@drip-apex/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/dist/_headers +3 -0
- package/dist/bundle-report.json +564 -0
- package/dist/drip.debug.js +2 -0
- package/dist/drip.debug.js.map +1 -0
- package/dist/drip.heatmap.js +2 -0
- package/dist/drip.heatmap.js.map +1 -0
- package/dist/drip.js +2 -0
- package/dist/drip.js.map +1 -0
- package/dist/drip.live.js +2 -0
- package/dist/drip.live.js.map +1 -0
- package/dist/editor.js +480 -0
- package/dist/editor.js.map +7 -0
- package/dist/index.mjs +645 -0
- package/dist/index.mjs.map +7 -0
- package/dist/metafiles/drip.debug.meta.json +973 -0
- package/dist/metafiles/drip.heatmap.meta.json +918 -0
- package/dist/metafiles/drip.live.meta.json +918 -0
- package/dist/metafiles/drip.meta.json +973 -0
- package/dist/metafiles/editor.meta.json +321 -0
- package/dist/metafiles/index.meta.json +1039 -0
- package/dist/metafiles/index.mjs.meta.json +78 -0
- package/dist/react/index.js +16973 -0
- package/dist/react/index.js.map +7 -0
- package/dist/sri.json +27 -0
- package/dist/types/analytics.d.ts +15 -0
- package/dist/types/antiflicker.d.ts +14 -0
- package/dist/types/assignment-store.d.ts +30 -0
- package/dist/types/audit.d.ts +9 -0
- package/dist/types/bucket.d.ts +2 -0
- package/dist/types/bucketing-cleanup.d.ts +5 -0
- package/dist/types/commerce-gift.d.ts +41 -0
- package/dist/types/commerce-price.d.ts +22 -0
- package/dist/types/commerce-shipping.d.ts +28 -0
- package/dist/types/css.d.ts +5 -0
- package/dist/types/cwv.d.ts +10 -0
- package/dist/types/data-layer-normalize.d.ts +1 -0
- package/dist/types/debug.d.ts +23 -0
- package/dist/types/define.d.ts +87 -0
- package/dist/types/devtools.d.ts +32 -0
- package/dist/types/dom-trigger.d.ts +3 -0
- package/dist/types/editor/api.d.ts +37 -0
- package/dist/types/editor/artifacts.d.ts +15 -0
- package/dist/types/editor/command-runtime.d.ts +48 -0
- package/dist/types/editor/controller.d.ts +97 -0
- package/dist/types/editor/device-preview.d.ts +23 -0
- package/dist/types/editor/index.d.ts +9 -0
- package/dist/types/editor/operator.d.ts +39 -0
- package/dist/types/editor/picker.d.ts +23 -0
- package/dist/types/editor/selector.d.ts +2 -0
- package/dist/types/editor/types.d.ts +55 -0
- package/dist/types/editor/view-kit.d.ts +33 -0
- package/dist/types/editor/view.d.ts +5 -0
- package/dist/types/editor-bootstrap.d.ts +37 -0
- package/dist/types/exclusion-groups.d.ts +59 -0
- package/dist/types/exposure-signals.d.ts +7 -0
- package/dist/types/flags.d.ts +65 -0
- package/dist/types/goals.d.ts +16 -0
- package/dist/types/guards.d.ts +39 -0
- package/dist/types/handover.d.ts +10 -0
- package/dist/types/hash.d.ts +19 -0
- package/dist/types/heatmap.d.ts +8 -0
- package/dist/types/hideflicker.d.ts +15 -0
- package/dist/types/hydration.d.ts +11 -0
- package/dist/types/index.d.ts +144 -0
- package/dist/types/js.d.ts +6 -0
- package/dist/types/module.d.ts +4 -0
- package/dist/types/money.d.ts +14 -0
- package/dist/types/mutate.d.ts +34 -0
- package/dist/types/observer-mute.d.ts +3 -0
- package/dist/types/pii-keys.d.ts +1 -0
- package/dist/types/prerequisites.d.ts +12 -0
- package/dist/types/qa-assistant-state.d.ts +68 -0
- package/dist/types/qa-assistant-view.d.ts +6 -0
- package/dist/types/qa-assistant.d.ts +9 -0
- package/dist/types/qa-toolbar.d.ts +19 -0
- package/dist/types/react/index.d.ts +84 -0
- package/dist/types/reassert-sentinel.d.ts +6 -0
- package/dist/types/router.d.ts +9 -0
- package/dist/types/runtime-tools.d.ts +50 -0
- package/dist/types/runtime.d.ts +22 -0
- package/dist/types/safe-regex.d.ts +6 -0
- package/dist/types/sanitize.d.ts +5 -0
- package/dist/types/semantic.d.ts +7 -0
- package/dist/types/shopify-cart-events.d.ts +7 -0
- package/dist/types/shopify-cart.d.ts +62 -0
- package/dist/types/signals.d.ts +31 -0
- package/dist/types/surface-signals.d.ts +6 -0
- package/dist/types/targeting-diagnostics.d.ts +5 -0
- package/dist/types/targeting.d.ts +50 -0
- package/dist/types/test-fixtures/commerce.d.ts +12 -0
- package/dist/types/track.d.ts +79 -0
- package/dist/types/types.d.ts +859 -0
- package/dist/types/wait.d.ts +7 -0
- package/package.json +74 -0
- package/src/analytics.ts +146 -0
- package/src/antiflicker.test.ts +127 -0
- package/src/antiflicker.ts +147 -0
- package/src/assignment-store.test.ts +171 -0
- package/src/assignment-store.ts +208 -0
- package/src/audit.test.ts +17 -0
- package/src/audit.ts +362 -0
- package/src/bucket.test.ts +65 -0
- package/src/bucket.ts +18 -0
- package/src/bucketing-cleanup.test.ts +30 -0
- package/src/bucketing-cleanup.ts +72 -0
- package/src/bucketing-parity.test.ts +41 -0
- package/src/commerce-analytics-lifecycle.test.ts +1416 -0
- package/src/commerce-config-lifecycle.test.ts +274 -0
- package/src/commerce-epoch-lifecycle.test.ts +62 -0
- package/src/commerce-gift.test.ts +1293 -0
- package/src/commerce-gift.ts +979 -0
- package/src/commerce-offers-display.test.ts +154 -0
- package/src/commerce-price.test.ts +1145 -0
- package/src/commerce-price.ts +941 -0
- package/src/commerce-revocation-lifecycle.test.ts +78 -0
- package/src/commerce-shipping.test.ts +630 -0
- package/src/commerce-shipping.ts +447 -0
- package/src/config-fetch.test.ts +325 -0
- package/src/css.ts +54 -0
- package/src/cwv.test.ts +95 -0
- package/src/cwv.ts +129 -0
- package/src/data-layer-normalize.ts +21 -0
- package/src/debug.test.ts +83 -0
- package/src/debug.ts +138 -0
- package/src/define.test.ts +327 -0
- package/src/define.ts +208 -0
- package/src/devtools.ts +582 -0
- package/src/dom-trigger.test.ts +70 -0
- package/src/dom-trigger.ts +55 -0
- package/src/editor/api.test.ts +154 -0
- package/src/editor/api.ts +185 -0
- package/src/editor/artifacts.test.ts +57 -0
- package/src/editor/artifacts.ts +115 -0
- package/src/editor/command-runtime.test.ts +225 -0
- package/src/editor/command-runtime.ts +572 -0
- package/src/editor/controller.test.ts +371 -0
- package/src/editor/controller.ts +596 -0
- package/src/editor/device-preview.test.ts +60 -0
- package/src/editor/device-preview.ts +120 -0
- package/src/editor/index.test.ts +161 -0
- package/src/editor/index.ts +169 -0
- package/src/editor/operator.test.ts +148 -0
- package/src/editor/operator.ts +256 -0
- package/src/editor/picker.test.ts +58 -0
- package/src/editor/picker.ts +152 -0
- package/src/editor/selector.test.ts +44 -0
- package/src/editor/selector.ts +110 -0
- package/src/editor/types.ts +92 -0
- package/src/editor/view-kit.ts +162 -0
- package/src/editor/view.test.ts +535 -0
- package/src/editor/view.ts +1395 -0
- package/src/editor-bootstrap.test.ts +116 -0
- package/src/editor-bootstrap.ts +213 -0
- package/src/event-schema-contract.test.ts +35 -0
- package/src/exclusion-groups.test.ts +383 -0
- package/src/exclusion-groups.ts +270 -0
- package/src/exposure-signals.test.ts +182 -0
- package/src/exposure-signals.ts +110 -0
- package/src/flags.test.ts +322 -0
- package/src/flags.ts +201 -0
- package/src/goals.test.ts +42 -0
- package/src/goals.ts +200 -0
- package/src/guards.test.ts +249 -0
- package/src/guards.ts +250 -0
- package/src/handover-cache-order.test.ts +32 -0
- package/src/handover.test.ts +349 -0
- package/src/handover.ts +309 -0
- package/src/hash.ts +214 -0
- package/src/heatmap.test.ts +305 -0
- package/src/heatmap.ts +373 -0
- package/src/hideflicker.ts +21 -0
- package/src/hydration.test.ts +252 -0
- package/src/hydration.ts +203 -0
- package/src/index.ts +7513 -0
- package/src/init-empty.test.ts +5572 -0
- package/src/js.test.ts +26 -0
- package/src/js.ts +61 -0
- package/src/module.ts +50 -0
- package/src/money.test.ts +35 -0
- package/src/money.ts +53 -0
- package/src/mutate.test.ts +304 -0
- package/src/mutate.ts +469 -0
- package/src/observer-mute.test.ts +88 -0
- package/src/observer-mute.ts +45 -0
- package/src/page-trigger.test.ts +84 -0
- package/src/personalization.test.ts +68 -0
- package/src/pii-keys.ts +17 -0
- package/src/prerequisites.test.ts +39 -0
- package/src/prerequisites.ts +94 -0
- package/src/qa-assistant-state.test.ts +471 -0
- package/src/qa-assistant-state.ts +505 -0
- package/src/qa-assistant-view.test.ts +185 -0
- package/src/qa-assistant-view.ts +768 -0
- package/src/qa-assistant.ts +40 -0
- package/src/qa-toolbar.ts +444 -0
- package/src/react/index.test.tsx +177 -0
- package/src/react/index.tsx +252 -0
- package/src/reassert-sentinel.test.ts +314 -0
- package/src/reassert-sentinel.ts +191 -0
- package/src/router.test.ts +78 -0
- package/src/router.ts +92 -0
- package/src/runtime-tools.test.ts +112 -0
- package/src/runtime-tools.ts +403 -0
- package/src/runtime.test.ts +217 -0
- package/src/runtime.ts +268 -0
- package/src/safe-regex.ts +35 -0
- package/src/sanitize.ts +34 -0
- package/src/semantic.ts +245 -0
- package/src/shopify-cart-events.test.ts +76 -0
- package/src/shopify-cart-events.ts +115 -0
- package/src/shopify-cart.test.ts +2823 -0
- package/src/shopify-cart.ts +1256 -0
- package/src/signals.ts +226 -0
- package/src/surface-signals.test.ts +83 -0
- package/src/surface-signals.ts +165 -0
- package/src/targeting-diagnostics.ts +560 -0
- package/src/targeting.detailed.test.ts +443 -0
- package/src/targeting.test.ts +1054 -0
- package/src/targeting.ts +1024 -0
- package/src/test-fixtures/commerce.ts +65 -0
- package/src/track.test.ts +817 -0
- package/src/track.ts +519 -0
- package/src/types.ts +991 -0
- package/src/wait.test.ts +96 -0
- package/src/wait.ts +238 -0
package/dist/drip.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drip.js","names":["cleanUrl","location","origin","pathname","onPageEnter","trackFn","pageEnteredAt","Date","now","maxScrollDepth","initialized","referrer","ref","document","host","URL","hostname","captureReferrer","utmParams","KEY","stored","sessionStorage","getItem","JSON","parse","params","URLSearchParams","search","utms","k","v","get","Object","keys","length","setItem","stringify","captureUtm","scrollCleanup","handler","body","docHeight","Math","max","scrollHeight","documentElement","viewportHeight","window","innerHeight","pct","round","scrollY","addEventListener","passive","domReady","once","removeEventListener","startScrollTracking","data","path","title","entries","onPageExit","duration","scroll_depth","init_analytics","__esmMin","activeDocument","clearTimers","progressiveRevealTimer","clearTimeout","hardRevealTimer","cleanupTimer","applyAntiFlicker","mode","timeoutMs","scopedSelectors","customCss","ownerDocument","existingStyle","getElementById","STYLE_ID","css","trim","selectorList","join","FULL_PAGE_CSS","resolveAntiFlickerCss","antiFlickerOwnerDocument","classList","remove","cleanupDocumentImmediately","root","style","createElement","id","textContent","add","isConnected","head","appendChild","progressiveMs","setTimeout","removeAntiFlickerFrom","el","removeAntiFlicker","init_antiflicker","assignmentEpoch","experiment","Number","isFinite","floor","readLocalStorage","globalThis","localStorage","STORAGE_KEY","readCookie","match","cookie","RegExp","COOKIE_NAME","decodeURIComponent","parseStore","raw","parsed","Array","isArray","out","experimentId","value","serializeStore","store","maxEntries","sort","a","b","slice","trimmed","record","readPersistedAssignments","compact","variationId","epoch","assignedAt","writePersistedAssignments","records","writeLocalStorage","encodeURIComponent","writeCookie","persistAssignmentForExperiment","removePersistedAssignmentsForExperiments","experimentIds","changed","__assignmentStoreInternals","init_assignment_store","readJsonRecord","key","storage","GOALS_KEY","CONFIG_CACHE_PREFIX","init_bucketing_cleanup","inTrafficAllocation","hashValue","allocation","chooseVariation","weights","total","reduce","sum","w","n","acc","i","init_bucket","snapshot","measurement","cls_total","cls_after_reveal","afterReveal","consume","rawEntry","entry","hadRecentInput","revealAt","startTime","finish","current","finalized","disconnectTimer","observer","takeRecords","disconnect","metrics","lastMetrics","resolve","startCwvMeasurement","disabled","PerformanceObserver","lastCompletion","Promise","promise","done","list","getEntries","observe","type","buffered","measurementStarted","markCwvReveal","performance","init_cwv","hashToFloat","seed","remainder","bytes","h1","c1","c2","k1","charCodeAt","imul","murmurhash3_32_gc","variationHashToFloat","generateId","crypto","getRandomValues","Uint8Array","toString","padStart","bytesToHex","random","configureIdentityStorage","settings","storageMode","encodeStorageValues","cookieDomain","normalized","replace","toLowerCase","includes","candidate","labels","split","every","label","test","normalizeCookieDomain","encodeStoredValue","btoa","decodeStoredValue","startsWith","padded","repeat","atob","browserStorage","writeStorage","UID_KEY","memoryUserId","expires","toUTCString","domain","getUserId","provided","existing","readStorage","created","adoptUserId","init_hash","isScreenshotMode","param","readFirstParam","names","name","parseForceParams","map","parseForceString","FORCE_EXPERIMENT_PARAM_NAMES","FORCE_VARIATION_PARAM_NAMES","parseForceParam","options","cookieFallback","pair","expId","varId","isQaMode","isDebugQaParam","QA_COOKIE","persistQaForce","forceMap","QA_COOKIE_MAX_AGE","sanitizeQaSessionId","exitQaMode","deleteCookie","removeItem","QA_SESSION_STORAGE_KEY","url","href","searchParams","delete","history","replaceState","maxAge","BOT_RE","init_guards","normalizeEpoch","readCompactStore","browserGroupStickyStore","init_exclusion_groups","read","groupId","write","selection","serialized","writeCompactStore","parseDisplayedCents","text","minorUnits","pattern","exec","separator","lastIndexOf","trailing","decimals","visibleDecimal","group","decimal","majorText","fraction","scale","cents","convention","start","index","end","formatCentsLike","major","String","init_money","shopifyProductMetaReady","meta","ShopifyAnalytics","Shopify","product","variants","cancelMetaRetry","metaRetryTimer","cancelStampCheck","stampCheckTimer","stampCheckDeadline","scheduleStampCheck","STAMP_CONFIRM_TIMEOUT_MS","status","isCohortStampedOnCart","cleanupCommercePrice","activeExperiments","assignments","isAssignmentAuthorized","page","pageType","currency","active","pageVariantIds","Set","filter","variant","experiments","assignment","find","item","experiment_id","adjustments","targetsCurrentProduct","some","adjustment","variantId","variant_gid","pop","has","epochMatches","assignment_epoch","isControl","push","hasActiveChargedPrice","fixedPricePerUnit","isCommercePriceWorkPending","isCommercePriceActive","isStrictlyLowerPrice","treatmentUnits","discarded","units","isSafeInteger","replaceNumericText","targets","replacement","isNaN","applyAccessibleLabel","node","container","labelled","parentElement","closest","contains","getAttribute","previous","originalAriaLabels","set","original","applied","setAttribute","guardedSwapPass","swapPass","productHandleFromUrl","currentProductHandle","metadataHandle","handle","canonical","querySelector","isElementLinkedToDifferentProduct","currentHandle","wrappingAnchor","labelledContainer","siblingContainer","productAnchors","from","querySelectorAll","linkedHandles","anchor","size","linkedHandle","isLinkedToDifferentProduct","applying","stampStatus","ZERO_DECIMAL","shopifyStoredScale","published","Map","price","selectedByVariant","selected","compareByVariant","compareCandidates","left","right","compareAt","compare","source","treatmentDisplayAmount","sourceDisplayAmount","NaN","compareAmount","amount","sourceAmount","displayedAmount","renderedDisplayAssignment","productHandle","exclusion","COMMERCE_PRICE_EXCLUSIONS","containers","COMMERCE_PRICE_SELECTORS","selectedVariantId","form","urlVariant","currentVariantId","selectedCompare","nextRenderedDisplayAssignment","compareAtNodes","removeInjectedFraming","removeApexCompareAt","display","hiddenCompareAtNodes","existingCompareNodes","scope","hasAttribute","eligible","selector","leaves","dataset","apexCompareAt","className","insertBefore","currentText","parsedCurrent","nextText","matches","walker","createTreeWalker","NodeFilter","SHOW_TEXT","nextNode","originals","rootObserver","MutationObserver","forEach","childList","characterData","subtree","addedNodes","Element","eligibilityChanged","exposureChanged","nextVariantForm","variantForm","handleVariantFormEvent","activateCommercePrice","deadline","onResolved","pendingActivation","META_RETRY_INTERVAL_MS","applyCommercePrice","META_RETRY_WINDOW_MS","element","setCommercePriceExposureListener","init_commerce_price","listener","isShopifyCartMutation","input","requestUrl","configuredRoot","routes","hash","action","notifyHandlers","handlers","handleFormSubmit","event","target","HTMLFormElement","queueMicrotask","onShopifyCartMutation","originalFetch","fetch","nativeFetch","bind","wrappedFetch","args","shouldNotify","suppressNotifications","result","then","response","ok","formListenerInstalled","install","fetchWithoutShopifyCartMutationNotification","call","init_shopify_cart_events","ttlMs","days","canUseLocalStorage","canPersistSignals","signalPersistenceAllowed","readStore","STORE_KEY","writeStore","normalizeValue","Boolean","json","compactStore","ts","next","expiresAt","setSignal","ttlDays","updatedAt","signalSources","getSignals","markVisitorSeen","signals","assign","runtimeSignals","seen","VISITOR_SEEN_KEY","setRuntimeSignal","clearRuntimeSignal","prependUnique","values","clean","readStringArray","rememberProduct","productType","tags","tag","vendor","setCartSignals","itemCount","productIds","setSearchSignal","query","init_signals","findCartDrawerContainer","CART_DRAWER_SELECTORS","classNameOf","hasOpenHint","classes","state","isExplicitlyClosed","isRendered","getComputedStyle","visibility","opacity","pointerEvents","rect","getBoundingClientRect","width","height","detectCartDrawerOpen","bodyClasses","BODY_OPEN_PATTERN","candidates","installCartDrawerOpenListener","onChange","timeoutId","check","schedule","attributes","attributeFilter","CART_DRAWER_OPEN_SIGNAL","init_surface_signals","removeRenderedElement","classifyShippingExposure","ownVariant","empty","productGids","variantGids","scoped","bound","treatment","threshold","treatments","eligibilityTarget","needsTargetProof","isCurrencyBound","thresholdCents","padEnd","money","Intl","NumberFormat","format","render","subtotal","reached","copy","template","resolveCopy","bannerCopy","reachedCopy","progressCopy","wrapper","apexShipping","cssText","line","track","progress","min","fill","drawer","prepend","position","inset","async","refreshCart","onEligibilityConfirmed","sequence","refreshSequence","cartAbortController","abort","controller","AbortController","timeout","lastSubtotal","endsWith","shopifyRoot","headers","Accept","signal","cart","items_subtotal_price","targetEligible","items","products","product_id","variant_id","cartMatchesTarget","currencyEligible","cartEligibility","renderEnabled","applyCommerceShipping","cleanupCommerceShipping","shopify","resolvedOptions","maximumFractionDigits","isInteger","currencyMinorUnits","exposure","activeShipping","stopCartMutationListener","placementObserver","placementCheckTimer","parent","installPlacementObserver","stopDrawerListener","open","clear","CSS_CLASS","CSS_LINK_CLASS","init_commerce_shipping","init_css","isExpired","timestamp","configureDebug","userId","storageAllowed","configured","enabled","restrictMode","persist","allowedUserIds","getQueryValue","queryParam","token","tokenMatches","isDebugEnabled","debugLog","category","message","console","toISOString","log","PREFIX","STYLE","DIMMED","debugWarn","warn","init_debug","registerMutedObserver","callback","observers","unregisterMutedObserver","runMuted","fn","muteDepth","pending","init_observer_mute","isApexNode","APEX_HOST_SELECTOR","QA_ASSISTANT_HOST_SELECTOR","init_dom_trigger","isPlainObject","prototype","getPrototypeOf","normalizeDataLayerEntry","init_data_layer_normalize","EDITOR_FRAGMENT_KEY","EDITOR_BUNDLE_FILENAME","EDITOR_DEVICE_FRAME_NAME","EDITOR_SCRIPT_ID","editorState","init_editor_bootstrap","cacheRegex","compiled","regexCache","oldest","safeRegexTest","cached","init_safe_regex","containsPiiToken","PII_KEY_TOKENS","init_pii_keys","isStrictJsPolicy","activePolicy","execJs","code","sourceLabel","Function","e","error","EXTERNAL_JS_CLASS","init_js","getFiredGoals","fireGoal","goal","countOnce","goalId","alreadyFired","fired","markFired","onGoal","extractCapturedValues","capture","rule","property","attribute","_","c","toUpperCase","textMatches","findByText","needle","handleClick","activeClickGoals","textMatch","matched","captured","cleanupGoals","clickListener","init_goals","paramName","handoverQueryParam","ttlSeconds","ttl","handoverTtlSeconds","handoverMintTimeoutMs","enabledDomains","domains","hostMatches","readBucketingHandover","shopId","verifyToken","verified","exp","shop","visitorId","visitorIdV2","vid","asg","x","decodeVerifiedPayload","init_handover","revealAll","init_hideflicker","init_sanitize","captureAppliedNodes","mutation","appliedNodes","childNodes","appliedStyles","styles","normalizeCssPropertyName","getPropertyValue","variantContentSurvives","needsDeepCheck","appliedAt","IN_PLACE_REVERT_WINDOW_MS","mutationSnapshots","kind","matchesOriginalInnerHtmlSnapshot","innerHTML","perf","__dripPerf","attributeName","expected","markPending","deepChecks","roots","frame","init_reassert_sentinel","init_mutate","isSafeMutationAttribute","normalizedName","URL_ATTRIBUTES","normalizedValue","mediaType","SAFE_DATA_URL_MEDIA_TYPES","sanitizeMutationHtml","html","sanitized","doc","DOMParser","parseFromString","script","attr","removeAttribute","sanitizeHtml","content","m","getMutationKey","isInsertAction","restoreSnapshot","priority","setProperty","removeProperty","parentNode","nextSibling","nodes","removeChild","applyToElement","insertAdjacentHTML","isInsertDuplicate","INSERT_ATTR","applyTrackedMutationWithSnapshots","snapshots","previousSibling","insertedNodes","firstChild","boundary","insertedElements","inserted","markInserted","getPropertyPriority","snapshotMutation","applyTrackedMutation","applyMutations","mutations","elements","onMiss","onApplied","applyMutationsWithSnapshots","detectSsrFramework","runtime","__NUXT__","__NEXT_DATA__","__next_f","hasMutationHold","holds","signalHydrated","hydratedAt","awaitHydration","started","boundedTimeoutMs","waitForHydration","readyState","settled","proceed","fallback","frameworkDetected","explicitHydrationWait","needsHydration","hydrationDone","quietFrames","lastMutation","timedOut","hydrationTimeout","holdTimeout","hydration_detected_at","apply_delayed_ms","hydration_timeout","hold_timeout","timer","cancelAnimationFrame","onFrame","requestAnimationFrame","beginQuiet","onRecords","init_hydration","notifyIfChanged","lastUrlRef","reason","previousUrl","nextUrl","init_router","MAX_STRING_CHARS","outputKeyForCustomSignal","collidesWithBuiltInPrefix","builtInKey","BUILT_IN_OUTPUT_KEYS","isExcludedCustomSignalKey","EXCLUDED_CUSTOM_KEYS","EXCLUDED_CUSTOM_PREFIXES","prefix","BUILT_IN_SIGNALS","MAX_KEYS","MAX_JSON_CHARS","init_exposure_signals","output","buildRuleApi","context","consentRequired","consentGranted","__drip","getWindowValue","evaluateProjectPrerequisite","knownResult","normalizeSimpleRule","getterMatch","evaluateKnownRule","api","err","Error","buildPrerequisiteContext","config","init_prerequisites","ensureAuthorizedAssignmentCache","authorizedAssignmentsBySignature","shipping","offers","requiresCommerceAuthorization","requiredAssignments","offersAuthorizationRevision","shippingAuthorizationRevision","priceAuthorizationRevision","hasActivePriceAuthorizationPlane","priceExperimentIds","hasActiveOffersAuthorizationPlane","offersExperimentIds","shippingExperimentIds","hasActiveShippingAuthorizationPlane","isUnsignedCommerceClearCandidate","cannotRequestRequiredCommerceAuthorization","endpoint","ingestSignature","isShopifyStorefront","normalizeTargetingUrl","syncSignature","localeCompare","sessionId","cartToken","normalizeCartToken","exclusionGroupSelections","shopifyRoutesRoot","storefrontOrigin","shopifyCartPath","withoutQuery","normalizeProofCartToken","syncShopifyCartAttributes","signature","existingInFlight","inFlightBySignature","force","latestSyncGeneration","generation","requiresCurrentAssignmentProof","CART_ATTRIBUTE_SYNC_KEY","readStampedSignature","validatedAuthorizationSignatures","authorizePriceDisplayAssignments","authorizeShippingDisplayAssignments","authorizeOffersDisplayAssignments","authorizedSignature","requestCommerceAuthorization","completed","cartWriteAllowed","offersAdoptionAssignments","authorizationCompleted","authorizedPriceAssignments","authorizedShippingAssignments","authorizedOffersAssignments","authorizedInput","parseSignedPriceAuthorizationAssignments","parseSignedShippingAuthorizationAssignments","parseSignedOffersAuthorizationAssignments","fromEntries","buildCartAttributeEntries","method","keepalive","completedSignature","adoptOffersAssignments","onCartSnapshot","clone","catch","writeStampedSignature","cache","finally","priceWriteRequiresProof","offersWriteRequiresProof","configuredOffersExperimentIds","enforceOffersPlaneProof","requiredOffersAssignments","configuredShippingExperimentIds","requiredShippingAssignments","hasAuthoritativePriceProof","supplied","resolveChargeAuthorizationCartToken","requestedExperimentIds","shop_id","user_id","environment","cart_token","exclusion_group_selections","group_id","payload","commerce_authorization","authorizedAssignments","resolvedPriceAssignments","resolvedOffersAssignments","evaluatedPriceExperimentIds","configuredPriceExperimentIds","rolloutFallback","envelope","hasOwnProperty","evaluated","parseEvaluatedPriceExperimentIds","resolveAuthoritativePriceAssignments","flatMap","required","authoritative","priceAssignments","requiredPriceAssignments","requiresNonPriceAssignment","pricePlane","parsePriceAuthorizationPlane","p","plane","r","cartHash","s","hasSignedEmptyPriceAuthorizationEnvelope","hasSignedAssignmentProof","adoptionRequired","responseAssignments","localAssignments","offersAssignments","parseResponsePriceAssignments","resolved","resolveAuthoritativeOffersAssignments","offersPlane","parseAuthorizationPlane","shippingPlane","variation_id","hasRequiredAssignmentProof","adoptPriceAssignments","adoptable","canAdoptOffersAssignments","ep","signedAssignments","commerce_price_only","commercePriceOnly","localPriceAssignments","authoritativeByExperimentId","local","remainingPriceAssignments","commerceAuthorization","primaryAssignment","init_shopify_cart","giftTiers","tiers","gift_variant_gid","tier","numericVariantId","choices","gift_choice_variant_gids","gid","declined","DECLINE_PREFIX","recordDecline","insertionRecord","INSERTED_PREFIX","insertedThisSession","recordVariantGid","variantGid","recordTierThreshold","tierThreshold","insertionMatchesCart","recordCart","ANY_CART","recordInserted","selectedGiftOptions","clearInserted","clearDispatchedChoices","dispatchedChoices","listInsertionRecords","ids","marker","properties","MARKER","lineVariantId","lineAmount","line_price","mutate","run","cartMutated","lines","assigned","chargeOnlyExperimentIds","authorizedOfferExperimentIds","authorization","changePath","insertedVariantIdsThisRun","removedLineKeys","removeLine","quantity","linePresent","activeGiftExperiments","isArmProven","control","offer_type","mark","teardownChecked","activeChoiceTier","managedLines","removeAllManaged","allRemoved","allGiftIds","valid","applicableTier","chosen","choiceGids","choiceTierGeneration","currentKey","markChoicePromptLive","suppressInsertion","extendedRecord","persistedRecord","persistedGid","lowestChoiceTierThresholdFor","persistedTierThreshold","tierlessRecoveryAllowed","inMemorySelection","inMemoryGid","markedCurrentTierGid","persistedChoiceIsCurrentTier","persistedCurrentTierGid","selectedGid","priorPending","managed","desiredGid","giftId","allowedCurrentIds","staleRemovalFailed","removedStaleForExperiment","eventKey","emitChoicePrompt","satisfyingLine","insertedAllowedId","satisfyingGid","localAssignment","addResponse","dd","failedSelection","retryKey","addedLine","syncGiftWithPurchase","latestArgs","choiceRequestListenerInstalled","inFlight","choiceReplayRequested","getPendingGiftChoices","batchGeneration","recheckTeardown","queuedArgs","runToFixpoint","nextSettings","nextAssignments","nextOptions","anyMutated","pass","mutated","dispatchEvent","CustomEvent","detail","selectGiftOption","containingTiers","applicableThreshold","owningTier","prompts","activeExperimentId","init_commerce_gift","hasOwnEntries","hasNavigationApi","nav","navigation","resolvePlatform","platformHint","profilePlatform","profile","platform","analytics","publish","hasShopifyRuntime","PluginManager","Shopware","hasShopwareRuntime","resolveActivationMode","spa","activationMode","readPerfFlags","PERF_FLAG_DEFAULTS","perfFlags","parseMaybeUrl","readForceSignature","markUrlDepsForPattern","deps","assignmentSignature","getBlankScreenMs","timing","navigationStart","domContentLoadedEventStart","getEntriesByType","init_runtime","perf_platform_router_v1","perf_shopify_pixel_buffer_v1","perf_spa_incremental_reapply_v1","perf_empty_project_v1","readDocument","env","readWindow","safeCallback","isElement","isDocument","Document","createApexRuntimeTools","tools","waitForElement","WeakSet","stop","collectMatches","observeTarget","observeRootFor","elementIsInView","rawOptions","win","normalizeInViewOptions","observed","cleanups","IntersectionObserver","bottom","top","innerWidth","isIntersecting","unobserve","rootMargin","splice","cleanup","domChanged","debounceMs","flush","domLoaded","waitForDataLayer","matcher","layerName","layerHost","layer","originalPush","process","rawRecord","normalizeMatcher","matchesDataLayerEntry","wrappedPush","apply","trackGoal","redirect","loc","readLocation","reInit","forceReapply","init_runtime_tools","urlRuleOperator","matchType","match_type","pageRulePatternSummary","rules","includeRules","include","excludeRules","pageRuleSource","advancedCode","advancedCondition","sourceType","triggerJs","trigger","evaluatePageRuleForDiagnostics","ctx","matchUrlRules","pageManualTriggerMatches","advanced","evaluatePageAdvancedConditionResult","pageRuleCondition","actual","hasPatterns","operator","segmentConditionDiagnostic","condition","jsCode","js","skippedSegmentRuleConditions","groups","flat","conditions","segmentRuleDiagnosticConditions","resolveNamedConditionExpected","diagnoseSegmentCondition","resolveNamedConditionActual","evaluateJsTriggerResult","jsReason","resolveSegmentConditionForDiagnostics","matchSegmentConditionValues","diagnostic","diagnoseSegmentRule","diagnostics","flatIndex","groupOffset","groupMatched","groupIndex","remainingGroup","attributeCondition","init_targeting_diagnostics","init_targeting","evalUrlRule","unescapeRegexLiteral","escaped","substring","comps","isPath","evalSimpleUrlPart","evalSimpleUrlTarget","normalizeRuntimeUrlRule","rawPattern","normalizeRuntimeUrlRules","targeting","urlSource","legacyRules","concat","hasInclude","included","jsErrorReason","errorMessage","matchPageTargetingRule","pageId","pageName","evaluatePageAdvancedCondition","matchAttributeRule","attrs","runtimeNavigator","navigator","lower","normalizeVersion","firstVersionMatch","ua","patterns","version","getUserAgent","userAgent","getPlatform","userAgentData","browserInfoFromBrands","brands","EMPTY_BROWSER_INFO","brand","browserWithVersionPriority","uaVersion","hinted","decodeCookieComponent","parseNamedValue","indexOf","getPersistedUtmValue","direct","readShopifySignal","page_type","product_type","customer","buildTargetingAttributes","baseAttributes","currentUrl","persistSignals","utm_source","utm_medium","utm_campaign","normalizeReferrer","device","mobile","fromUa","normalizedUa","normalizedPlatform","maxTouchPoints","getDeviceTypeFromUserAgent","getDeviceType","browser","fullVersionInfo","fullVersionList","highEntropyBrowserInfo","getHighEntropyValues","highEntropyBrowserInfoRequested","info","requestHighEntropyBrowserInfo","getBrowserInfoFromClientHints","getBrowserInfo","os","EMPTY_OS_INFO","getOsInfo","navLanguage","language","lang","getLanguage","utmSource","normalizeTrafficSource","productMeta","readShopifyProductMeta","pairs","getCookieValue","isLegacyRawQueryCondition","rawQueryString","conditionValue","resolveUrlQueryValue","evaluateJsTrigger","resolveSignalValue","LEGACY_RAW_QUERY_OPERATORS","isActivateJsTrigger","apexTools","buildJsTriggerSource","stringValues","hasMeaningfulValue","compareNumber","predicate","actualNumber","expectedNumber","matchSegmentCondition","actualValues","expectedValues","firstExpected","wildcardToRegex","matchSegmentRule","matchesTargeting","gates","urlRules","pageRules","pageHasRules","pageMatched","matchPageRules","skipped","attributesMatched","attributeRules","segmentRules","segmentRulesMatched","matchSegmentRules","audienceHasRules","audienceMatched","evaluateTargetingGates","evaluateTargetingGatesDetailed","stopped","rawMatched","passed","diagnoseUrlRules","pageRulesMatched","diagnosePageRules","skippedPageRuleConditions","skippedAttributeConditions","skippedSegmentConditions","ruleMatched","diagnoseAttributeRules","segments","diagnoseSegmentRules","evaluateTargetingGatesWithConditionDiagnostics","createEventId","cryptoApi","randomUUID","RECOVERY_KEY","VISITOR_SESSIONS_KEY","Tracker","init_track","constructor","this","queue","activeBatch","flushInFlight","flushPromise","nextFlushAt","backoffMs","maxQueueSize","pagehideHandler","beforeUnloadHandler","pageshowHandler","beforeUnloadResetTimer","visibilityHandler","pageLifecycleFlushed","pageTeardownStarted","ingestShopId","getOrCreateSessionId","visitorSessions","lifetimeIdentityStorage","storedRecent","recentSessionIds","storedLast","lastSessionId","recent","storedCount","count","visitorSessionCount","flushIntervalMs","maxBatchSize","getActiveAssignment","buildPageExitEvents","qaMode","qaSessionId","getSessionId","recoverEvents","setInterval","listenUnload","clearInterval","enriched","enrichEvent","event_id","visitor_sessions","qa_mode","qa_session_id","scheduleBackoff","ms","jitter","resetBackoff","parseRetryAfterSeconds","parseInt","drainQueue","batch","res","buildHeaders","buildPayload","unshift","saveRecovery","retryAfter","waitMs","removeRecovery","events","_shopId","_signature","recoveryEventKey","eventId","readRecovery","merged","keyed","unkeyed","bounded","deliveredKeys","remaining","queuePageExitEvents","flushForPageLifecycle","terminal","alreadyFlushed","lifecycleEvents","queued","sendBeacon","Blob","resetPageLifecycle","onPagehide","persisted","onBeforeUnload","onPageShow","onVisibilityChange","visibilityState","defineExperiment","def","issues","slug","variations","controls","totalWeight","weight","abs","toFixed","trafficAllocation","goals","goalIds","g","validate","ExperimentDefinitionError","hashAttribute","resetJs","externalCssUrl","externalJsUrl","urlPattern","freeze","defineExperiments","defs","init_define","super","evaluateFlagAssignment","flagId","variation","experimentName","featureFlag","harnessSession","defineFlagExperiment","rollout","rolloutPercent","flag","offValue","onValue","init_flags","nodeType","Node","ELEMENT_NODE","applyToEntry","handled","clearExpiryTimer","expiryTimer","scheduleExpiryPrune","nextExpiry","delay","pruneExpiredEntries","expired","pendingRoots","buildSelectorMap","selectorMap","runSelectorOnRoot","hasQuerySelectorAll","applyMutationWithWait","DEFAULT_WAIT_TTL_MS","DOCUMENT_FRAGMENT_NODE","debouncedCheck","init_wait","selectorEntries","checkPendingRoots","checkAllEntries","flushChecks","devtools_exports","logDevtoolsEvent","eventLog","shift","eventListeners","panelInstance","refresh","subscribeDevtoolsEvents","isDevtoolsEnabled","mountDevtools","opts","update","DevtoolsPanel","unmountDevtools","destroy","esc","__export","PANEL_CSS","init_devtools","collapsed","activeTab","dragState","shadow","attachShadow","attachDrag","renderTabContent","tab","select","onForceVariation","renderSequence","renderAssignments","renderLog","renderForce","project","activation","gate","renderGate","assignedVariationId","reverse","toLocaleTimeString","header","panel","onMouseDown","startX","clientX","startY","clientY","offsetX","offsetY","preventDefault","attachHeader","h","origRender","dx","dy","heatmap_exports","clamp","sampledIn","sampleRate","stableSampleKey","normalizeSampleRate","captureSelector","parts","tagName","testId","nth","sibling","previousElementSibling","safeElementText","resolveCaptureAssignments","experimentsById","behaviorCapture","startHeatmapCapture","seenScrollBuckets","lastClickAt","recentClicks","lastPosition","movementBuckets","bucketPageUrl","movementSampleTimer","movementFlushTimer","movementEnabled","moves","flushMovement","buckets","totalDwell","dwell","MOVEMENT_MIN_DWELL_MS","points","sorted","dwellDifference","encoded","bucket","point","nextLength","MOVEMENT_POINTS_MAX_LENGTH","encodeMovementPoints","page_url","viewport_width","viewport_height","document_height","sample_ms","sampleMovement","currentPageUrl","documentHeight","xPercent","yPercent","pageY","MOVEMENT_GRID_SIZE","MOVEMENT_SAMPLE_MS","onPointerMove","stopMovement","syncMovementCapture","MOVEMENT_FLUSH_MS","emitScroll","scrolls","scrollPercent","scroll_percent","SCROLL_BUCKETS","scroll_bucket","onClick","clicks","pageX","click","t","RAGE_CLICK_WINDOW_MS","RAGE_CLICK_BUFFER_SIZE","y","rage","hypot","RAGE_CLICK_RADIUS_PX","viewport_x","viewport_y","x_pct","y_pct","element_tag","element_text","element_x","scrollX","element_y","element_width","element_height","onScroll","nextExperiments","init_heatmap","semantic_exports","pathMatches","pathPattern","elementText","labelFor","labelSource","elementRole","productContext","productId","product_handle","elementIndex","indexStrategy","basePayload","semantic_rule_id","semantic_event","eventType","semantic_role","semantic_label","element_index","startSemanticCapture","oncePerSession","normalizeRules","maxEvents","maxEventsPerSession","minVisibleMs","visibilityThreshold","timers","emitted","emit","extra","dedupeKey","visibilityRules","clickRules","intersectionRatio","visible_ms","visibility_pct","init_semantic","audit_exports","textOf","collectText","limit","redactUrl","rgbToHex","hex","part","unique","collectStyles","colors","fonts","buttonStyles","color","bg","backgroundColor","border","borderColor","fontFamily","HTMLAnchorElement","borderRadius","buttons","storageAvailable","hasStorage","detectPlatform","WooCommerce","isApexScriptSrc","collectNetwork","resources","initiatorType","durationMs","transferSize","currentHost","thirdParties","resource","notableThirdParties","apexRequests","configuredEndpoint","failedResources","resourceErrors","collectSnapshot","headings","imageAlts","images","img","alt","schemaTypes","types","collectSchemaTypes","textSample","innerText","offerPhrases","apexScriptCount","scripts","src","viewport","devicePixelRatio","sdk","installed","configSource","trackerStarted","eventsEndpointReachable","duplicateInstalls","scriptCount","site","spaDetected","consentBannerDetected","cartDetected","productJsonLdDetected","dom","sections","browserCapabilities","cookiesAvailable","cookieEnabled","localStorageAvailable","sessionStorageAvailable","cspWarnings","blockedRequests","network","capturedAt","runAuditIfRequested","queryToken","inMemorySentToken","oncePerPage","requestIdleCallback","auditEndpoint","DEFAULT_AUDIT_ENDPOINT","init_audit","HTMLElement","HTMLScriptElement","HTMLImageElement","HTMLLinkElement","qa_toolbar_exports","buildQaDebugUrl","filteredForceMap","serializeForceMap","replaceQaUrl","mountQaToolbar","TOOLBAR_ID","TOOLBAR_STYLES","toolbar","badge","actions","collapseBtn","toggle","exitBtn","onExitQa","activeForceMap","currentForceMap","harnessAssignment","harness","harnessActions","reload","onReloadLatest","exitHarness","onExitHarness","noExp","debugActions","copyDebugLink","originalLabel","clipboard","writeText","textarea","execCommand","copyText","openDebugPanel","session","sessionLabel","expDiv","nameEl","currentForced","activeForced","currentAssignment","opt","onSwitchVariation","unmountQaToolbar","init_qa_toolbar","createQaAssistantStore","buildState","listeners","cartFetchSignature","disposed","setState","baseTransactions","__getQaAssistantRuntimeSnapshot","attribution","experimentNameById","variationName","variationNameById","attributionFromAssignments","orderIdentity","orderNumber","platformOrderId","serverReceipt","shopifyConfigured","shopifyRuntime","cartStamped","primaryAssignmentVariationName","stampedAt","transactionShell","readShopifyCart","cartMatchesAssignments","primaryStampedVariationName","refreshShopifyCart","unsubscribeRuntime","__subscribeQaAssistantRuntime","unsubscribeEvents","mapped","revenue","at","eventLabel","eventValue","mapDevtoolsEvent","duplicate","duplicateOf","appendEvent","transactions","getState","subscribe","forceVariation","__forceQaAssistantVariation","resetForce","__resetQaAssistantForce","exitQa","selectors","removeAssistantHost","mapExperiments","activationDiagnostics","forcedSummary","assignmentByExperiment","diagnosticByExperiment","variationDisplayName","forced","targetingConditions","mapCondition","pageConditions","audienceConditions","shortId","triggerPill","targetingPill","segmentPill","displayFrequencyPill","subline","experimentSubline","isCurrent","isReal","firstFailed","isJsError","conditionText","conditionDetail","rawCode","isPageRulePatternSummary","formatValue","noRulesReason","trafficGate","parseCartAssignments","readCartAttributes","apex_assignments","apex_experiment_id","apex_variation_id","stamped","primary","findIndex","formatNumber","init_qa_assistant_state","init_index","svg","d","sw","formatTime","pad","getHours","getMinutes","getSeconds","chip","tone","condRow","codeOpen","P","cls","fail","skip","minus","alert","whole","words","REASON_WORDS","humanizeSkipDetail","codeBlock","chevUp","chevD","experimentRow","view","expanded","chipHtml","forceControls","pages","audience","chevR","experimentsBody","visible","pageOk","pageFilter","statusOk","statusFilter","rejected","filters","totalRejected","summary","eventRow","ev","fg","bd","pageview","dup","eventsBody","live","activity","attributionRows","transactionsBody","tx","checkSquare","help","receipt","clock","orderHead","buildTabs","hideTx","tabsHtml","tabs","forcedBarHtml","bolt","operatorMarkSvg","QA_ASSISTANT_HOST_ID","MINIMIZED_KEY","CSS","init_qa_assistant_view","eyeOff","url_mismatch","url_exclude_matched","page_rule_failed","segment_mismatch","segment_and_failed","attribute_mismatch","js_false","js_error","qa_assistant_exports","mountQaAssistant","qaAssistantStore","qaAssistantView","mount","append","minimized","firstMount","clearedBefore","mounted","renderTimer","lastSignature","composingSearch","immediate","currentState","nextSignature","eventsBadge","pillHtml","panelHtml","scrollTop","focused","activeElement","focusedAction","selectionStart","selectionEnd","focus","setSelectionRange","tabsRegion","var","unsubscribe","mountQaAssistantView","getQaAssistantStore","init_qa_assistant","index_exports","fetchWithTimeout","race","reject","DOMException","createFetchTimeoutError","fetchWithRetry","retries","delayMs","normalizeNumber","DEFAULT_CONFIG_FETCH_TIMEOUT_MS","firstAttemptTimeoutMs","attempt","startedAt","slowTimer","slowMarked","onAttemptStart","onSlow","slowMs","DEFAULT_CONFIG_FETCH_SLOW_MS","elapsedMs","onAttemptEnd","monotonicNow","boundedPerfDuration","MAX_PERF_DURATION_MS","createInitPerfContext","phases","includesConfigFetch","addInitPhase","phase","elapsed","resolveRuntimeConfig","executionMode","DEFAULT_EXECUTION_MODE","antiFlickerMode","antiFlicker","antiFlickerTimeoutMs","antiFlickerTimeout","DEFAULT_ANTI_FLICKER_TIMEOUT_MS","trackingStart","deferTracking","DEFAULT_TRACKING_START","trackingIdleTimeoutMs","DEFAULT_TRACKING_IDLE_TIMEOUT_MS","customJsPolicy","DEFAULT_JS_POLICY","antiFlickerCustomCss","resolveDomPageTrigger","pageTriggerMode","domChangeTrigger","dtLog","FEATURE_DEVTOOLS","mn","vr","traceStep","traceGate","trackingBlocked","trackingDisabledByDnt","doNotTrackEnabled","dataProtection","respectDoNotTrack","doNotTrack","msDoNotTrack","browserDoNotTrackEnabled","readPath","readWindowPath","configuredConsentGranted","consent","consentMode","provider","requiredGroup","services","uc","UC_UI","getServicesBaseInfo","service","serviceId","templateId","dataProcessor","dataProcessorName","consentTokenMatches","consentStatus","readUsercentricsConsent","cookiebot","Cookiebot","stats","statistic","statistics","marketing","preference","preferences","necessary","readCookiebotConsent","ccm","CCM","embeddings","acceptedEmbeddings","requiredName","readCcm19Consent","methodName","sale_of_data","saleofdata","sale","sources","Pandectes","customerPrivacy","readPandectesConsent","getter","syncConfiguredConsent","setConsent","resolveConsentRequired","requireConsent","hasConsent","resolveConsentGranted","CONSENT_COOKIE_NAME","readConsentCookie","persistentStorageAllowed","coerceSignalValue","valueType","numeric","captureUrlSignals","definitions","definition","parameter","setCapturedSignal","setPublicSignal","getPublicSignals","normalizePageApiName","triggerPage","apiName","normalizedApiName","nextActive","isActive","pageTriggerSignal","readElementCaptureValue","char","captureDomAndGlobalSignals","clearConsentStorage","ORDER_EXPOSURE_STORAGE_KEY","clearStoredSignals","CONFIG_CACHE_KEY_PREFIX","clearIdentityContextCookie","clearCookie","clearPersistedAssignments","clearBrowserGroupStickyStore","runWhenDomReady","runProjectStartupCode","projectCode","conditionUsesActivateTrigger","buildJsTriggerContext","getRuntimeTools","installPageTriggerRule","teardown","activate","notifyQaAssistantRuntimeListeners","qaAssistantRuntimeListeners","activeHarnessAssignment","FEATURE_HARNESS","manifestUrl","stopHarnessPolling","harnessPollTimer","harnessPollKey","applyHarnessManifest","manifest","spaCleanup","sessionInfo","pollIntervalMs","applyAssignments","lastAssignmentSignature","pollHarnessManifest","hidden","normalizeEndpoint","getEventsEndpoint","verifyBucketingHandoverToken","AbortSignal","externalTracking","clearScheduledAnalyticsStart","analyticsTimeoutId","cancelIdle","cancelIdleCallback","analyticsIdleId","readNumericPath","readStringPath","handleDataLayerEvent","dataLayerName","gtagNormalized","mappedSignals","eventPayload","mappings","mapping","to","applyDataLayerMappings","lastDataLayerTrigger","eventName","initializingAssignments","trackEventName","trackPageview","dataLayerEvent","trackRevenue","revenueFrom","eventData","orderId","orderIdFrom","currencyFrom","cost","costFrom","profit","profitFrom","RESERVED_DATA_LAYER_REVENUE_KEYS","trackDataLayerRevenue","reEvaluate","reevaluateAssignments","rememberExposureDestination","exposureDestinationDiagnostics","clarityTagKey","pushExposureToQueue","destination","globalName","event_name","event_attributes","exposureAssignmentKey","personalization","priceAssignmentAuthorizationKey","isPriceDisplayAssignmentAuthorized","commerce","revision","authorizedPriceAssignmentKeys","isShippingDisplayAssignmentAuthorized","authorizedShippingAssignmentKeys","isOffersDisplayAssignmentAuthorized","authorizedOffersAssignmentKeys","giftSyncOptions","assignmentHasRenderableArtifacts","experimentCss","experimentJs","authorizeOffersDisplayAndRender","offersEnforcedIds","trackViewedAssignmentsAfterShippingEligibility","analyticsStarted","trackViewedAssignments","autoTrack","isCommercePriceExposureEligible","isShippingCartEligibilityConfirmed","isShippingExposureCartEligible","exposureEligibleAssignments","exposureSignals","sourceKey","outputKey","customSignals","compactToLimits","buildExposureSignalContext","exposureKey","exposedAssignmentKeys","entity_kind","personalization_id","personalization_key","personalization_rule_id","ruleId","personalization_experience_id","experienceId","personalization_surface","surface","personalization_template_key","templateKey","destinations","exposureDestinations","project_id","experiment_name","variation_index","variation_name","is_control","dataLayer","includeMetadata","hotjar","hj","apex_ab_test","clarity","clarityFn","tagPrefix","upgrade","clarityUpgradeSent","contentsquare","uxa","_uxa","keyPrefix","posthog","register","queues","emitExposureDestinations","exposures","readStoredOrderExposures","pruneStoredOrderExposures","writeStoredOrderExposures","writeIdentityContextCookie","rememberOrderExposure","onExperimentViewed","setupGoalTracking","expMap","hasClickGoals","setupGoals","setupHeatmapTracking","FEATURE_HEATMAP","tracker","heatmapController","ap","sp","cleanupHeatmapTracking","cleanupSemanticTracking","semanticController","buildExperimentBehaviorEvents","withAssignmentEpochData","analyticsTrack","scheduleOrderIdentityBeacon","behaviorEvent","syncLoadDiagnosticsToPerf","perfWindow","load_stage","load","stage","config_fetch_status","configFetchStatus","configFetchAttempts","config_fetch_attempts","configFetchMs","config_fetch_ms","assignmentReadyMs","assignment_ready_ms","pendingMutations","pending_mutations","appliedMutations","applied_mutations","missedMutations","missed_mutations","updateLoadDiagnostics","patch","queuePerfEvent","pendingPerf","config_fetch_status_code","configFetchStatusCode","mutation_apply_pending","mutation_apply_applied","mutation_apply_missed","telemetryLabel","readRuntimeInstallClaim","RUNTIME_INSTALL_CLAIM_KEY","installSurface","sdkVersion","runtimeProfile","sdkAttributionData","firstInstall","snippetRevision","delivery","sdk_version","sdk_delivery_mode","sdkDeliveryMode","sdk_delivery_source","sdkDeliverySource","sdk_policy_revision","sdkPolicyRevision","snippet_revision","runtime_profile","install_surface","first_install_surface","sendRuntimeEventNow","screenshotMode","environments","activeKey","readDripPerf","markDripPerf","numberPerf","coexistencePerfFields","reapply_count","reassert_loop_detected","buildPerfEvent","assignmentReadyAt","antiFlickerInsertedAt","measuredPhaseMs","unattributedInitMs","initTotalMs","mutationCount","init_total_ms","guard_resolve_ms","consent_identity_ms","runtime_setup_ms","targeting_assignment_ms","mutation_finalize_ms","unattributed_init_ms","blank_screen_ms","blankScreenMs","config_source","activation_mode","experiment_count","assignment_count","mutation_count","script_exec_start","anti_flicker_inserted_at","assignment_ready_at","first_mutation_at","reveal_at","hidden_duration_ms","current_page_hide_selector_count","delivery_state","deliveryState","script_cache_source","scriptCacheSource","flushPendingPerf","completion","cwv_finalized","ORDER_EXPOSURE_TTL_MS","ORDER_EXPOSURE_MAX_ENTRIES","IDENTITY_CONTEXT_COOKIE_NAME","generateSessionId","deduped","recentIdentityContextExposures","IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES","buildIdentityContextCookieValue","trackerSessionId","SESSION_STORAGE_KEY","getIdentityContextSessionId","IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS","mergedOrderIdentityAssignments","cleanOrderIdentityText","detectOrderIdentity","orderIdentityDetectionUrl","orderIdentityDetection","explicit","__apexOrderIdentity","__apexShopware","wc","woocommerce_params","resolveOrderIdentityPlatform","strongSignal","order_id","transaction_id","order_number","number","hintedPlatform","orderIdEl","orderNumberEl","domOrderId","apexOrderId","domOrderNumber","apexOrderNumber","orderIdentityEndpoint","identity","orderIdentityDedupeKey","orderIdentityInFlight","sendOnPagehide","markDelivered","deliveryStatus","missed","startAnalyticsStage","pendingInitialApply","trackingPrerequisiteMet","emptyProjectFastPath","eventsEndpoint","ensureTrackerStarted","byId","experimentById","offTargetPersistedAssignments","usesStickyAssignmentPersistence","persistActiveExperimentAssignments","syncActiveAssignmentToShopifyCart","pendingDeliveryHealth","flushPendingDeliveryHealth","storedOrderExposures","recorded","restoreRecordedExposureDedup","fp","pp","semanticTracking","setupSemanticTracking","updateProjectActivationDiagnostics","scheduleShopifyAssignmentSync","scheduleAnalyticsStart","idleTimeout","requestIdle","startAnalyticsIfReady","getConfigCacheKey","environmentKey","hashConfigPayload","exclusionGroups","withRuntimeSettings","snippet","prerequisites","debug","pageTrigger","dataLayerTriggers","bucketingCleanup","runtimeControl","configCacheTtlMs","projectPrerequisites","showVariationsRule","startTrackingRule","getHashId","buildAssignment","experimentResetJs","loadPersistedAssignments","allowed","prunePersistedAssignments","buildPersistedAssignmentResult","hashId","offTarget","experimentDiagnostic","failed","assignedVariationIndex","evaluateExperimentDetailed","traceName","forcedVarId","forcedIdx","forcedVariation","persistedAssignments","findPersistedVariation","otherwiseEligible","targetingLifecycleMode","inAllocation","evaluateExperiment","enforcePersonalizationStopAfterMatch","stoppedKeys","suppressedExperimentIds","filtered","stopAfterMatch","_assignedVariationId","_assignedVariationIndex","rest","stoppedPersonalizationDiagnostic","keptByGroupDiagnostic","applyExclusionAndPersonalization","afterGroups","decisions","forcedExperimentIds","assignedById","suppressed","members","hasForcedAssignment","member","persistGroupSelection","conflicting","share","winnerId","conflictingIds","prior","sticky","priorMember","hasPositiveWeight","configuredWeights","suppressedIds","conflictingExperimentIds","winnerExperimentId","resolveExclusionGroups","nextDiagnostics","decisionsByWinner","decision","provisionalIds","forcedIds","losingDecision","excludedByGroupDiagnostic","winningDecision","eligibleIds","evaluate","evaluateWithDiagnostics","matchSimpleDeliveryPattern","cleanPattern","re","escapeDeliveryRegex","matchRegexDeliveryPattern","matchesDeliveryUrlRules","includeHit","expandCriticalMutation","base","runPostRevealReassert","reassertAssignmentMutations","revealExperimentContent","postRevealReassert","first","schedulePostRevealReassert","applyAssignmentCode","applyGeneration","appliedExperimentCode","injectExperimentCss","injectCss","assignmentApplyGeneration","link","rel","onload","onerror","injectExternalCss","loadExternalJs","commerceActive","commerceAssignments","withCommercePriceAssignments","stopShopifyCartMutationSync","requiresCommerceCohortPin","chargeCorrectness","commercePriceAdoptionState","configureChargeCorrectnessCartSync","offersDisplayWithheld","pricePending","priceResolved","mutationKey","deliveryTrackers","deliveryKey","maybeEmitDeliveryHealth","expected_mutations","expectedMutations","selector_misses","selectorMisses","apply_status","assignment_index","apply_generation","queueDeliveryHealthEvent","appliedMutationKeys","missedMutationKeys","revealed","maybeRevealResolvedMutations","onMutationApplied","treatedRoot","times","trackAppliedMutation","appliedMutation","firstMutationAt","onMutationMissed","intervalMs","nextKey","harnessVisibilityInstalled","startHarnessPolling","all","reassertNonStructuralMutations","prevAssignments","resetExperimentIds","resetReassertSentinel","generateQaSessionId","ensureCommercePriceAdoptionState","currentCommercePriceContext","adoption","activeExperimentIds","validCommerceOnly","clearShopifyAssignmentSyncTimers","shopifyAssignmentSyncTimers","adoptAuthoritativePriceAssignments","replacements","nextCommercePriceOnlyAssignments","seenAuthoritativeExperimentIds","variationIndex","previousAssignments","previousCommercePriceOnlyAssignments","previousCommercePriceOnlyContext","planAuthoritativeOffersAdoption","canAdoptAuthoritativeOffersAssignments","adoptAuthoritativeOffersAssignments","plan","buildActiveCartAttributeSyncInput","hasActiveCommerceAuthorizationPlane","activeCartAssignments","chargeAffectingExperimentIds","getChargeAffectingCommerceExperimentIds","assignedExperimentIds","winner","found","noteCartSnapshotForGifts","hasActiveAuthorizationPlane","hasChargeAffectingCommerceAssignment","chargeAffecting","offerExperimentIds","enforcedExperimentIds","isShippingCartEligible","headlessCartAuthorizationState","confirmationPending","lastShopifyCartSync","shopifyCartSyncGeneration","authorizationUnavailable","assignmentCount","notifyCommerceCartStampConfirmed","publishAssignmentsToShopify","lastShopifyAssignmentSync","flags","SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS","variationsAllowed","variationGate","variationPrerequisiteMet","trackingGate","goalsGate","trackingAllowed","lifecycle","stopAnalyticsStage","skipHoldGate","queuedRecheck","hydrationTimeoutMs","exps","evaluation","preserved","nextExperimentIds","persistent","preservePersistentAssignments","updated","forceReset","reapplyQaAssistantForceMap","initWithExperiments","perfContext","verifiedHandover","runtimeResolveStartedAt","runtimeConfig","afMode","afTimeout","trackStart","jsPolicy","emptyProjectProfileCandidate","helperJs","hasProjectCode","runtimeFeatures","sdkVariant","defaultMode","routerMode","reinitOnly","canUseEmptyProjectProfile","resolvePageTriggerMode","baseRouterMode","requested","resolveRouterMode","manualInitialTrigger","domPageTrigger","urlDiffNeeds","computeUrlDiffNeeds","assignmentStartedAt","consentIdentityStartedAt","initialConsentRequired","initialConsentGranted","initialTrackingDisabledByDnt","initialStorageAllowed","consentModeEnabled","handover","resolvedUserId","getEphemeralUserId","runtimeSetupStartedAt","policy","setJsPolicy","applyProjectCode","urlForceMap","handoverForceMap","resolvedConfig","priorPriceSyncPending","generated","getQaSessionId","stopObserver","stopDomObserver","stopHandover","stopSignalCaptures","stopSurfaceSignals","stopJsTriggerSignals","stopDataLayerTriggers","stopConsentListeners","documentEvents","pollTimer","pollCapTimer","stopPolling","EVENT_DRIVEN_CONSENT_PROVIDERS","shouldPollConfiguredConsent","CUSTOM_CONSENT_POLL_INTERVAL_MS","CUSTOM_CONSENT_POLL_MAX_MS","installConsentChangeListeners","targetElement","installClickSignalCaptures","experimentsUseSurfaceSignals","installSurfaceSignals","targetingHasJsTriggers","activateCleanups","collectJsTriggerConditions","resetCode","runJsTriggerReset","installActivateJsTrigger","pageTriggerCleanups","collectPageTriggerRules","installJsTriggerObserver","triggers","normalizeDataLayerTriggers","byLayer","layerTriggers","installDataLayerTriggers","targetingAssignmentStartedAt","critical","plannedExperimentIds","skippedDiagnostics","planIndex","plannedVariation","fullIndex","fullVariation","buildCriticalPathAssignments","criticalMutationPlan","fallbackDiagnosticIds","filteredInitial","antiFlickerSelectors","collectScopedSelectors","mutationFinalizeStartedAt","initialApplyPromise","applyTiming","deferForVisualWork","priceSettings","assignmentsHaveVisualWork","scheduledConfig","scheduledUrl","activeGoalIds","activeVariationIds","variationIds","kept","cleanupGoalStorage","currentShopId","retentionDays","cutoffMs","fetchedAt","cleanupConfigCache","cleanupBucketingStorage","getPayload","mintPayload","cachedSignedPayload","cachedBasePayload","cachedSignedPayloadExp","mintInFlight","mint","readPayloadExp","bestPayload","rewriteUrl","rawUrl","appendHandover","isHandoverTarget","handleLinkEvent","closestLink","rewrite","resumeLinkNavigation","resubmitting","handleSubmit","submitter","rawAction","submitterAction","submissionAction","requestSubmit","installBucketingHandover","iat","encodePayload","createBucketingHandoverPayload","signed","credentials","mintBucketingHandoverPayload","lastUrl","assignmentReadyMonotonicAt","beginTracking","FEATURE_AUDIT","bp","vp","observeNavigationApi","wrap","ret","restorePush","restoreReplace","popHandler","hashHandler","observeHistoryChanges","observeRouteChanges","routeAnalyticsGeneration","routeStartedAt","shouldReevaluate","prev","shouldReevaluateForUrlChange","lastRouteChange","reEvaluated","runRouteAnalytics","mutationObserver","observeDomChanges","groupEnd","FEATURE_QA","onUnavailable","Hp","Vp","loadQaAssistant","wp","Sp","loadQaToolbar","loadDevtoolsIfEnabled","getDiagnostics","remount","loadDevtools","init","windowLike","isEditorDevicePreview","launch","locationLike","historyLike","encodedToken","hint","encodedPayload","decoded","decodeBase64Url","sid","apiOrigin","protocol","normalizeApiOrigin","api_origin","aud","decodeEditorLaunchToken","remainingHash","consumeEditorLaunchFragment","onBeforeLoad","bundleUrl","baseUrl","scriptSrc","pageUrl","configuredUrl","scriptUrl","resolveEditorBundleUrl","configuredBundleUrl","onFailure","loadBundle","documentLike","crossOrigin","editorGlobal","ApexEditor","loadEditorBundle","interceptEditorLaunch","editorBundleUrl","SDK_SCRIPT_SRC","earlyConsentRequired","earlyConsentGranted","earlyTrackingDisabledByDnt","earlyStorageAllowed","earlyUserId","attemptedInstallSurface","runtimeGlobal","RUNTIME_INSTALL_CONFLICT_KEY","claimInstallConflictEmission","attempted_install_surface","claim","rememberRuntimeInstallClaim","allowIframes","self","isIframe","isOptedOut","resetLoadDiagnostics","geo","country","__dripEdgeInit","hasBucketingHandover","serializedForceMap","configUrl","harnessToken","useConfigCache","configCache","cacheTtlMs","DEFAULT_CONFIG_CACHE_TTL_MS","getConfigCacheTtlMs","readCachedExperiments","handoverPromise","cachedConfig","cachedApplyDeferred","initCachedConfig","asyncFetchAntiFlickerArmed","configFetchStartedAt","antiFlickerFetchBudgetMs","hardRevealDeadline","configFetchError","configFetchCompletedAt","countryChanged","configWithRuntime","runtimeConsentRequired","runtimeStorageAllowed","writeCachedExperiments","incomingHash","lateConfigPolicy","sendRuntimePerfNow","config_fetch_error","captureEventPropertySignals","activeAssignment","resolvedExperimentId","resolvedVariationId","triggerGoalsForEvent","trackStep","stepName","funnelStepStorageKey","shouldTrackFunnelStep","step_name","triggerGoal","granted","writeConsentCookie","applyConsentStorageMode","recheckPrerequisites","hold","release","hydrated","normalizeRevenueCurrency","pendingApply","getAssignments","getCartAttributes","normalizedHeadlessCartToken","getSignedCartAttributes","requiresCohortPin","headless","hadRenderable","revokeOffersDisplayAuthorization","shippingAssignments","stageOffersAdoptionAssignments","buildSignedCartAttributeEntries","normalizedCartToken","confirmCartAttributesWritten","getExperiments","getRuntimeValue","getGoals","getActiveExperimentIds","experimentsLoaded","buildFlagContext","evaluateFlag","evaluateFlagValue","signalDiagnostics","getSignalDiagnostics","userIdPresent","featureFlagKey","personalizationKey","personalizationRuleId","personalizationExperienceId","personalizationSurface","personalizationTemplateKey","personalizationPriority","personalizationStopAfterMatch","cookiesEnabled","externalHandoverDomains","runtimeDisabled","runtimeDisabledAt","disabledAt","integrations","processCommand","cmd","__test","currentScript","drip","command","step","setCart","setSearch","getTools","Apex","processQueue","Cp","x_"],"sources":["../src/analytics.ts","../src/antiflicker.ts","../src/assignment-store.ts","../src/bucketing-cleanup.ts","../src/bucket.ts","../src/cwv.ts","../src/hash.ts","../src/guards.ts","../src/exclusion-groups.ts","../src/money.ts","../src/commerce-price.ts","../src/shopify-cart-events.ts","../src/signals.ts","../src/surface-signals.ts","../src/commerce-shipping.ts","../src/css.ts","../src/debug.ts","../src/observer-mute.ts","../src/dom-trigger.ts","../src/data-layer-normalize.ts","../src/editor-bootstrap.ts","../src/safe-regex.ts","../src/pii-keys.ts","../src/js.ts","../src/goals.ts","../src/handover.ts","../src/hideflicker.ts","../src/sanitize.ts","../src/reassert-sentinel.ts","../src/mutate.ts","../src/hydration.ts","../src/router.ts","../src/exposure-signals.ts","../src/prerequisites.ts","../src/shopify-cart.ts","../src/commerce-gift.ts","../src/runtime.ts","../src/runtime-tools.ts","../src/targeting-diagnostics.ts","../src/targeting.ts","../src/track.ts","../src/define.ts","../src/flags.ts","../src/wait.ts","../src/devtools.ts","../src/heatmap.ts","../src/semantic.ts","../src/audit.ts","../src/qa-toolbar.ts","../src/qa-assistant-state.ts","../src/qa-assistant-view.ts","../src/qa-assistant.ts","../src/index.ts"],"sourcesContent":["/**\n * analytics.ts — Automatic pageview and engagement tracking.\n *\n * Fires two event types through the existing track() pipeline:\n * - \"pageview\" on every page load / SPA navigation\n * - \"page_exit\" on navigation away / tab close (with duration + scroll depth)\n */\n\ntype TrackFn = (type: string, data?: Record<string, unknown>) => void;\n\nlet pageEnteredAt = 0;\nlet maxScrollDepth = 0;\nlet scrollCleanup: (() => void) | null = null;\nlet referrer = \"\";\nlet utmParams: Record<string, string> = {};\nlet initialized = false;\n\n/** Parse UTM params from URL. Persist in sessionStorage so they stick across the session. */\nfunction captureUtm(): Record<string, string> {\n const KEY = \"drip_utm\";\n try {\n const stored = sessionStorage.getItem(KEY);\n if (stored) return JSON.parse(stored);\n } catch {}\n const params = new URLSearchParams(location.search);\n const utms: Record<string, string> = {};\n for (const k of [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n ]) {\n const v = params.get(k);\n if (v) utms[k] = v;\n }\n if (Object.keys(utms).length) {\n try {\n sessionStorage.setItem(KEY, JSON.stringify(utms));\n } catch {}\n }\n return utms;\n}\n\n/** Capture and normalise the referring domain. */\nfunction captureReferrer(): string {\n const ref = document.referrer;\n if (!ref) return \"(direct)\";\n try {\n const host = new URL(ref).hostname;\n if (host === location.hostname) return \"(internal)\";\n return host;\n } catch {\n return \"(direct)\";\n }\n}\n\n/** Track max scroll depth as 0-100 percentage. Returns cleanup fn. */\nfunction startScrollTracking(): () => void {\n const handler = () => {\n // The snippet can execute in <head> before <body> exists.\n if (!document.body) return;\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n );\n const viewportHeight = window.innerHeight;\n if (docHeight <= viewportHeight) {\n maxScrollDepth = 100;\n return;\n }\n const pct = Math.round(((window.scrollY + viewportHeight) / docHeight) * 100);\n if (pct > maxScrollDepth) maxScrollDepth = pct;\n };\n window.addEventListener(\"scroll\", handler, { passive: true });\n let domReady: (() => void) | null = null;\n if (document.body) {\n handler();\n } else {\n domReady = () => handler();\n document.addEventListener(\"DOMContentLoaded\", domReady, { once: true });\n }\n return () => {\n window.removeEventListener(\"scroll\", handler);\n // A page exit before DOM readiness must not leave the deferred\n // measurement alive to contaminate the next page's scroll depth.\n if (domReady) document.removeEventListener(\"DOMContentLoaded\", domReady);\n };\n}\n\n/** Clean URL: origin + pathname only (strips query params). */\nexport function cleanUrl(): string {\n return location.origin + location.pathname;\n}\n\n/** Called on every page load / SPA navigation. */\nexport function onPageEnter(trackFn: TrackFn): void {\n pageEnteredAt = Date.now();\n maxScrollDepth = 0;\n\n // Capture referrer + UTMs once per session\n if (!initialized) {\n referrer = captureReferrer();\n utmParams = captureUtm();\n initialized = true;\n }\n\n // Start scroll tracking\n if (scrollCleanup) {\n scrollCleanup();\n scrollCleanup = null;\n }\n scrollCleanup = startScrollTracking();\n\n // Fire pageview\n const data: Record<string, unknown> = {\n referrer,\n path: location.pathname,\n title: document.title,\n };\n // Merge UTMs into event data (only non-empty values)\n for (const [k, v] of Object.entries(utmParams)) {\n if (v) data[k] = v;\n }\n trackFn(\"pageview\", data);\n}\n\n/** Called on SPA navigation away / page unload. */\nexport function onPageExit(trackFn: TrackFn): void {\n if (!pageEnteredAt) return;\n const duration = Math.round((Date.now() - pageEnteredAt) / 1000);\n\n if (scrollCleanup) {\n scrollCleanup();\n scrollCleanup = null;\n }\n\n trackFn(\"page_exit\", {\n duration,\n scroll_depth: maxScrollDepth,\n path: location.pathname,\n });\n\n pageEnteredAt = 0;\n maxScrollDepth = 0;\n}\n","import type { AntiFlickerMode } from \"./types\";\n\nconst STYLE_ID = \"drip-antiflicker\";\nconst DEFAULT_TIMEOUT_MS = 1200;\nconst PROGRESSIVE_REVEAL_RATIO = 0.8; // Start progressive reveal at 80% of timeout\nconst REVEAL_CLEANUP_MS = 80;\n\nconst FULL_PAGE_CSS =\n \"html.drip-af { opacity: 0 !important; }\" +\n \" html.drip-af-reveal { transition: opacity 0.05s ease-in !important; }\";\n\nlet progressiveRevealTimer: ReturnType<typeof setTimeout> | null = null;\nlet hardRevealTimer: ReturnType<typeof setTimeout> | null = null;\nlet cleanupTimer: ReturnType<typeof setTimeout> | null = null;\nlet antiFlickerOwnerDocument: Document | null = null;\n\nfunction activeDocument(): Document | null {\n if (typeof document === \"undefined\" || !document.documentElement) return null;\n return document;\n}\n\nfunction clearTimers(): void {\n if (progressiveRevealTimer !== null) {\n clearTimeout(progressiveRevealTimer);\n progressiveRevealTimer = null;\n }\n if (hardRevealTimer !== null) {\n clearTimeout(hardRevealTimer);\n hardRevealTimer = null;\n }\n if (cleanupTimer !== null) {\n clearTimeout(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\nfunction cleanupDocumentImmediately(ownerDocument: Document): void {\n ownerDocument.documentElement?.classList.remove(\"drip-af\", \"drip-af-reveal\");\n ownerDocument.getElementById(STYLE_ID)?.remove();\n if (antiFlickerOwnerDocument === ownerDocument) antiFlickerOwnerDocument = null;\n}\n\nexport function resolveAntiFlickerCss(\n mode: AntiFlickerMode = \"scoped\",\n scopedSelectors?: string[],\n customCss?: string,\n): string | null {\n if (mode === \"off\") return null;\n\n if (mode === \"custom\") {\n return customCss && customCss.trim() ? customCss : null;\n }\n\n if (mode === \"scoped\") {\n if (!scopedSelectors || scopedSelectors.length === 0) {\n return null;\n }\n\n const selectorList = scopedSelectors.join(\",\");\n return (\n selectorList + \" { visibility: hidden !important; }\" +\n \" .drip-af-reveal \" + selectorList + \" { visibility: visible !important; transition: visibility 0s, opacity 0.05s ease-in !important; }\"\n );\n }\n\n return FULL_PAGE_CSS;\n}\n\n/**\n * Apply anti-flicker hiding based on mode.\n * - \"scoped\": only hides elements matching provided selectors (preferred).\n * - \"full\": hides entire page with opacity:0 (legacy).\n * - \"off\": no-op.\n * Scoped mode is a no-op when no selectors are available.\n *\n * Progressive reveal: at 80% of timeout, begins a CSS transition to fade\n * content in gradually rather than a sudden flash at timeout expiry.\n */\nexport function applyAntiFlicker(\n mode: AntiFlickerMode = \"scoped\",\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n scopedSelectors?: string[],\n customCss?: string,\n): void {\n const ownerDocument = activeDocument();\n if (!ownerDocument) return;\n const existingStyle = ownerDocument.getElementById(STYLE_ID);\n // A live barrier owns its current timers. During the short reveal cleanup\n // window, however, network config or re-init may need to arm a fresh barrier\n // immediately against the same document.\n if (existingStyle && cleanupTimer === null) return;\n const css = resolveAntiFlickerCss(mode, scopedSelectors, customCss);\n if (!css) return;\n clearTimers();\n if (antiFlickerOwnerDocument && antiFlickerOwnerDocument !== ownerDocument) {\n cleanupDocumentImmediately(antiFlickerOwnerDocument);\n }\n antiFlickerOwnerDocument = ownerDocument;\n\n const root = ownerDocument.documentElement;\n const style = existingStyle ?? ownerDocument.createElement(\"style\");\n style.id = STYLE_ID;\n\n style.textContent = css;\n root.classList.remove(\"drip-af-reveal\");\n if (mode === \"full\") {\n root.classList.add(\"drip-af\");\n } else {\n root.classList.remove(\"drip-af\");\n }\n\n if (!style.isConnected) (ownerDocument.head || root).appendChild(style);\n\n // Progressive reveal: at 80% of timeout, begin transition before hard timeout\n const progressiveMs = Math.round(timeoutMs * PROGRESSIVE_REVEAL_RATIO);\n progressiveRevealTimer = setTimeout(() => {\n progressiveRevealTimer = null;\n // Add reveal class to start transition (content fades in over 50ms)\n root.classList.add(\"drip-af-reveal\");\n }, progressiveMs);\n\n // Hard timeout: fully remove anti-flicker\n hardRevealTimer = setTimeout(() => {\n hardRevealTimer = null;\n removeAntiFlickerFrom(ownerDocument);\n }, timeoutMs);\n}\n\nfunction removeAntiFlickerFrom(ownerDocument: Document | null): void {\n clearTimers();\n if (!ownerDocument?.documentElement) return;\n const root = ownerDocument.documentElement;\n root.classList.remove(\"drip-af\");\n root.classList.add(\"drip-af-reveal\");\n const el = ownerDocument.getElementById(STYLE_ID);\n // Remove style (if present) and class after transition completes\n cleanupTimer = setTimeout(() => {\n cleanupTimer = null;\n el?.remove();\n root.classList.remove(\"drip-af-reveal\");\n if (antiFlickerOwnerDocument === ownerDocument) antiFlickerOwnerDocument = null;\n }, REVEAL_CLEANUP_MS);\n}\n\nexport function removeAntiFlicker(): void {\n removeAntiFlickerFrom(antiFlickerOwnerDocument ?? activeDocument());\n}\n","import type { Experiment, Variation } from \"./types\";\n\nconst STORAGE_KEY = \"drip_assignments_v1\"; // gitleaks:allow — public storage key name, not a credential\nconst COOKIE_NAME = \"drip_assignments_v1\";\nconst MAX_ENTRIES = 80;\nconst MAX_COOKIE_ENTRIES = 20;\nconst COOKIE_MAX_AGE_SECONDS = 365 * 24 * 60 * 60;\n\nexport type PersistedAssignmentRecord = {\n variationId: string;\n epoch: number;\n assignedAt: number;\n};\n\ntype CompactRecord = [string, number, number];\ntype CompactStore = Record<string, CompactRecord>;\n\nfunction assignmentEpoch(experiment: Experiment): number {\n return Number.isFinite(experiment.assignmentEpoch)\n ? Math.max(1, Math.floor(experiment.assignmentEpoch as number))\n : 1;\n}\n\nfunction readLocalStorage(): string | null {\n try {\n return globalThis.localStorage?.getItem(STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeLocalStorage(value: string): void {\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, value);\n } catch {\n // Ignore storage failures; cookie fallback is best effort.\n }\n}\n\nfunction readCookie(): string | null {\n try {\n const cookie = globalThis.document?.cookie ?? \"\";\n const match = cookie.match(new RegExp(\"(^| )\" + COOKIE_NAME + \"=([^;]+)\"));\n return match ? decodeURIComponent(match[2]) : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCookie(value: string): void {\n try {\n if (!globalThis.document) return;\n globalThis.document.cookie =\n COOKIE_NAME +\n \"=\" +\n encodeURIComponent(value) +\n \"; Max-Age=\" +\n COOKIE_MAX_AGE_SECONDS +\n \"; Path=/; SameSite=Lax\";\n } catch {\n // Ignore cookie failures.\n }\n}\n\nfunction clearCookie(): void {\n try {\n if (!globalThis.document) return;\n globalThis.document.cookie =\n COOKIE_NAME + \"=; Max-Age=0; Path=/; SameSite=Lax\";\n } catch {\n // Ignore cookie failures.\n }\n}\n\nfunction parseStore(raw: string | null): CompactStore {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n const out: CompactStore = {};\n for (const [experimentId, value] of Object.entries(parsed)) {\n if (\n typeof experimentId !== \"string\" ||\n !Array.isArray(value) ||\n typeof value[0] !== \"string\" ||\n typeof value[1] !== \"number\" ||\n typeof value[2] !== \"number\"\n ) {\n continue;\n }\n out[experimentId] = [value[0], value[1], value[2]];\n }\n return out;\n } catch {\n return {};\n }\n}\n\nfunction serializeStore(store: CompactStore, maxEntries = MAX_ENTRIES): string {\n const entries = Object.entries(store)\n .sort(([, a], [, b]) => b[2] - a[2])\n .slice(0, maxEntries);\n // Object.fromEntries is ES2019; the SDK lib target predates it.\n const trimmed: CompactStore = {};\n for (const [experimentId, record] of entries) {\n trimmed[experimentId] = record;\n }\n return JSON.stringify(trimmed);\n}\n\nexport function readPersistedAssignments(): Record<string, PersistedAssignmentRecord> {\n const compact = {\n ...parseStore(readCookie()),\n ...parseStore(readLocalStorage()),\n };\n const out: Record<string, PersistedAssignmentRecord> = {};\n for (const [experimentId, [variationId, epoch, assignedAt]] of Object.entries(compact)) {\n out[experimentId] = { variationId, epoch, assignedAt };\n }\n return out;\n}\n\nexport function writePersistedAssignments(\n records: Record<string, PersistedAssignmentRecord>,\n): void {\n const compact: CompactStore = {};\n for (const [experimentId, record] of Object.entries(records)) {\n compact[experimentId] = [record.variationId, record.epoch, record.assignedAt];\n }\n writeLocalStorage(serializeStore(compact, MAX_ENTRIES));\n writeCookie(serializeStore(compact, MAX_COOKIE_ENTRIES));\n}\n\nexport function clearPersistedAssignments(): void {\n try {\n globalThis.localStorage?.removeItem(STORAGE_KEY);\n } catch {\n // Ignore storage failures.\n }\n clearCookie();\n}\n\nexport function prunePersistedAssignments(\n experiments: Experiment[],\n records = readPersistedAssignments(),\n): Record<string, PersistedAssignmentRecord> {\n const allowed = new Set(experiments.map((experiment) => experiment.id));\n let changed = false;\n for (const experimentId of Object.keys(records)) {\n if (!allowed.has(experimentId)) {\n delete records[experimentId];\n changed = true;\n }\n }\n if (changed) writePersistedAssignments(records);\n return records;\n}\n\nexport function findPersistedVariation(\n experiment: Experiment,\n records = readPersistedAssignments(),\n): { variation: Variation; index: number; record: PersistedAssignmentRecord } | null {\n const record = records[experiment.id];\n if (!record) return null;\n if (record.epoch !== assignmentEpoch(experiment)) return null;\n const index = experiment.variations.findIndex(\n (variation) => variation.id === record.variationId,\n );\n if (index < 0) return null;\n return { variation: experiment.variations[index], index, record };\n}\n\nexport function persistAssignmentForExperiment(\n experiment: Experiment,\n variationId: string,\n assignedAt = Date.now(),\n): PersistedAssignmentRecord {\n const records = readPersistedAssignments();\n const record = {\n variationId,\n epoch: assignmentEpoch(experiment),\n assignedAt,\n };\n records[experiment.id] = record;\n writePersistedAssignments(records);\n return record;\n}\n\nexport function removePersistedAssignmentsForExperiments(\n experimentIds: Iterable<string>,\n): void {\n const records = readPersistedAssignments();\n let changed = false;\n for (const experimentId of experimentIds) {\n if (!(experimentId in records)) continue;\n delete records[experimentId];\n changed = true;\n }\n if (changed) writePersistedAssignments(records);\n}\n\nexport const __assignmentStoreInternals = {\n STORAGE_KEY,\n COOKIE_NAME,\n assignmentEpoch,\n parseStore,\n serializeStore,\n};\n","import type { Experiment } from \"./types\";\n\nconst GOALS_KEY = \"drip_goals\";\nconst CONFIG_CACHE_PREFIX = \"drip_cfg:\";\n\nfunction readJsonRecord(key: string): Record<string, unknown> | null {\n try {\n const storage = globalThis.localStorage;\n if (!storage) return null;\n const raw = storage.getItem(key);\n return raw ? JSON.parse(raw) as Record<string, unknown> : null;\n } catch {\n return null;\n }\n}\n\nfunction cleanupGoalStorage(experiments: Experiment[]): void {\n const stored = readJsonRecord(GOALS_KEY);\n if (!stored) return;\n\n const activeGoalIds = new Set<string>();\n const activeVariationIds = new Set<string>();\n for (const experiment of experiments) {\n for (const goal of experiment.goals ?? []) activeGoalIds.add(goal.id);\n for (const variation of experiment.variations ?? []) activeVariationIds.add(variation.id);\n }\n\n const next: Record<string, string[]> = {};\n for (const [goalId, variationIds] of Object.entries(stored)) {\n if (!activeGoalIds.has(goalId) || !Array.isArray(variationIds)) continue;\n const kept = variationIds.filter((variationId) => (\n typeof variationId === \"string\" && activeVariationIds.has(variationId)\n ));\n if (kept.length) next[goalId] = kept;\n }\n\n try {\n const storage = globalThis.localStorage;\n if (!storage) return;\n if (Object.keys(next).length) storage.setItem(GOALS_KEY, JSON.stringify(next));\n else storage.removeItem(GOALS_KEY);\n } catch {\n // ignore storage failures\n }\n}\n\nfunction cleanupConfigCache(currentShopId?: string, retentionDays = 180): void {\n if (!currentShopId) return;\n const cutoffMs = Date.now() - Math.max(1, retentionDays) * 864e5;\n try {\n const storage = globalThis.localStorage;\n if (!storage) return;\n for (let i = storage.length - 1; i >= 0; i--) {\n const key = storage.key(i);\n if (!key?.startsWith(CONFIG_CACHE_PREFIX)) continue;\n if (key.startsWith(CONFIG_CACHE_PREFIX + currentShopId + \":\")) continue;\n const parsed = readJsonRecord(key);\n const fetchedAt = typeof parsed?.fetchedAt === \"number\" ? parsed.fetchedAt : 0;\n if (!fetchedAt || fetchedAt < cutoffMs) storage.removeItem(key);\n }\n } catch {\n // ignore storage failures\n }\n}\n\nexport function cleanupBucketingStorage(\n experiments: Experiment[],\n options?: { shopId?: string; retentionDays?: number },\n): void {\n cleanupGoalStorage(experiments);\n cleanupConfigCache(options?.shopId, options?.retentionDays ?? 180);\n}\n","export function inTrafficAllocation(hashValue: number, allocation = 1): boolean {\n if (allocation <= 0) return false;\n if (allocation >= 1) return true;\n return hashValue < allocation;\n}\n\nexport function chooseVariation(hashValue: number, weights: number[]): number {\n if (!weights.length) return -1;\n const total = weights.reduce((sum, w) => sum + (w > 0 ? w : 0), 0);\n if (total <= 0) return 0;\n const n = hashValue * total;\n let acc = 0;\n for (let i = 0; i < weights.length; i++) {\n acc += weights[i] > 0 ? weights[i] : 0;\n if (n < acc) return i;\n }\n return weights.length - 1;\n}\n","type LayoutShiftEntry = PerformanceEntry & {\n value?: number;\n hadRecentInput?: boolean;\n};\n\ntype CwvMetrics = {\n cls_total: number;\n cls_after_reveal: number;\n};\n\ntype Measurement = {\n observer: PerformanceObserver;\n revealAt: number | null;\n disconnectTimer: ReturnType<typeof setTimeout> | null;\n total: number;\n afterReveal: number;\n promise: Promise<CwvMetrics | null>;\n resolve: (metrics: CwvMetrics | null) => void;\n finalized: boolean;\n};\n\nlet current: Measurement | null = null;\nlet lastMetrics: CwvMetrics = { cls_total: 0, cls_after_reveal: 0 };\nlet lastCompletion: Promise<CwvMetrics | null> = Promise.resolve(null);\nlet measurementStarted = false;\n\nfunction snapshot(measurement: Measurement): CwvMetrics {\n return {\n cls_total: Math.round(measurement.total * 100_000) / 100_000,\n cls_after_reveal: Math.round(measurement.afterReveal * 100_000) / 100_000,\n };\n}\n\nfunction consume(measurement: Measurement, entries: PerformanceEntry[]): void {\n for (const rawEntry of entries) {\n const entry = rawEntry as LayoutShiftEntry;\n if (entry.hadRecentInput || typeof entry.value !== \"number\") continue;\n measurement.total += entry.value;\n if (measurement.revealAt !== null && entry.startTime > measurement.revealAt) {\n measurement.afterReveal += entry.value;\n }\n }\n}\n\nfunction finish(measurement = current): void {\n if (!measurement || measurement.finalized) return;\n measurement.finalized = true;\n if (measurement.disconnectTimer !== null) {\n clearTimeout(measurement.disconnectTimer);\n measurement.disconnectTimer = null;\n }\n try {\n consume(measurement, measurement.observer.takeRecords());\n } catch {}\n measurement.observer.disconnect();\n const metrics = snapshot(measurement);\n lastMetrics = metrics;\n measurement.resolve(metrics);\n if (current === measurement) current = null;\n}\n\nexport function startCwvMeasurement(disabled?: boolean): void {\n finish(current);\n lastMetrics = { cls_total: 0, cls_after_reveal: 0 };\n\n if (disabled || typeof PerformanceObserver === \"undefined\") {\n lastCompletion = Promise.resolve(null);\n return;\n }\n try {\n let resolve!: (metrics: CwvMetrics | null) => void;\n const promise = new Promise<CwvMetrics | null>((done) => { resolve = done; });\n let measurement!: Measurement;\n const observer = new PerformanceObserver((list) => {\n if (!measurement.finalized) consume(measurement, list.getEntries());\n });\n measurement = {\n observer,\n revealAt: null,\n disconnectTimer: null,\n total: 0,\n afterReveal: 0,\n promise,\n resolve,\n finalized: false,\n };\n current = measurement;\n lastCompletion = promise;\n // Buffered entries belong to the initial document only. Replaying them\n // into later SPA route observers would mix prior-route CLS into the new\n // route's telemetry window.\n observer.observe({ type: \"layout-shift\", buffered: !measurementStarted });\n measurementStarted = true;\n // Empty-project and non-visual routes may not call markCwvReveal(). Bound\n // every route measurement anyway so finalized telemetry is guaranteed.\n measurement.disconnectTimer = setTimeout(() => finish(measurement), 5_000);\n } catch {\n current?.observer.disconnect();\n current?.resolve(null);\n current = null;\n lastCompletion = Promise.resolve(null);\n }\n}\n\nexport function markCwvReveal(): void {\n if (!current || current.revealAt !== null) return;\n current.revealAt = typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : 0;\n if (current.disconnectTimer !== null) clearTimeout(current.disconnectTimer);\n const measurement = current;\n measurement.disconnectTimer = setTimeout(() => finish(measurement), 5_000);\n}\n\nexport function getCwvMetrics(): CwvMetrics {\n return current ? snapshot(current) : lastMetrics;\n}\n\nexport function waitForCwvMetrics(): Promise<CwvMetrics | null> {\n return current?.promise ?? lastCompletion;\n}\n\nexport function resetCwvMeasurement(): void {\n finish(current);\n current = null;\n measurementStarted = false;\n lastMetrics = { cls_total: 0, cls_after_reveal: 0 };\n lastCompletion = Promise.resolve(null);\n}\n","const UID_KEY = \"drip_uid\";\n\ntype StorageMode = \"localStorage\" | \"sessionStorage\" | \"cookie\" | \"memory\";\n\nlet storageMode: StorageMode = \"localStorage\";\nlet encodeStorageValues = false;\nlet cookieDomain = \"\";\nlet memoryUserId: string | null = null;\n\nexport function murmurhash3_32_gc(key: string, seed = 0): number {\n let remainder = key.length & 3;\n let bytes = key.length - remainder;\n let h1 = seed;\n let c1 = 0xcc9e2d51;\n let c2 = 0x1b873593;\n let i = 0;\n\n while (i < bytes) {\n let k1 =\n (key.charCodeAt(i) & 0xff) |\n ((key.charCodeAt(++i) & 0xff) << 8) |\n ((key.charCodeAt(++i) & 0xff) << 16) |\n ((key.charCodeAt(++i) & 0xff) << 24);\n ++i;\n\n k1 = Math.imul(k1, c1);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = Math.imul(k1, c2);\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = Math.imul(h1, 5) + 0xe6546b64;\n }\n\n let k1 = 0;\n switch (remainder) {\n case 3:\n k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n case 2:\n k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n case 1:\n k1 ^= key.charCodeAt(i) & 0xff;\n k1 = Math.imul(k1, c1);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = Math.imul(k1, c2);\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n h1 ^= h1 >>> 16;\n h1 = Math.imul(h1, 0x85ebca6b);\n h1 ^= h1 >>> 13;\n h1 = Math.imul(h1, 0xc2b2ae35);\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n\nexport function hashToFloat(seed: string, value: string): number {\n const hash = murmurhash3_32_gc(seed + value, 1);\n return (hash % 10000) / 10000;\n}\n\nexport function variationHashToFloat(experimentId: string, value: string): number {\n return hashToFloat(`${experimentId}:variation`, value);\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let out = \"\";\n for (let i = 0; i < bytes.length; i++) {\n out += bytes[i].toString(16).padStart(2, \"0\");\n }\n return out;\n}\n\nfunction generateId(): string {\n if (globalThis.crypto && globalThis.crypto.getRandomValues) {\n const bytes = new Uint8Array(16);\n globalThis.crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport function configureIdentityStorage(settings?: {\n storageMode?: StorageMode;\n encodeStorageValues?: boolean;\n cookieDomain?: string;\n}): void {\n storageMode = settings?.storageMode ?? \"localStorage\";\n encodeStorageValues = settings?.encodeStorageValues === true;\n cookieDomain = normalizeCookieDomain(settings?.cookieDomain);\n}\n\nfunction normalizeCookieDomain(value: string | undefined): string {\n const normalized = (value ?? \"\")\n .trim()\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/\\/.*$/, \"\")\n .replace(/[?#].*$/, \"\")\n .replace(/:\\d+$/, \"\")\n .toLowerCase();\n if (!normalized || normalized === \"localhost\" || normalized.includes(\":\")) return \"\";\n const candidate = normalized.replace(/^\\.+/, \".\");\n const labels = candidate.replace(/^\\./, \"\").split(\".\");\n return labels.length > 1\n && labels.every((label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label))\n ? candidate\n : \"\";\n}\n\nfunction encodeStoredValue(value: string): string {\n if (!encodeStorageValues) return value;\n try {\n return \"b64:\" + btoa(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n } catch {\n return value;\n }\n}\n\nfunction decodeStoredValue(value: string | null): string | null {\n if (!value) return null;\n if (!value.startsWith(\"b64:\")) return value;\n try {\n const raw = value.slice(4).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = raw + \"=\".repeat((4 - (raw.length % 4)) % 4);\n return atob(padded);\n } catch {\n return null;\n }\n}\n\n/**\n * Lifetime (cross-session) storage permitted by the configured identity\n * storage mode. Only localStorage mode has one; sessionStorage/memory/cookie\n * modes return null so lifetime counters stay unpersisted under them.\n */\nexport function lifetimeIdentityStorage(): Storage | null {\n if (storageMode !== \"localStorage\") return null;\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction browserStorage(): Storage | null {\n try {\n if (storageMode === \"sessionStorage\") return globalThis.sessionStorage ?? null;\n if (storageMode === \"localStorage\") return globalThis.localStorage ?? null;\n return null;\n } catch {\n return null;\n }\n}\n\nfunction readStorage(): string | null {\n if (storageMode === \"memory\") return memoryUserId;\n if (storageMode === \"cookie\") return null;\n try {\n return decodeStoredValue(browserStorage()?.getItem(UID_KEY) || null);\n } catch {\n return null;\n }\n}\n\nfunction writeStorage(value: string): void {\n if (storageMode === \"memory\") {\n memoryUserId = value;\n return;\n }\n if (storageMode === \"cookie\") return;\n try {\n browserStorage()?.setItem(UID_KEY, encodeStoredValue(value));\n } catch {\n // ignore\n }\n}\n\nfunction readCookie(): string | null {\n if (!globalThis.document?.cookie) return null;\n const match = globalThis.document.cookie.match(\n new RegExp(\"(^| )\" + UID_KEY + \"=([^;]+)\"),\n );\n return match ? decodeStoredValue(decodeURIComponent(match[2])) : null;\n}\n\nfunction writeCookie(value: string): void {\n if (!globalThis.document) return;\n const expires = new Date(Date.now() + 365 * 864e5).toUTCString();\n const domain = cookieDomain ? \"; domain=\" + cookieDomain : \"\";\n globalThis.document.cookie =\n UID_KEY + \"=\" + encodeURIComponent(encodeStoredValue(value)) + \"; expires=\" + expires + \"; path=/\" + domain;\n}\n\nexport function getUserId(provided?: string): string {\n if (provided) return provided;\n const existing = readStorage() || readCookie();\n if (existing) return existing;\n const created = generateId();\n writeStorage(created);\n if (storageMode !== \"memory\") writeCookie(created);\n return created;\n}\n\nexport function getEphemeralUserId(provided?: string): string {\n return provided || generateId();\n}\n\nexport function adoptUserId(value: string): void {\n if (!value) return;\n writeStorage(value);\n if (storageMode !== \"memory\") writeCookie(value);\n}\n","const BOT_RE = /bot|google|crawler|spider|robot|crawling|facebookexternalhit|bingpreview|slurp/i;\n\nexport function isBot(): boolean {\n return BOT_RE.test(navigator.userAgent);\n}\n\nexport function isIframe(): boolean {\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nexport function isDuplicate(): boolean {\n if ((globalThis as Record<string, unknown>).__drip) return true;\n (globalThis as Record<string, unknown>).__drip = true;\n return false;\n}\n\nexport function isOptedOut(options?: { storageAllowed?: boolean }): boolean {\n const storageAllowed = options?.storageAllowed !== false;\n const param = new URLSearchParams(location.search).get(\"drip_optout\");\n if (param === \"true\") {\n if (storageAllowed) {\n try {\n localStorage.setItem(\"drip_optout\", \"1\");\n } catch {}\n }\n return true;\n }\n if (param === \"false\") {\n if (storageAllowed) {\n try {\n localStorage.removeItem(\"drip_optout\");\n } catch {}\n }\n return false;\n }\n if (!storageAllowed) return false;\n try {\n return localStorage.getItem(\"drip_optout\") === \"1\";\n } catch {\n return false;\n }\n}\n\nexport function isScreenshotMode(): boolean {\n const param = new URLSearchParams(location.search).get(\"drip_screenshot\");\n return param === \"1\" || param === \"true\";\n}\n\nconst FORCE_EXPERIMENT_PARAM_NAMES = [\n \"drip_experiment_id\",\n \"drip_experiment\",\n \"experiment_id\",\n \"experimentId\",\n \"expId\",\n];\n\nconst FORCE_VARIATION_PARAM_NAMES = [\n \"drip_variation_id\",\n \"drip_variation\",\n \"variation_id\",\n \"variationId\",\n \"varId\",\n];\n\nfunction readFirstParam(params: URLSearchParams, names: string[]): string | null {\n for (const name of names) {\n const value = params.get(name)?.trim();\n if (value) return value;\n }\n return null;\n}\n\nfunction parseForceParams(params: URLSearchParams): Record<string, string> | null {\n const param = params.get(\"drip_force\");\n if (param) {\n const map = parseForceString(param);\n if (map) return map;\n }\n\n const experimentId = readFirstParam(params, FORCE_EXPERIMENT_PARAM_NAMES);\n const variationId = readFirstParam(params, FORCE_VARIATION_PARAM_NAMES);\n if (experimentId && variationId) {\n return { [experimentId]: variationId };\n }\n return null;\n}\n\nfunction isDebugQaParam(params: URLSearchParams): boolean {\n return (\n params.get(\"drip_debug\") === \"1\" ||\n params.get(\"apex_debug\") === \"1\" ||\n params.get(\"drip_devtools\") === \"1\"\n );\n}\n\nexport function parseForceParam(options?: { cookieFallback?: boolean }): Record<string, string> | null {\n // Check URL param first\n const map = parseForceParams(new URLSearchParams(location.search));\n if (map) return map;\n\n // Fallback to QA cookie\n if (options?.cookieFallback !== false) {\n const cookie = readCookie(\"drip_qa_force\");\n if (cookie) {\n const map = parseForceString(cookie);\n if (map) return map;\n }\n }\n\n return null;\n}\n\nfunction parseForceString(value: string): Record<string, string> | null {\n const map: Record<string, string> = {};\n for (const pair of value.split(\",\")) {\n const [expId, varId] = pair.split(\":\");\n if (expId && varId) map[expId] = varId;\n }\n return Object.keys(map).length ? map : null;\n}\n\n// ---------------------------------------------------------------------------\n// QA mode detection and cookie persistence\n// ---------------------------------------------------------------------------\n\nconst QA_COOKIE = \"drip_qa_force\";\nconst QA_SESSION_STORAGE_KEY = \"drip_qa_session\";\nconst QA_COOKIE_MAX_AGE = 1800; // 30 minutes\n\nexport function isQaMode(options?: { cookieFallback?: boolean }): boolean {\n if (isScreenshotMode()) return false;\n const params = new URLSearchParams(location.search);\n const param = params.get(\"drip_qa\");\n if (param === \"1\") return true;\n if (isDebugQaParam(params) && parseForceParams(params)) return true;\n if (options?.cookieFallback === false) return false;\n return !!readCookie(QA_COOKIE);\n}\n\n/**\n * Persist the force map in a cookie so QA sessions survive navigation.\n * Cookie expires after 30 minutes.\n */\nexport function persistQaForce(forceMap: Record<string, string>): void {\n const value = Object.entries(forceMap)\n .map(([k, v]) => `${k}:${v}`)\n .join(\",\");\n writeCookie(QA_COOKIE, value, QA_COOKIE_MAX_AGE);\n}\n\nfunction sanitizeQaSessionId(value: string | null): string | null {\n if (!value) return null;\n const trimmed = value.trim();\n return /^[a-zA-Z0-9_-]{3,120}$/.test(trimmed) ? trimmed : null;\n}\n\nexport function getQaSessionId(fallback: () => string, options?: { storageAllowed?: boolean }): string {\n const storageAllowed = options?.storageAllowed !== false;\n const param = sanitizeQaSessionId(\n new URLSearchParams(location.search).get(\"drip_qa_session\"),\n );\n if (param) {\n if (storageAllowed) {\n try {\n sessionStorage.setItem(QA_SESSION_STORAGE_KEY, param);\n } catch {}\n }\n return param;\n }\n\n if (!storageAllowed) return fallback();\n\n try {\n const stored = sanitizeQaSessionId(sessionStorage.getItem(QA_SESSION_STORAGE_KEY));\n if (stored) return stored;\n const generated = fallback();\n sessionStorage.setItem(QA_SESSION_STORAGE_KEY, generated);\n return generated;\n } catch {\n return fallback();\n }\n}\n\n/**\n * Exit QA mode: clear the force cookie and remove drip_qa/drip_force from URL.\n */\nexport function exitQaMode(): void {\n deleteCookie(QA_COOKIE);\n try {\n sessionStorage.removeItem(QA_SESSION_STORAGE_KEY);\n } catch {}\n // Remove QA params from URL without reload\n try {\n const url = new URL(location.href);\n url.searchParams.delete(\"drip_qa\");\n url.searchParams.delete(\"drip_force\");\n url.searchParams.delete(\"drip_experiment_id\");\n url.searchParams.delete(\"drip_experiment\");\n url.searchParams.delete(\"experiment_id\");\n url.searchParams.delete(\"experimentId\");\n url.searchParams.delete(\"expId\");\n url.searchParams.delete(\"drip_variation_id\");\n url.searchParams.delete(\"drip_variation\");\n url.searchParams.delete(\"variation_id\");\n url.searchParams.delete(\"variationId\");\n url.searchParams.delete(\"varId\");\n url.searchParams.delete(\"drip_qa_session\");\n url.searchParams.delete(\"drip_harness\");\n url.searchParams.delete(\"drip_debug\");\n url.searchParams.delete(\"apex_debug\");\n history.replaceState(null, \"\", url.toString());\n } catch {}\n}\n\n// ---------------------------------------------------------------------------\n// Cookie helpers\n// ---------------------------------------------------------------------------\n\nexport function readCookie(name: string): string | null {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : null;\n } catch {\n return null;\n }\n}\n\nexport function writeCookie(name: string, value: string, maxAge: number): void {\n try {\n document.cookie = `${name}=${encodeURIComponent(value)};path=/;max-age=${maxAge};samesite=lax`;\n } catch {}\n}\n\nexport function deleteCookie(name: string): void {\n try {\n document.cookie = `${name}=;path=/;max-age=0;samesite=lax`;\n } catch {}\n}\n\n/** @internal — exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n parseForceString,\n parseForceParams,\n sanitizeQaSessionId,\n BOT_RE,\n};\n","import type { Assignment, ExclusionGroupConfig } from \"./types\";\nimport { hashToFloat } from \"./hash\";\nimport { chooseVariation } from \"./bucket\";\nimport { deleteCookie, readCookie, writeCookie } from \"./guards\";\n\nconst STORAGE_KEY = \"drip_xgroups_v1\"; // gitleaks:allow — public storage key name, not a credential\nconst COOKIE_NAME = \"drip_xgroups_v1\";\nconst COOKIE_MAX_AGE_SECONDS = 365 * 24 * 60 * 60;\n\n/** A remembered group decision: which member won and at what group epoch. */\nexport type PersistedGroupSelection = {\n experimentId: string;\n epoch: number;\n};\n\n/** Pluggable persistence so the runtime uses browser storage and tests use memory. */\nexport interface GroupStickyStore {\n read(groupId: string): PersistedGroupSelection | null;\n write(groupId: string, selection: PersistedGroupSelection): void;\n}\n\ntype CompactSelection = [string, number];\ntype CompactStore = Record<string, CompactSelection>;\n\nfunction normalizeEpoch(epoch: number | null | undefined): number {\n return Number.isFinite(epoch) ? Math.max(1, Math.floor(epoch as number)) : 1;\n}\n\nfunction parseStore(raw: string | null): CompactStore {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as CompactStore)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction readLocalStorage(): string | null {\n try {\n return globalThis.localStorage?.getItem(STORAGE_KEY) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction readCompactStore(): CompactStore {\n return {\n ...parseStore(readLocalStorage()),\n ...parseStore(readCookie(COOKIE_NAME)),\n };\n}\n\nfunction writeCompactStore(store: CompactStore): void {\n const serialized = JSON.stringify(store);\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, serialized);\n } catch {\n // best-effort\n }\n writeCookie(COOKIE_NAME, serialized, COOKIE_MAX_AGE_SECONDS);\n}\n\n/** Browser-backed store (localStorage + cookie mirror) used by the live runtime. */\nexport const browserGroupStickyStore: GroupStickyStore = {\n read(groupId) {\n const record = readCompactStore()[groupId];\n return Array.isArray(record) &&\n typeof record[0] === \"string\" &&\n typeof record[1] === \"number\"\n ? { experimentId: record[0], epoch: record[1] }\n : null;\n },\n write(groupId, selection) {\n const store = readCompactStore();\n store[groupId] = [selection.experimentId, normalizeEpoch(selection.epoch)];\n writeCompactStore(store);\n },\n};\n\n/** Remove consent-gated group stickiness from both browser persistence planes. */\nexport function clearBrowserGroupStickyStore(): void {\n try {\n globalThis.localStorage?.removeItem(STORAGE_KEY);\n } catch {\n // best-effort\n }\n deleteCookie(COOKIE_NAME);\n}\n\n/** In-memory store for tests and non-persistent (QA / no-consent) contexts. */\nexport function createMemoryGroupStickyStore(): GroupStickyStore {\n const map = new Map<string, PersistedGroupSelection>();\n return {\n read: (groupId) => map.get(groupId) ?? null,\n write: (groupId, selection) =>\n void map.set(groupId, {\n experimentId: selection.experimentId,\n epoch: normalizeEpoch(selection.epoch),\n }),\n };\n}\n\nexport interface ExclusionGroupDecision {\n groupId: string;\n /** Eligible, non-forced members that overlapped for this visitor. */\n conflictingExperimentIds: string[];\n winnerExperimentId: string | null;\n suppressedExperimentIds: string[];\n /** True when the winner was carried over from a prior sticky selection. */\n sticky: boolean;\n}\n\nexport interface ResolveExclusionGroupsResult {\n assignments: Assignment[];\n decisions: ExclusionGroupDecision[];\n}\n\n/**\n * Second pass of the overlap-then-pick model.\n *\n * `assignments` are the pass-one winners (each experiment already evaluated its\n * own status, targeting, exposure, sticky assignment and variation split). Here\n * we detect members of the same exclusion group that BOTH became eligible for\n * this visitor (overlap) and keep exactly one — chosen by a group-deterministic\n * hash weighted by each conflicting member's share, re-normalized across only\n * the conflicting members. A previously assigned member stays sticky while it\n * remains eligible; if it drops out we reselect among the current conflicting\n * members. Forced (QA preview) members bypass exclusion entirely.\n */\nexport function resolveExclusionGroups(\n assignments: Assignment[],\n groups: ExclusionGroupConfig[] | undefined,\n ctx: {\n userId: string;\n forcedExperimentIds?: Iterable<string>;\n store?: GroupStickyStore;\n persist?: boolean;\n },\n): ResolveExclusionGroupsResult {\n const decisions: ExclusionGroupDecision[] = [];\n if (!groups || groups.length === 0) {\n return { assignments, decisions };\n }\n\n const persist = ctx.persist !== false;\n const forced = new Set(ctx.forcedExperimentIds ?? []);\n // Persistence-disabled contexts skip sticky reads and writes below, so they\n // cannot inherit a prior browser or injected winner.\n const store = ctx.store ?? browserGroupStickyStore;\n\n // experimentId -> its pass-one assignment (only eligible experiments appear).\n const assignedById = new Map<string, Assignment>();\n for (const assignment of assignments) {\n assignedById.set(assignment.experimentId, assignment);\n }\n\n const suppressed = new Set<string>();\n\n for (const group of groups) {\n if (\n !group?.id ||\n !Array.isArray(group.members) ||\n group.members.length === 0\n ) {\n continue;\n }\n const epoch = normalizeEpoch(group.epoch);\n const hasForcedAssignment = group.members.some(\n (member) =>\n assignedById.has(member.experimentId) &&\n forced.has(member.experimentId),\n );\n const persistGroupSelection = persist && !hasForcedAssignment;\n\n // Conflicting = eligible (assigned this pass) AND not forced for QA preview.\n const conflicting = group.members.filter(\n (member) =>\n assignedById.has(member.experimentId) &&\n !forced.has(member.experimentId),\n );\n\n if (conflicting.length <= 1) {\n // Zero or one eligible member → no exclusion decision. Remember a lone\n // positive-share member so it stays sticky if another member overlaps\n // later. A 0% member must never gain priority merely by appearing alone.\n if (\n conflicting.length === 1 &&\n conflicting[0].share > 0 &&\n persistGroupSelection\n ) {\n store.write(group.id, {\n experimentId: conflicting[0].experimentId,\n epoch,\n });\n }\n continue;\n }\n\n const conflictingIds = conflicting.map((member) => member.experimentId);\n\n // Sticky: keep the prior winner while it stays eligible at the current epoch.\n const prior = persistGroupSelection ? store.read(group.id) : null;\n let winnerId: string;\n let sticky = false;\n const priorMember = prior\n ? conflicting.find((member) => member.experimentId === prior.experimentId)\n : undefined;\n const hasPositiveWeight = conflicting.some((member) => member.share > 0);\n if (\n prior &&\n prior.epoch === epoch &&\n priorMember &&\n (priorMember.share > 0 || !hasPositiveWeight)\n ) {\n winnerId = prior.experimentId;\n sticky = true;\n } else {\n // Deterministic pick across only the conflicting members, weighted by share.\n const configuredWeights = conflicting.map((member) =>\n Number.isFinite(member.share) && member.share > 0 ? member.share : 0,\n );\n // A degenerate all-zero conflicting subset can happen after eligibility\n // filtering. Keep the decision fair and deterministic instead of letting\n // the generic bucket helper silently favor the first member.\n const weights = configuredWeights.some((weight) => weight > 0)\n ? configuredWeights\n : configuredWeights.map(() => 1);\n const hashValue = hashToFloat(`${group.id}:exclusion`, ctx.userId);\n const index = chooseVariation(hashValue, weights);\n winnerId =\n conflicting[Math.max(0, Math.min(index, conflicting.length - 1))]\n .experimentId;\n if (persistGroupSelection) {\n store.write(group.id, { experimentId: winnerId, epoch });\n }\n }\n\n const suppressedIds = conflictingIds.filter((id) => id !== winnerId);\n for (const id of suppressedIds) suppressed.add(id);\n\n decisions.push({\n groupId: group.id,\n conflictingExperimentIds: conflictingIds,\n winnerExperimentId: winnerId,\n suppressedExperimentIds: suppressedIds,\n sticky,\n });\n }\n\n if (suppressed.size === 0) {\n return { assignments, decisions };\n }\n\n return {\n assignments: assignments.filter(\n (assignment) => !suppressed.has(assignment.experimentId),\n ),\n decisions,\n };\n}\n\nexport const __exclusionGroupInternals = {\n STORAGE_KEY,\n COOKIE_NAME,\n parseStore,\n normalizeEpoch,\n};\n","export type MoneyConvention = {\n decimal: \".\" | \",\";\n group: string;\n decimals: number;\n minorUnits: number;\n};\n\nexport type DisplayedMoney = {\n cents: number;\n convention: MoneyConvention;\n start: number;\n end: number;\n};\n\nexport function parseDisplayedCents(text: string, minorUnits = 2): DisplayedMoney | null {\n const pattern = /\\d(?:[\\d.,\\u00a0 ]*\\d)?/g;\n const match = pattern.exec(text);\n if (!match || pattern.exec(text)) return null;\n const raw = match[0];\n const compact = raw.replace(/[ \\u00a0]/g, \"\");\n const separator = Math.max(compact.lastIndexOf(\".\"), compact.lastIndexOf(\",\"));\n const trailing = separator < 0 ? 0 : compact.length - separator - 1;\n const decimals = trailing && trailing <= minorUnits ? trailing : 0;\n\n const visibleDecimal = decimals ? compact[separator] as \".\" | \",\" : null;\n const groupMatch = raw.slice(0, visibleDecimal ? raw.lastIndexOf(visibleDecimal) : raw.length).match(/[.,\\u00a0 ]/);\n const group = groupMatch?.[0] ?? \"\";\n // When the display has grouping but no decimals (for example `1.299`),\n // preserve the locale's opposite separator for a treatment that introduces\n // a fractional amount. Reusing the group separator would produce `1.149.95`.\n const decimal = visibleDecimal ?? (group === \".\" ? \",\" : \".\");\n const majorText = (decimals ? compact.slice(0, separator) : compact).replace(/[.,]/g, \"\");\n const fraction = decimals ? compact.slice(separator + 1) : \"\";\n const scale = 10 ** minorUnits;\n const cents = Number(majorText) * scale + Number((fraction + \"0\".repeat(minorUnits)).slice(0, minorUnits) || 0);\n return {\n cents,\n convention: { decimal, group, decimals, minorUnits },\n start: match.index,\n end: match.index + raw.length,\n };\n}\n\nexport function formatCentsLike(cents: number, convention: MoneyConvention): string {\n const scale = 10 ** convention.minorUnits;\n let major = String(Math.floor(cents / scale));\n if (convention.group) major = major.replace(/\\B(?=(\\d{3})+(?!\\d))/g, convention.group);\n const remainder = cents % scale;\n const decimals = convention.decimals || (remainder ? convention.minorUnits : 0);\n return decimals\n ? major + convention.decimal + String(remainder).padStart(convention.minorUnits, \"0\").slice(0, decimals)\n : major;\n}\n","import type { Assignment, CommercePriceSettings } from \"./types\";\nimport { formatCentsLike, parseDisplayedCents } from \"./money\";\n\ntype PriceAssignmentAuthorization = (assignment: Assignment) => boolean;\n\nexport const COMMERCE_PRICE_SELECTORS =\n '.price,.price__regular,.price-item,.price-item--regular,.product__price,.product-price,[data-price],[itemprop=\"price\"]'.split(\n \",\",\n );\nexport const COMMERCE_PRICE_EXCLUSIONS =\n 's,del,.price__compare,.price-item--compare,[class*=\"compare-at\"]'.split(\",\");\n\ntype ShopifyWindow = Window & {\n Shopify?: { currency?: { active?: string } };\n ShopifyAnalytics?: {\n meta?: {\n page?: { pageType?: string; handle?: string };\n product?: {\n handle?: string;\n variants?: Array<{ id?: string | number; price?: string | number }>;\n };\n };\n };\n};\n\nconst ZERO_DECIMAL =\n /^(BIF|CLP|DJF|GNF|ISK|JPY|KMF|KRW|PYG|RWF|UGX|VND|VUV|XAF|XOF|XPF)$/;\nlet observer: MutationObserver | null = null;\nlet rootObserver: MutationObserver | null = null;\nlet variantForm: HTMLFormElement | null = null;\nconst handleVariantFormEvent = () => guardedSwapPass();\nlet originals = new Map<Text, { original: string; applied: string }>();\nlet originalAriaLabels = new Map<\n Element,\n { original: string; applied: string }\n>();\nlet compareAtNodes: HTMLElement[] = [];\nlet hiddenCompareAtNodes = new Map<HTMLElement, string>();\nlet renderedDisplayAssignment: Assignment | null = null;\nlet exposureChanged: (() => void) | undefined;\nlet current: {\n settings: CommercePriceSettings;\n assignments: Assignment[];\n isCohortStampedOnCart: () => boolean | \"pending\";\n isAssignmentAuthorized: PriceAssignmentAuthorization;\n} | null = null;\nlet applying = false;\nlet metaRetryTimer: ReturnType<typeof setTimeout> | null = null;\nlet stampCheckTimer: ReturnType<typeof setTimeout> | null = null;\nlet stampCheckDeadline = 0;\nlet pendingActivation: {\n settings: CommercePriceSettings;\n assignments: Assignment[];\n isCohortStampedOnCart: () => boolean | \"pending\";\n deadline: number;\n onResolved?: () => void;\n isAssignmentAuthorized: PriceAssignmentAuthorization;\n} | null = null;\n\n/** Whether price teardown has state to restore, disconnect, or cancel. */\nexport function hasCommercePriceState(): boolean {\n return (\n observer !== null ||\n rootObserver !== null ||\n originals.size > 0 ||\n originalAriaLabels.size > 0 ||\n current !== null ||\n applying ||\n metaRetryTimer !== null ||\n stampCheckTimer !== null ||\n pendingActivation !== null\n );\n}\n\n/**\n * How long activation may wait for the cohort stamp to be confirmed. The tested\n * price is not shown until Shopify has accepted the signed cart attributes — a\n * shopper must never be shown a price we cannot prove Shopify will charge.\n */\nconst STAMP_CONFIRM_TIMEOUT_MS = 8000;\n\n/**\n * Shopify populates ShopifyAnalytics.meta.product AFTER the SDK boots (measured on a\n * live storefront: SDK at 43ms, meta.product still absent at 46ms). Activation must\n * therefore be retried instead of failing permanently, or the swap never runs on a\n * real store.\n */\nconst META_RETRY_INTERVAL_MS = 60;\nconst META_RETRY_WINDOW_MS = 5000;\n\nfunction shopifyProductMetaReady(): boolean {\n if (typeof window === \"undefined\") return false;\n const meta = (window as ShopifyWindow).ShopifyAnalytics?.meta;\n return Boolean(\n (window as ShopifyWindow).Shopify && Array.isArray(meta?.product?.variants),\n );\n}\n\nfunction cancelMetaRetry(): void {\n if (metaRetryTimer != null) clearTimeout(metaRetryTimer);\n metaRetryTimer = null;\n}\n\nfunction cancelStampCheck(): void {\n if (stampCheckTimer != null) clearTimeout(stampCheckTimer);\n stampCheckTimer = null;\n stampCheckDeadline = 0;\n}\n\nfunction scheduleStampCheck(): void {\n if (stampCheckTimer != null) return;\n if (stampCheckDeadline === 0)\n stampCheckDeadline = Date.now() + STAMP_CONFIRM_TIMEOUT_MS;\n stampCheckTimer = setTimeout(() => {\n stampCheckTimer = null;\n if (!current) return;\n const status = current.isCohortStampedOnCart();\n if (status === false) {\n // The cohort will never reach the cart: restore the published price.\n cleanupCommercePrice();\n return;\n }\n if (status === \"pending\") {\n if (Date.now() >= stampCheckDeadline) {\n // Unconfirmed for too long — fail closed rather than keep showing a price\n // the Cart Transform may not apply.\n cleanupCommercePrice();\n return;\n }\n scheduleStampCheck();\n }\n }, 25);\n}\n\nfunction activeExperiments(\n settings: CommercePriceSettings,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n) {\n if (typeof window === \"undefined\") return [];\n const w = window as ShopifyWindow;\n const meta = w.ShopifyAnalytics?.meta;\n if (\n !w.Shopify ||\n meta?.page?.pageType !== \"product\" ||\n !Array.isArray(meta.product?.variants)\n )\n return [];\n const currency = w.Shopify.currency?.active;\n const pageVariantIds = new Set(\n meta.product.variants\n .filter((variant) => variant.id != null)\n .map((variant) => String(variant.id)),\n );\n const active = [];\n for (const experiment of settings.experiments) {\n const assignment = assignments.find(\n (item) => item.experimentId === experiment.experiment_id,\n );\n const adjustments = assignment\n ? experiment.variants[assignment.variationId]\n : undefined;\n const targetsCurrentProduct = adjustments?.some((adjustment) => {\n const variantId = adjustment.variant_gid.split(\"/\").pop();\n return variantId != null && pageVariantIds.has(variantId);\n });\n const epochMatches =\n experiment.assignment_epoch == null ||\n experiment.assignment_epoch === assignment?.assignmentEpoch;\n if (\n assignment &&\n isAssignmentAuthorized(assignment) &&\n epochMatches &&\n !assignment.isControl &&\n currency === experiment.currency &&\n adjustments &&\n targetsCurrentProduct\n ) {\n active.push({ experiment, assignment, currency });\n }\n }\n return active;\n}\n\nfunction hasActiveChargedPrice(\n settings: CommercePriceSettings,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization,\n): boolean {\n const active = activeExperiments(\n settings,\n assignments,\n isAssignmentAuthorized,\n );\n if (active.length > 0)\n return active.some(({ experiment, assignment }) =>\n experiment.variants[assignment.variationId]?.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n ),\n );\n // Before metadata or authorization arrives, retain the strict charged-arm\n // barrier so activation can be revisited when the cart proof lands.\n return settings.experiments.some((experiment) => {\n const assignment = assignments.find(\n (candidate) =>\n candidate.experimentId === experiment.experiment_id &&\n !candidate.isControl,\n );\n return Boolean(\n assignment &&\n (experiment.assignment_epoch == null ||\n experiment.assignment_epoch === assignment.assignmentEpoch) &&\n experiment.variants[assignment.variationId]?.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n ),\n );\n });\n}\n\n/**\n * True when a price treatment is assigned AND the page either is eligible now or could\n * still become eligible (Shopify has not published product metadata yet). The reveal\n * barrier uses this so a metadata-late PDP cannot flash the ORIGINAL price before the\n * swap lands. The anti-flicker timeout still caps how long content can stay hidden.\n */\nexport function isCommercePriceWorkPending(\n settings: CommercePriceSettings | undefined,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): boolean {\n if (!settings) return false;\n if (isCommercePriceActive(settings, assignments, isAssignmentAuthorized))\n return true;\n if (shopifyProductMetaReady()) return false;\n return settings.experiments.some((experiment) =>\n assignments.some(\n (assignment) =>\n assignment.experimentId === experiment.experiment_id &&\n isAssignmentAuthorized(assignment) &&\n !assignment.isControl &&\n (experiment.assignment_epoch == null ||\n experiment.assignment_epoch === assignment.assignmentEpoch),\n ),\n );\n}\n\nexport function isCommercePriceActive(\n settings: CommercePriceSettings | undefined,\n assignments: Assignment[],\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): boolean {\n try {\n return Boolean(\n settings &&\n activeExperiments(settings, assignments, isAssignmentAuthorized).length,\n );\n } catch {\n return false;\n }\n}\n\nfunction isStrictlyLowerPrice(candidate: string, current: string): boolean {\n return Number(candidate) < Number(current);\n}\n\nfunction treatmentUnits(value: string, minorUnits: number): number | null {\n const match = value.match(/^(\\d+)(?:\\.(\\d+))?$/);\n if (!match) return null;\n const fraction = match[2] ?? \"\";\n const discarded = fraction.slice(minorUnits);\n if (/[^0]/.test(discarded)) return null;\n const units = Number(\n match[1] + (fraction + \"0\".repeat(minorUnits)).slice(0, minorUnits),\n );\n return Number.isSafeInteger(units) ? units : null;\n}\n\nfunction replaceNumericText(\n value: string,\n targets: Map<number, number>,\n minorUnits: number,\n): string | null {\n const parsed = parseDisplayedCents(value, minorUnits);\n if (!parsed) return null;\n const replacement = targets.get(parsed.cents);\n if (replacement == null || Number.isNaN(replacement)) return null;\n return (\n value.slice(0, parsed.start) +\n formatCentsLike(replacement, parsed.convention) +\n value.slice(parsed.end)\n );\n}\n\nfunction applyAccessibleLabel(\n node: Text,\n container: Element,\n targets: Map<number, number>,\n minorUnits: number,\n): void {\n const labelled = node.parentElement?.closest(\"[aria-label]\");\n if (!labelled || !container.contains(labelled)) return;\n const label = labelled.getAttribute(\"aria-label\");\n if (label == null) return;\n const replacement = replaceNumericText(label, targets, minorUnits);\n if (replacement == null || replacement === label) return;\n const previous = originalAriaLabels.get(labelled);\n originalAriaLabels.set(labelled, {\n original:\n previous && label === previous.applied ? previous.original : label,\n applied: replacement,\n });\n labelled.setAttribute(\"aria-label\", replacement);\n}\n\nfunction guardedSwapPass(): void {\n try {\n swapPass();\n } catch {\n cleanupCommercePrice();\n }\n}\n\nfunction productHandleFromUrl(value: string): string | null {\n try {\n const path = new URL(value, location.href).pathname;\n const match = path.match(/\\/products\\/([^/]+)/i);\n return match?.[1] ? decodeURIComponent(match[1]).toLowerCase() : null;\n } catch {\n return null;\n }\n}\n\nfunction currentProductHandle(): string | null {\n const meta = (window as ShopifyWindow).ShopifyAnalytics?.meta;\n const metadataHandle = meta?.page?.handle ?? meta?.product?.handle;\n if (typeof metadataHandle === \"string\" && metadataHandle.trim()) {\n return metadataHandle.trim().toLowerCase();\n }\n const canonical = document.querySelector<HTMLLinkElement>(\n 'link[rel=\"canonical\"][href]',\n );\n return canonical ? productHandleFromUrl(canonical.href) : null;\n}\n\nfunction isElementLinkedToDifferentProduct(\n node: Element,\n currentHandle: string | null,\n): boolean {\n const wrappingAnchor = node.closest<HTMLAnchorElement>(\n 'a[href*=\"/products/\"]',\n );\n const labelledContainer = node.closest(\n \"li,article,[data-product-id],[class*='product-card'],[class*='product-item'],[class*='card']\",\n );\n const siblingContainer =\n node.parentElement && node.parentElement !== document.body\n ? node.parentElement\n : null;\n const container = labelledContainer ?? siblingContainer;\n const productAnchors = container\n ? Array.from(\n container.querySelectorAll<HTMLAnchorElement>('a[href*=\"/products/\"]'),\n ).filter(\n (candidate) =>\n labelledContainer != null || candidate.parentElement === container,\n )\n : [];\n const linkedHandles = new Set(\n productAnchors\n .map((candidate) => productHandleFromUrl(candidate.href))\n .filter((handle): handle is string => handle != null),\n );\n // A descendant link is ownership evidence only inside the nearest explicit\n // product/card container (or the price's direct parent for sibling labels),\n // and only when that container identifies one product. A recommendation\n // elsewhere under a broad PDP ancestor must not claim the main price.\n const anchor =\n wrappingAnchor ??\n (linkedHandles.size === 1 ? (productAnchors[0] ?? null) : null);\n if (!anchor) return false;\n const linkedHandle = productHandleFromUrl(anchor.href);\n if (!linkedHandle) return false;\n // If current-product identity is unavailable, fail open only for unlinked\n // candidates: rewriting any product-linked price could corrupt another item.\n return currentHandle == null || linkedHandle !== currentHandle;\n}\n\nfunction isLinkedToDifferentProduct(\n node: Text,\n currentHandle: string | null,\n): boolean {\n return node.parentElement\n ? isElementLinkedToDifferentProduct(node.parentElement, currentHandle)\n : currentHandle == null;\n}\n\nfunction currentVariantId(\n variants: Array<{ id?: string | number; price?: string | number }>,\n): string | null {\n const currentHandle = currentProductHandle();\n const productForm = Array.from(\n document.querySelectorAll<HTMLFormElement>('form[action*=\"/cart/add\"]'),\n ).find((form) => !isElementLinkedToDifferentProduct(form, currentHandle));\n const selected = productForm?.querySelector<\n HTMLInputElement | HTMLSelectElement\n >(\n \"[name=id][type=radio]:checked,select[name=id],input[name=id]:not([type=radio])\",\n )?.value;\n if (selected && variants.some((variant) => String(variant.id) === selected))\n return selected;\n const urlVariant = new URL(location.href).searchParams.get(\"variant\");\n if (\n urlVariant &&\n variants.some((variant) => String(variant.id) === urlVariant)\n )\n return urlVariant;\n return variants.length === 1 && variants[0]?.id != null\n ? String(variants[0].id)\n : null;\n}\n\nfunction swapPass(): void {\n if (!current || applying) return;\n const stampStatus = hasActiveChargedPrice(\n current.settings,\n current.assignments,\n current.isAssignmentAuthorized,\n )\n ? current.isCohortStampedOnCart()\n : true;\n if (stampStatus === false) {\n cleanupCommercePrice();\n return;\n }\n if (stampStatus === \"pending\") scheduleStampCheck();\n applying = true;\n try {\n const active = activeExperiments(\n current.settings,\n current.assignments,\n current.isAssignmentAuthorized,\n );\n const variants = (window as ShopifyWindow).ShopifyAnalytics?.meta?.product\n ?.variants;\n if (!active.length || !Array.isArray(variants)) return;\n const currency = active[0]!.currency;\n const minorUnits = ZERO_DECIMAL.test(currency) ? 0 : 2;\n // ShopifyAnalytics keeps prices on Shopify's two-decimal stored scale even\n // when the storefront formats a zero-decimal currency such as JPY.\n const shopifyStoredScale = minorUnits ? 1 : 100;\n const published = new Map<string, number>();\n for (const variant of variants) {\n const price = Number(variant.price);\n if (variant.id != null && Number.isSafeInteger(price) && price >= 0)\n published.set(String(variant.id), price);\n }\n const selectedByVariant = new Map<string, string>();\n for (const candidate of active) {\n for (const adjustment of candidate.experiment.variants[\n candidate.assignment.variationId\n ]) {\n if (typeof adjustment.fixedPricePerUnit !== \"string\") continue;\n const id = adjustment.variant_gid.split(\"/\").pop();\n if (!id || !published.has(id)) continue;\n const selected = selectedByVariant.get(id);\n if (\n selected == null ||\n isStrictlyLowerPrice(adjustment.fixedPricePerUnit, selected)\n ) {\n selectedByVariant.set(id, adjustment.fixedPricePerUnit);\n }\n }\n }\n const compareByVariant = new Map<\n string,\n {\n compare: { mode: \"set\"; amount: string } | { mode: \"clear\" };\n assignment: Assignment;\n }\n >();\n // Launch-side conflict screening rejects concurrent price tests on one\n // variant, but the projection can still briefly carry both. Deterministic\n // tie-break instead of last-iterated-wins: process in experiment-id order\n // and keep the FIRST adjustment per variant, so every shopper session\n // resolves the same collision identically.\n const compareCandidates = [...active].sort((left, right) =>\n left.experiment.experiment_id < right.experiment.experiment_id ? -1 : 1,\n );\n for (const candidate of compareCandidates) {\n for (const adjustment of candidate.experiment.variants[\n candidate.assignment.variationId\n ]) {\n const id = adjustment.variant_gid.split(\"/\").pop();\n if (\n id &&\n published.has(id) &&\n adjustment.compareAt &&\n !compareByVariant.has(id)\n ) {\n compareByVariant.set(id, {\n compare: adjustment.compareAt,\n assignment: candidate.assignment,\n });\n }\n }\n }\n const targets = new Map<number, number>();\n // The Function records every colliding experiment but charges the lowest\n // authorized match. Keep every assignment exposure-eligible while using\n // that same winner solely for the shopper-facing display.\n for (const [id, fixedPricePerUnit] of selectedByVariant) {\n const source = published.get(id);\n const treatmentDisplayAmount = treatmentUnits(\n fixedPricePerUnit,\n minorUnits,\n );\n // The display plane must mirror the Cart Transform's decrease-only\n // invariant. Invalid, equal, or higher treatment prices fail closed.\n if (\n source == null ||\n treatmentDisplayAmount == null ||\n treatmentDisplayAmount * shopifyStoredScale >= source\n )\n continue;\n if (source % shopifyStoredScale) continue;\n const sourceDisplayAmount = source / shopifyStoredScale;\n const existing = targets.get(sourceDisplayAmount);\n targets.set(\n sourceDisplayAmount,\n existing == null || existing === treatmentDisplayAmount\n ? treatmentDisplayAmount\n : NaN,\n );\n }\n // Compare-at framing must describe a real discount. Reject malformed,\n // equal, or lower reference prices instead of hiding the theme's native\n // framing and manufacturing a false sale signal.\n for (const [id, { compare }] of compareByVariant) {\n if (compare.mode !== \"set\") continue;\n const source = published.get(id);\n const compareAmount = treatmentUnits(compare.amount, minorUnits);\n const sourceAmount =\n source != null && source % shopifyStoredScale === 0\n ? source / shopifyStoredScale\n : null;\n const displayedAmount =\n sourceAmount == null ? null : targets.get(sourceAmount) || sourceAmount;\n if (\n compareAmount == null ||\n displayedAmount == null ||\n compareAmount <= displayedAmount\n ) {\n compareByVariant.delete(id);\n }\n }\n // A later DOM/variant pass can invalidate previously rendered framing.\n // Continue through reconciliation when display eligibility was previously\n // granted so stale treatment UI and exposure state are both withdrawn.\n if (\n !targets.size &&\n !compareByVariant.size &&\n renderedDisplayAssignment === null\n )\n return;\n\n const productHandle = currentProductHandle();\n const exclusion = COMMERCE_PRICE_EXCLUSIONS.join(\",\");\n const containers = Array.from(\n document.querySelectorAll(COMMERCE_PRICE_SELECTORS.join(\",\")),\n );\n const selectedVariantId = currentVariantId(variants);\n const selectedCompare = selectedVariantId\n ? compareByVariant.get(selectedVariantId)\n : undefined;\n const compare = selectedCompare?.compare;\n let nextRenderedDisplayAssignment: Assignment | null = null;\n compareAtNodes = compareAtNodes.filter((node) => node.isConnected);\n const removeInjectedFraming = () => {\n for (const node of compareAtNodes) node.remove();\n compareAtNodes = [];\n };\n const removeApexCompareAt = () => {\n removeInjectedFraming();\n for (const [node, display] of hiddenCompareAtNodes)\n node.style.display = display;\n hiddenCompareAtNodes = new Map();\n };\n if (compare) {\n const existingCompareNodes = new Set<HTMLElement>();\n for (const container of containers) {\n if (isElementLinkedToDifferentProduct(container, productHandle))\n continue;\n const scope = container.parentElement ?? container;\n for (const existing of Array.from(\n scope.querySelectorAll<HTMLElement>(exclusion),\n )) {\n if (existing.hasAttribute(\"data-apex-compare-at\")) continue;\n if (isElementLinkedToDifferentProduct(existing, productHandle))\n continue;\n existingCompareNodes.add(existing);\n }\n }\n for (const existing of existingCompareNodes) {\n if (!hiddenCompareAtNodes.has(existing))\n hiddenCompareAtNodes.set(existing, existing.style.display);\n existing.style.display = \"none\";\n }\n if (compare.mode === \"set\") {\n const amount = treatmentUnits(compare.amount, minorUnits);\n const source = selectedVariantId\n ? published.get(selectedVariantId)\n : undefined;\n // The current price is read from Shopify and is never replaced for a\n // compare-at-only arm. Only add merchant-authored reference framing.\n if (amount != null && source != null) {\n const eligible = containers.filter(\n (container) =>\n !isElementLinkedToDifferentProduct(container, productHandle),\n );\n // Prefer a LEAF price node: an outer wrapper's textContent bundles\n // regular/sale/compare labels, and cloning it into the injected <s>\n // renders duplicated or garbled prices.\n const selector = COMMERCE_PRICE_SELECTORS.join(\",\");\n const leaves = eligible.filter(\n (container) => !container.querySelector(selector),\n );\n for (const container of leaves.length > 0 ? leaves : eligible) {\n let node =\n container.parentElement?.querySelector<HTMLElement>(\n \"[data-apex-compare-at]\",\n ) ?? null;\n if (!node) {\n node = document.createElement(\"s\");\n node.dataset.apexCompareAt = \"true\";\n node.className = \"apex-compare-at\";\n container.parentElement?.insertBefore(node, container);\n compareAtNodes.push(node);\n }\n const sourceDisplayAmount = source / shopifyStoredScale;\n const currentText = container.textContent ?? \"\";\n const parsedCurrent = parseDisplayedCents(currentText, minorUnits);\n // A node whose text still holds several amounts is not safe to\n // clone-and-replace; format only the configured amount using the\n // leaf's convention.\n const singleAmount = parsedCurrent\n ? parseDisplayedCents(\n currentText.slice(0, parsedCurrent.start) +\n currentText.slice(parsedCurrent.end),\n minorUnits,\n ) === null\n : false;\n const nextText = singleAmount\n ? (replaceNumericText(\n currentText,\n new Map([[sourceDisplayAmount, amount]]),\n minorUnits,\n ) ??\n (parsedCurrent\n ? currentText.slice(0, parsedCurrent.start) +\n formatCentsLike(amount, parsedCurrent.convention) +\n currentText.slice(parsedCurrent.end)\n : compare.amount))\n : parsedCurrent\n ? formatCentsLike(amount, parsedCurrent.convention)\n : compare.amount;\n if (node.textContent !== nextText) node.textContent = nextText;\n }\n if (compareAtNodes.some((node) => node.isConnected)) {\n nextRenderedDisplayAssignment = selectedCompare!.assignment;\n }\n if (eligible.length === 0) removeApexCompareAt();\n } else removeApexCompareAt();\n }\n // A clear arm's treatment IS the hidden native strikethrough: remove\n // only injected framing and keep the natives hidden until the\n // assignment ends or the variant's mode changes.\n if (compare.mode === \"clear\") {\n removeInjectedFraming();\n if (hiddenCompareAtNodes.size > 0) {\n nextRenderedDisplayAssignment = selectedCompare!.assignment;\n }\n }\n } else {\n removeApexCompareAt();\n }\n for (const container of containers) {\n if (container.matches(exclusion) || container.closest(exclusion))\n continue;\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let node: Text | null;\n while ((node = walker.nextNode() as Text | null)) {\n if (node.parentElement?.closest(exclusion)) continue;\n if (isLinkedToDifferentProduct(node, productHandle)) continue;\n const replacement = replaceNumericText(node.data, targets, minorUnits);\n if (replacement == null || replacement === node.data) continue;\n applyAccessibleLabel(node, container, targets, minorUnits);\n const previous = originals.get(node);\n originals.set(node, {\n original:\n previous && node.data === previous.applied\n ? previous.original\n : node.data,\n applied: replacement,\n });\n node.data = replacement;\n }\n }\n observer?.disconnect();\n rootObserver?.disconnect();\n observer = new MutationObserver(guardedSwapPass);\n containers.forEach((container) =>\n observer!.observe(container, {\n childList: true,\n characterData: true,\n subtree: true,\n }),\n );\n rootObserver = new MutationObserver((records) => {\n const selector = COMMERCE_PRICE_SELECTORS.join(\",\");\n if (\n records.some((record) =>\n Array.from(record.addedNodes).some(\n (node) =>\n node instanceof Element &&\n (node.matches(selector) || Boolean(node.querySelector(selector))),\n ),\n )\n )\n guardedSwapPass();\n });\n rootObserver.observe(document.body, { childList: true, subtree: true });\n const eligibilityChanged =\n nextRenderedDisplayAssignment !== renderedDisplayAssignment;\n renderedDisplayAssignment = nextRenderedDisplayAssignment;\n if (eligibilityChanged) exposureChanged?.();\n const nextVariantForm =\n Array.from(\n document.querySelectorAll<HTMLFormElement>('form[action*=\"/cart/add\"]'),\n ).find(\n (form) => !isElementLinkedToDifferentProduct(form, productHandle),\n ) ?? null;\n if (variantForm !== nextVariantForm) {\n variantForm?.removeEventListener(\"change\", handleVariantFormEvent);\n variantForm?.removeEventListener(\"input\", handleVariantFormEvent);\n variantForm = nextVariantForm;\n variantForm?.addEventListener(\"change\", handleVariantFormEvent);\n variantForm?.addEventListener(\"input\", handleVariantFormEvent);\n }\n } finally {\n applying = false;\n }\n}\n\nfunction activateCommercePrice(\n settings: CommercePriceSettings,\n assignments: Assignment[],\n isCohortStampedOnCart: () => boolean | \"pending\",\n deadline: number,\n onResolved?: () => void,\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): void {\n const stampStatus = hasActiveChargedPrice(\n settings,\n assignments,\n isAssignmentAuthorized,\n )\n ? isCohortStampedOnCart()\n : true;\n if (stampStatus === \"pending\") {\n if (stampCheckDeadline === 0) {\n stampCheckDeadline = Date.now() + STAMP_CONFIRM_TIMEOUT_MS;\n }\n if (Date.now() >= stampCheckDeadline) {\n cancelStampCheck();\n const resolve = pendingActivation?.onResolved ?? onResolved;\n if (pendingActivation) pendingActivation.onResolved = undefined;\n resolve?.();\n return;\n }\n if (stampCheckTimer == null) {\n stampCheckTimer = setTimeout(() => {\n stampCheckTimer = null;\n activateCommercePrice(\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n );\n }, 25);\n }\n return;\n }\n cancelStampCheck();\n if (stampStatus === false) {\n pendingActivation = null;\n // No cohort on the cart: the Function cannot charge the tested price, so the\n // published price must stay on screen. Resolve the reveal barrier immediately.\n cancelMetaRetry();\n onResolved?.();\n return;\n }\n if (!isCommercePriceActive(settings, assignments, isAssignmentAuthorized)) {\n // Retry only while the page could still BECOME eligible — i.e. Shopify has not\n // published product metadata yet. Every other inactive reason (control cohort,\n // currency mismatch, non-product page) is final and must not spin.\n if (!shopifyProductMetaReady() && Date.now() < deadline) {\n metaRetryTimer = setTimeout(\n () =>\n activateCommercePrice(\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n ),\n META_RETRY_INTERVAL_MS,\n );\n return;\n }\n // Activation is final and inactive — release the reveal barrier.\n cancelMetaRetry();\n pendingActivation = null;\n onResolved?.();\n return;\n }\n cancelMetaRetry();\n pendingActivation = null;\n current = {\n settings,\n assignments,\n isCohortStampedOnCart,\n isAssignmentAuthorized,\n };\n try {\n swapPass();\n } catch {\n cleanupCommercePrice();\n }\n // The swap has landed (or failed and restored): content may be revealed.\n onResolved?.();\n}\n\nexport function applyCommercePrice(\n settings: CommercePriceSettings | undefined,\n assignments: Assignment[],\n isCohortStampedOnCart: () => boolean | \"pending\" = () => false,\n onResolved?: () => void,\n isAssignmentAuthorized: PriceAssignmentAuthorization = () => true,\n): void {\n cleanupCommercePrice();\n if (!settings) {\n onResolved?.();\n return;\n }\n const deadline = Date.now() + META_RETRY_WINDOW_MS;\n pendingActivation = {\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n };\n activateCommercePrice(\n settings,\n assignments,\n isCohortStampedOnCart,\n deadline,\n onResolved,\n isAssignmentAuthorized,\n );\n}\n\n/** Revisit a timed-out activation when the in-flight Shopify cart write lands. */\nexport function notifyCommerceCartStampConfirmed(): void {\n if (!pendingActivation) return;\n const activation = pendingActivation;\n activation.deadline = Math.max(\n activation.deadline,\n Date.now() + META_RETRY_WINDOW_MS,\n );\n activateCommercePrice(\n activation.settings,\n activation.assignments,\n activation.isCohortStampedOnCart,\n activation.deadline,\n activation.onResolved,\n activation.isAssignmentAuthorized,\n );\n}\n\n/** Whether a display-only price assignment has produced shopper-visible framing. */\nexport function isCommercePriceExposureEligible(\n settings: CommercePriceSettings | undefined,\n assignment: Assignment,\n): boolean {\n const adjustments = settings?.experiments.find(\n (experiment) => experiment.experiment_id === assignment.experimentId,\n )?.variants[assignment.variationId];\n return Boolean(\n assignment.isControl ||\n !adjustments?.some((adjustment) => adjustment.compareAt) ||\n adjustments.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n ) ||\n renderedDisplayAssignment === assignment,\n );\n}\n\nexport const setCommercePriceExposureListener = (listener: () => void) => {\n exposureChanged = listener;\n};\n\nexport function cleanupCommercePrice(): void {\n observer?.disconnect();\n observer = null;\n rootObserver?.disconnect();\n rootObserver = null;\n variantForm?.removeEventListener(\"change\", handleVariantFormEvent);\n variantForm?.removeEventListener(\"input\", handleVariantFormEvent);\n variantForm = null;\n for (const [node, value] of originals) node.data = value.original;\n originals = new Map();\n for (const [element, value] of originalAriaLabels)\n element.setAttribute(\"aria-label\", value.original);\n originalAriaLabels = new Map();\n for (const node of compareAtNodes) node.remove();\n compareAtNodes = [];\n for (const [node, display] of hiddenCompareAtNodes)\n node.style.display = display;\n hiddenCompareAtNodes = new Map();\n renderedDisplayAssignment = null;\n current = null;\n pendingActivation = null;\n applying = false;\n cancelMetaRetry();\n cancelStampCheck();\n}\n","export type ShopifyCartMutationHandler = () => void;\n\nconst handlers = new Set<ShopifyCartMutationHandler>();\nlet originalFetch: typeof window.fetch | null = null;\nlet wrappedFetch: typeof window.fetch | null = null;\nlet suppressNotifications = 0;\nlet formListenerInstalled = false;\n\nfunction requestUrl(input: RequestInfo | URL): URL | null {\n try {\n const value = typeof input === \"string\" || input instanceof URL\n ? String(input)\n : input.url;\n return new URL(value, location.href);\n } catch {\n return null;\n }\n}\n\nfunction isShopifyCartMutation(input: RequestInfo | URL): boolean {\n const url = requestUrl(input);\n if (!url || url.origin !== location.origin) return false;\n const configuredRoot = (window as Window & {\n Shopify?: { routes?: { root?: string } };\n }).Shopify?.routes?.root;\n let root = \"\";\n if (typeof configuredRoot === \"string\") {\n try {\n const parsed = new URL(configuredRoot, location.origin);\n if (parsed.origin === location.origin && !parsed.search && !parsed.hash) {\n root = parsed.pathname.replace(/\\/$/, \"\");\n }\n } catch {\n root = \"\";\n }\n }\n const path = url.pathname.replace(/\\/$/, \"\");\n return [\"add\", \"change\", \"update\", \"clear\"].some(\n (action) => path === `${root}/cart/${action}` || path === `${root}/cart/${action}.js`,\n );\n}\n\nfunction notifyHandlers(): void {\n for (const handler of handlers) {\n try {\n handler();\n } catch {\n // Cart observers must never affect the storefront's own mutation flow.\n }\n }\n}\n\nfunction handleFormSubmit(event: Event): void {\n const form = event.target;\n if (!(form instanceof HTMLFormElement) || !isShopifyCartMutation(form.action)) return;\n queueMicrotask(notifyHandlers);\n}\n\nfunction install(): void {\n if (originalFetch || typeof window.fetch !== \"function\") return;\n originalFetch = window.fetch;\n const nativeFetch = originalFetch.bind(window);\n wrappedFetch = function(...args: Parameters<typeof fetch>) {\n const shouldNotify = suppressNotifications === 0 && isShopifyCartMutation(args[0]);\n const result = nativeFetch(...args);\n if (shouldNotify) {\n result.then((response) => {\n if (response.ok) notifyHandlers();\n }, () => {\n // Observe without changing or consuming the caller's rejection.\n });\n }\n return result;\n };\n window.fetch = wrappedFetch;\n document.addEventListener(\"submit\", handleFormSubmit, true);\n formListenerInstalled = true;\n}\n\nfunction uninstall(): void {\n if (formListenerInstalled) {\n document.removeEventListener(\"submit\", handleFormSubmit, true);\n formListenerInstalled = false;\n }\n if (originalFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n wrappedFetch = null;\n originalFetch = null;\n}\n\nexport function onShopifyCartMutation(handler: ShopifyCartMutationHandler): () => void {\n handlers.add(handler);\n install();\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) uninstall();\n };\n}\n\n/**\n * Use for Apex's own cart-attribute write so it does not recursively look like\n * a shopper/theme mutation to subscribers of the shared fetch wrapper.\n */\nexport function fetchWithoutShopifyCartMutationNotification(\n ...args: Parameters<typeof fetch>\n): ReturnType<typeof fetch> {\n suppressNotifications += 1;\n try {\n const activeFetch = typeof window.fetch === \"function\"\n ? window.fetch\n : globalThis.fetch;\n return activeFetch.call(window, ...args);\n } finally {\n suppressNotifications -= 1;\n }\n}\n","type SignalValue = string | number | boolean | string[] | Record<string, unknown> | null;\n\ntype StoredSignal = {\n value: SignalValue;\n updatedAt: number;\n expiresAt?: number;\n};\n\nexport type ProductSignalInput = {\n id?: string | number | null;\n handle?: string | null;\n title?: string | null;\n type?: string | null;\n vendor?: string | null;\n tags?: string[] | null;\n price?: number | string | null;\n};\n\nconst STORE_KEY = \"drip_signals_v1\";\nconst VISITOR_SEEN_KEY = \"drip_visitor_seen_v1\";\nconst DEFAULT_TTL_DAYS = 30;\nconst MAX_ARRAY_LENGTH = 24;\nconst MAX_VALUE_BYTES = 4096;\nconst runtimeSignals: Record<string, SignalValue> = {};\nconst signalSources: Record<string, string> = {};\nlet signalPersistenceAllowed: () => boolean = () => true;\n\nfunction now(): number {\n return Date.now();\n}\n\nfunction ttlMs(days: number): number {\n return Math.max(1, days) * 86400 * 1000;\n}\n\nfunction canUseLocalStorage(): boolean {\n if (!canPersistSignals()) return false;\n try {\n if (typeof localStorage === \"undefined\") return false;\n const key = \"__drip_signal_test__\";\n localStorage.setItem(key, \"1\");\n localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction canPersistSignals(): boolean {\n try {\n return signalPersistenceAllowed() === true;\n } catch {\n return false;\n }\n}\n\nexport function configureSignalPersistenceAllowed(predicate?: () => boolean): void {\n signalPersistenceAllowed = predicate ?? (() => true);\n}\n\nfunction readStore(): Record<string, StoredSignal> {\n if (!canUseLocalStorage()) return {};\n try {\n const parsed = JSON.parse(localStorage.getItem(STORE_KEY) || \"{}\");\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction writeStore(store: Record<string, StoredSignal>): void {\n if (!canUseLocalStorage()) return;\n try {\n localStorage.setItem(STORE_KEY, JSON.stringify(store));\n } catch {}\n}\n\nfunction normalizeValue(value: unknown): SignalValue | undefined {\n if (value === null) return null;\n if (typeof value === \"string\") return value.slice(0, 1000);\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value === \"boolean\") return value;\n if (Array.isArray(value)) {\n return value\n .map((item) => String(item).trim())\n .filter(Boolean)\n .slice(0, MAX_ARRAY_LENGTH);\n }\n if (value && typeof value === \"object\") {\n try {\n const json = JSON.stringify(value);\n if (json.length > MAX_VALUE_BYTES) return undefined;\n return JSON.parse(json);\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\nfunction compactStore(store: Record<string, StoredSignal>): Record<string, StoredSignal> {\n const ts = now();\n const next: Record<string, StoredSignal> = {};\n for (const [key, entry] of Object.entries(store)) {\n if (!entry || typeof entry !== \"object\") continue;\n if (entry.expiresAt && entry.expiresAt <= ts) continue;\n next[key] = entry;\n }\n return next;\n}\n\nexport function setSignal(key: string, value: unknown, ttlDays = DEFAULT_TTL_DAYS, source = \"manual\"): void {\n if (!canPersistSignals()) return;\n const normalized = normalizeValue(value);\n if (normalized === undefined) return;\n const store = compactStore(readStore());\n store[key] = {\n value: normalized,\n updatedAt: now(),\n expiresAt: now() + ttlMs(ttlDays),\n };\n writeStore(store);\n signalSources[key] = source;\n}\n\nexport function getSignals(options: { markVisitorSeen?: boolean } = {}): Record<string, SignalValue> {\n const store = compactStore(readStore());\n if (options.markVisitorSeen !== false) writeStore(store);\n const signals: Record<string, SignalValue> = {};\n for (const [key, entry] of Object.entries(store)) {\n signals[key] = entry.value;\n }\n Object.assign(signals, runtimeSignals);\n\n if (options.markVisitorSeen !== false && canPersistSignals()) {\n try {\n const seen = localStorage.getItem(VISITOR_SEEN_KEY) === \"1\";\n signals[\"visitor.returning\"] = seen;\n localStorage.setItem(VISITOR_SEEN_KEY, \"1\");\n } catch {}\n }\n\n return signals;\n}\n\nexport function clearStoredSignals(): void {\n try {\n localStorage.removeItem(STORE_KEY);\n localStorage.removeItem(VISITOR_SEEN_KEY);\n } catch {}\n}\n\nexport function setRuntimeSignal(key: string, value: unknown, source = \"runtime\"): void {\n const normalized = normalizeValue(value);\n if (normalized === undefined) return;\n runtimeSignals[key] = normalized;\n signalSources[key] = source;\n}\n\nexport function clearRuntimeSignal(key: string): void {\n delete runtimeSignals[key];\n delete signalSources[key];\n}\n\nexport function getSignalDiagnostics(options: { markVisitorSeen?: boolean } = {}): { values: Record<string, SignalValue>; sources: Record<string, string> } {\n const values = getSignals(options);\n return {\n values,\n sources: { ...signalSources },\n };\n}\n\nfunction prependUnique(values: string[], next: string): string[] {\n const clean = next.trim();\n if (!clean) return values;\n return [clean, ...values.filter((value) => value !== clean)].slice(0, MAX_ARRAY_LENGTH);\n}\n\nfunction readStringArray(key: string): string[] {\n const value = getSignals({ markVisitorSeen: false })[key];\n return Array.isArray(value) ? value.map((item) => String(item)) : [];\n}\n\nexport function rememberProduct(product: ProductSignalInput, ttlDays = DEFAULT_TTL_DAYS): void {\n const id = product.id == null ? \"\" : String(product.id);\n const handle = product.handle ? String(product.handle) : \"\";\n const productType = product.type ? String(product.type) : \"\";\n\n if (id) {\n setSignal(\"recently_viewed.product_ids\", prependUnique(readStringArray(\"recently_viewed.product_ids\"), id), ttlDays);\n }\n if (handle) {\n setSignal(\"recently_viewed.product_handles\", prependUnique(readStringArray(\"recently_viewed.product_handles\"), handle), ttlDays);\n }\n if (productType) {\n setSignal(\n \"recently_viewed.product_types\",\n prependUnique(readStringArray(\"recently_viewed.product_types\"), productType),\n ttlDays,\n );\n }\n if (product.tags?.length) {\n const existing = readStringArray(\"recently_viewed.product_tags\");\n const next = product.tags.reduce((acc, tag) => prependUnique(acc, String(tag)), existing);\n setSignal(\"recently_viewed.product_tags\", next, ttlDays);\n }\n setSignal(\"recently_viewed.last_product\", {\n id: id || undefined,\n handle: handle || undefined,\n title: product.title || undefined,\n type: productType || undefined,\n vendor: product.vendor || undefined,\n price: product.price ?? undefined,\n }, ttlDays);\n}\n\nexport function setCartSignals(args: { itemCount?: number; productIds?: string[] }, ttlDays = 14): void {\n if (typeof args.itemCount === \"number\") setSignal(\"cart.item_count\", args.itemCount, ttlDays);\n if (args.productIds) setSignal(\"cart.product_ids\", args.productIds, ttlDays);\n}\n\nexport function setSearchSignal(query: string, ttlDays = 7): void {\n const trimmed = query.trim();\n if (!trimmed) return;\n setSignal(\"search.last_query\", trimmed, ttlDays);\n}\n","import { clearRuntimeSignal, setRuntimeSignal } from \"./signals\";\n\nexport const CART_DRAWER_OPEN_SIGNAL = \"surface.cart_drawer.open\";\n\nconst BODY_OPEN_PATTERN =\n /\\b(cart|mini-cart|side-cart|cart-drawer|drawer)[-_ ]?(open|opened|active|visible|shown)\\b|\\b(open|active|visible|shown)[-_ ]?(cart|mini-cart|side-cart|cart-drawer|drawer)\\b/i;\n\nexport const CART_DRAWER_SELECTORS = [\n \"cart-drawer\",\n \"mini-cart\",\n \"side-cart\",\n \"[data-cart-drawer]\",\n \"[data-cart-drawer-open]\",\n \"[data-side-cart]\",\n \"[data-mini-cart]\",\n \"[data-state='open'][class*='cart' i]\",\n \"[data-state='open'][id*='cart' i]\",\n \"[aria-hidden='false'][class*='cart' i][class*='drawer' i]\",\n \"[aria-hidden='false'][id*='cart' i][id*='drawer' i]\",\n \"[class*='cart-drawer' i]\",\n \"[class*='mini-cart' i]\",\n \"[class*='side-cart' i]\",\n \"[id*='cart-drawer' i]\",\n \"[id*='mini-cart' i]\",\n \"[id*='side-cart' i]\",\n];\n\nexport function findCartDrawerContainer(\n root: ParentNode = document,\n): Element | null {\n if (typeof document === \"undefined\") return null;\n for (const selector of CART_DRAWER_SELECTORS) {\n const element = root.querySelector(selector);\n if (element) return element;\n }\n return null;\n}\n\nfunction classNameOf(element: Element): string {\n const value = element.getAttribute(\"class\");\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction hasOpenHint(element: Element): boolean {\n const classes = classNameOf(element);\n const state = element.getAttribute(\"data-state\") ?? \"\";\n return (\n element.hasAttribute(\"open\") ||\n element.getAttribute(\"aria-hidden\") === \"false\" ||\n element.getAttribute(\"aria-expanded\") === \"true\" ||\n /^(open|opened|active|visible|shown)$/i.test(state) ||\n /\\b(is-|has-)?(open|opened|active|visible|shown)\\b/i.test(classes)\n );\n}\n\nfunction isExplicitlyClosed(element: Element): boolean {\n const classes = classNameOf(element);\n return (\n element.hasAttribute(\"hidden\") ||\n element.getAttribute(\"aria-hidden\") === \"true\" ||\n element.getAttribute(\"data-state\") === \"closed\" ||\n /\\b(is-)?(closed|closing|hidden)\\b/i.test(classes)\n );\n}\n\nfunction isRendered(element: Element): boolean {\n if (typeof window === \"undefined\") return false;\n const node = element as HTMLElement;\n const style = window.getComputedStyle ? window.getComputedStyle(node) : null;\n if (\n style &&\n (style.display === \"none\" ||\n style.visibility === \"hidden\" ||\n style.opacity === \"0\" ||\n style.pointerEvents === \"none\")\n ) {\n return false;\n }\n const rect = node.getBoundingClientRect?.();\n return Boolean(rect && rect.width > 0 && rect.height > 0);\n}\n\nexport function detectCartDrawerOpen(root: ParentNode = document): boolean {\n if (typeof document === \"undefined\") return false;\n const bodyClasses = document.body ? classNameOf(document.body) : \"\";\n if (BODY_OPEN_PATTERN.test(bodyClasses)) return true;\n\n for (const selector of CART_DRAWER_SELECTORS) {\n const candidates = Array.from(root.querySelectorAll(selector));\n for (const element of candidates) {\n if (isExplicitlyClosed(element)) continue;\n if (!hasOpenHint(element)) continue;\n if (isRendered(element)) return true;\n }\n }\n\n return false;\n}\n\nexport function installCartDrawerOpenListener(\n onChange: (open: boolean) => void,\n): () => void {\n if (\n typeof document === \"undefined\" ||\n typeof window === \"undefined\" ||\n typeof MutationObserver === \"undefined\" ||\n !document.documentElement\n ) {\n return () => {};\n }\n\n let current = detectCartDrawerOpen();\n\n let timeoutId: number | null = null;\n const check = () => {\n timeoutId = null;\n const next = detectCartDrawerOpen();\n if (next === current) return;\n current = next;\n onChange(next);\n };\n const schedule = () => {\n if (timeoutId !== null) return;\n timeoutId = window.setTimeout(check, 80);\n };\n\n const observer = new MutationObserver(schedule);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\n \"aria-expanded\",\n \"aria-hidden\",\n \"class\",\n \"data-state\",\n \"hidden\",\n \"open\",\n \"style\",\n ],\n childList: true,\n subtree: true,\n });\n\n document.addEventListener(\"click\", schedule, true);\n document.addEventListener(\"keyup\", schedule, true);\n\n return () => {\n observer.disconnect();\n document.removeEventListener(\"click\", schedule, true);\n document.removeEventListener(\"keyup\", schedule, true);\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n };\n}\n\nexport function installSurfaceSignals(onChange: () => void): () => void {\n const current = detectCartDrawerOpen();\n setRuntimeSignal(CART_DRAWER_OPEN_SIGNAL, current);\n const stop = installCartDrawerOpenListener((open) => {\n setRuntimeSignal(CART_DRAWER_OPEN_SIGNAL, open);\n onChange();\n });\n return () => {\n stop();\n clearRuntimeSignal(CART_DRAWER_OPEN_SIGNAL);\n };\n}\n","import type { Assignment, CommerceShippingSettings } from \"./types\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n findCartDrawerContainer,\n installCartDrawerOpenListener,\n} from \"./surface-signals\";\n\ntype ShopifyWindow = Window & {\n Shopify?: {\n currency?: { active?: string };\n routes?: { root?: string };\n };\n};\n\ntype ActiveShipping = {\n experimentId: string;\n currency: string;\n variant: CommerceShippingSettings[\"experiments\"][number][\"variants\"][string];\n eligibilityTarget: { productGids: string[]; variantGids: string[] };\n renderEnabled: boolean;\n thresholdCents: number | null;\n minorUnits: number;\n};\n\nlet current: ActiveShipping | null = null;\nlet stopCartMutationListener: (() => void) | null = null;\nlet stopDrawerListener: (() => void) | null = null;\nlet placementObserver: MutationObserver | null = null;\nlet placementCheckTimer: number | null = null;\n\nfunction removeRenderedElement(): void {\n element?.remove();\n element = null;\n}\nlet element: HTMLElement | null = null;\nlet lastSubtotal: number | null = null;\nlet refreshSequence = 0;\nlet cartAbortController: AbortController | null = null;\nconst cartEligibility = new Map<string, boolean>();\n\nexport function isShippingCartEligible(experimentId: string): boolean {\n // Fail closed: until a cart read proves the target is absent, an enforced\n // experiment stays charge-affecting — an unevaluated (e.g. unsigned-plane)\n // experiment must not silently downgrade to advisory stamping.\n return cartEligibility.get(experimentId) ?? true;\n}\n\ntype ShippingVariantLike = {\n treatment: string;\n threshold: string | null;\n target?: { productGids: string[]; variantGids: string[] };\n};\n\n/** Shared exposure classification for the sync loop and the exposure fence.\n * Treatments prove eligibility on their OWN target; controls mirror the\n * treatment set — any-targeted for scope (an unscoped sibling keeps the\n * control universal), every-bound for currency (a thresholdless percent\n * sibling keeps the control cross-currency eligible). */\nexport function classifyShippingExposure(\n variants: Record<string, ShippingVariantLike>,\n isControl: boolean,\n ownVariant: ShippingVariantLike | undefined,\n): {\n eligibilityTarget: { productGids: string[]; variantGids: string[] };\n needsTargetProof: boolean;\n isCurrencyBound: boolean;\n} {\n const empty = { productGids: [] as string[], variantGids: [] as string[] };\n const scoped = (candidate: ShippingVariantLike | undefined) =>\n (candidate?.target?.productGids.length ?? 0) > 0 ||\n (candidate?.target?.variantGids.length ?? 0) > 0;\n const bound = (candidate: ShippingVariantLike | undefined) =>\n candidate != null &&\n candidate.treatment !== \"none\" &&\n (candidate.threshold !== null || candidate.treatment !== \"percent_off\");\n const treatments = Object.values(variants).filter(\n (candidate) => candidate.treatment !== \"none\",\n );\n if (!isControl) {\n return {\n eligibilityTarget: ownVariant?.target ?? empty,\n needsTargetProof: scoped(ownVariant),\n isCurrencyBound: bound(ownVariant),\n };\n }\n const hasUnscopedTreatment = treatments.some((candidate) => !scoped(candidate));\n return {\n eligibilityTarget: hasUnscopedTreatment\n ? empty\n : treatments.reduce(\n (target, candidate) => ({\n productGids: [...target.productGids, ...(candidate.target?.productGids ?? [])],\n variantGids: [...target.variantGids, ...(candidate.target?.variantGids ?? [])],\n }),\n empty,\n ),\n needsTargetProof: treatments.some(scoped),\n isCurrencyBound: treatments.length > 0 && treatments.every(bound),\n };\n}\n\n/** True only after shipping setup or a successful cart read proves eligibility. */\nexport function isShippingCartEligibilityConfirmed(\n experimentId: string,\n): boolean {\n return cartEligibility.get(experimentId) === true;\n}\n\nfunction currencyMinorUnits(currency: string): number | null {\n try {\n const units = new Intl.NumberFormat(\"en\", {\n style: \"currency\",\n currency,\n }).resolvedOptions().maximumFractionDigits;\n return typeof units === \"number\" &&\n Number.isInteger(units) &&\n units >= 0 &&\n // ISO 4217 tops out at exponent 4 (CLF, UYW).\n units <= 4\n ? units\n : null;\n } catch {\n return null;\n }\n}\n\nfunction thresholdCents(value: string, minorUnits: number): number | null {\n const fractionPattern =\n minorUnits === 0 ? \"\" : `(?:\\\\.(\\\\d{1,${minorUnits}}))?`;\n const match = new RegExp(`^(\\\\d+)${fractionPattern}$`).exec(value);\n if (!match) return null;\n const cents = Number(match[1] + (match[2] ?? \"\").padEnd(minorUnits, \"0\"));\n return Number.isSafeInteger(cents) && cents > 0 ? cents : null;\n}\n\nfunction shopifyRoot(): string {\n const root = (window as ShopifyWindow).Shopify?.routes?.root;\n if (typeof root !== \"string\") return \"/\";\n try {\n const parsed = new URL(root, location.origin);\n if (parsed.origin !== location.origin || parsed.search || parsed.hash)\n return \"/\";\n return parsed.pathname.endsWith(\"/\")\n ? parsed.pathname\n : `${parsed.pathname}/`;\n } catch {\n return \"/\";\n }\n}\n\nfunction cartPath(resource: string): string {\n return `${shopifyRoot()}${resource}`;\n}\n\nfunction activeShipping(\n settings: CommerceShippingSettings,\n assignments: Assignment[],\n): ActiveShipping | null {\n if (typeof window === \"undefined\") return null;\n const shopify = (window as ShopifyWindow).Shopify;\n if (!shopify) return null;\n const currency = shopify.currency?.active;\n if (typeof currency !== \"string\" || !/^[A-Z]{3}$/.test(currency)) return null;\n const minorUnits = currencyMinorUnits(currency);\n if (minorUnits === null) return null;\n const candidates: ActiveShipping[] = [];\n for (const experiment of settings.experiments) {\n const assignment = assignments.find(\n (item) => item.experimentId === experiment.experiment_id,\n );\n const variant = assignment\n ? experiment.variants[assignment.variationId]\n : undefined;\n const exposure = classifyShippingExposure(\n experiment.variants,\n Boolean(assignment?.isControl),\n variant,\n );\n const eligibilityTarget = exposure.eligibilityTarget;\n const isExperimentTargeted = exposure.needsTargetProof;\n const isCurrencyBound = exposure.isCurrencyBound;\n if (\n !variant ||\n (experiment.assignment_epoch != null &&\n experiment.assignment_epoch !== assignment?.assignmentEpoch) ||\n (isCurrencyBound && currency !== experiment.currency) ||\n // Controls stay as eligibility candidates (renderEnabled excludes them\n // from the banner): an untargeted threshold control must confirm cart\n // currency the same way its treatment sibling would, or it never exposes.\n (variant.treatment === \"none\" && !assignment?.isControl)\n ) {\n continue;\n }\n const threshold =\n variant.threshold === null\n ? null\n : thresholdCents(variant.threshold, minorUnits);\n if (variant.threshold !== null && threshold === null) continue;\n // Controls use the treatment union for symmetric eligibility; treatments\n // use only their own arm's target.\n cartEligibility.set(\n experiment.experiment_id,\n false,\n );\n candidates.push({\n experimentId: experiment.experiment_id,\n currency,\n variant,\n eligibilityTarget,\n renderEnabled: !assignment?.isControl && variant.treatment !== \"none\",\n thresholdCents: threshold,\n minorUnits,\n });\n }\n return candidates.length === 1 ? candidates[0] : null;\n}\n\nfunction money(cents: number, currency: string, minorUnits: number): string {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency,\n }).format(cents / 10 ** minorUnits);\n}\n\nfunction resolveCopy(\n template: string,\n subtotal: number,\n active: ActiveShipping,\n): string {\n return template\n .split(\"{remaining}\")\n .join(\n money(\n Math.max(0, (active.thresholdCents ?? 0) - subtotal),\n active.currency,\n active.minorUnits,\n ),\n )\n .split(\"{threshold}\")\n .join(\n money(active.thresholdCents ?? 0, active.currency, active.minorUnits),\n );\n}\n\nfunction render(subtotal: number, active: ActiveShipping): boolean {\n removeRenderedElement();\n const reached =\n active.thresholdCents !== null && subtotal >= active.thresholdCents;\n const copy = resolveCopy(\n active.thresholdCents === null\n ? active.variant.bannerCopy\n : reached\n ? active.variant.reachedCopy\n : active.variant.progressCopy,\n subtotal,\n active,\n );\n if (!copy.trim()) return false;\n\n const wrapper = document.createElement(\"div\");\n wrapper.dataset.apexShipping = \"\";\n wrapper.setAttribute(\"role\", \"status\");\n wrapper.setAttribute(\"aria-live\", \"polite\");\n wrapper.setAttribute(\"aria-atomic\", \"true\");\n wrapper.style.cssText =\n \"box-sizing:border-box;padding:10px 12px;background:#f4f4f0;color:#1a1a1a;font:500 13px/1.4 system-ui,sans-serif;z-index:2147483646\";\n const line = document.createElement(\"div\");\n line.textContent = copy;\n wrapper.appendChild(line);\n if (\n active.variant.treatment === \"progress_bar\" &&\n active.thresholdCents !== null\n ) {\n const track = document.createElement(\"div\");\n const progress = Math.min(\n 100,\n Math.max(0, (subtotal / active.thresholdCents) * 100),\n );\n track.setAttribute(\"role\", \"progressbar\");\n track.setAttribute(\"aria-label\", \"Free shipping progress\");\n track.setAttribute(\"aria-valuemin\", \"0\");\n track.setAttribute(\"aria-valuemax\", \"100\");\n track.setAttribute(\"aria-valuenow\", String(Math.round(progress)));\n track.style.cssText =\n \"height:6px;margin-top:8px;overflow:hidden;border-radius:999px;background:#d9d9d2\";\n const fill = document.createElement(\"div\");\n fill.style.cssText = `height:100%;width:${progress}%;border-radius:inherit;background:#1a1a1a`;\n track.appendChild(fill);\n wrapper.appendChild(track);\n }\n const drawer = findCartDrawerContainer();\n if (drawer) {\n drawer.prepend(wrapper);\n } else {\n wrapper.style.position = \"fixed\";\n wrapper.style.inset = \"0 0 auto\";\n document.body.prepend(wrapper);\n }\n element = wrapper;\n return true;\n}\n\nfunction cartMatchesTarget(\n items: unknown,\n target: { productGids: string[]; variantGids: string[] },\n): boolean {\n if (target.productGids.length === 0 && target.variantGids.length === 0)\n return true;\n if (!Array.isArray(items)) return false;\n const products = new Set(target.productGids);\n const variants = new Set(target.variantGids);\n return items.some((item) => {\n if (!item || typeof item !== \"object\") return false;\n const line = item as { product_id?: unknown; variant_id?: unknown };\n const product =\n typeof line.product_id === \"number\" || typeof line.product_id === \"string\"\n ? `gid://shopify/Product/${line.product_id}`\n : null;\n const variant =\n typeof line.variant_id === \"number\" || typeof line.variant_id === \"string\"\n ? `gid://shopify/ProductVariant/${line.variant_id}`\n : null;\n return (\n (product !== null && products.has(product)) ||\n (variant !== null && variants.has(variant))\n );\n });\n}\n\nasync function refreshCart(\n active: ActiveShipping,\n onEligibilityConfirmed?: () => void,\n): Promise<void> {\n const sequence = ++refreshSequence;\n cartAbortController?.abort();\n const controller =\n typeof AbortController === \"function\" ? new AbortController() : null;\n cartAbortController = controller;\n const timeout = controller\n ? window.setTimeout(() => controller.abort(), 5_000)\n : null;\n lastSubtotal = null;\n element?.remove();\n element = null;\n try {\n const response = await window.fetch(cartPath(\"cart.js\"), {\n headers: { Accept: \"application/json\" },\n ...(controller ? { signal: controller.signal } : {}),\n });\n if (!response.ok) return;\n const cart = (await response.json()) as {\n currency?: unknown;\n items_subtotal_price?: unknown;\n items?: unknown;\n };\n const subtotal = cart.items_subtotal_price;\n const targetEligible = cartMatchesTarget(\n cart.items,\n active.eligibilityTarget,\n );\n if (sequence !== refreshSequence || current !== active) return;\n const currencyEligible = cart.currency === active.currency;\n cartEligibility.set(active.experimentId, targetEligible && currencyEligible);\n if (!targetEligible || !currencyEligible) {\n lastSubtotal = null;\n removeRenderedElement();\n }\n if (\n !currencyEligible ||\n typeof subtotal !== \"number\" ||\n !Number.isSafeInteger(subtotal) ||\n subtotal < 0 ||\n !targetEligible\n )\n return;\n lastSubtotal = subtotal;\n onEligibilityConfirmed?.();\n if (active.renderEnabled) render(subtotal, active);\n } catch {\n // Shipping messaging is additive; storefront cart behavior must never fail with it.\n } finally {\n if (timeout !== null) window.clearTimeout(timeout);\n if (cartAbortController === controller) cartAbortController = null;\n }\n}\n\nfunction installPlacementObserver(active: ActiveShipping): void {\n placementObserver = new MutationObserver(() => {\n if (placementCheckTimer !== null) return;\n placementCheckTimer = window.setTimeout(() => {\n placementCheckTimer = null;\n if (\n current !== active ||\n lastSubtotal === null ||\n cartEligibility.get(active.experimentId) !== true\n )\n return;\n const parent = findCartDrawerContainer() ?? document.body;\n if (!element?.isConnected || element.parentElement !== parent) {\n render(lastSubtotal, active);\n }\n }, 80);\n });\n placementObserver.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n}\n\nexport function applyCommerceShipping(\n settings: CommerceShippingSettings | undefined,\n assignments: Assignment[],\n onEligibilityConfirmed?: () => void,\n): void {\n cleanupCommerceShipping();\n if (!settings) return;\n const active = activeShipping(settings, assignments);\n if (!active) return;\n current = active;\n stopCartMutationListener = onShopifyCartMutation(() => {\n if (current === active) void refreshCart(active, onEligibilityConfirmed);\n });\n installPlacementObserver(active);\n stopDrawerListener = installCartDrawerOpenListener((open) => {\n if (open) void refreshCart(active, onEligibilityConfirmed);\n });\n void refreshCart(active, onEligibilityConfirmed);\n}\n\nexport function cleanupCommerceShipping(): void {\n refreshSequence += 1;\n cartAbortController?.abort();\n cartAbortController = null;\n current = null;\n cartEligibility.clear();\n lastSubtotal = null;\n element?.remove();\n element = null;\n stopDrawerListener?.();\n stopDrawerListener = null;\n placementObserver?.disconnect();\n placementObserver = null;\n if (placementCheckTimer !== null) window.clearTimeout(placementCheckTimer);\n placementCheckTimer = null;\n stopCartMutationListener?.();\n stopCartMutationListener = null;\n}\n","const CSS_CLASS = \"drip-css\";\nconst CSS_LINK_CLASS = \"drip-css-link\";\n\nexport function injectCss(css: string, experimentId: string, variationId: string): void {\n const id = \"drip-css-\" + experimentId + \"-\" + variationId;\n if (document.getElementById(id)) return;\n const style = document.createElement(\"style\");\n style.id = id;\n style.className = CSS_CLASS;\n style.textContent = css;\n (document.head || document.documentElement).appendChild(style);\n}\n\nexport function injectExperimentCss(css: string, experimentId: string): void {\n const id = \"drip-css-exp-\" + experimentId;\n let style = document.getElementById(id) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = id;\n style.className = CSS_CLASS;\n (document.head || document.documentElement).appendChild(style);\n }\n style.textContent = css;\n}\n\nexport function removeCss(experimentId: string, variationId: string): void {\n const el = document.getElementById(\"drip-css-\" + experimentId + \"-\" + variationId);\n if (el) el.remove();\n}\n\nexport function injectExternalCss(url: string, experimentId: string, variationId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const id = \"drip-css-link-\" + experimentId + \"-\" + variationId;\n const previous = document.getElementById(id);\n if (previous && previous.getAttribute(\"href\") === url) {\n resolve();\n return;\n }\n if (previous) previous.remove();\n const link = document.createElement(\"link\");\n link.id = id;\n link.className = CSS_LINK_CLASS;\n link.rel = \"stylesheet\";\n link.href = url;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(\"Failed to load CSS artifact: \" + url));\n (document.head || document.documentElement).appendChild(link);\n });\n}\n\nexport function removeAllCss(): void {\n document.querySelectorAll(\".\" + CSS_CLASS).forEach((el) => el.remove());\n document.querySelectorAll(\".\" + CSS_LINK_CLASS).forEach((el) => el.remove());\n}\n","/**\n * Debug console for Drip SDK.\n *\n * Project-configured debug console. By default debug is off; the snippet can\n * enable it for a specific request, query parameter, or user id.\n */\n\nimport type { DebugSettings } from \"./types\";\n\nlet enabled = false;\nlet configured: DebugSettings = { enabled: false, restrictMode: \"off\" };\n\nfunction getQueryValue(param: string): string | null {\n try {\n return new URLSearchParams(location.search).get(param);\n } catch {\n return null;\n }\n}\n\nfunction tokenMatches(value: string | null, token?: string): boolean {\n if (!value) return false;\n if (!token) return value === \"1\" || value === \"true\";\n return value === token;\n}\n\nfunction isExpired(expiresAt?: string | null): boolean {\n if (!expiresAt) return false;\n const timestamp = Date.parse(expiresAt);\n return Number.isFinite(timestamp) && timestamp <= Date.now();\n}\n\nexport function configureDebug(\n settings?: DebugSettings,\n userId?: string | null,\n options?: { storageAllowed?: boolean },\n): boolean {\n const storageAllowed = options?.storageAllowed !== false;\n configured = storageAllowed\n ? (settings ?? { enabled: false, restrictMode: \"off\" })\n : { ...(settings ?? { enabled: false, restrictMode: \"off\" }), persist: false };\n enabled = false;\n if (!configured.enabled || configured.restrictMode === \"off\" || isExpired(configured.expiresAt)) {\n if (storageAllowed) {\n try {\n localStorage.removeItem(\"drip_debug\");\n } catch {}\n }\n return false;\n }\n\n if (configured.active === true || configured.restrictMode === \"always\") {\n enabled = true;\n } else if (configured.restrictMode === \"user_ids\") {\n enabled = Boolean(userId && configured.allowedUserIds?.includes(userId));\n } else {\n const queryParam = configured.queryParam || \"drip_debug\";\n const value = getQueryValue(queryParam);\n if (value === \"0\" || value === \"false\") {\n if (storageAllowed) {\n try {\n localStorage.removeItem(\"drip_debug\");\n } catch {}\n }\n enabled = false;\n } else {\n enabled = tokenMatches(value, configured.token);\n }\n }\n\n if (configured.persist && storageAllowed) {\n try {\n if (enabled) localStorage.setItem(\"drip_debug\", \"1\");\n else if (localStorage.getItem(\"drip_debug\") === \"1\") enabled = true;\n } catch {}\n }\n\n return enabled;\n}\n\nexport function isDebugEnabled(): boolean {\n if (enabled) return true;\n if (isExpired(configured.expiresAt)) return false;\n try {\n enabled = configured.enabled === true\n && configured.persist === true\n && localStorage.getItem(\"drip_debug\") === \"1\";\n } catch {\n enabled = false;\n }\n return enabled;\n}\n\nconst PREFIX = \"%c[drip]\";\nconst STYLE = \"color: #8b5cf6; font-weight: bold;\";\nconst DIMMED = \"color: #6b6f7b;\";\n\nexport function debugLog(category: string, message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n if (typeof console === \"undefined\") return;\n\n const timestamp = new Date().toISOString().slice(11, 23);\n if (data !== undefined) {\n console.log(`${PREFIX} %c${timestamp} %c[${category}] ${message}`, STYLE, DIMMED, \"\", data);\n } else {\n console.log(`${PREFIX} %c${timestamp} %c[${category}] ${message}`, STYLE, DIMMED, \"\");\n }\n}\n\nexport function debugWarn(category: string, message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n if (typeof console === \"undefined\") return;\n\n const timestamp = new Date().toISOString().slice(11, 23);\n if (data !== undefined) {\n console.warn(`${PREFIX} %c${timestamp} %c[${category}] ${message}`, STYLE, DIMMED, \"\", data);\n } else {\n console.warn(`${PREFIX} %c${timestamp} %c[${category}] ${message}`, STYLE, DIMMED, \"\");\n }\n}\n\nexport function debugGroup(label: string): void {\n if (!isDebugEnabled()) return;\n if (typeof console === \"undefined\") return;\n console.group(`${PREFIX} ${label}`, STYLE);\n}\n\nexport function debugGroupEnd(): void {\n if (!isDebugEnabled()) return;\n if (typeof console === \"undefined\") return;\n console.groupEnd();\n}\n\n/** @internal — exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n isExpired,\n tokenMatches,\n};\n","const observers = new Map<MutationObserver, MutationCallback | undefined>();\nlet muteDepth = 0;\n\nexport function registerMutedObserver(\n observer: MutationObserver,\n callback?: MutationCallback,\n): void {\n observers.set(observer, callback);\n}\n\nexport function unregisterMutedObserver(observer: MutationObserver): void {\n observers.delete(observer);\n}\n\nexport function runMuted<T>(fn: () => T): T {\n if (muteDepth === 0) {\n // Deliver records queued BEFORE the muted write to their handlers: a\n // real storefront change in the same task must not be discarded along\n // with the SDK's own write records when the queue drains below.\n for (const [observer, callback] of observers) {\n try {\n const pending = observer.takeRecords();\n if (pending.length && callback) callback(pending, observer);\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n muteDepth += 1;\n try {\n return fn();\n } finally {\n muteDepth -= 1;\n if (muteDepth === 0) {\n for (const observer of observers.keys()) {\n try {\n observer.takeRecords();\n } catch {\n // A disconnected or test-double observer must not block SDK writes.\n }\n }\n }\n }\n}\n\n","import { registerMutedObserver, unregisterMutedObserver } from \"./observer-mute\";\n\ntype DomChangeObserver = () => void;\n\nconst QA_ASSISTANT_HOST_SELECTOR = \"#\" + [\"drip\", \"qa\", \"assistant\", \"host\"].join(\"-\");\nconst APEX_HOST_SELECTOR = [\"#drip-qa-toolbar\", QA_ASSISTANT_HOST_SELECTOR, \"#drip-devtools-host\"].join(\",\");\n\nfunction isApexNode(node: Node): boolean {\n if (!(node instanceof Element)) return false;\n const id = node.getAttribute(\"id\") || \"\";\n return id.startsWith(\"drip-\") || node.closest?.(APEX_HOST_SELECTOR) != null;\n}\n\nexport function observeDomChanges(\n observer: DomChangeObserver,\n debounceMs = 250,\n): () => void {\n if (typeof MutationObserver === \"undefined\" || !document.documentElement) {\n return () => {};\n }\n\n let timer: number | null = null;\n const schedule = () => {\n if (timer !== null) window.clearTimeout(timer);\n timer = window.setTimeout(() => {\n timer = null;\n observer();\n }, debounceMs);\n };\n\n const onRecords: MutationCallback = (mutations) => {\n const relevant = mutations.some((mutation) => {\n if (mutation.type === \"attributes\") {\n return mutation.target instanceof Element && !isApexNode(mutation.target);\n }\n return Array.from(mutation.addedNodes).some((node) => !isApexNode(node));\n });\n if (relevant) schedule();\n };\n const mutationObserver = new MutationObserver(onRecords);\n\n registerMutedObserver(mutationObserver, onRecords);\n mutationObserver.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\", \"aria-hidden\"],\n });\n\n return () => {\n if (timer !== null) window.clearTimeout(timer);\n mutationObserver.disconnect();\n unregisterMutedObserver(mutationObserver);\n };\n}\n","function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function normalizeDataLayerEntry(\n item: unknown,\n): Record<string, unknown> | null {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null;\n\n const record = item as Record<PropertyKey, unknown>;\n if (typeof record.event === \"string\") {\n return item as Record<string, unknown>;\n }\n\n if (record[0] !== \"event\" || typeof record[1] !== \"string\") return null;\n\n const params = isPlainObject(record[2]) ? record[2] : {};\n return { ...params, event: record[1] };\n}\n","export const EDITOR_FRAGMENT_KEY = \"apex-editor\";\nexport const EDITOR_BUNDLE_FILENAME = \"editor.js\";\nexport const EDITOR_DEVICE_FRAME_NAME = \"apex-editor-device-preview\";\nconst EDITOR_SCRIPT_ID = \"drip-editor-bundle\";\nconst EDITOR_LOAD_TIMEOUT_MS = 10_000;\n\nexport type EditorLaunchHint = {\n token: string;\n sid: string;\n apiOrigin: string;\n};\n\ntype LocationLike = Pick<Location, \"hash\" | \"href\">;\ntype HistoryLike = Pick<History, \"replaceState\" | \"state\">;\n\nexport type EditorBundleApi = {\n start: (launch: EditorLaunchHint) => boolean | Promise<boolean>;\n};\n\ntype EditorGlobal = typeof globalThis & {\n ApexEditor?: EditorBundleApi;\n};\n\nlet editorState: \"idle\" | \"starting\" | \"active\" = \"idle\";\n\nexport function isEditorDevicePreview(windowLike: Pick<Window, \"name\"> = window): boolean {\n return windowLike.name === EDITOR_DEVICE_FRAME_NAME;\n}\n\nfunction decodeBase64Url(value: string): string | null {\n try {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n return atob(padded);\n } catch {\n return null;\n }\n}\n\nfunction normalizeApiOrigin(value: unknown): string | null {\n if (typeof value !== \"string\" || !value.trim()) return null;\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null;\n return url.origin;\n } catch {\n return null;\n }\n}\n\nexport function decodeEditorLaunchToken(token: string): Omit<EditorLaunchHint, \"token\"> | null {\n const encodedPayload = token.split(\".\", 1)[0];\n if (!encodedPayload) return null;\n const decoded = decodeBase64Url(encodedPayload);\n if (!decoded) return null;\n try {\n const payload = JSON.parse(decoded) as Record<string, unknown>;\n const sid = typeof payload.sid === \"string\" ? payload.sid.trim() : \"\";\n const apiOrigin = normalizeApiOrigin(payload.apiOrigin ?? payload.api_origin);\n if (payload.aud !== \"apex-editor-exchange\" || !sid || !apiOrigin) return null;\n return { sid, apiOrigin };\n } catch {\n return null;\n }\n}\n\nexport function consumeEditorLaunchFragment(\n locationLike: LocationLike = location,\n historyLike: HistoryLike = history,\n): EditorLaunchHint | null {\n if (!locationLike.hash || locationLike.hash.length < 2) return null;\n const params = new URLSearchParams(locationLike.hash.slice(1));\n const encodedToken = params.get(EDITOR_FRAGMENT_KEY);\n if (!encodedToken) return null;\n\n const token = encodedToken.trim();\n const hint = decodeEditorLaunchToken(token);\n params.delete(EDITOR_FRAGMENT_KEY);\n\n try {\n const cleanUrl = new URL(locationLike.href);\n const remainingHash = params.toString();\n cleanUrl.hash = remainingHash ? `#${remainingHash}` : \"\";\n historyLike.replaceState(historyLike.state ?? null, \"\", cleanUrl.toString());\n } catch {\n return null;\n }\n\n return hint ? { token, ...hint } : null;\n}\n\nexport function resolveEditorBundleUrl(input: {\n configuredUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n}): string | null {\n const baseUrl = input.scriptSrc || input.pageUrl;\n if (input.configuredUrl) {\n try {\n const url = new URL(input.configuredUrl, baseUrl);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.toString() : null;\n } catch {\n return null;\n }\n }\n if (!input.scriptSrc) return null;\n try {\n const scriptUrl = new URL(input.scriptSrc, input.pageUrl);\n if (/^\\/sdk\\/[^/]+\\/[^/]+\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else if (/\\/drip(?:\\.live|\\.heatmap|\\.debug)?\\.js$/.test(scriptUrl.pathname)) {\n scriptUrl.pathname = scriptUrl.pathname.replace(/[^/]+\\.js$/, EDITOR_BUNDLE_FILENAME);\n } else {\n scriptUrl.pathname = `/${EDITOR_BUNDLE_FILENAME}`;\n }\n scriptUrl.search = \"\";\n scriptUrl.hash = \"\";\n return scriptUrl.toString();\n } catch {\n return null;\n }\n}\n\nexport function loadEditorBundle(\n bundleUrl: string,\n documentLike: Document = document,\n timeoutMs = EDITOR_LOAD_TIMEOUT_MS,\n): Promise<EditorBundleApi> {\n return new Promise((resolve, reject) => {\n const existing = documentLike.getElementById(EDITOR_SCRIPT_ID);\n existing?.remove();\n\n const script = documentLike.createElement(\"script\");\n script.id = EDITOR_SCRIPT_ID;\n script.src = bundleUrl;\n script.async = true;\n script.crossOrigin = \"anonymous\";\n\n const timeout = setTimeout(() => {\n script.remove();\n reject(new Error(\"Editor bundle load timed out\"));\n }, timeoutMs);\n const finish = (error?: Error) => {\n clearTimeout(timeout);\n if (error) {\n script.remove();\n reject(error);\n return;\n }\n const editorGlobal = globalThis as EditorGlobal;\n const api = editorGlobal.ApexEditor;\n try {\n editorGlobal.ApexEditor = undefined;\n } catch {}\n if (!api || typeof api.start !== \"function\") {\n reject(new Error(\"Editor bundle did not expose a start function\"));\n return;\n }\n resolve(api);\n };\n script.onload = () => finish();\n script.onerror = () => finish(new Error(\"Editor bundle failed to load\"));\n (documentLike.head || documentLike.documentElement).appendChild(script);\n });\n}\n\nexport function interceptEditorLaunch(input: {\n configuredBundleUrl?: string;\n scriptSrc?: string;\n pageUrl?: string;\n onBeforeLoad?: () => void;\n onFailure: () => void;\n loadBundle?: (url: string) => Promise<EditorBundleApi>;\n locationLike?: LocationLike;\n historyLike?: HistoryLike;\n}): boolean {\n if (editorState !== \"idle\") return true;\n const launch = consumeEditorLaunchFragment(input.locationLike, input.historyLike);\n if (!launch) return false;\n\n editorState = \"starting\";\n input.onBeforeLoad?.();\n const bundleUrl = resolveEditorBundleUrl({\n configuredUrl: input.configuredBundleUrl,\n scriptSrc: input.scriptSrc,\n pageUrl: input.pageUrl,\n });\n const fail = () => {\n editorState = \"idle\";\n input.onFailure();\n };\n if (!bundleUrl) {\n Promise.resolve().then(fail);\n return true;\n }\n\n const loader = input.loadBundle ?? ((url: string) => loadEditorBundle(url));\n loader(bundleUrl)\n .then((api) => api.start(launch))\n .then((active) => {\n if (active) editorState = \"active\";\n else fail();\n })\n .catch(fail);\n return true;\n}\n\nexport const __test = {\n getState: () => editorState,\n resetState: () => {\n editorState = \"idle\";\n },\n};\n","/**\n * Safe wrapper around RegExp construction and testing.\n * Prevents crashes from invalid patterns and guards against\n * extremely long patterns that could cause ReDoS.\n */\n\nconst MAX_PATTERN_LENGTH = 1024;\nconst MAX_CACHE_ENTRIES = 256;\nconst regexCache = new Map<string, RegExp | null>();\n\nfunction cacheRegex(pattern: string, compiled: RegExp | null): void {\n if (!regexCache.has(pattern) && regexCache.size >= MAX_CACHE_ENTRIES) {\n const oldest = regexCache.keys().next().value;\n if (oldest) regexCache.delete(oldest);\n }\n regexCache.set(pattern, compiled);\n}\n\nexport function safeRegexTest(pattern: string, input: string): boolean {\n if (!pattern || pattern.length > MAX_PATTERN_LENGTH) return false;\n\n if (regexCache.has(pattern)) {\n const cached = regexCache.get(pattern);\n return cached ? cached.test(input) : false;\n }\n\n try {\n const compiled = new RegExp(pattern);\n cacheRegex(pattern, compiled);\n return compiled.test(input);\n } catch {\n cacheRegex(pattern, null);\n return false;\n }\n}\n","const PII_KEY_TOKENS = new Set([\n \"email\", \"mail\", \"phone\", \"tel\", \"mobile\", \"fax\",\n \"address\", \"street\", \"zip\", \"postal\", \"postcode\",\n \"firstname\", \"lastname\", \"fullname\", \"surname\", \"username\", \"name\",\n \"birth\", \"birthday\", \"birthdate\", \"dob\", \"gender\",\n \"ssn\", \"vat\", \"iban\", \"bic\", \"card\", \"cvv\", \"cvc\",\n \"password\", \"passwd\", \"secret\", \"token\", \"auth\", \"session\",\n \"ip\", \"latitude\", \"longitude\", \"lat\", \"lng\", \"lon\",\n]);\n\nexport function containsPiiToken(key: string): boolean {\n return key\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .some((token) => PII_KEY_TOKENS.has(token));\n}\n","import type { CustomJsPolicy } from \"./types\";\n\nlet activePolicy: CustomJsPolicy = \"hybrid\";\nconst EXTERNAL_JS_CLASS = \"drip-external-js\";\n\nexport function setJsPolicy(policy: CustomJsPolicy): void {\n activePolicy = policy;\n}\n\nexport function isStrictJsPolicy(): boolean {\n return activePolicy === \"strict\";\n}\n\nexport function execJs(code: string, sourceLabel?: string): void {\n if (isStrictJsPolicy()) {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] Custom JS blocked by strict policy for \" + (sourceLabel || \"unknown\"));\n }\n return;\n }\n\n try {\n const suffix = sourceLabel ? \"\\n//# sourceURL=drip-\" + sourceLabel + \".js\" : \"\";\n new Function(code + suffix)();\n } catch (e) {\n if (typeof console !== \"undefined\") {\n console.error(\"[drip] JS error in \" + (sourceLabel || \"unknown\") + \":\", e);\n }\n }\n}\n\nexport function loadExternalJs(url: string, sourceLabel: string): Promise<void> {\n if (activePolicy === \"strict\") {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] External JS blocked by strict policy for \" + sourceLabel);\n }\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const id = \"drip-external-js-\" + sourceLabel;\n const previous = document.getElementById(id);\n if (previous && previous.getAttribute(\"src\") === url) {\n resolve();\n return;\n }\n if (previous) previous.remove();\n\n const script = document.createElement(\"script\");\n script.id = id;\n script.className = EXTERNAL_JS_CLASS;\n script.src = url;\n script.async = false;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"Failed to load JS artifact: \" + url));\n (document.head || document.documentElement).appendChild(script);\n });\n}\n\nexport function removeAllExternalJs(): void {\n document.querySelectorAll(\".\" + EXTERNAL_JS_CLASS).forEach((el) => el.remove());\n}\n","import { Goal, Assignment, CaptureRule } from \"./types\";\nimport { safeRegexTest } from \"./safe-regex\";\nimport { containsPiiToken } from \"./pii-keys\";\nimport { isStrictJsPolicy } from \"./js\";\n\ntype GoalCallback = (\n goalId: string,\n assignment: Assignment,\n data?: Record<string, unknown>,\n) => void;\n\nconst STORAGE_KEY = \"drip_goals\";\nlet onGoal: GoalCallback | null = null;\nlet clickListener: ((e: Event) => void) | null = null;\nlet activeClickGoals: { goal: Goal; assignment: Assignment }[] = [];\n\nfunction getFiredGoals(): Record<string, string[]> {\n try {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || \"{}\");\n } catch {\n return {};\n }\n}\n\nfunction markFired(goalId: string, variationId: string): void {\n const fired = getFiredGoals();\n const list = fired[goalId] || [];\n if (!list.includes(variationId)) {\n list.push(variationId);\n fired[goalId] = list;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(fired));\n } catch {}\n }\n}\n\nfunction alreadyFired(goalId: string, variationId: string): boolean {\n const fired = getFiredGoals();\n return (fired[goalId] || []).includes(variationId);\n}\n\nfunction fireGoal(\n goal: Goal,\n assignment: Assignment,\n data?: Record<string, unknown>,\n): void {\n if (goal.countOnce && alreadyFired(goal.id, assignment.variationId)) return;\n if (goal.countOnce) markFired(goal.id, assignment.variationId);\n if (onGoal) onGoal(goal.id, assignment, data);\n}\n\n/**\n * Extract captured values from a matched element based on capture rules.\n * Values are sent as event properties alongside the goal event.\n */\nfunction extractCapturedValues(\n el: Element,\n capture?: CaptureRule[],\n): Record<string, unknown> {\n if (!capture?.length) return {};\n const data: Record<string, unknown> = {};\n for (const rule of capture) {\n if (isStrictJsPolicy() && (containsPiiToken(rule.property) ||\n (rule.attribute && containsPiiToken(rule.attribute)))) continue;\n if (rule.source === \"attribute\" && rule.attribute) {\n data[rule.property] = el.getAttribute(rule.attribute);\n } else if (rule.source === \"textContent\") {\n data[rule.property] = (el.textContent || \"\").trim().slice(0, 500);\n } else if (rule.source === \"dataset\" && rule.attribute) {\n // Convert \"data-product-id\" → \"productId\" for dataset access\n const key = rule.attribute\n .replace(/^data-/, \"\")\n .replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n data[rule.property] = (el as HTMLElement).dataset?.[key] ?? null;\n }\n }\n return data;\n}\n\nfunction textMatches(el: Element, text: string): boolean {\n return (el.textContent || \"\")\n .trim()\n .toLowerCase()\n .includes(text.trim().toLowerCase());\n}\n\nfunction findByText(start: Element, text: string): Element | null {\n let el: Element | null = start;\n const needle = text.trim().toLowerCase();\n while (el && el !== document.documentElement) {\n if ((el.textContent || \"\").trim().toLowerCase().includes(needle)) return el;\n el = el.parentElement;\n }\n return null;\n}\n\nfunction handleClick(e: Event): void {\n const target = e.target as Element;\n if (!target?.closest) return;\n for (const entry of activeClickGoals) {\n const { selector, textMatch } = entry.goal;\n if (!selector && !textMatch) continue;\n\n let matched: Element | null = null;\n\n if (selector) {\n matched = target.closest(selector);\n if (!matched) continue;\n // If textMatch is also set, verify the text\n if (textMatch && !textMatches(matched, textMatch)) continue;\n } else if (textMatch) {\n // No CSS selector — walk up from target checking text\n matched = findByText(target, textMatch);\n if (!matched) continue;\n }\n\n const captured = extractCapturedValues(matched!, entry.goal.capture);\n fireGoal(entry.goal, entry.assignment, captured);\n }\n}\n\nexport function setupGoals(\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n callback: GoalCallback,\n): void {\n onGoal = callback;\n activeClickGoals = [];\n\n if (clickListener) {\n document.removeEventListener(\"click\", clickListener, true);\n clickListener = null;\n }\n\n const expMap = new Map(experiments.map((e) => [e.id, e]));\n let hasClickGoals = false;\n\n for (const assignment of assignments) {\n const exp = expMap.get(assignment.experimentId);\n if (!exp?.goals) continue;\n for (const goal of exp.goals) {\n if (goal.type === \"click\" && (goal.selector || goal.textMatch)) {\n activeClickGoals.push({ goal, assignment });\n hasClickGoals = true;\n }\n if (goal.type === \"pageview\") {\n if (!goal.urlPattern || safeRegexTest(goal.urlPattern, location.href)) {\n fireGoal(goal, assignment);\n }\n }\n }\n }\n\n if (hasClickGoals) {\n clickListener = handleClick;\n document.addEventListener(\"click\", clickListener, true);\n }\n}\n\nexport function triggerGoal(\n goalId: string,\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n data?: Record<string, unknown>,\n): void {\n const expMap = new Map(experiments.map((e) => [e.id, e]));\n for (const assignment of assignments) {\n const exp = expMap.get(assignment.experimentId);\n if (!exp?.goals) continue;\n const goal = exp.goals.find((g) => g.id === goalId);\n if (goal) fireGoal(goal, assignment, data);\n }\n}\n\nexport function triggerGoalsForEvent(\n eventName: string,\n assignments: Assignment[],\n experiments: { id: string; goals?: Goal[] }[],\n data?: Record<string, unknown>,\n): void {\n if (!eventName) return;\n const expMap = new Map(experiments.map((e) => [e.id, e]));\n for (const assignment of assignments) {\n const exp = expMap.get(assignment.experimentId);\n if (!exp?.goals) continue;\n for (const goal of exp.goals) {\n if (goal.type === \"custom\" && goal.eventName === eventName) {\n fireGoal(goal, assignment, data);\n }\n }\n }\n}\n\nexport function cleanupGoals(): void {\n activeClickGoals = [];\n if (clickListener) {\n document.removeEventListener(\"click\", clickListener, true);\n clickListener = null;\n }\n}\n","import type { Assignment, ExternalTrackingSettings } from \"./types\";\n\nexport type HandoverData = {\n visitorId?: string;\n forceMap?: Record<string, string>;\n};\n\nconst DEFAULT_HANDOVER_TTL_SECONDS = 120;\nconst DEFAULT_HANDOVER_MINT_TIMEOUT_MS = 250;\n\nfunction paramName(settings?: ExternalTrackingSettings): string {\n return settings?.handoverQueryParam || \"drip_bucket\";\n}\n\nfunction ttlSeconds(settings?: ExternalTrackingSettings): number {\n const ttl = Number(settings?.handoverTtlSeconds ?? DEFAULT_HANDOVER_TTL_SECONDS);\n return Number.isFinite(ttl) ? Math.max(30, Math.min(600, Math.floor(ttl))) : DEFAULT_HANDOVER_TTL_SECONDS;\n}\n\nexport function handoverMintTimeoutMs(settings?: ExternalTrackingSettings): number {\n const timeout = Number(settings?.handoverMintTimeoutMs ?? DEFAULT_HANDOVER_MINT_TIMEOUT_MS);\n return Number.isFinite(timeout) ? Math.max(50, Math.min(2000, Math.floor(timeout))) : DEFAULT_HANDOVER_MINT_TIMEOUT_MS;\n}\n\nfunction enabledDomains(settings?: ExternalTrackingSettings): string[] {\n return (settings?.domains ?? [])\n .map((domain) => domain.trim().replace(/^https?:\\/\\//i, \"\").replace(/\\/.*$/, \"\").toLowerCase())\n .filter(Boolean);\n}\n\nfunction encodePayload(value: unknown): string {\n const json = JSON.stringify(value);\n return btoa(json).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\ntype VerifiedHandoverPayload = Record<string, unknown>;\n\nfunction decodeVerifiedPayload(parsed: VerifiedHandoverPayload, shopId: string): HandoverData | null {\n try {\n const exp = typeof parsed.exp === \"number\" ? parsed.exp : 0;\n if (!exp || Math.floor(Date.now() / 1000) > exp || parsed.shop !== shopId) return null;\n const visitorId = typeof parsed.visitorId === \"string\" ? parsed.visitorId : undefined;\n const visitorIdV2 = typeof parsed.vid === \"string\" ? parsed.vid : undefined;\n const forceMap: Record<string, string> = {};\n const assignments = Array.isArray(parsed.assignments)\n ? parsed.assignments\n : Array.isArray(parsed.asg)\n ? parsed.asg\n : [];\n if (Array.isArray(assignments)) {\n for (const item of assignments) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n if (typeof record.experimentId === \"string\" && typeof record.variationId === \"string\") {\n forceMap[record.experimentId] = record.variationId;\n } else if (typeof record.e === \"string\" && typeof record.x === \"string\") {\n forceMap[record.e] = record.x;\n }\n }\n }\n return { visitorId: visitorIdV2 ?? visitorId, forceMap };\n } catch {\n return null;\n }\n}\n\nfunction readPayloadExp(value: string): number | null {\n try {\n const payloadPart = value.includes(\".\") ? value.split(\".\")[0] : value;\n const normalized = payloadPart.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n const parsed = JSON.parse(atob(padded)) as Record<string, unknown>;\n return typeof parsed.exp === \"number\" ? parsed.exp : null;\n } catch {\n return null;\n }\n}\n\nfunction hostMatches(hostname: string, domains: string[]): boolean {\n const normalized = hostname.toLowerCase();\n return domains.some((domain) => normalized === domain || normalized.endsWith(`.${domain}`));\n}\n\nfunction appendHandover(url: URL, settings: ExternalTrackingSettings | undefined, payload: string): string {\n url.searchParams.set(paramName(settings), payload);\n return url.toString();\n}\n\nfunction closestLink(target: EventTarget | null): HTMLAnchorElement | null {\n const candidate = target as\n | {\n closest?: (selector: string) => Element | null;\n parentElement?: { closest?: (selector: string) => Element | null };\n }\n | null;\n if (!candidate) return null;\n const direct = typeof candidate.closest === \"function\"\n ? candidate.closest(\"a[href]\")\n : null;\n if (direct) return direct as HTMLAnchorElement;\n const fromParent = typeof candidate.parentElement?.closest === \"function\"\n ? candidate.parentElement.closest(\"a[href]\")\n : null;\n return fromParent as HTMLAnchorElement | null;\n}\n\nfunction resumeLinkNavigation(link: HTMLAnchorElement): void {\n const target = link.getAttribute(\"target\");\n if (\n target\n && target.toLowerCase() !== \"_self\"\n && typeof globalThis.open === \"function\"\n ) {\n globalThis.open(link.href, target);\n return;\n }\n // A synthetic click is the only general way to reproduce the download\n // attribute, but it would re-dispatch merchant handlers. Direct navigation\n // still honors server-provided Content-Disposition downloads.\n globalThis.location?.assign(link.href);\n}\n\nfunction submissionAction(\n form: HTMLFormElement,\n submitter: HTMLElement | null,\n): string {\n const submitterAction = submitter?.getAttribute(\"formaction\");\n if (submitterAction != null) {\n return submitterAction || globalThis.location?.href || \"\";\n }\n return form.getAttribute(\"action\") || globalThis.location?.href || \"\";\n}\n\nexport async function readBucketingHandover(\n settings: ExternalTrackingSettings | undefined,\n shopId: string,\n verifyToken: (token: string) => Promise<unknown>,\n): Promise<HandoverData | null> {\n if (!globalThis.location || !enabledDomains(settings).length || !shopId) return null;\n const value = new URL(globalThis.location.href).searchParams.get(paramName(settings));\n if (!value) return null;\n try {\n const verified = await verifyToken(value);\n return verified && typeof verified === \"object\"\n ? decodeVerifiedPayload(verified as VerifiedHandoverPayload, shopId)\n : null;\n } catch {\n return null;\n }\n}\n\nexport function hasBucketingHandover(settings?: ExternalTrackingSettings): boolean {\n if (!globalThis.location || !enabledDomains(settings).length) return false;\n return Boolean(new URL(globalThis.location.href).searchParams.get(paramName(settings)));\n}\n\nexport function createBucketingHandoverPayload(\n visitorId: string,\n assignments: Assignment[],\n settings?: ExternalTrackingSettings,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n return encodePayload({\n v: 2,\n iat,\n exp: iat + ttlSeconds(settings),\n vid: visitorId,\n asg: assignments.map((assignment) => ({\n e: assignment.experimentId,\n x: assignment.variationId,\n })),\n });\n}\n\nexport function installBucketingHandover(\n settings: ExternalTrackingSettings | undefined,\n getPayload: () => string | null,\n mintPayload?: () => Promise<string | null>,\n): () => void {\n const domains = enabledDomains(settings);\n if (!domains.length || !globalThis.document) return () => {};\n let cachedSignedPayload: string | null = null;\n let cachedBasePayload: string | null = null;\n let cachedSignedPayloadExp = 0;\n let mintInFlight: Promise<string | null> | null = null;\n const mint = () => {\n if (!mintPayload) return null;\n const basePayload = getPayload();\n if (!basePayload) return null;\n if (!mintInFlight) {\n mintInFlight = mintPayload()\n .then((payload) => {\n cachedSignedPayload = payload;\n cachedBasePayload = payload ? basePayload : null;\n cachedSignedPayloadExp = payload ? readPayloadExp(payload) ?? 0 : 0;\n return payload;\n })\n .catch(() => null)\n .finally(() => {\n mintInFlight = null;\n });\n }\n return mintInFlight;\n };\n\n const bestPayload = (): string | null => {\n const basePayload = getPayload();\n const now = Math.floor(Date.now() / 1000);\n if (\n cachedSignedPayload\n && cachedBasePayload === basePayload\n && cachedSignedPayloadExp > now\n ) {\n return cachedSignedPayload;\n }\n // A raw payload is only minting input. Destinations reject it by design,\n // so never put it on a navigation when signing is unavailable or pending.\n return null;\n };\n\n const rewriteUrl = (rawUrl: string | null | undefined): string | null => {\n if (!rawUrl) return null;\n try {\n const url = new URL(rawUrl, globalThis.location?.href);\n if (!hostMatches(url.hostname, domains)) return null;\n const payload = bestPayload();\n if (!payload) return null;\n return appendHandover(url, settings, payload);\n } catch {\n return null;\n }\n };\n\n const isHandoverTarget = (rawUrl: string | null | undefined): boolean => {\n if (!rawUrl) return false;\n try {\n return hostMatches(new URL(rawUrl, globalThis.location?.href).hostname, domains);\n } catch {\n return false;\n }\n };\n\n const handleLinkEvent = (event: Event) => {\n const link = closestLink(event.target);\n if (!link) return;\n if (!isHandoverTarget(link.getAttribute(\"href\"))) return;\n const pending = mint();\n const rewrite = () => {\n const next = rewriteUrl(link.getAttribute(\"href\"));\n if (next) link.href = next;\n };\n if (event.type === \"click\" && pending && !bestPayload()) {\n event.preventDefault();\n void pending.then(() => {\n rewrite();\n resumeLinkNavigation(link);\n });\n return;\n }\n void pending?.then(rewrite);\n rewrite();\n };\n\n const resubmitting = new WeakSet<HTMLFormElement>();\n const handleSubmit = (event: Event) => {\n const form = event.target as HTMLFormElement | null;\n if (!form || form.tagName !== \"FORM\") return;\n if (resubmitting.delete(form)) return;\n const submitter = (event as SubmitEvent).submitter ?? null;\n const rawAction = submissionAction(form, submitter);\n if (!isHandoverTarget(rawAction)) return;\n const pending = mint();\n if (!pending) return;\n event.preventDefault();\n void pending.then(() => {\n const payload = bestPayload();\n const action = rewriteUrl(rawAction);\n if (payload && action) {\n if (submitter?.hasAttribute(\"formaction\")) {\n submitter.setAttribute(\"formaction\", action);\n } else {\n form.action = action;\n }\n const name = paramName(settings);\n let input = form.querySelector(`input[name=\"${name}\"]`) as HTMLInputElement | null;\n if (!input) {\n input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = name;\n form.appendChild(input);\n }\n input.value = payload;\n }\n resubmitting.add(form);\n if (submitter) {\n form.requestSubmit(submitter);\n } else {\n form.requestSubmit();\n }\n });\n };\n\n document.addEventListener(\"click\", handleLinkEvent, true);\n document.addEventListener(\"submit\", handleSubmit, true);\n return () => {\n document.removeEventListener(\"click\", handleLinkEvent, true);\n document.removeEventListener(\"submit\", handleSubmit, true);\n };\n}\n","/**\n * Anti-flicker reveal module.\n *\n * The Worker's /s/<shopId>.js snippet injects\n * <style id=\"drip-hide\">…</style> as early as possible.\n * In optimized mode this style is selector-scoped and only falls back\n * to full-page hiding when scoped selectors are unavailable.\n *\n * This module provides revealAll() which the SDK calls once all mutations\n * have been applied, making the page visible with the correct variant.\n * A snippet safety timeout guarantees the page is always revealed even if\n * the SDK encounters an error.\n */\n\nconst STYLE_ID = \"drip-hide\";\n\n/** Remove the anti-flicker style injected by the snippet */\nexport function revealAll(): void {\n const el = document.getElementById(STYLE_ID);\n if (el) el.remove();\n}\n","/**\n * Lightweight HTML sanitizer using the browser's DOMParser.\n * Strips <script> tags, on* event handlers, and javascript: URLs.\n */\nexport function sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n\n // Remove all <script> elements\n for (const script of Array.from(doc.querySelectorAll(\"script\"))) {\n script.remove();\n }\n\n // Walk every element to strip dangerous attributes\n for (const el of Array.from(doc.body.querySelectorAll(\"*\"))) {\n for (const attr of Array.from(el.attributes)) {\n // Remove on* event handler attributes (onclick, onerror, etc.)\n if (attr.name.toLowerCase().startsWith(\"on\")) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Remove javascript: URLs in href, src, action, formaction, xlink:href\n const urlAttrs = [\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"];\n if (urlAttrs.includes(attr.name.toLowerCase())) {\n const value = attr.value.replace(/\\s+/g, \"\").toLowerCase();\n if (value.startsWith(\"javascript:\")) {\n el.removeAttribute(attr.name);\n }\n }\n }\n }\n\n return doc.body.innerHTML;\n}\n","import type { Mutation } from \"./types\";\nimport { matchesOriginalInnerHtmlSnapshot, normalizeCssPropertyName } from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\n\ntype Entry = {\n el: Element;\n mutation: Mutation;\n experimentId?: string;\n variationId?: string;\n appliedAt: number;\n apply: (element: Element, mutation: Mutation) => void;\n times: number[];\n stopped: boolean;\n appliedNodes?: ChildNode[];\n appliedStyles?: Array<[string, string]>;\n};\n\ntype TreatedRoot = {\n entries: Entry[];\n observer: MutationObserver;\n};\n\n// For html treatments, remember the nodes the treatment put in place and\n// attribute subtree changes: a framework hydration revert either replaces\n// them wholesale or restores the pre-treatment original content in place\n// (React/Vue reconciliation), while variant-owned widget activity (a\n// carousel adding slides, a countdown updating text, variation JS appending\n// state) evolves the applied content into something the original never had.\n// Wholesale replaces reassert at any time; in-place full restores reassert\n// within the hydration window; everything else is treated as variant-owned.\n// Partial in-place patches that do not restore the full original are not\n// separable from widget writes — sites that hit that corner integrate via\n// the drip:hydrated event / hold() API.\nconst IN_PLACE_REVERT_WINDOW_MS = 10_000;\n\nfunction captureAppliedNodes(entry: Entry): void {\n if (entry.mutation.action === \"html\") {\n entry.appliedNodes = Array.from(entry.el.childNodes);\n } else if (entry.mutation.action === \"style\" || entry.mutation.action === \"setStyle\") {\n const style = (entry.el as HTMLElement).style;\n entry.appliedStyles = Object.keys(entry.mutation.styles ?? {}).map((name) => [\n name = normalizeCssPropertyName(name),\n style.getPropertyValue(name),\n ]);\n }\n}\n\nfunction variantContentSurvives(entry: Entry, needsDeepCheck: boolean): boolean {\n const surviving = (entry.appliedNodes ?? []).some(\n (node) => node.isConnected && entry.el.contains(node),\n );\n if (!surviving) return false;\n if (Date.now() - entry.appliedAt > IN_PLACE_REVERT_WINDOW_MS) return true;\n if (!needsDeepCheck) return true;\n // Any captured pre-state counts as a revert target: the server original,\n // or — with stacked html treatments — an earlier treatment's content.\n return !matchesOriginalInnerHtmlSnapshot(entry.el, entry.el.innerHTML);\n}\n\nconst pending = new Set<Entry>();\nconst deepChecks = new Set<Entry>();\nconst roots = new Map<Element, TreatedRoot>();\nlet frame: number | null = null;\n\nfunction perf(): Record<string, unknown> | null {\n if (typeof window === \"undefined\") return null;\n const target = window as Window & { __dripPerf?: Record<string, unknown> };\n return target.__dripPerf = target.__dripPerf ?? {};\n}\n\nfunction matches(entry: Entry, record: MutationRecord): boolean {\n if (!entry.el.isConnected) return false;\n const action = entry.mutation.action;\n if (action === \"style\" || action === \"setStyle\") {\n if (record.type !== \"attributes\" || record.target !== entry.el || record.attributeName !== \"style\") return false;\n const style = (entry.el as HTMLElement).style;\n return entry.appliedStyles!.some(\n ([name, value]) => style.getPropertyValue(name) !== value,\n );\n }\n if (action === \"attribute\") {\n if (record.type !== \"attributes\" || record.target !== entry.el || !record.attributeName) return false;\n const expected = record.attributeName === entry.mutation.attribute?.name\n ? entry.mutation.attribute.value\n : entry.mutation.attributes?.[record.attributeName];\n return expected !== undefined && entry.el.getAttribute(record.attributeName) !== expected;\n }\n if (action === \"html\") return true;\n return record.type !== \"attributes\" && entry.el.textContent !== entry.mutation.text;\n}\n\nfunction markPending(entry: Entry): void {\n pending.add(entry);\n if (entry.mutation.action === \"html\") deepChecks.add(entry);\n}\n\nfunction schedule(): void {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n const now = Date.now();\n for (const entry of pending) {\n if (entry.stopped) continue;\n entry.times = entry.times.filter((at) => now - at < 10_000);\n if (entry.times.length === 12) {\n entry.stopped = true;\n const metrics = perf();\n if (metrics) metrics.reassert_loop_detected = true;\n continue;\n }\n if (entry.mutation.action === \"html\" && variantContentSurvives(entry, deepChecks.has(entry))) {\n // The change came from inside the still-applied treatment; erasing\n // it would destroy legitimate widget state. Track the evolved\n // subtree instead of reasserting the original static HTML.\n captureAppliedNodes(entry);\n continue;\n }\n entry.times.push(now);\n runMuted(() => entry.apply(entry.el, entry.mutation));\n captureAppliedNodes(entry);\n const metrics = perf();\n if (metrics) metrics.reapply_count = (Number(metrics.reapply_count) || 0) + 1;\n if (entry.mutation.action === \"html\") {\n document.dispatchEvent(new CustomEvent(\"drip:mutation-reapplied\", { detail: {\n experimentId: entry.experimentId,\n variationId: entry.variationId,\n selector: entry.mutation.selector,\n action: entry.mutation.action,\n } }));\n }\n }\n pending.clear();\n deepChecks.clear();\n });\n}\n\nfunction observe(element: Element): void {\n if (typeof MutationObserver === \"undefined\" || roots.has(element)) return;\n for (const [treatedRoot, { observer }] of roots) {\n if (treatedRoot.isConnected) continue;\n observer.disconnect();\n unregisterMutedObserver(observer);\n roots.delete(treatedRoot);\n }\n const entries: Entry[] = [];\n const onRecords: MutationCallback = (records) => {\n for (const record of records) {\n for (const entry of entries) {\n if (!entry.stopped && matches(entry, record)) markPending(entry);\n }\n }\n if (pending.size) schedule();\n };\n const observer = new MutationObserver(onRecords);\n roots.set(element, { entries, observer });\n registerMutedObserver(observer, onRecords);\n observer.observe(element, { attributes: true, characterData: true, childList: true, subtree: true });\n}\n\nexport function trackAppliedMutation(\n element: Element,\n mutation: Mutation,\n context: { experimentId?: string; variationId?: string },\n apply: (element: Element, mutation: Mutation) => void,\n): void {\n if (mutation.action === \"remove\" || mutation.action === \"insertBefore\" || mutation.action === \"insertAfter\") return;\n observe(element);\n const entries = roots.get(element)?.entries;\n if (!entries) return;\n const existing = entries.find((entry) => entry.mutation === mutation);\n if (existing) {\n Object.assign(existing, context, { appliedAt: Date.now(), apply });\n captureAppliedNodes(existing);\n } else {\n const entry: Entry = { el: element, mutation, ...context, appliedAt: Date.now(), apply, times: [], stopped: false };\n captureAppliedNodes(entry);\n entries.push(entry);\n }\n}\n\nexport function resetReassertSentinel(): void {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n pending.clear();\n deepChecks.clear();\n for (const { observer } of roots.values()) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n roots.clear();\n}\n","import { Mutation, MutationAction } from \"./types\";\nimport { sanitizeHtml } from \"./sanitize\";\nimport { runMuted } from \"./observer-mute\";\nimport { resetReassertSentinel } from \"./reassert-sentinel\";\nimport { isStrictJsPolicy } from \"./js\";\n\nexport type ApplyOptions = {\n root?: Document | HTMLElement;\n onApplied?: (mutation: Mutation, element: Element, index: number) => void;\n onMiss?: (mutation: Mutation, index: number) => void;\n};\n\nconst INSERT_ATTR = \"data-drip-inserted\";\n\ntype AttributeSnapshot = {\n kind: \"attribute\";\n element: Element;\n values: Array<{ name: string; value: string | null }>;\n};\n\ntype ContentSnapshot = {\n kind: \"content\";\n element: Element;\n property: \"innerHTML\" | \"textContent\";\n value: string | null;\n};\n\ntype StyleSnapshot = {\n kind: \"style\";\n element: HTMLElement;\n values: Array<{ name: string; value: string; priority: string }>;\n};\n\ntype RemoveSnapshot = {\n kind: \"remove\";\n element: Element;\n parent: Node | null;\n nextSibling: Node | null;\n};\n\ntype InsertSnapshot = {\n kind: \"insert\";\n nodes: Node[];\n};\n\ntype MutationSnapshot =\n | AttributeSnapshot\n | ContentSnapshot\n | StyleSnapshot\n | RemoveSnapshot\n | InsertSnapshot;\n\nconst mutationSnapshots: MutationSnapshot[] = [];\n\nconst URL_ATTRIBUTES = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\"]);\nconst SAFE_DATA_URL_MEDIA_TYPES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/avif\",\n]);\n\nexport function isSafeMutationAttribute(name: string, value: string | null): boolean {\n const normalizedName = name.trim().toLowerCase();\n if (!normalizedName || normalizedName.startsWith(\"on\") || normalizedName === \"srcdoc\") {\n return false;\n }\n if (value === null || !URL_ATTRIBUTES.has(normalizedName)) return true;\n const normalizedValue = value.replace(/[\\u0000-\\u0020]+/g, \"\").toLowerCase();\n if (normalizedValue.startsWith(\"javascript:\")) return false;\n if (!normalizedValue.startsWith(\"data:\")) return true;\n const mediaType = normalizedValue.slice(5).split(/[;,]/, 1)[0];\n return SAFE_DATA_URL_MEDIA_TYPES.has(mediaType);\n}\n\nfunction sanitizeMutationHtml(html: string): string {\n const sanitized = sanitizeHtml(html);\n if (!isStrictJsPolicy()) return sanitized;\n const template = document.createElement(\"template\");\n template.innerHTML = sanitized;\n for (const element of Array.from(template.content.querySelectorAll(\"*\"))) {\n for (const attribute of Array.from(element.attributes)) {\n if (!isSafeMutationAttribute(attribute.name, attribute.value)) {\n element.removeAttribute(attribute.name);\n }\n }\n }\n return template.innerHTML;\n}\n\nexport function normalizeCssPropertyName(name: string): string {\n // Prefer CSS syntax (kebab-case) because it works with:\n // - HTMLElement.style.setProperty(...)\n // - inline style rewriting at the edge worker\n // But accept common JS-style camelCase keys for developer ergonomics.\n if (!name) return name;\n if (name.startsWith(\"--\")) return name; // custom properties\n if (name.includes(\"-\")) return name; // already kebab-case\n\n let out = name.replace(/[A-Z]/g, (m) => \"-\" + m.toLowerCase());\n // Special-case msTransform -> -ms-transform\n if (out.startsWith(\"ms-\")) out = \"-\" + out;\n return out;\n}\n\nexport function getMutationKey(mutation: Mutation, index: number): string {\n return (\n mutation.action +\n \":\" +\n index +\n \":\" +\n (mutation.selector || \"\") +\n \":\" +\n (mutation.html || mutation.text || \"\")\n );\n}\n\nexport function isInsertAction(action: MutationAction): boolean {\n return action === \"insertBefore\" || action === \"insertAfter\";\n}\n\nfunction snapshotMutation(\n mutation: Mutation,\n element: Element,\n snapshots: MutationSnapshot[] = mutationSnapshots,\n): void {\n switch (mutation.action) {\n case \"html\":\n snapshots.push({\n kind: \"content\",\n element,\n property: \"innerHTML\",\n value: element.innerHTML,\n });\n break;\n case \"text\":\n case \"setText\":\n snapshots.push({\n kind: \"content\",\n element,\n property: \"textContent\",\n value: element.textContent,\n });\n break;\n case \"attribute\": {\n const names = new Set<string>();\n if (mutation.attribute) names.add(mutation.attribute.name);\n if (mutation.attributes) {\n Object.keys(mutation.attributes).forEach((name) => names.add(name));\n }\n snapshots.push({\n kind: \"attribute\",\n element,\n values: Array.from(names).map((name) => ({\n name,\n value: element.getAttribute(name),\n })),\n });\n break;\n }\n case \"style\":\n case \"setStyle\": {\n const style = (element as HTMLElement).style;\n const names = Object.keys(mutation.styles ?? {}).map(normalizeCssPropertyName);\n snapshots.push({\n kind: \"style\",\n element: element as HTMLElement,\n values: names.map((name) => ({\n name,\n value: style.getPropertyValue(name),\n priority: style.getPropertyPriority(name),\n })),\n });\n break;\n }\n case \"remove\":\n snapshots.push({\n kind: \"remove\",\n element,\n parent: element.parentNode,\n nextSibling: element.nextSibling,\n });\n break;\n }\n}\n\nfunction restoreSnapshot(snapshot: MutationSnapshot): void {\n switch (snapshot.kind) {\n case \"content\":\n if (snapshot.property === \"innerHTML\") {\n snapshot.element.innerHTML = snapshot.value ?? \"\";\n } else {\n snapshot.element.textContent = snapshot.value;\n }\n break;\n case \"attribute\":\n for (const { name, value } of snapshot.values) {\n if (value === null) snapshot.element.removeAttribute(name);\n else snapshot.element.setAttribute(name, value);\n }\n break;\n case \"style\":\n for (const { name, value, priority } of snapshot.values) {\n if (value) snapshot.element.style.setProperty(name, value, priority);\n else snapshot.element.style.removeProperty(name);\n }\n break;\n case \"remove\":\n if (!snapshot.parent || snapshot.element.parentNode) return;\n try {\n snapshot.parent.insertBefore(snapshot.element, snapshot.nextSibling);\n } catch {\n snapshot.parent.appendChild(snapshot.element);\n }\n break;\n case \"insert\":\n for (const node of snapshot.nodes) node.parentNode?.removeChild(node);\n break;\n }\n}\n\nexport function applyToElement(mutation: Mutation, element: Element): void {\n switch (mutation.action) {\n case \"html\":\n if (typeof mutation.html === \"string\") element.innerHTML = sanitizeMutationHtml(mutation.html);\n break;\n case \"text\":\n case \"setText\":\n if (typeof mutation.text === \"string\") element.textContent = mutation.text;\n break;\n case \"attribute\":\n if (mutation.attribute) {\n if (!isStrictJsPolicy() ||\n isSafeMutationAttribute(mutation.attribute.name, mutation.attribute.value)) {\n if (mutation.attribute.value === null) {\n element.removeAttribute(mutation.attribute.name);\n } else {\n element.setAttribute(mutation.attribute.name, mutation.attribute.value);\n }\n }\n }\n if (mutation.attributes) {\n for (const [name, value] of Object.entries(mutation.attributes)) {\n if (isStrictJsPolicy() && !isSafeMutationAttribute(name, value)) continue;\n if (value === null) element.removeAttribute(name);\n else element.setAttribute(name, value);\n }\n }\n break;\n case \"style\":\n case \"setStyle\":\n if (mutation.styles) {\n for (const [name, value] of Object.entries(mutation.styles)) {\n (element as HTMLElement).style.setProperty(\n normalizeCssPropertyName(name),\n value,\n );\n }\n }\n break;\n case \"remove\":\n element.remove();\n break;\n case \"insertBefore\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"beforebegin\", sanitizeMutationHtml(mutation.html));\n }\n break;\n case \"insertAfter\":\n if (typeof mutation.html === \"string\") {\n element.insertAdjacentHTML(\"afterend\", sanitizeMutationHtml(mutation.html));\n }\n break;\n }\n}\n\nexport function isInsertDuplicate(element: Element, key: string): boolean {\n const parent = element.parentElement;\n if (!parent) return false;\n return Array.from(parent.querySelectorAll(\"[\" + INSERT_ATTR + \"]\")).some(\n (candidate) => candidate.getAttribute(INSERT_ATTR) === key,\n );\n}\n\nexport function markInserted(el: Element, key: string): void {\n (el as HTMLElement).setAttribute(INSERT_ATTR, key);\n}\n\nfunction applyTrackedMutationWithSnapshots(\n mutation: Mutation,\n element: Element,\n snapshots: MutationSnapshot[],\n key?: string,\n): Element | null {\n return runMuted(() => {\n if (isInsertAction(mutation.action)) {\n const parent = element.parentNode;\n if (!parent || typeof mutation.html !== \"string\") return null;\n const previousSibling = element.previousSibling;\n const nextSibling = element.nextSibling;\n applyToElement(mutation, element);\n const insertedNodes: Node[] = [];\n let current = mutation.action === \"insertBefore\"\n ? (previousSibling ? previousSibling.nextSibling : parent.firstChild)\n : element.nextSibling;\n const boundary = mutation.action === \"insertBefore\" ? element : nextSibling;\n while (current && current !== boundary) {\n insertedNodes.push(current);\n current = current.nextSibling;\n }\n const insertedElements = insertedNodes.filter(\n (node): node is Element => node instanceof Element,\n );\n if (key) insertedElements.forEach((inserted) => markInserted(inserted, key));\n if (insertedNodes.length) snapshots.push({ kind: \"insert\", nodes: insertedNodes });\n return insertedElements[0] ?? null;\n }\n snapshotMutation(mutation, element, snapshots);\n applyToElement(mutation, element);\n return null;\n });\n}\n\nexport function applyTrackedMutation(mutation: Mutation, element: Element, key?: string): Element | null {\n return applyTrackedMutationWithSnapshots(mutation, element, mutationSnapshots, key);\n}\n\n// Every pre-apply innerHTML captured for the element's html mutations. The\n// reassert sentinel uses these to attribute subtree changes: a framework\n// hydration revert restores one of these pre-states (the server original,\n// or — for stacked treatments — an earlier treatment's content), while\n// variant-owned widget activity produces content none of them ever had.\nexport function matchesOriginalInnerHtmlSnapshot(element: Element, current: string): boolean {\n for (const snapshot of mutationSnapshots) {\n if (\n snapshot.kind === \"content\" &&\n snapshot.element === element &&\n snapshot.property === \"innerHTML\" &&\n typeof snapshot.value === \"string\"\n ) {\n if (snapshot.value === current) return true;\n }\n }\n return false;\n}\n\nfunction applyMutationsWithSnapshots(\n mutations: Mutation[],\n options: ApplyOptions,\n snapshots: MutationSnapshot[],\n): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n let elements: NodeListOf<Element>;\n try {\n elements = root.querySelectorAll(mutation.selector);\n } catch {\n options.onMiss?.(mutation, index);\n return;\n }\n if (elements.length === 0) {\n options.onMiss?.(mutation, index);\n return;\n }\n elements.forEach((element) => {\n const key = getMutationKey(mutation, index);\n if (isInsertAction(mutation.action)) {\n if (isInsertDuplicate(element, key)) return;\n applyTrackedMutationWithSnapshots(mutation, element, snapshots, key);\n options.onApplied?.(mutation, element, index);\n return;\n }\n applyTrackedMutationWithSnapshots(mutation, element, snapshots, key);\n options.onApplied?.(mutation, element, index);\n });\n });\n}\n\nexport function applyMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n applyMutationsWithSnapshots(mutations, options, mutationSnapshots);\n}\n\nexport function reassertNonStructuralMutations(mutations: Mutation[], options: ApplyOptions = {}): void {\n const root = options.root || document;\n mutations.forEach((mutation, index) => {\n if (isInsertAction(mutation.action) || mutation.action === \"remove\") return;\n const elements = root.querySelectorAll(mutation.selector);\n elements.forEach((element) => {\n runMuted(() => applyToElement(mutation, element));\n options.onApplied?.(mutation, element, index);\n });\n });\n}\n\nexport function resetAppliedMutations(): void {\n resetReassertSentinel();\n runMuted(() => {\n for (let i = mutationSnapshots.length - 1; i >= 0; i -= 1) {\n restoreSnapshot(mutationSnapshots[i]);\n }\n });\n mutationSnapshots.length = 0;\n}\n\nexport type MutationApplicationContext = {\n apply: (mutations: Mutation[], options?: ApplyOptions) => void;\n rollback: () => void;\n readonly snapshotCount: number;\n};\n\n/**\n * Owns only the DOM snapshots created through this context. Rolling it back\n * restores the state that existed immediately before its mutations, without\n * touching shopper assignment mutations tracked by the main SDK runtime.\n */\nexport function createMutationApplicationContext(): MutationApplicationContext {\n const snapshots: MutationSnapshot[] = [];\n return {\n apply(mutations, options = {}) {\n applyMutationsWithSnapshots(mutations, options, snapshots);\n },\n rollback() {\n runMuted(() => {\n for (let i = snapshots.length - 1; i >= 0; i -= 1) {\n restoreSnapshot(snapshots[i]);\n }\n });\n snapshots.length = 0;\n },\n get snapshotCount() {\n return snapshots.length;\n },\n };\n}\n\n/** @internal — exposed for unit testing only. Tree-shaken from production build. */\nexport const __test = {\n normalizeCssPropertyName,\n};\n\nexport function observeSpaNavigation(onChange: () => void): () => void {\n let lastUrl = location.href;\n const notify = () => {\n if (lastUrl !== location.href) {\n lastUrl = location.href;\n onChange();\n }\n };\n const wrap = (method: \"pushState\" | \"replaceState\") => {\n const original = history[method];\n history[method] = function (...args: Parameters<History[\"pushState\"]>) {\n const ret = original.apply(this, args);\n notify();\n return ret;\n };\n return () => {\n history[method] = original;\n };\n };\n const restorePush = wrap(\"pushState\");\n const restoreReplace = wrap(\"replaceState\");\n window.addEventListener(\"popstate\", notify);\n return () => {\n restorePush();\n restoreReplace();\n window.removeEventListener(\"popstate\", notify);\n };\n}\n","import { registerMutedObserver, unregisterMutedObserver } from \"./observer-mute\";\nimport { isCommercePriceWorkPending } from \"./commerce-price\";\nimport type { Assignment, CommercePriceSettings } from \"./types\";\n\nlet holds = 0;\nlet hydratedAt = 0;\nconst signals = new Set<() => void>();\n\nfunction perf(): Record<string, unknown> | null {\n if (typeof window === \"undefined\") return null;\n const target = window as Window & { __dripPerf?: Record<string, unknown> };\n return target.__dripPerf = target.__dripPerf ?? {};\n}\n\nexport function detectSsrFramework(): \"nuxt\" | \"next\" | \"server-rendered\" | null {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return null;\n const runtime = window as Window & { __NUXT__?: unknown; __NEXT_DATA__?: unknown; __next_f?: unknown };\n if (runtime.__NUXT__ !== undefined || document.querySelector(\"#__nuxt\")) return \"nuxt\";\n if (\n runtime.__NEXT_DATA__ !== undefined ||\n runtime.__next_f !== undefined ||\n document.querySelector(\"#__next\") ||\n document.querySelector('script[src*=\"/_next/static/\"]')\n ) return \"next\";\n return document.querySelector(\"[data-server-rendered]\") ? \"server-rendered\" : null;\n}\n\nexport function holdMutations(): number {\n return ++holds;\n}\n\nexport function releaseMutations(): number {\n holds = Math.max(0, holds - 1);\n if (!holds) signals.forEach((signal) => signal());\n return holds;\n}\n\nexport function hasMutationHold(): boolean {\n return holds > 0;\n}\n\nexport function signalHydrated(): void {\n hydratedAt ||= Date.now();\n signals.forEach((signal) => signal());\n}\n\nexport function awaitHydration(\n timeoutMs: number,\n options: { waitForHydration?: boolean } = {},\n): Promise<void> {\n const started = Date.now();\n const boundedTimeoutMs = Number.isFinite(timeoutMs)\n ? Math.max(0, Math.min(10_000, timeoutMs))\n : 3_000;\n if (\n boundedTimeoutMs > 0 &&\n options.waitForHydration !== false &&\n !hydratedAt &&\n typeof document !== \"undefined\" &&\n document.readyState === \"loading\" &&\n detectSsrFramework() === null\n ) {\n // Head installs run before the SSR root markers (#__next, #__nuxt,\n // data-server-rendered) are parsed; deciding \"no hydration\" now would\n // silently skip after_hydration exactly where it matters. Re-detect\n // once the DOM is available — racing the same hard timeout so a\n // delayed DOMContentLoaded can never hold the gate past the budget.\n return new Promise((resolve) => {\n let settled = false;\n const proceed = () => {\n if (settled) return;\n settled = true;\n clearTimeout(fallback);\n document.removeEventListener(\"DOMContentLoaded\", proceed);\n signals.delete(proceed);\n const remaining = Math.max(0, boundedTimeoutMs - (Date.now() - started));\n void awaitHydration(remaining, options).then(resolve);\n };\n document.addEventListener(\"DOMContentLoaded\", proceed, { once: true });\n // A framework can call drip.hydrated() before the parser reaches the\n // root marker/DOMContentLoaded. Let that explicit signal re-enter the\n // normal gate immediately instead of waiting for the hard deadline.\n signals.add(proceed);\n const fallback = setTimeout(proceed, boundedTimeoutMs);\n });\n }\n const frameworkDetected = detectSsrFramework() !== null;\n const explicitHydrationWait = options.waitForHydration === true;\n const needsHydration =\n options.waitForHydration !== false &&\n !hydratedAt &&\n (explicitHydrationWait || frameworkDetected);\n if (!needsHydration && !holds) return Promise.resolve();\n\n return new Promise((resolve) => {\n let hydrationDone = !needsHydration;\n let settled = false;\n let observer: MutationObserver | null = null;\n let frame = 0;\n let quietFrames = 0;\n let lastMutation = Date.now();\n\n const finish = (timedOut = false) => {\n if (settled) return;\n settled = true;\n const hydrationTimeout = timedOut && !hydrationDone;\n const holdTimeout = timedOut && holds > 0;\n if (hydrationTimeout) hydratedAt = Date.now();\n if (holdTimeout) {\n holds = 0;\n console.warn(\"[drip] Mutation hold timed out; applying fail-open\");\n }\n const metrics = perf();\n if (metrics) {\n if (needsHydration || hydratedAt) metrics.hydration_detected_at = hydratedAt || Date.now();\n metrics.apply_delayed_ms = Math.max(0, Date.now() - started);\n if (hydrationTimeout) metrics.hydration_timeout = true;\n if (holdTimeout) metrics.hold_timeout = true;\n }\n signals.delete(check);\n clearTimeout(timer);\n if (frame) cancelAnimationFrame(frame);\n if (observer) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n resolve();\n };\n\n function check() {\n if (hydratedAt) hydrationDone = true;\n if (hydrationDone && !holds) finish();\n }\n\n const onFrame = () => {\n quietFrames = Date.now() - lastMutation >= 50 ? quietFrames + 1 : 0;\n if (quietFrames === 2) {\n hydratedAt = Date.now();\n hydrationDone = true;\n check();\n } else if (!settled) frame = requestAnimationFrame(onFrame);\n };\n\n const beginQuiet = () => {\n if (!needsHydration || hydrationDone || settled) return;\n if (typeof MutationObserver === \"undefined\" || !document.documentElement) {\n hydrationDone = true;\n check();\n return;\n }\n const onRecords: MutationCallback = () => {\n lastMutation = Date.now();\n quietFrames = 0;\n };\n observer = new MutationObserver(onRecords);\n registerMutedObserver(observer, onRecords);\n observer.observe(document.documentElement, { attributes: true, characterData: true, childList: true, subtree: true });\n frame = requestAnimationFrame(onFrame);\n };\n\n signals.add(check);\n const timer = setTimeout(() => finish(true), boundedTimeoutMs);\n if (needsHydration && frameworkDetected) {\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", beginQuiet, { once: true });\n else beginQuiet();\n }\n check();\n });\n}\n\nexport function resetHydrationState(): void {\n holds = 0;\n hydratedAt = 0;\n signals.forEach((signal) => signal());\n}\n\n// The anti-flicker reveal happens inside applyAssignments(), so deferring the\n// apply (hydration wait / pre-init hold) is only justified when the assignment\n// set carries visual work to coordinate. Untreated visitors — traffic-excluded\n// or control/no-mutation assignments — must apply and reveal immediately.\nexport function assignmentsHaveVisualWork(\n assignments: Assignment[],\n priceSettings?: CommercePriceSettings,\n): boolean {\n return (\n assignments.some(\n (assignment) =>\n assignment.mutations.length > 0 ||\n Boolean(\n assignment.css ||\n assignment.js ||\n assignment.externalCssUrl ||\n assignment.externalJsUrl ||\n assignment.experimentCss ||\n assignment.experimentJs,\n ),\n ) || isCommercePriceWorkPending(priceSettings, assignments)\n );\n}\n\nif (typeof document !== \"undefined\" && typeof document.addEventListener === \"function\") {\n document.addEventListener(\"drip:hydrated\", signalHydrated);\n}\n","import { RouterMode } from \"./types\";\n\nexport type RouteChangeEvent = {\n previousUrl: string;\n nextUrl: string;\n reason: \"pushState\" | \"replaceState\" | \"popstate\" | \"hashchange\" | \"navigation\";\n};\n\ntype RouteObserver = (event: RouteChangeEvent) => void;\n\nfunction notifyIfChanged(\n lastUrlRef: { value: string },\n reason: RouteChangeEvent[\"reason\"],\n observer: RouteObserver,\n): void {\n const next = location.href;\n if (next === lastUrlRef.value) return;\n const previous = lastUrlRef.value;\n lastUrlRef.value = next;\n observer({ previousUrl: previous, nextUrl: next, reason });\n}\n\nfunction observeHistoryChanges(observer: RouteObserver, lastUrlRef: { value: string }): () => void {\n const wrap = (method: \"pushState\" | \"replaceState\") => {\n const original = history[method];\n history[method] = function (...args: Parameters<History[\"pushState\"]>) {\n const ret = original.apply(this, args);\n notifyIfChanged(lastUrlRef, method, observer);\n return ret;\n };\n return () => {\n history[method] = original;\n };\n };\n\n const restorePush = wrap(\"pushState\");\n const restoreReplace = wrap(\"replaceState\");\n const popHandler = () => notifyIfChanged(lastUrlRef, \"popstate\", observer);\n const hashHandler = () => notifyIfChanged(lastUrlRef, \"hashchange\", observer);\n\n window.addEventListener(\"popstate\", popHandler);\n window.addEventListener(\"hashchange\", hashHandler);\n\n return () => {\n restorePush();\n restoreReplace();\n window.removeEventListener(\"popstate\", popHandler);\n window.removeEventListener(\"hashchange\", hashHandler);\n };\n}\n\nfunction observeNavigationApi(observer: RouteObserver, lastUrlRef: { value: string }): () => void {\n const w = globalThis as Record<string, unknown>;\n const navigation = w.navigation as {\n addEventListener?: (type: string, listener: () => void) => void;\n removeEventListener?: (type: string, listener: () => void) => void;\n } | undefined;\n if (!navigation || typeof navigation.addEventListener !== \"function\") {\n return () => {};\n }\n\n const listener = () => notifyIfChanged(lastUrlRef, \"navigation\", observer);\n navigation.addEventListener(\"navigate\", listener);\n\n return () => {\n if (typeof navigation.removeEventListener === \"function\") {\n navigation.removeEventListener(\"navigate\", listener);\n }\n };\n}\n\nexport function observeRouteChanges(\n mode: RouterMode,\n observer: RouteObserver,\n): () => void {\n if (mode === \"none\") return () => {};\n\n const lastUrlRef = { value: location.href };\n const cleanups: Array<() => void> = [];\n\n if (mode === \"navigation\") {\n cleanups.push(observeNavigationApi(observer, lastUrlRef));\n }\n\n if (mode === \"history\" || mode === \"navigation\") {\n cleanups.push(observeHistoryChanges(observer, lastUrlRef));\n }\n\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n}\n","import type { RuntimeSignalDefinition } from \"./types\";\nimport { containsPiiToken } from \"./pii-keys\";\n\ntype ExposureSignalValue = string | number | boolean;\n\nconst BUILT_IN_SIGNALS: Array<[source: string, output: string]> = [\n [\"traffic.source\", \"traffic_source\"],\n [\"visitor.returning\", \"visitor_returning\"],\n [\"shopify.page_type\", \"page_type\"],\n [\"shopify.product_type\", \"product_type\"],\n [\"cart.item_count\", \"cart_item_count\"],\n [\"navigator.language\", \"language\"],\n];\n\nconst BUILT_IN_OUTPUT_KEYS = new Set(BUILT_IN_SIGNALS.map(([, output]) => output));\nconst MAX_KEYS = 24;\nconst MAX_JSON_CHARS = 2000;\nconst MAX_STRING_CHARS = 120;\nconst EXCLUDED_CUSTOM_KEYS = new Set([\n \"cookie.value\",\n \"referrer\",\n \"search.last_query\",\n \"shopify.customer_tag\",\n]);\nconst EXCLUDED_CUSTOM_PREFIXES = [\n \"url.\",\n \"utm.\",\n \"device.\",\n \"geo.\",\n \"recently_viewed.\",\n];\n\n// Custom signal keys are merchant-defined, so key-syntax validation alone\n// cannot stop PII-shaped signals (customer.email, phone, …) from reaching\n// analytics. Any key containing one of these tokens is never attached to\n// exposure events, regardless of merchant configuration.\nfunction normalizeValue(value: unknown): ExposureSignalValue | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, MAX_STRING_CHARS) : undefined;\n }\n return undefined;\n}\n\nfunction outputKeyForCustomSignal(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nfunction collidesWithBuiltInPrefix(key: string): boolean {\n if (!key) return true;\n for (const builtInKey of BUILT_IN_OUTPUT_KEYS) {\n if (key === builtInKey || key.startsWith(`${builtInKey}_`)) return true;\n }\n return false;\n}\n\nfunction isExcludedCustomSignalKey(key: string): boolean {\n const normalized = key.trim().toLowerCase();\n if (EXCLUDED_CUSTOM_KEYS.has(normalized)) return true;\n if (EXCLUDED_CUSTOM_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {\n return true;\n }\n return containsPiiToken(key);\n}\n\nfunction compactToLimits(values: Record<string, ExposureSignalValue>): Record<string, ExposureSignalValue> | null {\n const keys = Object.keys(values).sort();\n while (keys.length > MAX_KEYS) {\n const key = keys.pop();\n if (key) delete values[key];\n }\n\n while (keys.length > 0 && JSON.stringify(values).length > MAX_JSON_CHARS) {\n const key = keys.pop();\n if (key) delete values[key];\n }\n\n if (Object.keys(values).length === 0) return null;\n return Object.fromEntries(\n Object.keys(values).sort().map((key) => [key, values[key]]),\n ) as Record<string, ExposureSignalValue>;\n}\n\nexport function buildExposureSignalContext(input: {\n attributes: Record<string, unknown>;\n customSignals?: RuntimeSignalDefinition[];\n}): Record<string, ExposureSignalValue> | null {\n const values: Record<string, ExposureSignalValue> = {};\n\n for (const [sourceKey, outputKey] of BUILT_IN_SIGNALS) {\n const value = normalizeValue(input.attributes[sourceKey]);\n if (value !== undefined) values[outputKey] = value;\n }\n\n for (const signal of input.customSignals ?? []) {\n if (!signal.key) continue;\n if (isExcludedCustomSignalKey(signal.key)) continue;\n if (![\"string\", \"number\", \"boolean\"].includes(signal.valueType ?? \"string\")) continue;\n const outputKey = outputKeyForCustomSignal(signal.key);\n if (collidesWithBuiltInPrefix(outputKey)) continue;\n if (Object.prototype.hasOwnProperty.call(values, outputKey)) continue;\n const value = normalizeValue(input.attributes[signal.key]);\n if (value !== undefined) values[outputKey] = value;\n }\n\n return compactToLimits(values);\n}\n","import { debugWarn } from \"./debug\";\nimport type { InitConfig } from \"./types\";\n\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\n\ntype PrerequisiteContext = {\n type: \"show_variations\" | \"start_tracking\";\n url: string;\n attributes: Record<string, unknown>;\n userId: string | null;\n consentRequired: boolean;\n consentGranted: boolean;\n};\n\nfunction getWindowValue(key: string): unknown {\n const w = globalThis as Record<string, unknown>;\n return w[key] ?? (w.__drip as Record<string, unknown> | undefined)?.[key];\n}\n\nfunction buildRuleApi(context: PrerequisiteContext) {\n return {\n get(key: string): unknown {\n if (key === \"trackingConsentEnabled\") {\n return !context.consentRequired || context.consentGranted;\n }\n if (key === \"consentGranted\") return context.consentGranted;\n if (key === \"url\") return context.url;\n if (key === \"userId\") return context.userId;\n return getWindowValue(key);\n },\n context,\n };\n}\n\nfunction normalizeSimpleRule(code: string): string {\n return code.trim().replace(/\\s+/g, \" \").replace(/;+$/, \"\");\n}\n\nfunction evaluateKnownRule(code: string, context: PrerequisiteContext): boolean | null {\n const normalized = normalizeSimpleRule(code);\n if (normalized === \"return true\") return true;\n if (normalized === \"return false\") return false;\n if (normalized === \"return context.consentGranted\") return context.consentGranted;\n if (normalized === \"return !context.consentRequired || context.consentGranted\") {\n return !context.consentRequired || context.consentGranted;\n }\n\n const getterMatch = normalized.match(/^return\\s+(?:drip|Drip)\\.get\\(['\"]([a-zA-Z0-9_.-]+)['\"]\\)$/);\n if (getterMatch) {\n const api = buildRuleApi(context);\n return api.get(getterMatch[1]) === true;\n }\n\n return null;\n}\n\nexport function evaluateProjectPrerequisite(\n rule: string | undefined,\n context: PrerequisiteContext,\n fallback: boolean,\n): boolean {\n const code = (rule ?? \"\").trim();\n if (!code) return fallback;\n const knownResult = evaluateKnownRule(code, context);\n if (knownResult != null) return knownResult;\n try {\n const api = buildRuleApi(context);\n const fn = new Function(\"context\", \"drip\", \"Drip\", code);\n const result = fn.call(globalThis, context, api, api);\n return result === true;\n } catch (err) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"prerequisite\", `${context.type} rule failed; failing closed`, {\n error: err instanceof Error ? err.message : String(err),\n });\n return false;\n }\n}\n\nexport function buildPrerequisiteContext(\n config: InitConfig,\n userId: string | null,\n consentRequired: boolean,\n consentGranted: boolean,\n type: PrerequisiteContext[\"type\"],\n): PrerequisiteContext {\n return {\n type,\n url: config.url ?? location.href,\n attributes: config.attributes ?? {},\n userId,\n consentRequired,\n consentGranted,\n };\n}\n","import { fetchWithoutShopifyCartMutationNotification } from \"./shopify-cart-events\";\n\nconst CART_ATTRIBUTE_SYNC_KEY = \"drip_cart_attr\";\n\nexport type CartAssignment = {\n experimentId: string;\n variationId: string;\n assignmentEpoch?: number;\n commercePriceOnly?: boolean;\n};\n\nexport type CartAttributeSyncInput = {\n assignments: CartAssignment[];\n requiredAssignments?: CartAssignment[];\n visitorId: string;\n sessionId: string;\n shopId?: string;\n endpoint?: string;\n ingestSignature?: string;\n url?: string;\n environment?: string;\n cartToken?: string;\n offersAuthorizationRevision?: number;\n offersExperimentIds?: string[];\n shippingAuthorizationRevision?: number;\n shippingExperimentIds?: string[];\n priceAuthorizationRevision?: number;\n priceExperimentIds?: string[];\n adoptOffersAssignments?: (assignments: CartAssignment[]) => boolean;\n /** Pre-write feasibility check; must not apply anything. */\n canAdoptOffersAssignments?: (assignments: CartAssignment[]) => boolean;\n /** Headless capture hook: stage a validated offers adoption for {@link confirmCartAttributesWritten}. */\n stageOffersAdoptionAssignments?: (assignments: CartAssignment[]) => void;\n adoptPriceAssignments?: (assignments: CartAssignment[]) => boolean;\n authorizePriceDisplayAssignments?: (assignments: CartAssignment[]) => void;\n authorizeShippingDisplayAssignments?: (assignments: CartAssignment[]) => void;\n authorizeOffersDisplayAssignments?: (assignments: CartAssignment[]) => void;\n /** Receives the parsed /cart/update.js response body after a successful stamp write. */\n onCartSnapshot?: (cart: unknown) => void;\n exclusionGroupSelections?: Array<{\n groupId: string;\n experimentId: string;\n epoch: number;\n }>;\n};\n\nexport type CartAttributeEntry = { key: string; value: string };\n\nexport type CartAttributeSyncResult = {\n status: \"sent\" | \"skipped\" | \"failed\";\n reason?: string;\n};\n\nexport type CartAttributeSyncOptions = {\n /** Re-write after a real cart mutation even if this assignment was stamped earlier. */\n force?: boolean;\n};\n\nconst inFlightBySignature = new Map<string, Promise<CartAttributeSyncResult>>();\nconst validatedAuthorizationSignatures = new Set<string>();\nlet authorizedAssignmentsBySignature: {\n price: Map<string, CartAssignment[]>;\n shipping: Map<string, CartAssignment[]>;\n offers: Map<string, CartAssignment[]>;\n} | null = null;\nlet latestSyncGeneration = 0;\n\n/** Prevent an obsolete authorization response from reaching the cart write. */\nexport function invalidateShopifyCartAttributeSync(): void {\n latestSyncGeneration += 1;\n}\n\nfunction ensureAuthorizedAssignmentCache() {\n return authorizedAssignmentsBySignature ??= {\n price: new Map<string, CartAssignment[]>(),\n shipping: new Map<string, CartAssignment[]>(),\n offers: new Map<string, CartAssignment[]>(),\n };\n}\n\nfunction requiresCommerceAuthorization(input: CartAttributeSyncInput): boolean {\n return !!input.requiredAssignments?.length\n || input.offersAuthorizationRevision != null\n || input.shippingAuthorizationRevision != null\n || input.priceAuthorizationRevision != null;\n}\n\nfunction hasActivePriceAuthorizationPlane(input: CartAttributeSyncInput): boolean {\n return input.priceAuthorizationRevision != null && !!input.priceExperimentIds?.length;\n}\n\nfunction hasActiveOffersAuthorizationPlane(input: CartAttributeSyncInput): boolean {\n return input.offersAuthorizationRevision != null && !!input.offersExperimentIds?.length;\n}\n\nfunction offersExperimentIds(input: CartAttributeSyncInput): Set<string> {\n return new Set(input.offersExperimentIds ?? []);\n}\n\nfunction shippingExperimentIds(input: CartAttributeSyncInput): Set<string> {\n if (input.shippingExperimentIds?.length) return new Set(input.shippingExperimentIds);\n const priceExperimentIds = new Set(input.priceExperimentIds ?? []);\n return new Set(\n input.requiredAssignments\n ?.filter((assignment) => !priceExperimentIds.has(assignment.experimentId))\n .map((assignment) => assignment.experimentId) ?? [],\n );\n}\n\nfunction hasActiveShippingAuthorizationPlane(input: CartAttributeSyncInput): boolean {\n return input.shippingAuthorizationRevision != null && shippingExperimentIds(input).size > 0;\n}\n\n// Clearing a stale grant is privilege-REDUCING, so shipping- and offers-only\n// shops may clear without a signed token; the price plane always needs one.\nfunction isUnsignedCommerceClearCandidate(input: CartAttributeSyncInput): boolean {\n return input.priceAuthorizationRevision == null &&\n (input.shippingAuthorizationRevision != null ||\n input.offersAuthorizationRevision != null) &&\n !input.requiredAssignments?.length;\n}\n\nexport function cannotRequestRequiredCommerceAuthorization(\n input: CartAttributeSyncInput,\n): boolean {\n return (\n !!input.assignments[0] ||\n input.shippingAuthorizationRevision != null ||\n input.offersAuthorizationRevision != null ||\n hasActivePriceAuthorizationPlane(input)\n )\n && requiresCommerceAuthorization(input)\n && (!input.shopId || !input.endpoint || !input.ingestSignature);\n}\n\nexport function isShopifyStorefront(): boolean {\n return typeof window !== \"undefined\" && !!(window as unknown as { Shopify?: unknown }).Shopify;\n}\n\nfunction readStampedSignature(): string | null {\n try {\n return sessionStorage.getItem(CART_ATTRIBUTE_SYNC_KEY);\n } catch {\n return null;\n }\n}\n\nfunction writeStampedSignature(signature: string): void {\n try {\n sessionStorage.setItem(CART_ATTRIBUTE_SYNC_KEY, signature);\n } catch {\n // Storage can be unavailable in strict privacy modes; the cart write is still best-effort.\n }\n}\n\nfunction normalizeTargetingUrl(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n try {\n // The Worker evaluates targeting through URL with the same fallback base.\n // Persist that effective value so equivalent URL spellings share a cache\n // entry while a meaningful SPA route change requests a fresh price pin.\n return new URL(trimmed, \"https://_\").href;\n } catch {\n // The Worker still receives invalid-but-non-empty strings and fails their\n // URL targeting closed, so retain the trimmed value as part of the key.\n return trimmed;\n }\n}\n\nfunction syncSignature(input: CartAttributeSyncInput): string {\n return JSON.stringify({\n assignments: input.assignments\n .map((assignment) => [\n assignment.experimentId,\n assignment.variationId,\n assignment.assignmentEpoch ?? null,\n ])\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n requiredAssignments: input.requiredAssignments\n ?.map((assignment) => [\n assignment.experimentId,\n assignment.variationId,\n assignment.assignmentEpoch ?? null,\n ])\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n visitorId: input.visitorId,\n sessionId: input.sessionId,\n url: requiresCommerceAuthorization(input)\n ? normalizeTargetingUrl(input.url)\n : undefined,\n cartToken: normalizeCartToken(input.cartToken),\n ...(input.offersAuthorizationRevision != null || input.offersExperimentIds?.length\n ? {\n offersAuthorizationRevision: input.offersAuthorizationRevision ?? null,\n offersExperimentIds: input.offersExperimentIds?.slice().sort(),\n }\n : {}),\n shippingAuthorizationRevision: input.shippingAuthorizationRevision ?? null,\n shippingExperimentIds: input.shippingExperimentIds?.slice().sort(),\n priceAuthorizationRevision: input.priceAuthorizationRevision ?? null,\n exclusionGroupSelections: input.exclusionGroupSelections\n ?.map((selection) => [\n selection.groupId,\n selection.experimentId,\n selection.epoch,\n ])\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n });\n}\n\n/** Validated locale-aware storefront root (\"/fr/\" on localized markets, \"/\" otherwise). */\nexport function shopifyRoutesRoot(): string {\n const configuredRoot = (window as Window & {\n Shopify?: { routes?: { root?: string } };\n }).Shopify?.routes?.root;\n if (typeof configuredRoot !== \"string\") return \"/\";\n try {\n const storefrontOrigin = window.location?.origin;\n if (!storefrontOrigin) return \"/\";\n const parsed = new URL(configuredRoot, storefrontOrigin);\n if (parsed.origin !== storefrontOrigin || parsed.search || parsed.hash) return \"/\";\n return parsed.pathname.endsWith(\"/\") ? parsed.pathname : `${parsed.pathname}/`;\n } catch {\n return \"/\";\n }\n}\n\nexport function shopifyCartPath(): string {\n return `${shopifyRoutesRoot()}cart.js`;\n}\n\nfunction normalizeCartToken(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const withoutQuery = value.trim().split(\"?\", 1)[0] ?? \"\";\n const token = withoutQuery.startsWith(\"gid://shopify/Cart/\")\n ? withoutQuery.slice(\"gid://shopify/Cart/\".length)\n : withoutQuery;\n return token.length > 0 && token.length <= 4096 ? token : null;\n}\n\nfunction normalizeProofCartToken(value: unknown): string | null {\n return typeof value === \"string\" && normalizeCartToken(value) ? value.trim() : null;\n}\n\nasync function resolveChargeAuthorizationCartToken(\n input: CartAttributeSyncInput,\n): Promise<string | null> {\n const supplied = normalizeProofCartToken(input.cartToken);\n if (supplied) return supplied;\n if (\n input.priceAuthorizationRevision == null &&\n input.offersAuthorizationRevision == null\n ) return null;\n if (!isShopifyStorefront()) return null;\n try {\n const response = await fetchWithoutShopifyCartMutationNotification(shopifyCartPath(), {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n cache: \"no-store\",\n });\n if (!response.ok) return null;\n return normalizeProofCartToken(((await response.json()) as { token?: unknown }).token);\n } catch {\n return null;\n }\n}\n\nexport function syncShopifyCartAttributes(\n input: CartAttributeSyncInput,\n options: CartAttributeSyncOptions = {},\n): Promise<CartAttributeSyncResult> {\n try {\n if (!isShopifyStorefront()) return Promise.resolve({ status: \"skipped\", reason: \"not_shopify\" });\n if (typeof fetch !== \"function\") return Promise.resolve({ status: \"skipped\", reason: \"fetch_missing\" });\n if (!input.assignments[0] && !requiresCommerceAuthorization(input)) {\n return Promise.resolve({ status: \"skipped\", reason: \"no_assignments\" });\n }\n if (cannotRequestRequiredCommerceAuthorization(input)) {\n return Promise.resolve({ status: \"failed\", reason: \"authorization_failed\" });\n }\n\n const signature = syncSignature(input);\n const existingInFlight = inFlightBySignature.get(signature);\n if (existingInFlight) {\n if (!options.force) return existingInFlight;\n // A forced sync follows a real cart mutation, so cart identity may have\n // changed underneath the pending request. Invalidate it immediately;\n // ordinary overlaps still share the existing request.\n latestSyncGeneration += 1;\n return existingInFlight.then(() => syncShopifyCartAttributes(input, options));\n }\n const generation = ++latestSyncGeneration;\n const requiresCurrentAssignmentProof = requiresCommerceAuthorization(input);\n if (\n !options.force &&\n readStampedSignature() === signature &&\n (!requiresCurrentAssignmentProof || validatedAuthorizationSignatures.has(signature))\n ) {\n if (hasActivePriceAuthorizationPlane(input)) {\n input.authorizePriceDisplayAssignments?.(\n authorizedAssignmentsBySignature?.price.get(signature) ?? [],\n );\n }\n if (hasActiveShippingAuthorizationPlane(input)) {\n input.authorizeShippingDisplayAssignments?.(\n authorizedAssignmentsBySignature?.shipping.get(signature) ?? [],\n );\n }\n if (hasActiveOffersAuthorizationPlane(input)) {\n input.authorizeOffersDisplayAssignments?.(\n authorizedAssignmentsBySignature?.offers.get(signature) ?? [],\n );\n }\n return Promise.resolve({ status: \"sent\", reason: \"already_stamped\" });\n }\n\n if (requiresCurrentAssignmentProof) validatedAuthorizationSignatures.delete(signature);\n let authorizedSignature = signature;\n const pending = requestCommerceAuthorization(input, generation)\n .then(async ({\n completed,\n cartWriteAllowed,\n token,\n assignments,\n offersAdoptionAssignments,\n }): Promise<{\n response: Response | null;\n authorizationCompleted: boolean;\n authorizedSignature: string;\n authorizedPriceAssignments: CartAssignment[];\n authorizedShippingAssignments: CartAssignment[];\n authorizedOffersAssignments: CartAssignment[];\n offersAdoptionAssignments?: CartAssignment[];\n }> => {\n if (!cartWriteAllowed || generation !== latestSyncGeneration) {\n return {\n response: null,\n authorizationCompleted: false,\n authorizedSignature,\n authorizedPriceAssignments: [],\n authorizedShippingAssignments: [],\n authorizedOffersAssignments: [],\n };\n }\n const authorizedInput = { ...input, assignments };\n authorizedSignature = syncSignature(authorizedInput);\n const authorizedPriceAssignments = hasActivePriceAuthorizationPlane(input)\n ? parseSignedPriceAuthorizationAssignments(\n token,\n new Set(input.priceExperimentIds ?? []),\n ) ?? []\n : [];\n const authorizedShippingAssignments = hasActiveShippingAuthorizationPlane(input)\n ? parseSignedShippingAuthorizationAssignments(\n token,\n shippingExperimentIds(input),\n ) ?? []\n : [];\n const authorizedOffersAssignments = hasActiveOffersAuthorizationPlane(input)\n ? parseSignedOffersAuthorizationAssignments(\n token,\n offersExperimentIds(input),\n ) ?? []\n : [];\n const attributes = Object.fromEntries(\n buildCartAttributeEntries(authorizedInput, token).map((entry) => [entry.key, entry.value]),\n );\n const response = await fetchWithoutShopifyCartMutationNotification(\"/cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes }),\n keepalive: true,\n });\n return {\n response,\n authorizationCompleted: completed,\n authorizedSignature,\n authorizedPriceAssignments,\n authorizedShippingAssignments,\n authorizedOffersAssignments,\n offersAdoptionAssignments,\n };\n })\n .then(({\n response,\n authorizationCompleted,\n authorizedSignature: completedSignature,\n authorizedPriceAssignments,\n authorizedShippingAssignments,\n authorizedOffersAssignments,\n offersAdoptionAssignments,\n }) => {\n if (!authorizationCompleted) {\n return { status: \"failed\", reason: \"authorization_failed\" } as const;\n }\n if (!response) {\n return { status: \"failed\", reason: \"cart_update_missing\" } as const;\n }\n if (!response.ok) {\n return { status: \"failed\", reason: `cart_update_${response.status}` } as const;\n }\n if (generation === latestSyncGeneration) {\n // The stamp is on the cart; only now may the adopted offer arm reach\n // display/persist/tracking. On failure, skip the signature records so\n // the next sync re-reconciles instead of treating this cart as done.\n if (\n offersAdoptionAssignments &&\n !input.adoptOffersAssignments?.(offersAdoptionAssignments)\n ) {\n return { status: \"failed\", reason: \"offers_adoption_failed\" } as const;\n }\n if (input.onCartSnapshot) {\n // The stamp-write response body is the full updated cart — a free\n // snapshot consumers use to rediscover Apex-managed lines without\n // an extra request (best-effort; never blocks the sync result).\n // Handed out only for the accepted generation AND after a required\n // adoption succeeded: reconciling against local assignments the\n // stamped envelope does not authorize could retain or insert a\n // gift the Function will not discount.\n void response.clone().json()\n .then((cart) => input.onCartSnapshot?.(cart))\n .catch(() => {});\n }\n writeStampedSignature(completedSignature);\n if (requiresCurrentAssignmentProof) {\n validatedAuthorizationSignatures.clear();\n validatedAuthorizationSignatures.add(completedSignature);\n }\n if (hasActivePriceAuthorizationPlane(input)) {\n const cache = ensureAuthorizedAssignmentCache().price;\n cache.clear();\n cache.set(\n completedSignature,\n authorizedPriceAssignments,\n );\n input.authorizePriceDisplayAssignments?.(authorizedPriceAssignments);\n }\n if (hasActiveShippingAuthorizationPlane(input)) {\n const cache = ensureAuthorizedAssignmentCache().shipping;\n cache.clear();\n cache.set(\n completedSignature,\n authorizedShippingAssignments,\n );\n input.authorizeShippingDisplayAssignments?.(authorizedShippingAssignments);\n }\n if (hasActiveOffersAuthorizationPlane(input)) {\n const cache = ensureAuthorizedAssignmentCache().offers;\n cache.clear();\n cache.set(\n completedSignature,\n authorizedOffersAssignments,\n );\n input.authorizeOffersDisplayAssignments?.(authorizedOffersAssignments);\n }\n }\n return { status: \"sent\" } as const;\n })\n .catch((error) => ({\n status: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n }) as const)\n .finally(() => {\n if (inFlightBySignature.get(signature) === pending) {\n inFlightBySignature.delete(signature);\n }\n });\n inFlightBySignature.set(signature, pending);\n return pending;\n } catch {\n // Shopify cart attribution must never block or break assignment rendering.\n return Promise.resolve({ status: \"failed\", reason: \"sync_exception\" });\n }\n}\n\nasync function requestCommerceAuthorization(\n input: CartAttributeSyncInput,\n generation?: number,\n): Promise<{\n completed: boolean;\n cartWriteAllowed: boolean;\n token: string | null;\n assignments: CartAssignment[];\n /** Adoption validated pre-write; the caller applies it only after the cart write is confirmed. */\n offersAdoptionAssignments?: CartAssignment[];\n}> {\n const priceWriteRequiresProof = hasActivePriceAuthorizationPlane(input);\n const offersWriteRequiresProof = hasActiveOffersAuthorizationPlane(input);\n const configuredOffersExperimentIds = offersExperimentIds(input);\n const enforceOffersPlaneProof = input.offersAuthorizationRevision != null;\n let requiredOffersAssignments = enforceOffersPlaneProof\n ? input.requiredAssignments?.filter((assignment) =>\n configuredOffersExperimentIds.has(assignment.experimentId)\n ) ?? []\n : [];\n const configuredShippingExperimentIds = shippingExperimentIds(input);\n const enforceShippingPlaneProof = input.shippingAuthorizationRevision != null &&\n (!!input.shippingExperimentIds?.length || hasActivePriceAuthorizationPlane(input));\n const requiredShippingAssignments = enforceShippingPlaneProof\n ? input.requiredAssignments?.filter((assignment) =>\n configuredShippingExperimentIds.has(assignment.experimentId)\n ) ?? []\n : [];\n let hasAuthoritativePriceProof = false;\n if (\n !input.assignments[0] &&\n input.shippingAuthorizationRevision == null &&\n input.offersAuthorizationRevision == null &&\n !hasActivePriceAuthorizationPlane(input)\n ) {\n return {\n completed: true,\n cartWriteAllowed: true,\n token: null,\n assignments: input.assignments,\n };\n }\n if (!input.shopId || !input.endpoint || !input.ingestSignature) {\n return {\n completed: !requiresCommerceAuthorization(input),\n cartWriteAllowed: true,\n token: null,\n assignments: input.assignments,\n };\n }\n const endpoint = input.endpoint.replace(/\\/+$/, \"\").replace(/\\/events$/, \"\");\n try {\n const cartToken = await resolveChargeAuthorizationCartToken(input);\n if (\n (input.priceAuthorizationRevision != null ||\n input.offersAuthorizationRevision != null) &&\n !cartToken\n ) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n const requestedExperimentIds = [...new Set([\n ...input.assignments.map((assignment) => assignment.experimentId),\n ...(hasActivePriceAuthorizationPlane(input) ? input.priceExperimentIds ?? [] : []),\n ...(hasActiveOffersAuthorizationPlane(input) ? input.offersExperimentIds ?? [] : []),\n ])];\n const response = await fetch(`${endpoint}/v1/assign`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Drip-Shop\": input.shopId,\n \"X-Drip-Signature\": input.ingestSignature,\n },\n body: JSON.stringify({\n shop_id: input.shopId,\n user_id: input.visitorId,\n url: input.url,\n environment: input.environment,\n ...(cartToken ? { cart_token: cartToken } : {}),\n experiments: requestedExperimentIds,\n exclusion_group_selections: input.exclusionGroupSelections?.map((selection) => ({\n group_id: selection.groupId,\n experiment_id: selection.experimentId,\n epoch: selection.epoch,\n })),\n }),\n keepalive: true,\n });\n if (!response.ok) {\n return {\n completed: !requiresCommerceAuthorization(input),\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof &&\n !isUnsignedCommerceClearCandidate(input),\n token: null,\n assignments: input.assignments,\n };\n }\n const payload = (await response.json()) as {\n assignments?: unknown;\n commerce_authorization?: unknown;\n };\n const token =\n typeof payload.commerce_authorization === \"string\" &&\n payload.commerce_authorization\n ? payload.commerce_authorization\n : null;\n if (\n !input.assignments[0] &&\n isUnsignedCommerceClearCandidate(input) &&\n // With configured offer experiments, a nonempty response is the\n // cart-pinned offer arm returning under a new identity/off-target page —\n // it must flow to the offers proof/adoption path below, not be rejected\n // as a failed stale-clear. Empty-response teardown clears are unaffected.\n !input.offersExperimentIds?.length &&\n (!Array.isArray(payload.assignments) || payload.assignments.length !== 0)\n ) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n let authorizedAssignments = input.assignments;\n let requiredAssignments = input.requiredAssignments;\n let resolvedPriceAssignments: ReturnType<\n typeof resolveAuthoritativePriceAssignments\n > = null;\n let resolvedOffersAssignments: ReturnType<\n typeof resolveAuthoritativeOffersAssignments\n > = null;\n if (input.priceAuthorizationRevision != null) {\n const priceExperimentIds = new Set(input.priceExperimentIds ?? []);\n const evaluatedPriceExperimentIds = parseEvaluatedPriceExperimentIds(\n token,\n priceExperimentIds,\n );\n if (!evaluatedPriceExperimentIds) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n if (priceExperimentIds.size > 0) {\n resolvedPriceAssignments = resolveAuthoritativePriceAssignments(\n payload.assignments,\n input.assignments,\n evaluatedPriceExperimentIds,\n );\n if (!resolvedPriceAssignments) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n authorizedAssignments = resolvedPriceAssignments.assignments;\n requiredAssignments = input.requiredAssignments?.flatMap((required) => {\n if (!priceExperimentIds.has(required.experimentId)) return [required];\n // A browser-only price experiment outside the Worker's evaluated set\n // cannot be signed. Keep its local assignment/cart attribution, but do\n // not demand impossible price proof: display eligibility is separately\n // restricted to assignments actually present in the signed price plane.\n if (!evaluatedPriceExperimentIds.has(required.experimentId)) return [];\n const authoritative = resolvedPriceAssignments?.priceAssignments.find(\n (assignment) => assignment.experimentId === required.experimentId,\n );\n return authoritative ? [authoritative] : [];\n });\n }\n const requiredPriceAssignments = requiredAssignments?.filter((assignment) =>\n priceExperimentIds.has(assignment.experimentId)\n ) ?? [];\n const requiresNonPriceAssignment = requiredAssignments?.some((assignment) =>\n !priceExperimentIds.has(assignment.experimentId)\n );\n const pricePlane = parsePriceAuthorizationPlane(token);\n hasAuthoritativePriceProof =\n resolvedPriceAssignments?.priceAssignments.length === 0\n ? hasSignedEmptyPriceAuthorizationEnvelope(token)\n : !!pricePlane && hasSignedAssignmentProof(\n pricePlane.a,\n resolvedPriceAssignments?.priceAssignments ?? [],\n );\n // Round 17 permits an unsigned successful response to clear shipping proof\n // because removing a shipping grant is privilege-reducing. Price differs:\n // replacing a signed price pin changes what checkout charges, so an active\n // price plane must have a signed assignment or signed-empty envelope before\n // any combined cart-attribute write can touch the existing pin.\n if (\n (priceWriteRequiresProof && !hasAuthoritativePriceProof) ||\n (requiredPriceAssignments.length > 0 &&\n (!pricePlane || !hasSignedAssignmentProof(pricePlane.a, requiredPriceAssignments))) ||\n (resolvedPriceAssignments?.adoptionRequired &&\n !hasAuthoritativePriceProof) ||\n (!token && requiresNonPriceAssignment)\n ) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n } else if (requiresCommerceAuthorization(input) && !token) {\n const isLegitimateEmptyShippingResponse =\n isUnsignedCommerceClearCandidate(input) &&\n Array.isArray(payload.assignments) &&\n (!!input.assignments[0] || payload.assignments.length === 0);\n if (!isLegitimateEmptyShippingResponse) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n // Clearing a stale shipping discount grant is privilege-reducing and needs no\n // signature; unlike conferring a grant, the successful parsed response is enough.\n }\n if (enforceOffersPlaneProof && configuredOffersExperimentIds.size > 0) {\n resolvedOffersAssignments = resolveAuthoritativeOffersAssignments(\n payload.assignments,\n authorizedAssignments,\n configuredOffersExperimentIds,\n );\n if (!resolvedOffersAssignments) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n authorizedAssignments = resolvedOffersAssignments.assignments;\n requiredOffersAssignments = resolvedOffersAssignments.offersAssignments;\n requiredAssignments = requiredAssignments?.flatMap((required) => {\n if (!configuredOffersExperimentIds.has(required.experimentId)) return [required];\n const authoritative = resolvedOffersAssignments?.offersAssignments.find(\n (assignment) => assignment.experimentId === required.experimentId,\n );\n return authoritative ? [authoritative] : [];\n });\n }\n if (requiredOffersAssignments.length > 0) {\n const offersPlane = parseAuthorizationPlane(token, \"offers\");\n const hasOffersProof = !!offersPlane && hasSignedAssignmentProof(\n offersPlane.a,\n requiredOffersAssignments,\n );\n if (!hasOffersProof) {\n if (!priceWriteRequiresProof || !hasAuthoritativePriceProof) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n const configuredPriceExperimentIds = new Set(input.priceExperimentIds ?? []);\n authorizedAssignments = authorizedAssignments.filter((assignment) =>\n !configuredOffersExperimentIds.has(assignment.experimentId) ||\n configuredPriceExperimentIds.has(assignment.experimentId)\n );\n }\n }\n if (requiredShippingAssignments.length > 0) {\n const shippingPlane = parseAuthorizationPlane(token, \"shipping\");\n const hasShippingProof = !!shippingPlane && hasSignedAssignmentProof(\n shippingPlane.a,\n requiredShippingAssignments,\n );\n if (!hasShippingProof) {\n if (!priceWriteRequiresProof || !hasAuthoritativePriceProof) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n // A proven price plane may proceed independently. Remove shipping-only\n // assignments from the stamp; assignments shared with price remain because\n // checkout validates each plane from its own signature.\n const configuredPriceExperimentIds = new Set(input.priceExperimentIds ?? []);\n authorizedAssignments = authorizedAssignments.filter((assignment) =>\n !configuredShippingExperimentIds.has(assignment.experimentId) ||\n configuredPriceExperimentIds.has(assignment.experimentId)\n );\n }\n }\n if (!hasRequiredAssignmentProof(payload.assignments, requiredAssignments)) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n if (\n resolvedPriceAssignments?.adoptionRequired &&\n ((generation !== undefined && generation !== latestSyncGeneration) ||\n !input.adoptPriceAssignments?.(\n authorizedAssignments.filter((assignment) =>\n input.priceExperimentIds?.includes(assignment.experimentId)\n ),\n ))\n ) {\n return {\n completed: false,\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof,\n token: null,\n assignments: input.assignments,\n };\n }\n let offersAdoptionAssignments: CartAssignment[] | undefined;\n if (resolvedOffersAssignments?.adoptionRequired) {\n const adoptable = authorizedAssignments.filter((assignment) =>\n configuredOffersExperimentIds.has(assignment.experimentId)\n );\n // Only validate feasibility here. Applying the adoption (DOM, persist,\n // tracking) before the cart write is confirmed would let the shopper see\n // and record a treatment Shopify never stamped an authorization for —\n // the caller applies it post-write (theme) or post-confirm (headless).\n if (\n (generation !== undefined && generation !== latestSyncGeneration) ||\n !input.canAdoptOffersAssignments?.(adoptable)\n ) {\n return {\n completed: false,\n cartWriteAllowed: false,\n token: null,\n assignments: input.assignments,\n };\n }\n offersAdoptionAssignments = adoptable;\n }\n return {\n completed: true,\n cartWriteAllowed: true,\n token,\n assignments: authorizedAssignments,\n offersAdoptionAssignments,\n };\n } catch {\n return {\n completed: !requiresCommerceAuthorization(input),\n cartWriteAllowed: !priceWriteRequiresProof && !offersWriteRequiresProof &&\n !isUnsignedCommerceClearCandidate(input),\n token: null,\n assignments: input.assignments,\n };\n }\n}\n\nfunction hasSignedEmptyPriceAuthorizationEnvelope(token: string | null): boolean {\n if (!token) return false;\n try {\n const envelope = JSON.parse(token) as Record<string, unknown> | null;\n if (\n !envelope ||\n typeof envelope !== \"object\" ||\n envelope.v !== 2 ||\n !envelope.p ||\n typeof envelope.p !== \"object\"\n ) return false;\n const price = (envelope.p as Record<string, unknown>).price;\n if (!price || typeof price !== \"object\") return false;\n const plane = price as Record<string, unknown>;\n return plane.v === 1 &&\n Number.isSafeInteger(plane.r) && (plane.r as number) > 0 &&\n typeof plane.c === \"string\" && /^[a-f0-9]{64}$/.test(plane.c) &&\n typeof plane.x === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(plane.x) &&\n Array.isArray(plane.a) && plane.a.length === 0 &&\n typeof plane.cartHash === \"string\" && /^[a-f0-9]{64}$/.test(plane.cartHash) &&\n typeof plane.s === \"string\" && /^[a-f0-9]{64}$/.test(plane.s);\n } catch {\n return false;\n }\n}\n\nfunction parsePriceAuthorizationPlane(\n token: string | null,\n): Record<string, unknown> | null {\n if (!token) return null;\n try {\n const candidate = JSON.parse(token) as Record<string, unknown> | null;\n if (!candidate || typeof candidate !== \"object\") return null;\n if (\n candidate.v === 1 &&\n typeof candidate.cartHash === \"string\" &&\n candidate.cartHash\n ) {\n return candidate;\n }\n if (candidate.v !== 2 || !candidate.p || typeof candidate.p !== \"object\") return null;\n const price = (candidate.p as Record<string, unknown>).price;\n return price && typeof price === \"object\"\n ? price as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction parseAuthorizationPlane(\n token: string | null,\n plane: \"shipping\" | \"offers\",\n): Record<string, unknown> | null {\n if (!token) return null;\n try {\n const candidate = JSON.parse(token) as Record<string, unknown> | null;\n if (candidate?.v !== 2 || !candidate.p || typeof candidate.p !== \"object\") return null;\n const value = (candidate.p as Record<string, unknown>)[plane];\n return value && typeof value === \"object\"\n ? value as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction parseSignedPriceAuthorizationAssignments(\n token: string | null,\n configuredPriceExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n const pricePlane = parsePriceAuthorizationPlane(token);\n if (!pricePlane || !Array.isArray(pricePlane.a)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of pricePlane.a) {\n if (!candidate || typeof candidate !== \"object\") return null;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.e !== \"string\" ||\n !configuredPriceExperimentIds.has(assignment.e) ||\n seen.has(assignment.e) ||\n typeof assignment.v !== \"string\" ||\n !assignment.v ||\n !Number.isSafeInteger(assignment.ep) ||\n (assignment.ep as number) < 1\n ) return null;\n seen.add(assignment.e);\n assignments.push({\n experimentId: assignment.e,\n variationId: assignment.v,\n assignmentEpoch: assignment.ep as number,\n });\n }\n return assignments;\n}\n\nfunction parseSignedShippingAuthorizationAssignments(\n token: string | null,\n configuredShippingExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n const shippingPlane = parseAuthorizationPlane(token, \"shipping\");\n if (!shippingPlane || !Array.isArray(shippingPlane.a)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of shippingPlane.a) {\n if (!candidate || typeof candidate !== \"object\") return null;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.e !== \"string\" ||\n !configuredShippingExperimentIds.has(assignment.e) ||\n seen.has(assignment.e) ||\n typeof assignment.v !== \"string\" ||\n !assignment.v ||\n !Number.isSafeInteger(assignment.ep) ||\n (assignment.ep as number) < 1\n ) return null;\n seen.add(assignment.e);\n assignments.push({\n experimentId: assignment.e,\n variationId: assignment.v,\n assignmentEpoch: assignment.ep as number,\n });\n }\n return assignments;\n}\n\nfunction parseSignedOffersAuthorizationAssignments(\n token: string | null,\n configuredOffersExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n const offersPlane = parseAuthorizationPlane(token, \"offers\");\n if (!offersPlane || !Array.isArray(offersPlane.a)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of offersPlane.a) {\n if (!candidate || typeof candidate !== \"object\") return null;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.e !== \"string\" ||\n !configuredOffersExperimentIds.has(assignment.e) ||\n seen.has(assignment.e) ||\n typeof assignment.v !== \"string\" ||\n !assignment.v ||\n !Number.isSafeInteger(assignment.ep) ||\n (assignment.ep as number) < 1\n ) return null;\n seen.add(assignment.e);\n assignments.push({\n experimentId: assignment.e,\n variationId: assignment.v,\n assignmentEpoch: assignment.ep as number,\n });\n }\n return assignments;\n}\n\nfunction parseEvaluatedPriceExperimentIds(\n token: string | null,\n configuredPriceExperimentIds: ReadonlySet<string>,\n): Set<string> | null {\n const rolloutFallback = () => new Set(configuredPriceExperimentIds);\n if (!token) return rolloutFallback();\n try {\n const envelope = JSON.parse(token) as Record<string, unknown> | null;\n if (!envelope || typeof envelope !== \"object\" || envelope.v !== 2) {\n return rolloutFallback();\n }\n if (!Object.prototype.hasOwnProperty.call(envelope, \"e\")) {\n // Rollout ordering matters: deploy the Worker before this SDK. Until every\n // response declares `e`, an older V2 envelope must retain round-14 behavior\n // and treat every configured price experiment as evaluated.\n return rolloutFallback();\n }\n if (!Array.isArray(envelope.e)) return null;\n const evaluated = new Set<string>();\n for (const experimentId of envelope.e) {\n if (\n typeof experimentId !== \"string\" ||\n !experimentId ||\n !configuredPriceExperimentIds.has(experimentId) ||\n evaluated.has(experimentId)\n ) return null;\n evaluated.add(experimentId);\n }\n return evaluated;\n } catch {\n return rolloutFallback();\n }\n}\n\nfunction hasSignedAssignmentProof(\n signedAssignments: unknown,\n requiredAssignments: NonNullable<CartAttributeSyncInput[\"requiredAssignments\"]>,\n): boolean {\n if (!Array.isArray(signedAssignments)) return false;\n return requiredAssignments.every((required) =>\n signedAssignments.some((candidate) => {\n if (!candidate || typeof candidate !== \"object\") return false;\n const assignment = candidate as Record<string, unknown>;\n return assignment.e === required.experimentId &&\n assignment.v === required.variationId &&\n assignment.ep === required.assignmentEpoch;\n })\n );\n}\n\nfunction parseResponsePriceAssignments(\n responseAssignments: unknown,\n priceExperimentIds: ReadonlySet<string>,\n): CartAssignment[] | null {\n if (!Array.isArray(responseAssignments)) return null;\n const assignments: CartAssignment[] = [];\n const seen = new Set<string>();\n for (const candidate of responseAssignments) {\n if (!candidate || typeof candidate !== \"object\") continue;\n const assignment = candidate as Record<string, unknown>;\n if (\n typeof assignment.experiment_id !== \"string\" ||\n !priceExperimentIds.has(assignment.experiment_id)\n ) {\n continue;\n }\n if (\n seen.has(assignment.experiment_id) ||\n typeof assignment.variation_id !== \"string\" ||\n !assignment.variation_id ||\n !Number.isSafeInteger(assignment.assignment_epoch) ||\n (assignment.assignment_epoch as number) < 1\n ) return null;\n seen.add(assignment.experiment_id);\n assignments.push({\n experimentId: assignment.experiment_id,\n variationId: assignment.variation_id,\n assignmentEpoch: assignment.assignment_epoch as number,\n ...(assignment.commerce_price_only === true ? { commercePriceOnly: true } : {}),\n });\n }\n return assignments;\n}\n\nfunction resolveAuthoritativePriceAssignments(\n responseAssignments: unknown,\n localAssignments: CartAttributeSyncInput[\"assignments\"],\n evaluatedPriceExperimentIds: ReadonlySet<string>,\n): {\n assignments: CartAssignment[];\n priceAssignments: CartAssignment[];\n adoptionRequired: boolean;\n} | null {\n const priceAssignments = parseResponsePriceAssignments(\n responseAssignments,\n evaluatedPriceExperimentIds,\n );\n if (!priceAssignments) return null;\n const localPriceAssignments = localAssignments.filter((assignment) =>\n evaluatedPriceExperimentIds.has(assignment.experimentId)\n );\n const authoritativeByExperimentId = new Map(\n priceAssignments.map((assignment) => [assignment.experimentId, assignment]),\n );\n const adoptionRequired = localPriceAssignments.some(\n (assignment) => !authoritativeByExperimentId.has(assignment.experimentId),\n ) || priceAssignments.some((assignment) => {\n const local = localPriceAssignments.find(\n (candidate) => candidate.experimentId === assignment.experimentId,\n );\n return local?.variationId !== assignment.variationId ||\n local.assignmentEpoch !== assignment.assignmentEpoch ||\n local.commercePriceOnly !== assignment.commercePriceOnly;\n });\n const remainingPriceAssignments = new Map(authoritativeByExperimentId);\n const assignments = localAssignments.map((assignment) => {\n if (!evaluatedPriceExperimentIds.has(assignment.experimentId)) return assignment;\n const authoritative = remainingPriceAssignments.get(assignment.experimentId);\n if (!authoritative) return null;\n remainingPriceAssignments.delete(assignment.experimentId);\n return authoritative;\n }).filter((assignment): assignment is CartAssignment => assignment !== null);\n for (const assignment of priceAssignments) {\n if (remainingPriceAssignments.has(assignment.experimentId)) {\n assignments.push(assignment);\n remainingPriceAssignments.delete(assignment.experimentId);\n }\n }\n return { assignments, priceAssignments, adoptionRequired };\n}\n\nfunction resolveAuthoritativeOffersAssignments(\n responseAssignments: unknown,\n localAssignments: CartAttributeSyncInput[\"assignments\"],\n configuredOffersExperimentIds: ReadonlySet<string>,\n): {\n assignments: CartAssignment[];\n offersAssignments: CartAssignment[];\n adoptionRequired: boolean;\n} | null {\n const offersAssignments = parseResponsePriceAssignments(\n responseAssignments,\n configuredOffersExperimentIds,\n );\n if (!offersAssignments) return null;\n const resolved = resolveAuthoritativePriceAssignments(\n responseAssignments,\n localAssignments,\n configuredOffersExperimentIds,\n );\n return resolved && {\n assignments: resolved.assignments,\n offersAssignments,\n adoptionRequired: resolved.adoptionRequired,\n };\n}\n\nexport async function buildSignedCartAttributeEntries(\n input: CartAttributeSyncInput,\n): Promise<CartAttributeEntry[]> {\n const generation = ++latestSyncGeneration;\n const authorization = await requestCommerceAuthorization(input, generation);\n if (generation !== latestSyncGeneration || !authorization.completed) return [];\n if (authorization.offersAdoptionAssignments) {\n // Headless integrators own the cart write; hand the validated adoption to\n // the caller so it applies only after confirmCartAttributesWritten.\n input.stageOffersAdoptionAssignments?.(authorization.offersAdoptionAssignments);\n }\n if (hasActivePriceAuthorizationPlane(input)) {\n const authorizedPriceAssignments = parseSignedPriceAuthorizationAssignments(\n authorization.token,\n new Set(input.priceExperimentIds ?? []),\n );\n if (!authorizedPriceAssignments) return [];\n input.authorizePriceDisplayAssignments?.(authorizedPriceAssignments);\n }\n if (hasActiveShippingAuthorizationPlane(input)) {\n const authorizedShippingAssignments = parseSignedShippingAuthorizationAssignments(\n authorization.token,\n shippingExperimentIds(input),\n ) ?? [];\n input.authorizeShippingDisplayAssignments?.(authorizedShippingAssignments);\n }\n if (hasActiveOffersAuthorizationPlane(input)) {\n const authorizedOffersAssignments = parseSignedOffersAuthorizationAssignments(\n authorization.token,\n offersExperimentIds(input),\n ) ?? [];\n input.authorizeOffersDisplayAssignments?.(authorizedOffersAssignments);\n }\n return buildCartAttributeEntries(\n { ...input, assignments: authorization.assignments },\n authorization.token,\n );\n}\n\nfunction hasRequiredAssignmentProof(\n responseAssignments: unknown,\n requiredAssignments: CartAttributeSyncInput[\"requiredAssignments\"],\n): boolean {\n if (!requiredAssignments?.length) return true;\n if (!Array.isArray(responseAssignments)) return false;\n\n return requiredAssignments.every((required) => {\n if (!Number.isInteger(required.assignmentEpoch) || (required.assignmentEpoch ?? 0) < 1) {\n return false;\n }\n return responseAssignments.some((candidate) => {\n if (!candidate || typeof candidate !== \"object\") return false;\n const assignment = candidate as Record<string, unknown>;\n return assignment.experiment_id === required.experimentId\n && assignment.variation_id === required.variationId\n && assignment.assignment_epoch === required.assignmentEpoch;\n });\n });\n}\n\nexport function buildCartAttributeEntries(\n input: CartAttributeSyncInput,\n commerceAuthorization: string | null = null,\n): CartAttributeEntry[] {\n const primaryAssignment = input.assignments[0];\n const entries: CartAttributeEntry[] = [\n {\n key: \"apex_assignments\",\n value: JSON.stringify(\n input.assignments.map((assignment) => ({\n e: assignment.experimentId,\n v: assignment.variationId,\n ep: assignment.assignmentEpoch,\n })),\n ),\n },\n {\n key: \"apex_assignment_authorization\",\n value: commerceAuthorization ?? \"\",\n },\n ];\n if (!primaryAssignment) {\n return [\n ...entries,\n { key: \"apex_experiment_id\", value: \"\" },\n { key: \"apex_variation_id\", value: \"\" },\n { key: \"apex_assignment_epoch\", value: \"\" },\n { key: \"apex_visitor_id\", value: input.visitorId },\n { key: \"apex_session_id\", value: input.sessionId },\n ];\n }\n return [\n ...entries,\n { key: \"apex_experiment_id\", value: primaryAssignment.experimentId },\n { key: \"apex_variation_id\", value: primaryAssignment.variationId },\n {\n key: \"apex_assignment_epoch\",\n value: String(primaryAssignment.assignmentEpoch ?? \"\"),\n },\n { key: \"apex_visitor_id\", value: input.visitorId },\n { key: \"apex_session_id\", value: input.sessionId },\n ];\n}\n","import { fetchWithoutShopifyCartMutationNotification } from \"./shopify-cart-events\";\nimport {\n isShopifyStorefront,\n shopifyCartPath,\n shopifyRoutesRoot,\n type CartAssignment,\n} from \"./shopify-cart\";\nimport type { CommerceOffersSettings } from \"./types\";\n\nconst MARKER = \"_apex_gwp\";\nconst DECLINE_PREFIX = \"drip_gwp_declined:\";\nconst INSERTED_PREFIX = \"drip_gwp_inserted:\";\n\ntype CartLine = {\n key?: unknown;\n quantity?: unknown;\n variant_id?: unknown;\n final_line_price?: unknown;\n line_price?: unknown;\n properties?: unknown;\n};\ntype ShopifyCart = { token?: unknown; currency?: unknown; items?: unknown };\n\n// Record value when the cart's identity is unknown — matches any cart.\nconst ANY_CART = \"*\";\n\nexport type GiftSyncOptions = {\n /** Per-arm proof from the CURRENT stamped offers plane. Insertion requires\n * it: config membership alone can cover an assignment whose offers proof\n * was refused (e.g. shared price+offers experiment with price-only proof),\n * and the Function would charge that \"gift\" at full price. */\n isArmProven?: (assignment: CartAssignment) => boolean;\n /** A cart mutation invalidates the once-per-page teardown check. */\n recheckTeardown?: boolean;\n /** Fail-closed reconciliation after a FAILED stamp sync: privilege-reducing\n * cleanup only (threshold/currency/orphan removals, quantity normalization)\n * — never insert, because no fresh proof exists for a new line. */\n suppressInsertion?: boolean;\n};\n\nlet inFlight: Promise<void> | null = null;\nlet queuedArgs: {\n settings: CommerceOffersSettings | undefined;\n assignments: CartAssignment[];\n options: GiftSyncOptions | undefined;\n generation: number;\n} | null = null;\n// In-memory fallback when localStorage is unavailable (strict privacy modes).\nconst insertedThisSession = new Map<string, string>();\nconst selectedGiftOptions = new Map<string, { gid: string; tierThreshold: string; pending?: boolean }>();\nconst dispatchedChoices = new Set<string>();\n// The choice tier currently applicable per experiment — selections bind to\n// THIS tier, not to whichever prompts were dispatched earlier in the session.\nconst activeChoiceTier = new Map<string, string>();\n// Bumped whenever new sync arguments are accepted: an in-flight pass built\n// on older arguments must not repopulate tier liveness after the clear.\nlet choiceTierGeneration = 0;\nlet latestArgs: { settings: CommerceOffersSettings | undefined; assignments: CartAssignment[]; options?: GiftSyncOptions } | null = null;\n\ntype GiftTier = { threshold: string; gift_variant_gid: string; gift_choice_variant_gids?: string[] };\nexport type PendingGiftChoice = {\n experimentId: string;\n threshold: string;\n options: string[];\n};\nfunction giftTiers(variant: Record<string, unknown>): GiftTier[] | null {\n const raw = Array.isArray(variant.tiers) && variant.tiers.length > 0\n ? variant.tiers\n : [{ threshold: variant.threshold, gift_variant_gid: variant.gift_variant_gid }];\n const tiers: GiftTier[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return null;\n const tier = item as Record<string, unknown>;\n if (typeof tier.threshold !== \"string\" || !/^\\d+$/.test(tier.threshold) ||\n typeof tier.gift_variant_gid !== \"string\" ||\n // Malformed fixed-tier GIDs would reach choice dispatch with a null\n // giftId and abort reconciliation mid-run; money-path config fails\n // closed at parse time instead.\n numericVariantId(tier.gift_variant_gid) === null) return null;\n const choices = tier.gift_choice_variant_gids;\n if (choices !== undefined && (!Array.isArray(choices) || choices.length < 2 || choices.length > 4 ||\n !choices.every((gid) => typeof gid === \"string\" && numericVariantId(gid) !== null))) return null;\n tiers.push({ threshold: tier.threshold, gift_variant_gid: tier.gift_variant_gid,\n ...(choices ? { gift_choice_variant_gids: choices as string[] } : {}) });\n }\n if (tiers.length < 1 || tiers.length > 3 || tiers.some((tier, index) =>\n !Number.isSafeInteger(Number(tier.threshold)) ||\n (index > 0 && Number(tier.threshold) <= Number(tiers[index - 1].threshold)))) return null;\n return tiers;\n}\n\nfunction declined(experimentId: string): boolean {\n try { return sessionStorage.getItem(`${DECLINE_PREFIX}${experimentId}`) === \"1\"; } catch { return false; }\n}\n\nfunction recordDecline(experimentId: string): void {\n try { sessionStorage.setItem(`${DECLINE_PREFIX}${experimentId}`, \"1\"); } catch { /* best effort */ }\n}\n\n// Insertion state persists in LOCAL storage: the Shopify cart itself is\n// durable across browser sessions, so the record of \"Apex added this line\"\n// must outlive the session too — otherwise a shopper returning after the\n// offer stopped would keep a no-longer-discounted gift (teardown cleanup\n// could not know to look), and a manual removal in a fresh session would\n// read as \"never inserted\" and re-add the gift. The record VALUE is the cart\n// token the insertion happened on, so a normal cart transition (checkout\n// emptied the old cart) is not misread as a manual decline on the new one.\n// This is charge-correctness state (experiment id + cart token), like the\n// cart attribute stamp, not analytics. Decline flags stay session-scoped.\nfunction insertionRecord(experimentId: string): string | null {\n try {\n return localStorage.getItem(`${INSERTED_PREFIX}${experimentId}`)\n ?? insertedThisSession.get(experimentId) ?? null;\n } catch { return insertedThisSession.get(experimentId) ?? null; }\n}\n\nfunction recordCart(record: string): string {\n if (!record.startsWith(\"{\")) return record;\n try { const parsed = JSON.parse(record) as { cart?: unknown }; return typeof parsed.cart === \"string\" ? parsed.cart : record; } catch { return record; }\n}\nfunction recordVariantGid(record: string): string | null {\n if (!record.startsWith(\"{\")) return null;\n try {\n const parsed = JSON.parse(record) as { variantGid?: unknown };\n return typeof parsed.variantGid === \"string\" ? parsed.variantGid : null;\n } catch { return null; }\n}\nfunction recordTierThreshold(record: string): string | null {\n if (!record.startsWith(\"{\")) return null;\n try {\n const parsed = JSON.parse(record) as { tierThreshold?: unknown };\n return typeof parsed.tierThreshold === \"string\" ? parsed.tierThreshold : null;\n } catch { return null; }\n}\nfunction insertionMatchesCart(record: string, cartToken: string | null): boolean {\n const token = recordCart(record);\n return token === ANY_CART || cartToken == null || token === cartToken;\n}\n\nfunction recordInserted(experimentId: string, cartToken: string | null, variantGid?: string, tierThreshold?: string): void {\n const token = cartToken ?? ANY_CART;\n const value = variantGid || tierThreshold ? JSON.stringify({ cart: token, variantGid, tierThreshold }) : token;\n insertedThisSession.set(experimentId, value);\n try { localStorage.setItem(`${INSERTED_PREFIX}${experimentId}`, value); } catch { /* best effort */ }\n // The durable record landing IS the settle point for a pending selection —\n // waiting for another reconciliation pass leaves a last-pass add pending\n // forever and re-opens the cross-tab revert.\n const selection = selectedGiftOptions.get(experimentId);\n if (selection?.pending && selection.gid === variantGid) {\n selectedGiftOptions.set(experimentId, {\n gid: selection.gid,\n tierThreshold: selection.tierThreshold,\n });\n }\n}\n\nfunction clearInserted(experimentId: string): void {\n insertedThisSession.delete(experimentId);\n try { localStorage.removeItem(`${INSERTED_PREFIX}${experimentId}`); } catch { /* best effort */ }\n}\n\nfunction clearDispatchedChoices(experimentId: string): void {\n dispatchedChoices.forEach((key) => {\n if (key.startsWith(`${experimentId}:`)) dispatchedChoices.delete(key);\n });\n}\n\nfunction listInsertionRecords(): string[] {\n const ids = new Set<string>(insertedThisSession.keys());\n try {\n for (let i = 0; i < localStorage.length; i += 1) {\n const key = localStorage.key(i);\n if (key?.startsWith(INSERTED_PREFIX)) ids.add(key.slice(INSERTED_PREFIX.length));\n }\n } catch { /* fall through */ }\n return [...ids];\n}\n\nfunction hasInsertionRecords(): boolean {\n return listInsertionRecords().length > 0;\n}\n\n// The teardown read (offers plane tombstoned to an empty experiments list)\n// runs once per PAGE LOAD — not per session — so a login/customer-account\n// cart merge that lands a marked line on a later page is still discovered;\n// in-page cart mutations reset the flag via the tombstone observer.\nlet teardownChecked = false;\n\nfunction markTeardownChecked(): void {\n teardownChecked = true;\n}\n\nfunction numericVariantId(gid: string): number | null {\n const match = /^gid:\\/\\/shopify\\/ProductVariant\\/(\\d+)$/.exec(gid);\n if (!match) return null;\n const id = Number(match[1]);\n return Number.isSafeInteger(id) && id > 0 ? id : null;\n}\n\nfunction marker(line: CartLine): string | null {\n if (!line.properties || typeof line.properties !== \"object\" || Array.isArray(line.properties)) return null;\n const value = (line.properties as Record<string, unknown>)[MARKER];\n return typeof value === \"string\" ? value : null;\n}\n\nfunction lineVariantId(line: CartLine): string | null {\n if (typeof line.variant_id === \"number\" && Number.isSafeInteger(line.variant_id)) return String(line.variant_id);\n if (typeof line.variant_id === \"string\" && /^\\d+$/.test(line.variant_id)) return line.variant_id;\n return null;\n}\n\nfunction lineAmount(line: CartLine): number | null {\n // The offer Function compares each non-gift line's cost.subtotalAmount —\n // the PRE-line-discount amount. Ajax `line_price` is that same basis;\n // `final_line_price` is post-discount and would disagree on discounted\n // carts, removing a gift the Function still authorizes.\n const value = line.line_price;\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : null;\n}\n\nasync function mutate(path: string, body: unknown): Promise<boolean> {\n // Never throws: a network-level rejection mid-pass must not discard the\n // pass's accumulated mutation state (earlier successful removals still\n // warrant the fixpoint retry and the cart-changed signal).\n try {\n const response = await fetchWithoutShopifyCartMutationNotification(path, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/** Returns true when this pass mutated the cart (caller re-runs to a fixpoint). */\nasync function run(\n settings: CommerceOffersSettings | undefined,\n assignments: CartAssignment[],\n options: GiftSyncOptions | undefined,\n generation: number,\n): Promise<boolean> {\n if (!isShopifyStorefront() || typeof fetch !== \"function\") return false;\n let response: Response;\n try {\n response = await fetchWithoutShopifyCartMutationNotification(shopifyCartPath(), {\n method: \"GET\", headers: { Accept: \"application/json\" }, cache: \"no-store\",\n });\n } catch { return false; }\n if (!response.ok) return false;\n const cart = await response.json() as ShopifyCart;\n if (!Array.isArray(cart.items) || typeof cart.currency !== \"string\") return false;\n let cartMutated = false;\n const lines = cart.items.filter((item): item is CartLine => !!item && typeof item === \"object\");\n const cartToken = typeof cart.token === \"string\" && cart.token ? cart.token : null;\n const assigned = new Map(assignments.map((item) => [item.experimentId, item.variationId]));\n // Charge-only pins authorize the cart stamp for an off-target page but are\n // deliberately excluded from DOM, persistence, and exposure — inserting a\n // physical gift for them would give away inventory the shopper was never\n // shown. They still count as ACTIVE for removal/keep decisions.\n const chargeOnlyExperimentIds = new Set(\n assignments.filter((item) => item.commercePriceOnly).map((item) => item.experimentId),\n );\n const experiments = settings?.experiments ?? [];\n // Only experiments covered by the signed offers authorization may INSERT:\n // without it the Function cannot discount the added line, so the \"gift\"\n // would be charged at full price. Removal/maintenance stays unrestricted.\n const authorizedOfferExperimentIds = new Set(\n settings?.authorization?.experimentIds ?? [],\n );\n const root = shopifyRoutesRoot();\n const changePath = `${root}cart/change.js`;\n // Tracks gift variants inserted within THIS run: two parallel GWP tests\n // configured with the same gift variant must share one line (the Function\n // consolidates both candidates onto the first matching line), or the\n // second marked line would be charged at full price.\n const insertedVariantIdsThisRun = new Set<string>();\n // Tracks lines removed within THIS run so presence checks against the\n // immutable snapshot do not see a line that is already gone — otherwise a\n // still-qualifying experiment sharing the removed gift's variant would\n // silently skip its own insertion.\n const removedLineKeys = new Set<string>();\n const removeLine = async (line: CartLine): Promise<boolean> => {\n if (typeof line.key !== \"string\") return false;\n if (!(await mutate(changePath, { id: line.key, quantity: 0 }))) return false;\n removedLineKeys.add(line.key);\n cartMutated = true;\n return true;\n };\n const linePresent = (line: CartLine): boolean =>\n typeof line.key === \"string\" ? !removedLineKeys.has(line.key) : true;\n\n // Orphan cleanup first: a marked line whose experiment left the offers\n // projection (stopped, archived, kill-switched), whose assignment is gone,\n // or whose assigned variant no longer describes a GWP offer (relaunched\n // under a different offer type) will never be authorized by the discount\n // Function again — the shopper would be charged full price for it. Remove\n // it before any insertion logic; keep the insertion record when removal\n // fails so the next sync retries instead of abandoning the line.\n const activeGiftExperiments = new Set(\n experiments\n .filter((experiment) => {\n const variationId = assigned.get(experiment.experiment_id);\n const variant = variationId ? experiment.variants[variationId] : undefined;\n if (!variant || typeof variant !== \"object\") return false;\n // With arm proof available, an assignment absent from the CURRENT\n // stamped offers plane is not active: the Function will not discount\n // its line, so keeping it would charge the shopper.\n if (options?.isArmProven) {\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (!assignment || !options.isArmProven(assignment)) return false;\n }\n if (\"control\" in variant && variant.control === true) return true;\n return \"offer_type\" in variant && variant.offer_type === \"gwp_threshold\"\n && giftTiers(variant as Record<string, unknown>) !== null;\n })\n .map((experiment) => experiment.experiment_id),\n );\n for (const line of lines) {\n const mark = marker(line);\n if (mark == null || activeGiftExperiments.has(mark)) continue;\n // Seed the durable record BEFORE attempting removal: if the mutation\n // fails transiently, the record keeps later syncs (and later sessions)\n // retrying even after this session's tombstone read is throttled.\n recordInserted(mark, cartToken);\n if (await removeLine(line)) clearInserted(mark);\n }\n // A record whose experiment is inactive AND whose line is already gone\n // (checkout consumed the cart, or the shopper removed it before teardown)\n // has nothing left to reconcile — clear it, or it would trigger a cart\n // read on every later apply and misread a relaunch as a manual decline.\n for (const experimentId of listInsertionRecords()) {\n if (activeGiftExperiments.has(experimentId)) continue;\n if (lines.some((line) => marker(line) === experimentId && linePresent(line))) continue;\n clearInserted(experimentId);\n }\n // Throttle only once the cart has actually been read this session; failed\n // orphan removals keep their seeded records, which bypass the throttle.\n if (settings && experiments.length === 0) markTeardownChecked();\n\n for (const experiment of experiments) {\n // Not live until this pass proves the choice prompt eligible: every\n // early exit (unassigned, control, currency mismatch, unproven arm,\n // suppression, decline) leaves the tier cleared so a delayed\n // selectGiftOption callback cannot bind to a phantom prompt.\n activeChoiceTier.delete(experiment.experiment_id);\n const variationId = assigned.get(experiment.experiment_id);\n if (!variationId) continue;\n const variant = experiment.variants[variationId];\n if (!variant || typeof variant !== \"object\") continue;\n // ALL marked lines for this experiment: concurrent tabs during a\n // relaunch can leave several (e.g. old and new gift variants), and the\n // Function discounts at most one unit of the current variant.\n const managedLines = () => lines.filter(\n (line) => marker(line) === experiment.experiment_id && linePresent(line),\n );\n // Removes every managed line; true when none that could be removed\n // remains (lines without a usable key were never removable and follow\n // the historical clear-anyway behavior).\n const removeAllManaged = async (): Promise<boolean> => {\n let allRemoved = true;\n for (const line of managedLines()) {\n if (typeof line.key !== \"string\") continue;\n if (!(await removeLine(line))) {\n allRemoved = false;\n // A failed REQUIRED removal (below-threshold, control, currency)\n // is unresolved work: the Function no longer discounts the line,\n // so force another fixpoint pass to retry within this\n // reconciliation instead of waiting for an unrelated cart event.\n cartMutated = true;\n }\n }\n return allRemoved;\n };\n if (\"control\" in variant && variant.control === true) {\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n if (!(\"offer_type\" in variant) || variant.offer_type !== \"gwp_threshold\") continue;\n const tiers = giftTiers(variant as Record<string, unknown>);\n if (!tiers) continue;\n if (cart.currency.toUpperCase() !== experiment.currency.toUpperCase()) {\n // The Function refuses cross-currency carts, so a market/currency switch\n // strands an existing managed line at full price — fail closed by\n // removing it, not just by skipping insertion. Not a decline: the gift\n // may re-insert if the shopper switches back.\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n const allGiftIds = new Set(tiers.flatMap((tier) => tier.gift_choice_variant_gids ?? [tier.gift_variant_gid])\n .map(numericVariantId).filter((id): id is number => id !== null).map(String));\n let subtotal = 0;\n let valid = true;\n for (const line of lines) {\n if (!linePresent(line) || allGiftIds.has(lineVariantId(line) ?? \"\")) continue;\n const amount = lineAmount(line);\n if (amount == null || !Number.isSafeInteger(subtotal + amount)) { valid = false; break; }\n subtotal += amount;\n }\n const applicableTier = valid ? tiers.reduce<GiftTier | null>((chosen, tier) => {\n const threshold = Number(tier.threshold);\n return Number.isSafeInteger(threshold) && threshold >= 0 && subtotal >= threshold ? tier : chosen;\n }, null) : null;\n if (!valid || tiers.some((tier) => !Number.isSafeInteger(Number(tier.threshold)))) {\n // Fail closed: an unrepresentable threshold means the Function cannot\n // legitimately discount this gift — an Apex-managed line left from an\n // earlier (lower) threshold would charge full price. Remove every\n // managed line for this experiment before skipping it.\n for (const line of managedLines()) {\n if (typeof line.key !== \"string\") continue;\n await removeLine(line);\n }\n continue;\n }\n if (!applicableTier) {\n clearDispatchedChoices(experiment.experiment_id);\n activeChoiceTier.delete(experiment.experiment_id);\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n const choiceGids = applicableTier.gift_choice_variant_gids;\n // Every applicable-tier transition re-arms the chooser: keys that do not\n // belong to the CURRENT tier (including all keys while a fixed tier\n // applies) are stale. Only the current batch may mutate dedup state.\n if (generation === choiceTierGeneration) {\n const currentKey = choiceGids\n ? `${experiment.experiment_id}:${applicableTier.threshold}:${choiceGids.join(\",\")}`\n : null;\n dispatchedChoices.forEach((key) => {\n if (key.startsWith(`${experiment.experiment_id}:`) && key !== currentKey) {\n dispatchedChoices.delete(key);\n }\n });\n }\n const markChoicePromptLive = () => {\n if (\n choiceGids &&\n !options?.suppressInsertion &&\n authorizedOfferExperimentIds.has(experiment.experiment_id) &&\n !declined(experiment.experiment_id)\n ) {\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (\n (!options?.isArmProven || (assignment && options.isArmProven(assignment))) &&\n generation === choiceTierGeneration\n ) {\n activeChoiceTier.set(experiment.experiment_id, applicableTier.threshold);\n }\n }\n };\n const extendedRecord = Array.isArray((variant as Record<string, unknown>).tiers);\n const persistedRecord = insertionRecord(experiment.experiment_id);\n const persistedGid = persistedRecord && insertionMatchesCart(persistedRecord, cartToken)\n ? recordVariantGid(persistedRecord)\n : null;\n // A recorded tier that DIFFERS from the applicable tier is a stale\n // lower-tier gift: entering a choice tier must present the choice. An\n // ABSENT tier (snapshot-seeded cross-device record, legacy plain-token\n // record) has no provenance: recover it only while the applicable tier\n // is the LOWEST choice tier containing that gid — once the subtotal has\n // crossed into a higher choice tier sharing the GID, the new tier's\n // prompt must not be suppressed by a tierless record.\n const lowestChoiceTierThresholdFor = (gid: string | null | undefined) =>\n gid == null\n ? undefined\n : tiers.find((tier) => tier.gift_choice_variant_gids?.includes(gid))?.threshold;\n const persistedTierThreshold =\n persistedRecord === null ? null : recordTierThreshold(persistedRecord);\n const tierlessRecoveryAllowed = (gid: string | null | undefined) =>\n lowestChoiceTierThresholdFor(gid) === applicableTier.threshold;\n // In-memory selections are tier-bound: a choice made for another tier\n // (tier crossing, or a selectGiftOption call while a different tier\n // applied) must not suppress the new tier's choice prompt.\n const inMemorySelection = selectedGiftOptions.get(experiment.experiment_id);\n let inMemoryGid = inMemorySelection?.tierThreshold === applicableTier.threshold\n ? inMemorySelection.gid\n : undefined;\n const markedCurrentTierGid = choiceGids?.find((gid) => {\n const variantId = numericVariantId(gid);\n return variantId !== null && lines.some((line) =>\n linePresent(line) && marker(line) === experiment.experiment_id &&\n lineVariantId(line) === String(variantId));\n });\n const persistedChoiceIsCurrentTier = persistedRecord !== null &&\n (persistedTierThreshold === applicableTier.threshold ||\n (persistedTierThreshold === null &&\n tierlessRecoveryAllowed(persistedGid ?? markedCurrentTierGid)));\n // Cross-tab arbitration: the durable record is the source of truth once\n // this tab's own selection has been persisted. A PENDING selection (made\n // here, not yet recorded) still wins — clobbering the user's fresh click\n // with an older record would be worse. Once our record lands (gids\n // match), pending clears; a later differing durable record means another\n // tab chose — drop the stale local selection instead of reverting theirs.\n if (inMemorySelection && inMemoryGid) {\n const persistedCurrentTierGid =\n persistedChoiceIsCurrentTier && choiceGids?.includes(persistedGid ?? \"\")\n ? persistedGid\n : null;\n if (inMemorySelection.pending && persistedCurrentTierGid === inMemoryGid) {\n selectedGiftOptions.set(experiment.experiment_id, {\n gid: inMemorySelection.gid,\n tierThreshold: inMemorySelection.tierThreshold,\n });\n } else if (\n !inMemorySelection.pending &&\n persistedCurrentTierGid &&\n persistedCurrentTierGid !== inMemoryGid\n ) {\n selectedGiftOptions.delete(experiment.experiment_id);\n inMemoryGid = undefined;\n }\n }\n const selectedGid = choiceGids?.includes(inMemoryGid ?? \"\")\n ? inMemoryGid\n : persistedChoiceIsCurrentTier && choiceGids?.includes(persistedGid ?? \"\") ? persistedGid!\n : persistedChoiceIsCurrentTier ? markedCurrentTierGid : undefined;\n if (selectedGid) {\n const priorPending =\n selectedGiftOptions.get(experiment.experiment_id)?.gid === selectedGid &&\n selectedGiftOptions.get(experiment.experiment_id)?.pending === true;\n selectedGiftOptions.set(experiment.experiment_id, {\n gid: selectedGid,\n tierThreshold: applicableTier.threshold,\n ...(priorPending ? { pending: true } : {}),\n });\n }\n const desiredGid = choiceGids ? selectedGid : applicableTier.gift_variant_gid;\n const giftId = desiredGid ? numericVariantId(desiredGid) : null;\n const allowedCurrentIds = new Set((choiceGids ?? [applicableTier.gift_variant_gid])\n .map(numericVariantId).filter((id): id is number => id !== null).map(String));\n // Keep at most ONE line carrying the current gift variant; every other\n // marked line (stale variant after a relaunch, or a concurrent-tab\n // duplicate) is removed — the Function will not discount it. Removal\n // failures skip the experiment: falling through could misread the\n // shopper's cart as a manual decline.\n let managed: CartLine | undefined;\n let staleRemovalFailed = false;\n let removedStaleForExperiment = false;\n for (const line of managedLines()) {\n if (!managed && giftId !== null && lineVariantId(line) === String(giftId)) {\n managed = line;\n continue;\n }\n if (typeof line.key !== \"string\") continue;\n if (await removeLine(line)) removedStaleForExperiment = true;\n else staleRemovalFailed = true;\n }\n // Any failed stale removal is unresolved work: force another fixpoint\n // pass so the retry happens now, not at the next unrelated cart event —\n // the Function discounts at most the one current-variant unit.\n if (staleRemovalFailed) cartMutated = true;\n if (staleRemovalFailed && !managed) continue;\n if (!managed && removedStaleForExperiment) {\n // OUR stale-variant removal, not a shopper decline of the new gift:\n // clear the record so the decline logic below cannot misread it and\n // the current gift may insert.\n clearInserted(experiment.experiment_id);\n }\n if (managed && lines.some((line) =>\n line !== managed && linePresent(line) && marker(line) !== experiment.experiment_id &&\n allowedCurrentIds.has(lineVariantId(line) ?? \"\"))) {\n // The Function picks one allowed option by cart-line id, not by Apex's\n // marker. If a shopper or another experiment added an allowed option,\n // our marked gift could therefore become a full-price line. Relinquish\n // Apex's line and let that other option satisfy the tier.\n if (typeof managed.key === \"string\" && await removeLine(managed)) {\n clearInserted(experiment.experiment_id);\n } else {\n cartMutated = true;\n }\n continue;\n }\n if (!desiredGid || giftId === null) {\n clearInserted(experiment.experiment_id);\n markChoicePromptLive();\n if (!options?.suppressInsertion && authorizedOfferExperimentIds.has(experiment.experiment_id) && !declined(experiment.experiment_id)) {\n const assignment = assignments.find((candidate) => candidate.experimentId === experiment.experiment_id);\n if (!options?.isArmProven || (assignment && options.isArmProven(assignment))) {\n const eventKey = `${experiment.experiment_id}:${applicableTier.threshold}:${choiceGids!.join(\",\")}`;\n // Only the current batch may dispatch or record dedup state: a\n // stale batch consuming the key would mute the queued batch's\n // valid prompt while its own event points at dead liveness.\n if (generation === choiceTierGeneration) {\n if (!dispatchedChoices.has(eventKey) && typeof window !== \"undefined\") {\n dispatchedChoices.add(eventKey);\n // Detail carries a COPY: chooser code mutating the array must\n // not corrupt the server-authored Function configuration that\n // selectGiftOption validates against.\n emitChoicePrompt({ experimentId: experiment.experiment_id, threshold: applicableTier.threshold, options: [...choiceGids!] });\n }\n }\n }\n }\n continue;\n }\n if (managed) {\n markChoicePromptLive();\n if (options?.suppressInsertion) {\n // Fail-closed pass after a failed stamp refresh: keep the line only\n // when durable evidence ties it to THIS cart — after a cart-identity\n // change (customer-cart merge) the old proof does not cover the new\n // cart and the Function will not discount the line.\n const record = insertionRecord(experiment.experiment_id);\n if (!record || !insertionMatchesCart(record, cartToken)) {\n if (await removeAllManaged()) clearInserted(experiment.experiment_id);\n continue;\n }\n } else {\n // A correctly marked line is always Apex-inserted (shoppers cannot\n // set our line property), so seed the insertion record when a fresh\n // session discovers one — a later disappearance must count as a\n // manual decline.\n recordInserted(experiment.experiment_id, cartToken, extendedRecord ? desiredGid : undefined, extendedRecord ? applicableTier.threshold : undefined);\n }\n // The Function only zeroes a single unit; extra units on the managed\n // line would be charged, so normalize a shopper/theme increment to one.\n if (\n typeof managed.key === \"string\" &&\n typeof managed.quantity === \"number\" &&\n managed.quantity !== 1\n ) {\n // An off-model quantity always warrants another fixpoint pass — even\n // when this normalize fails, the re-read retries within the run\n // instead of leaving an extra charged unit until the next mutation.\n cartMutated = true;\n await mutate(changePath, { id: managed.key, quantity: 1 });\n }\n continue;\n }\n // Off-target charge-only pins never insert, and their line's absence on\n // this page is not decline evidence — the targeted page owns both calls.\n if (chargeOnlyExperimentIds.has(experiment.experiment_id)) {\n // But when WE removed this experiment's shared gift line in this run,\n // clear the co-owner evidence now: removedByUsThisRun does not survive\n // the pass, and a later targeted page would misread the absent line as\n // a shopper decline and never reinsert the still-eligible gift.\n if (\n insertionRecord(experiment.experiment_id) != null &&\n lines.some(\n (line) => !linePresent(line) && allowedCurrentIds.has(lineVariantId(line) ?? \"\"),\n )\n ) {\n clearInserted(experiment.experiment_id);\n }\n continue;\n }\n // A shopper-owned copy of the gift satisfies the offer without giving\n // Apex ownership of it — as does a copy just inserted for a parallel\n // GWP test with the same gift variant (the Function consolidates both\n // experiments' candidates onto that one line). This MUST precede the\n // decline logic: a co-owner's record with the shared line still present\n // is not a removal.\n const satisfyingLine = lines.find(\n (line) => linePresent(line) && allowedCurrentIds.has(lineVariantId(line) ?? \"\"),\n );\n const insertedAllowedId = [...insertedVariantIdsThisRun].find((id) => allowedCurrentIds.has(id));\n if (satisfyingLine || insertedAllowedId) {\n markChoicePromptLive();\n // Sharing an APEX-INSERTED line makes this experiment a co-owner:\n // record insertion state so the shopper's later removal declines every\n // experiment the line represents, not just the one in its marker.\n // Unmarked shopper-owned copies stay unrecorded — removing one's own\n // purchase is not a gift decline.\n if (\n insertedAllowedId ||\n (satisfyingLine && marker(satisfyingLine) != null)\n ) {\n const satisfyingGid = satisfyingLine\n ? choiceGids?.find((gid) => String(numericVariantId(gid)) === lineVariantId(satisfyingLine))\n : choiceGids?.find((gid) => String(numericVariantId(gid)) === insertedAllowedId);\n recordInserted(experiment.experiment_id, cartToken, extendedRecord ? satisfyingGid ?? desiredGid : undefined, extendedRecord ? applicableTier.threshold : undefined);\n }\n continue;\n }\n const record = insertionRecord(experiment.experiment_id);\n if (record != null) {\n clearInserted(experiment.experiment_id);\n // Only a missing line on the SAME cart the gift was inserted on is a\n // manual decline. A new cart (checkout consumed the old one) starts\n // clean, and a shared line WE removed this run (its owner entered\n // control or lost eligibility) lets a still-qualifying co-owner take\n // ownership instead of being marked declined.\n const removedByUsThisRun = lines.some(\n (line) => !linePresent(line) && lineVariantId(line) === String(giftId),\n );\n if (!removedByUsThisRun && insertionMatchesCart(record, cartToken)) {\n recordDecline(experiment.experiment_id);\n continue;\n }\n }\n if (declined(experiment.experiment_id)) continue;\n if (options?.suppressInsertion) continue;\n if (!authorizedOfferExperimentIds.has(experiment.experiment_id)) continue;\n if (options?.isArmProven) {\n const localAssignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (!localAssignment || !options.isArmProven(localAssignment)) continue;\n }\n const addResponse = await fetchWithoutShopifyCartMutationNotification(`${root}cart/add.js`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n items: [{ id: giftId, quantity: 1, properties: { [MARKER]: experiment.experiment_id } }],\n }),\n }).catch(() => null);\n if (!addResponse?.ok) {\n // A failed add for an explicit CHOICE dead-ends the shopper: the\n // pending selection would keep retrying the same variant while the\n // cleared tier liveness rejects any new selectGiftOption call. Drop\n // the failed selection and re-arm the prompt so another option can\n // be chosen.\n const failedSelection = selectedGiftOptions.get(experiment.experiment_id);\n if (choiceGids && failedSelection?.gid === desiredGid) {\n selectedGiftOptions.delete(experiment.experiment_id);\n clearDispatchedChoices(experiment.experiment_id);\n // Re-arm immediately: the pass-start tier clear plus a failed add\n // with no cart mutation means no follow-up pass runs, so the chooser\n // would stay dead (selection ignored, no pending prompts) until an\n // unrelated reconciliation. Restore tier liveness and re-dispatch so\n // an alternative option can be chosen right away.\n markChoicePromptLive();\n if (generation === choiceTierGeneration && typeof window !== \"undefined\") {\n const retryKey = `${experiment.experiment_id}:${applicableTier.threshold}:${choiceGids.join(\",\")}`;\n if (!dispatchedChoices.has(retryKey)) {\n dispatchedChoices.add(retryKey);\n emitChoicePrompt({ experimentId: experiment.experiment_id, threshold: applicableTier.threshold, options: [...choiceGids] });\n }\n }\n }\n continue;\n }\n if (addResponse?.ok) {\n cartMutated = true;\n recordInserted(experiment.experiment_id, cartToken, extendedRecord ? desiredGid : undefined, extendedRecord ? applicableTier.threshold : undefined);\n insertedVariantIdsThisRun.add(String(giftId));\n // Concurrent tabs can both add; Shopify consolidates identical\n // variant+property lines by bumping quantity while the Function only\n // discounts one unit. Verify from the add response and normalize.\n try {\n const body = await addResponse.json() as { items?: unknown };\n const addedLine = Array.isArray(body.items)\n ? body.items.find((item): item is CartLine =>\n !!item && typeof item === \"object\" &&\n marker(item as CartLine) === experiment.experiment_id)\n : undefined;\n if (\n addedLine && typeof addedLine.key === \"string\" &&\n typeof addedLine.quantity === \"number\" && addedLine.quantity > 1\n ) {\n // Detected consolidation always forces a follow-up fixpoint pass:\n // even if this normalize fails, the re-read sees quantity > 1 on\n // the managed line and retries rather than leaving a charged unit.\n cartMutated = true;\n await mutate(changePath, { id: addedLine.key, quantity: 1 });\n }\n } catch { /* best effort */ }\n }\n }\n return cartMutated;\n}\n\n/**\n * Seed durable insertion records from any cart snapshot that passes through\n * the SDK (e.g. the /cart/update.js stamp-write response). Marked lines can\n * only originate from Apex, so seeing one IS the insertion evidence — this is\n * how a fresh device or a cleared-storage session over a persistent (or\n * customer-synced) cart rediscovers gifts it must reconcile or tear down.\n * Returns true when a marked line was found.\n */\nexport function noteCartSnapshotForGifts(cart: unknown): boolean {\n const snapshot = cart as { token?: unknown; items?: unknown } | null;\n if (!Array.isArray(snapshot?.items)) return false;\n const cartToken = typeof snapshot.token === \"string\" && snapshot.token ? snapshot.token : null;\n let found = false;\n for (const item of snapshot.items) {\n if (!item || typeof item !== \"object\") continue;\n const mark = marker(item as CartLine);\n if (mark == null) continue;\n const variantId = lineVariantId(item as CartLine);\n // A snapshot write must not erase tier ownership an in-flow record\n // already carries: overwriting a tier-bound choice with a variant-only\n // record would let a later tier crossing adopt it without re-prompting.\n const existing = insertionRecord(mark);\n const existingTier = existing && insertionMatchesCart(existing, cartToken)\n ? recordTierThreshold(existing)\n : null;\n recordInserted(mark, cartToken, variantId\n ? `gid://shopify/ProductVariant/${variantId}`\n : undefined, existingTier ?? undefined);\n found = true;\n }\n return found;\n}\n\nexport function syncGiftWithPurchase(\n settings: CommerceOffersSettings | undefined,\n assignments: CartAssignment[],\n options?: GiftSyncOptions,\n): Promise<void> {\n latestArgs = { settings, assignments, options };\n installChoiceRequestListener();\n // Liveness derives from the PREVIOUS eligibility state until the async\n // reconciliation below re-proves it; clear synchronously and advance the\n // generation so neither a chooser callback nor an in-flight pass built on\n // the old arguments can resurrect a stale proven tier.\n choiceTierGeneration += 1;\n const batchGeneration = choiceTierGeneration;\n activeChoiceTier.clear();\n if (options?.recheckTeardown) teardownChecked = false;\n if (!settings?.experiments.length && !hasInsertionRecords()) {\n // No offers plane at all: nothing to reconcile (shops that never ran\n // offers have no tombstone). A present-but-empty plane is the teardown\n // tombstone — read the cart once per page load (reset on cart mutations)\n // so an orphaned gift is discovered even when local insertion records\n // are gone (cleared storage, another device over a customer-synced cart).\n if (!settings || teardownChecked) return Promise.resolve();\n }\n if (inFlight) {\n // The active run may have read the cart before the mutation that\n // triggered this call — queue one trailing run (latest args win) instead\n // of dropping the reconciliation.\n queuedArgs = { settings, assignments, options, generation: batchGeneration };\n return inFlight;\n }\n // Any pass that mutates the cart re-reads and re-verifies its decisions\n // (bounded): the cart may have changed between the read and the mutation\n // (e.g. the subtotal dropped below threshold before the gift add landed),\n // and shared-line decisions must be order-independent across experiments.\n const runToFixpoint = async (\n nextSettings: CommerceOffersSettings | undefined,\n nextAssignments: CartAssignment[],\n nextOptions: GiftSyncOptions | undefined,\n // Fixed per argument batch: a later batch bumps the global counter, and\n // every remaining pass of THIS batch must keep failing the liveness\n // check rather than re-reading the now-current generation.\n generation: number,\n ) => {\n let anyMutated = false;\n for (let pass = 0; pass < 3; pass += 1) {\n const mutated = await run(nextSettings, nextAssignments, nextOptions, generation).catch(() => false);\n if (mutated) anyMutated = true;\n if (!mutated) break;\n }\n if (anyMutated && typeof window !== \"undefined\") {\n // Our mutations suppress the SDK's own cart observer, so themes whose\n // drawers render from their original add/change responses would show a\n // stale cart. Publish a documented signal for themes/integrators to\n // re-render from /cart.js (checkout charges are correct regardless —\n // the backend cart is authoritative; this is display freshness).\n try {\n window.dispatchEvent(\n new CustomEvent(\"apex:cart:changed\", { detail: { source: \"gwp_gift\" } }),\n );\n } catch { /* best effort */ }\n }\n };\n const pending = (async () => {\n await runToFixpoint(settings, assignments, options, batchGeneration);\n while (queuedArgs) {\n const next = queuedArgs;\n queuedArgs = null;\n await runToFixpoint(next.settings, next.assignments, next.options, next.generation);\n }\n if (choiceReplayRequested) getPendingGiftChoices().forEach(emitChoicePrompt);\n choiceReplayRequested = false;\n })().finally(() => {\n if (inFlight === pending) inFlight = null;\n if (!inFlight && queuedArgs) {\n const next = queuedArgs;\n queuedArgs = null;\n void syncGiftWithPurchase(next.settings, next.assignments, next.options);\n }\n });\n inFlight = pending;\n return pending;\n}\n\n/** Selects an option previously offered by `apex:gwp:choice`. The next\n * reconciliation validates the current signed arm/tier before mutating. */\nexport function selectGiftOption(experimentId: string, variantGid: string): Promise<void> {\n if (!latestArgs || numericVariantId(variantGid) === null) return Promise.resolve();\n const experiment = latestArgs.settings?.experiments.find((item) => item.experiment_id === experimentId);\n const variationId = latestArgs.assignments.find((item) => item.experimentId === experimentId)?.variationId;\n const variant = variationId ? experiment?.variants[variationId] : undefined;\n if (!variant || typeof variant !== \"object\") return Promise.resolve();\n const tiers = giftTiers(variant as Record<string, unknown>);\n const containingTiers = tiers?.filter((tier) =>\n tier.gift_choice_variant_gids?.includes(variantGid)) ?? [];\n // The same GID can be a valid choice in several tiers: bind the selection\n // to the tier that is applicable right now (tracked each reconciliation\n // pass), so answering the live prompt records the live tier — dispatched\n // keys from earlier tier crossings must not decide this.\n const applicableThreshold = activeChoiceTier.get(experimentId);\n // No live choice tier (shopper dropped below threshold, or moved to a\n // fixed tier) → a delayed chooser callback must be ignored, not recorded\n // against a tier that is no longer prompting.\n const owningTier = containingTiers.find(\n (tier) => tier.threshold === applicableThreshold,\n );\n if (!owningTier) return Promise.resolve();\n selectedGiftOptions.set(experimentId, {\n gid: variantGid,\n tierThreshold: owningTier.threshold,\n pending: true,\n });\n clearDispatchedChoices(experimentId);\n return syncGiftWithPurchase(latestArgs.settings, latestArgs.assignments, latestArgs.options);\n}\n\nfunction emitChoicePrompt(detail: PendingGiftChoice): void {\n dispatchEvent(new CustomEvent(\"apex:gwp:choice\", { detail }));\n}\n\n// Documented replay contract: dispatching apex:gwp:choice:request makes the\n// SDK re-emit apex:gwp:choice for every live, unanswered prompt, so choosers\n// mounted after the initial dispatch can recover it. Registered lazily from\n// the sync path so importing this module (e.g. via the @drip-apex/sdk/chooser\n// entry) stays free of runtime side effects.\nlet choiceRequestListenerInstalled = false;\nlet choiceReplayRequested = false;\nfunction installChoiceRequestListener(): void {\n if (choiceRequestListenerInstalled || typeof window === \"undefined\") return;\n choiceRequestListenerInstalled = true;\n window.addEventListener(\"apex:gwp:choice:request\", () => {\n if (inFlight) choiceReplayRequested = true;\n getPendingGiftChoices().forEach(emitChoicePrompt);\n });\n}\n\n/** Returns live, unanswered gift-choice prompts. This replayable query lets a\n * chooser mounted after `apex:gwp:choice` was dispatched discover the same\n * prompt; pass an experiment id to restrict the result. Returned option\n * arrays are copies and may be safely modified by caller code. */\nexport function getPendingGiftChoices(experimentId?: string): PendingGiftChoice[] {\n if (!latestArgs) return [];\n const prompts: PendingGiftChoice[] = [];\n for (const [activeExperimentId, threshold] of activeChoiceTier) {\n if (experimentId !== undefined && activeExperimentId !== experimentId) continue;\n const selected = selectedGiftOptions.get(activeExperimentId);\n if (selected?.tierThreshold === threshold) continue;\n const experiment = latestArgs.settings?.experiments.find(\n (item) => item.experiment_id === activeExperimentId,\n );\n const variationId = latestArgs.assignments.find(\n (item) => item.experimentId === activeExperimentId,\n )?.variationId;\n const variant = variationId ? experiment?.variants[variationId] : undefined;\n if (!variant || typeof variant !== \"object\") continue;\n const tier = giftTiers(variant as Record<string, unknown>)?.find(\n (candidate) => candidate.threshold === threshold,\n );\n if (!tier?.gift_choice_variant_gids) continue;\n prompts.push({\n experimentId: activeExperimentId,\n threshold,\n options: [...tier.gift_choice_variant_gids],\n });\n }\n return prompts;\n}\n\nexport const __giftManagerInternals = {\n reset() {\n inFlight = null;\n queuedArgs = null;\n insertedThisSession.clear();\n selectedGiftOptions.clear();\n activeChoiceTier.clear();\n dispatchedChoices.clear();\n latestArgs = null;\n teardownChecked = false;\n },\n};\n","import type {\n ActivationMode,\n Assignment,\n Experiment,\n InitConfig,\n PerfFeatureFlag,\n PlatformHint,\n RouterMode,\n} from \"./types\";\n\ntype UrlDiffNeeds = {\n path: boolean;\n search: boolean;\n hash: boolean;\n};\n\nexport type PerfFlagState = Record<PerfFeatureFlag, boolean>;\n\nconst PERF_FLAG_DEFAULTS: PerfFlagState = {\n perf_platform_router_v1: true,\n perf_shopify_pixel_buffer_v1: true,\n perf_spa_incremental_reapply_v1: true,\n perf_empty_project_v1: false,\n};\n\nfunction hasOwnEntries(value: unknown): boolean {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value) && Object.keys(value).length > 0);\n}\n\nfunction hasProjectCode(config: InitConfig): boolean {\n const projectCode = config.projectCode;\n return Boolean(\n projectCode?.enabled\n || projectCode?.css?.trim()\n || projectCode?.helperJs?.trim()\n || projectCode?.js?.trim(),\n );\n}\n\n/**\n * Browser-side validation for a server-compiled empty-project profile. The\n * browser may reject the profile, but never upgrades a full profile itself.\n */\nexport function canUseEmptyProjectProfile(\n config: InitConfig,\n experiments: Experiment[],\n platform?: PlatformHint,\n): boolean {\n if (config.runtimeProfile !== \"empty_project\") return false;\n if (!readPerfFlags(config).perf_empty_project_v1) return false;\n if (experiments.length > 0) return false;\n if ((config.signals?.length ?? 0) > 0) return false;\n if (hasOwnEntries(config.commerce)) return false;\n if ((config.dataLayerTriggers?.length ?? 0) > 0) return false;\n if ((config.externalTracking?.domains?.length ?? 0) > 0) return false;\n if (hasOwnEntries(config.exposureDestinations)) return false;\n if (hasProjectCode(config)) return false;\n if (config.semanticTracking?.enabled) return false;\n if (config.debug?.enabled) return false;\n if (config.runtimeFeatures && Object.entries(config.runtimeFeatures).some(([key, enabled]) => (\n key !== \"sdkVariant\" && enabled === true\n ))) return false;\n if (config.runtimeFeatures?.sdkVariant && config.runtimeFeatures.sdkVariant !== \"live\") return false;\n if (config.pageTrigger?.defaultMode && config.pageTrigger.defaultMode !== \"direct\") return false;\n if (config.routerMode && config.routerMode !== \"auto\" && config.routerMode !== \"none\") return false;\n if (config.spa && (\n config.spa.reinitOnly\n || config.spa.domChangeTrigger\n || config.spa.activationMode === \"manual\"\n || (config.spa.routerMode && config.spa.routerMode !== \"auto\" && config.spa.routerMode !== \"none\")\n )) return false;\n if (config.profile?.platform === \"spa\" || config.platformHint === \"spa\" || platform === \"spa\") return false;\n if (config.projectPrerequisites?.showVariationsRule?.trim()\n && config.projectPrerequisites.showVariationsRule.trim() !== \"return true;\") return false;\n if (config.projectPrerequisites?.startTrackingRule?.trim()\n && config.projectPrerequisites.startTrackingRule.trim() !== \"return true;\") return false;\n return true;\n}\n\nfunction hasNavigationApi(): boolean {\n const w = globalThis as Record<string, unknown>;\n const nav = w.navigation as { addEventListener?: unknown } | undefined;\n return Boolean(nav && typeof nav.addEventListener === \"function\");\n}\n\nfunction hasShopifyRuntime(): boolean {\n const w = globalThis as Record<string, unknown>;\n const shopify = w.Shopify as { analytics?: { publish?: unknown } } | undefined;\n return Boolean(shopify?.analytics && typeof shopify.analytics.publish === \"function\");\n}\n\nfunction hasShopwareRuntime(): boolean {\n const w = globalThis as Record<string, unknown>;\n if (w.PluginManager) return true;\n if (w.Shopware) return true;\n if (typeof document === \"undefined\") return false;\n return Boolean(\n document.querySelector(\"[data-shopware], [data-off-canvas-main-navigation], .cms-page, .is--ctl-index\"),\n );\n}\n\nfunction hasSpaMarkers(): boolean {\n if (typeof document === \"undefined\") return false;\n return Boolean(\n document.getElementById(\"__next\")\n || document.querySelector(\"[data-reactroot], [ng-version], [data-sveltekit], [data-v-app], [data-router-view]\"),\n );\n}\n\nexport function detectRuntimePlatform(): PlatformHint {\n if (hasShopifyRuntime()) return \"shopify\";\n if (hasShopwareRuntime()) return \"shopware\";\n if (hasSpaMarkers() || hasNavigationApi()) return \"spa\";\n return \"auto\";\n}\n\nexport function resolvePlatform(config: InitConfig): PlatformHint {\n if (config.platformHint && config.platformHint !== \"auto\") {\n return config.platformHint;\n }\n const profilePlatform = config.profile?.platform;\n if (profilePlatform && profilePlatform !== \"auto\") {\n return profilePlatform;\n }\n return detectRuntimePlatform();\n}\n\nexport function resolveRouterMode(config: InitConfig, platform: PlatformHint): RouterMode {\n if (config.spa?.reinitOnly) return \"none\";\n const requested = config.spa?.routerMode ?? config.routerMode ?? \"auto\";\n if (requested !== \"auto\") return requested;\n if (platform === \"shopify\" && !config.spa?.domChangeTrigger) return \"none\";\n return hasNavigationApi() ? \"navigation\" : \"history\";\n}\n\nexport function resolveActivationMode(config: InitConfig): ActivationMode {\n const requested = config.spa?.activationMode ?? config.activationMode ?? \"auto\";\n if (requested === \"manual\") return \"manual\";\n return \"observer\";\n}\n\nexport function readPerfFlags(config: InitConfig): PerfFlagState {\n const out = { ...PERF_FLAG_DEFAULTS };\n const configured = config.perfFlags ?? {};\n for (const key of Object.keys(out) as PerfFeatureFlag[]) {\n if (typeof configured[key] === \"boolean\") out[key] = configured[key]!;\n }\n return out;\n}\n\nfunction parseMaybeUrl(url: string): URL | null {\n try {\n return new URL(url, \"https://_\");\n } catch {\n return null;\n }\n}\n\nfunction readForceSignature(params: URLSearchParams): string {\n const canonical = params.get(\"drip_force\") ?? \"\";\n if (canonical) return canonical;\n const experimentId =\n params.get(\"drip_experiment_id\") ??\n params.get(\"drip_experiment\") ??\n params.get(\"experiment_id\") ??\n params.get(\"experimentId\") ??\n params.get(\"expId\") ??\n \"\";\n const variationId =\n params.get(\"drip_variation_id\") ??\n params.get(\"drip_variation\") ??\n params.get(\"variation_id\") ??\n params.get(\"variationId\") ??\n params.get(\"varId\") ??\n \"\";\n return experimentId && variationId ? `${experimentId}:${variationId}` : \"\";\n}\n\nfunction markUrlDepsForPattern(\n deps: UrlDiffNeeds,\n pattern: string,\n type: \"regex\" | \"simple\",\n): void {\n if (type === \"regex\") {\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n return;\n }\n deps.path = true;\n if (pattern.includes(\"?\")) deps.search = true;\n if (pattern.includes(\"#\")) deps.hash = true;\n}\n\nexport function computeUrlDiffNeeds(\n experiments: Experiment[],\n signals: InitConfig[\"signals\"] = [],\n): UrlDiffNeeds {\n const deps: UrlDiffNeeds = { path: false, search: false, hash: false };\n for (const exp of experiments) {\n const rules = exp.targeting?.url;\n if (!rules || rules.length === 0) continue;\n for (const rule of rules) {\n markUrlDepsForPattern(deps, rule.pattern, rule.type);\n if (deps.path && deps.search && deps.hash) return deps;\n }\n }\n\n for (const definition of signals ?? []) {\n const mode = definition.capture?.mode;\n if (mode === \"url_parameter\") {\n deps.search = true;\n }\n if (mode === \"dom_selector\" || mode === \"global\") {\n deps.path = true;\n deps.search = true;\n deps.hash = true;\n }\n if (deps.path && deps.search && deps.hash) return deps;\n }\n\n return deps;\n}\n\nexport function shouldReevaluateForUrlChange(\n previousUrl: string,\n nextUrl: string,\n deps: UrlDiffNeeds,\n): boolean {\n if (previousUrl === nextUrl) return false;\n const prev = parseMaybeUrl(previousUrl);\n const next = parseMaybeUrl(nextUrl);\n if (!prev || !next) return true;\n if (deps.path && prev.pathname !== next.pathname) return true;\n if (deps.search && prev.search !== next.search) return true;\n if (deps.hash && prev.hash !== next.hash) return true;\n if (!deps.path && !deps.search && !deps.hash) {\n const prevForce = readForceSignature(prev.searchParams);\n const nextForce = readForceSignature(next.searchParams);\n return prevForce !== nextForce;\n }\n return false;\n}\n\nexport function assignmentSignature(assignments: Assignment[]): string {\n if (!assignments.length) return \"none\";\n return assignments\n .map((item) => item.experimentId + \":\" + item.variationId)\n .sort()\n .join(\"|\");\n}\n\nexport function getBlankScreenMs(): number {\n try {\n if (typeof performance === \"undefined\") return 0;\n const timing = performance.timing;\n if (timing && timing.navigationStart > 0 && timing.domContentLoadedEventStart > 0) {\n return Math.max(0, timing.domContentLoadedEventStart - timing.navigationStart);\n }\n const nav = performance.getEntriesByType?.(\"navigation\")?.[0] as { domContentLoadedEventStart?: number } | undefined;\n if (nav && typeof nav.domContentLoadedEventStart === \"number\") {\n return Math.max(0, Math.round(nav.domContentLoadedEventStart));\n }\n } catch {\n // ignore perf API failures\n }\n return 0;\n}\n","import { normalizeDataLayerEntry } from \"./data-layer-normalize\";\n\ntype Cleanup = () => void;\n\ntype DataLayerEntry = Record<string, unknown>;\ntype DataLayerMatcher = Record<string, unknown> | Array<[string, unknown]>;\n\ntype RuntimeToolsEnvironment = {\n document?: Document;\n window?: Window & typeof globalThis;\n location?: Location;\n track?: (type: string, data?: Record<string, unknown>) => void;\n trackGoal?: (goalId: string, data?: Record<string, unknown>) => void;\n signal?: (key: string, value: unknown, ttlDays?: number) => void;\n reInit?: (forceReapply?: boolean) => unknown;\n get?: (key: string) => unknown;\n};\n\nexport type WaitForElementOptions = {\n root?: ParentNode;\n once?: boolean;\n timeoutMs?: number;\n};\n\nexport type DomChangedOptions = {\n root?: Node;\n subtree?: boolean;\n debounceMs?: number;\n};\n\nexport type ElementInViewOptions = {\n root?: Element | Document | null;\n rootMargin?: string;\n threshold?: number;\n once?: boolean;\n timeoutMs?: number;\n};\n\nexport type DataLayerOptions = {\n layerName?: string;\n once?: boolean;\n timeoutMs?: number;\n};\n\nexport type ApexRuntimeTools = {\n waitForElement: (\n selector: string,\n callback: (element: Element) => void,\n options?: WaitForElementOptions,\n ) => Cleanup;\n elementIsInView: (\n selector: string,\n callback: (element: Element) => void,\n options?: ElementInViewOptions | boolean,\n ) => Cleanup;\n domChanged: (\n callback: (mutations: MutationRecord[]) => void,\n options?: DomChangedOptions,\n ) => Cleanup;\n domLoaded: (callback: () => void) => Cleanup;\n waitForDataLayer: (\n matcher: DataLayerMatcher,\n callback: (entry: DataLayerEntry) => void,\n options?: DataLayerOptions,\n ) => Cleanup;\n track: (type: string, data?: Record<string, unknown>) => void;\n trackGoal: (goalId: string, data?: Record<string, unknown>) => void;\n signal: (key: string, value: unknown, ttlDays?: number) => void;\n redirect: (target: string) => void;\n reInit: (forceReapply?: boolean) => unknown;\n get: (key: string) => unknown;\n};\n\nfunction noopCleanup(): Cleanup {\n return () => {};\n}\n\nfunction readDocument(env: RuntimeToolsEnvironment): Document | undefined {\n return env.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction readWindow(\n env: RuntimeToolsEnvironment,\n): (Window & typeof globalThis) | undefined {\n return env.window ?? (typeof window !== \"undefined\" ? window : undefined);\n}\n\nfunction readLocation(env: RuntimeToolsEnvironment): Location | undefined {\n return env.location ?? (typeof location !== \"undefined\" ? location : undefined);\n}\n\nfunction safeCallback<T>(callback: (value: T) => void, value: T): void {\n try {\n callback(value);\n } catch {}\n}\n\nfunction isElement(value: unknown): value is Element {\n return typeof Element !== \"undefined\" && value instanceof Element;\n}\n\nfunction isDocument(value: unknown): value is Document {\n return typeof Document !== \"undefined\" && value instanceof Document;\n}\n\nfunction collectMatches(root: ParentNode, selector: string): Element[] {\n const matches: Element[] = [];\n if (isElement(root) && root.matches(selector)) {\n matches.push(root);\n }\n try {\n root.querySelectorAll(selector).forEach((element) => matches.push(element));\n } catch {}\n return matches;\n}\n\nfunction observeRootFor(root: ParentNode, doc: Document): Node | null {\n if (isDocument(root)) {\n return root.documentElement ?? root.body;\n }\n if (isElement(root)) return root;\n return doc.documentElement ?? doc.body;\n}\n\nfunction normalizeInViewOptions(\n options: ElementInViewOptions | boolean | undefined,\n): ElementInViewOptions {\n if (typeof options === \"boolean\") return { once: !options };\n return options ?? {};\n}\n\nfunction normalizeMatcher(matcher: DataLayerMatcher): Array<[string, unknown]> {\n return Array.isArray(matcher) ? matcher : Object.entries(matcher);\n}\n\nfunction matchesDataLayerEntry(\n entry: unknown,\n matcher: DataLayerMatcher,\n): entry is DataLayerEntry {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return false;\n const record = entry as DataLayerEntry;\n return normalizeMatcher(matcher).every(([key, expected]) => {\n if (expected instanceof RegExp) {\n return expected.test(String(record[key] ?? \"\"));\n }\n return record[key] === expected;\n });\n}\n\nexport function createApexRuntimeTools(\n env: RuntimeToolsEnvironment = {},\n): ApexRuntimeTools {\n const tools: ApexRuntimeTools = {\n waitForElement(\n selector: string,\n callback: (element: Element) => void,\n options: WaitForElementOptions = {},\n ): Cleanup {\n const doc = readDocument(env);\n if (!doc || !selector.trim()) return noopCleanup();\n const root = options.root ?? doc;\n const seen = new WeakSet<Element>();\n let active = true;\n let observer: MutationObserver | null = null;\n let timeoutId: number | null = null;\n\n const stop = () => {\n active = false;\n observer?.disconnect();\n observer = null;\n if (timeoutId !== null) {\n readWindow(env)?.clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const handle = (scope: ParentNode) => {\n if (!active) return;\n for (const element of collectMatches(scope, selector)) {\n if (seen.has(element)) continue;\n seen.add(element);\n safeCallback(callback, element);\n if (options.once !== false) {\n stop();\n return;\n }\n }\n };\n\n handle(root);\n if (!active || typeof MutationObserver === \"undefined\") return stop;\n\n const observeTarget = observeRootFor(root, doc);\n if (!observeTarget) return stop;\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (isElement(node)) handle(node);\n });\n }\n });\n observer.observe(observeTarget, { childList: true, subtree: true });\n\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutId = readWindow(env)?.setTimeout(stop, options.timeoutMs) ?? null;\n }\n return stop;\n },\n\n elementIsInView(\n selector: string,\n callback: (element: Element) => void,\n rawOptions?: ElementInViewOptions | boolean,\n ): Cleanup {\n const doc = readDocument(env);\n const win = readWindow(env);\n if (!doc || !win || !selector.trim()) return noopCleanup();\n const options = normalizeInViewOptions(rawOptions);\n const once = options.once !== false;\n const observed = new WeakSet<Element>();\n const cleanups: Cleanup[] = [];\n let observer: IntersectionObserver | null = null;\n\n const stop = () => {\n observer?.disconnect();\n observer = null;\n cleanups.splice(0).forEach((cleanup) => cleanup());\n };\n\n if (typeof IntersectionObserver === \"undefined\") {\n return tools.waitForElement(\n selector,\n (element: Element) => {\n const rect = element.getBoundingClientRect();\n const inView =\n rect.width > 0 &&\n rect.height > 0 &&\n rect.bottom >= 0 &&\n rect.right >= 0 &&\n rect.top <= win.innerHeight &&\n rect.left <= win.innerWidth;\n if (inView) safeCallback(callback, element);\n },\n { once, timeoutMs: options.timeoutMs },\n );\n }\n\n observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n safeCallback(callback, entry.target);\n if (once) observer?.unobserve(entry.target);\n }\n },\n {\n root: isDocument(options.root) ? null : (options.root ?? null),\n rootMargin: options.rootMargin,\n threshold: options.threshold ?? 1,\n },\n );\n\n cleanups.push(\n tools.waitForElement(\n selector,\n (element: Element) => {\n if (observed.has(element)) return;\n observed.add(element);\n observer?.observe(element);\n },\n { once: false, timeoutMs: options.timeoutMs },\n ),\n );\n return stop;\n },\n\n domChanged(\n callback: (mutations: MutationRecord[]) => void,\n options: DomChangedOptions = {},\n ): Cleanup {\n const doc = readDocument(env);\n const win = readWindow(env);\n if (!doc || typeof MutationObserver === \"undefined\") return noopCleanup();\n const root = options.root ?? doc.documentElement ?? doc.body;\n if (!root) return noopCleanup();\n const debounceMs = Math.max(0, options.debounceMs ?? 50);\n let pending: MutationRecord[] = [];\n let timeoutId: number | null = null;\n const flush = () => {\n timeoutId = null;\n const mutations = pending;\n pending = [];\n safeCallback(callback, mutations);\n };\n const observer = new MutationObserver((mutations) => {\n pending.push(...mutations);\n if (debounceMs === 0) {\n flush();\n return;\n }\n if (timeoutId !== null) return;\n timeoutId = win?.setTimeout(flush, debounceMs) ?? null;\n });\n observer.observe(root, { childList: true, subtree: options.subtree !== false });\n return () => {\n observer.disconnect();\n if (timeoutId !== null) win?.clearTimeout(timeoutId);\n };\n },\n\n domLoaded(callback: () => void): Cleanup {\n const doc = readDocument(env);\n if (!doc || doc.readyState !== \"loading\") {\n safeCallback(callback, undefined);\n return noopCleanup();\n }\n const handler = () => safeCallback(callback, undefined);\n doc.addEventListener(\"DOMContentLoaded\", handler, { once: true });\n return () => doc.removeEventListener(\"DOMContentLoaded\", handler);\n },\n\n waitForDataLayer(\n matcher: DataLayerMatcher,\n callback: (entry: DataLayerEntry) => void,\n options: DataLayerOptions = {},\n ): Cleanup {\n const win = readWindow(env);\n if (!win) return noopCleanup();\n const layerName = options.layerName || \"dataLayer\";\n const layerHost = win as unknown as Record<string, unknown>;\n const layer = Array.isArray(layerHost[layerName])\n ? (layerHost[layerName] as unknown[])\n : [];\n layerHost[layerName] = layer;\n const originalPush = layer.push;\n let active = true;\n let timeoutId: number | null = null;\n\n const process = (entry: unknown) => {\n if (!active) return;\n const normalized = normalizeDataLayerEntry(entry);\n const rawRecord = entry && typeof entry === \"object\" && !Array.isArray(entry)\n ? entry as DataLayerEntry\n : null;\n const candidate = normalized ?? (\n rawRecord && typeof rawRecord[0] !== \"string\" ? rawRecord : null\n );\n if (!candidate || !matchesDataLayerEntry(candidate, matcher)) return;\n safeCallback(callback, candidate);\n if (options.once !== false) cleanup();\n };\n const cleanup = () => {\n active = false;\n if (layer.push === wrappedPush) layer.push = originalPush;\n if (timeoutId !== null) {\n win.clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n const wrappedPush = function (...items: unknown[]) {\n const result = originalPush.apply(layer, items);\n items.forEach(process);\n return result;\n };\n\n layer.slice(Math.max(0, layer.length - 50)).forEach(process);\n if (active) layer.push = wrappedPush as typeof layer.push;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutId = win.setTimeout(cleanup, options.timeoutMs);\n }\n return cleanup;\n },\n\n track(type: string, data?: Record<string, unknown>) {\n env.track?.(type, data);\n },\n\n trackGoal(goalId: string, data?: Record<string, unknown>) {\n env.trackGoal?.(goalId, data);\n },\n\n signal(key: string, value: unknown, ttlDays?: number) {\n env.signal?.(key, value, ttlDays);\n },\n\n redirect(target: string) {\n const loc = readLocation(env);\n if (!loc || !target.trim()) return;\n loc.assign(new URL(target, loc.href).toString());\n },\n\n reInit(forceReapply?: boolean) {\n return env.reInit?.(forceReapply);\n },\n\n get(key: string) {\n if (key === \"tools\") return tools;\n return env.get?.(key);\n },\n };\n\n return tools;\n}\n","import type {\n ActivationGateDiagnostic,\n AttributeRule,\n ConditionDiagnostic,\n PageTargetingRule,\n SegmentCondition,\n SegmentTargetingRule,\n Targeting,\n TargetingDiagnostics,\n UrlRule,\n} from \"./types\";\nimport {\n evalUrlRule,\n evaluateJsTriggerResult,\n evaluatePageAdvancedConditionResult,\n matchAttributeRule,\n matchSegmentConditionValues,\n matchUrlRules,\n normalizeRuntimeUrlRules,\n pageManualTriggerMatches,\n resolveNamedConditionActual,\n resolveNamedConditionExpected,\n} from \"./targeting\";\n\nfunction urlRuleOperator(rule: UrlRule): string {\n return rule.matchType ?? rule.match_type ?? rule.type;\n}\n\nfunction diagnoseUrlRules(\n url: string,\n rules: UrlRule[],\n): { matched: boolean; conditions: ConditionDiagnostic[] } {\n const conditions: ConditionDiagnostic[] = [];\n if (!rules.length) return { matched: true, conditions };\n\n let hasInclude = false;\n let included = false;\n let stopped = false;\n for (let index = 0; index < rules.length; index += 1) {\n const rule = rules[index];\n if (stopped) {\n conditions.push({\n id: `url:${index}`,\n label: rule.include === false ? \"URL exclude rule\" : \"URL include rule\",\n status: \"skipped\",\n reason: \"url_exclude_matched\",\n operator: urlRuleOperator(rule),\n expected: rule.pattern,\n actual: url,\n source: rule.pattern,\n sourceType: \"url\",\n });\n continue;\n }\n\n const rawMatched = evalUrlRule(url, rule);\n const passed = rule.include === false ? !rawMatched : rawMatched;\n conditions.push({\n id: `url:${index}`,\n label: rule.include === false ? \"URL exclude rule\" : \"URL include rule\",\n status: passed ? \"passed\" : \"failed\",\n reason: passed ? \"url_matched\" : \"url_mismatch\",\n operator: urlRuleOperator(rule),\n expected: rule.pattern,\n actual: url,\n source: rule.pattern,\n sourceType: \"url\",\n });\n\n if (rule.include === false) {\n if (rawMatched) stopped = true;\n } else {\n hasInclude = true;\n if (rawMatched) included = true;\n }\n }\n\n return { matched: stopped ? false : included || !hasInclude, conditions };\n}\n\ntype BooleanDiagnosticResult = {\n matched: boolean;\n reason?: string;\n error?: unknown;\n};\n\nfunction pageRulePatternSummary(rule: PageTargetingRule): string {\n const rules = [\n ...(rule.includeRules ?? []).map((item) => ({\n // Preserve explicit negatives: the page-audience migration emits\n // include:false entries INSIDE includeRules (not_contains conditions),\n // and runtime evaluation honors them — the summary must not flip them.\n include: item.include !== false,\n matchType: urlRuleOperator(item),\n pattern: item.pattern,\n })),\n ...(rule.excludeRules ?? []).map((item) => ({\n include: false,\n matchType: urlRuleOperator(item),\n pattern: item.pattern,\n })),\n ];\n return JSON.stringify(rules);\n}\n\nfunction pageRuleSource(rule: PageTargetingRule): Pick<ConditionDiagnostic, \"source\" | \"sourceType\"> {\n const advancedCode = rule.advancedCondition?.code?.trim();\n if (advancedCode) return { source: advancedCode, sourceType: \"js\" };\n const triggerJs = rule.trigger?.triggerJs?.trim();\n if (triggerJs) return { source: triggerJs, sourceType: \"js\" };\n return { source: pageRulePatternSummary(rule), sourceType: \"page_rule\" };\n}\n\nfunction evaluatePageRuleForDiagnostics(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): BooleanDiagnosticResult {\n if (rule.disabled) return { matched: false, reason: \"page_rule_disabled\" };\n if (rule.trigger?.disabled) return { matched: false, reason: \"page_trigger_disabled\" };\n\n const includeRules = rule.includeRules ?? [];\n const excludeRules = (rule.excludeRules ?? []).map((item) => ({ ...item, include: false }));\n const urlMatched = matchUrlRules(ctx.url, [...includeRules, ...excludeRules]);\n if (!urlMatched) return { matched: false, reason: \"url_mismatch\" };\n if (!pageManualTriggerMatches(rule, ctx)) return { matched: false, reason: \"manual_trigger_mismatch\" };\n const advanced = evaluatePageAdvancedConditionResult(rule, ctx);\n if (!advanced.matched) return advanced;\n return { matched: true };\n}\n\nfunction pageRuleCondition(\n rule: PageTargetingRule,\n index: number,\n status: ConditionDiagnostic[\"status\"],\n reason: string | undefined,\n actual?: unknown,\n): ConditionDiagnostic {\n const include = rule.include !== false;\n const hasPatterns = Boolean(rule.includeRules?.length || rule.excludeRules?.length);\n const source = pageRuleSource(rule);\n return {\n id: `page:${rule.id || index}`,\n label: rule.name ?? (include ? \"Page include rule\" : \"Page exclude rule\"),\n status,\n reason,\n operator: include ? \"include\" : \"exclude\",\n // For plain page rules the pattern summary already lives in source; only\n // JS-sourced rules need it carried separately so the panel can show both\n // the patterns and the raw JS. The label already renders the rule name.\n expected: source.sourceType === \"js\" && hasPatterns ? pageRulePatternSummary(rule) : undefined,\n actual,\n ...source,\n };\n}\n\nfunction diagnosePageRules(\n rules: PageTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): { matched: boolean; conditions: ConditionDiagnostic[] } {\n const conditions: ConditionDiagnostic[] = [];\n if (!rules.length) return { matched: true, conditions };\n\n let hasInclude = false;\n let included = false;\n let stopped = false;\n for (let index = 0; index < rules.length; index += 1) {\n const rule = rules[index];\n if (stopped) {\n conditions.push(pageRuleCondition(rule, index, \"skipped\", \"page_rule_exclude_matched\"));\n continue;\n }\n\n const result = evaluatePageRuleForDiagnostics(rule, ctx);\n const include = rule.include !== false;\n const passed = include ? result.matched : !result.matched;\n conditions.push(pageRuleCondition(\n rule,\n index,\n passed ? \"passed\" : \"failed\",\n passed ? undefined : include ? result.reason ?? \"page_rule_mismatch\" : \"page_rule_exclude_matched\",\n pageRuleSource(rule).sourceType === \"page_rule\"\n ? `${ctx.url} — ${passed ? \"passed\" : \"failed\"}`\n : result.matched,\n ));\n\n if (rule.include === false) {\n if (result.matched) stopped = true;\n } else {\n hasInclude = true;\n if (result.matched) included = true;\n }\n }\n\n return { matched: stopped ? false : included || !hasInclude, conditions };\n}\n\nfunction skippedPageRuleConditions(rules: PageTargetingRule[], reason: string): ConditionDiagnostic[] {\n return rules.map((rule, index) => pageRuleCondition(rule, index, \"skipped\", reason));\n}\n\nfunction resolveSegmentConditionForDiagnostics(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): { actual: unknown; expected: SegmentCondition[\"value\"]; jsReason?: string } {\n if (condition.signal === \"cookie.value\" || condition.signal === \"url.query\") {\n return {\n actual: resolveNamedConditionActual(condition, ctx),\n expected: resolveNamedConditionExpected(condition),\n };\n }\n if (condition.js) {\n const result = evaluateJsTriggerResult(condition, ctx);\n return {\n actual: result.actual,\n expected: resolveNamedConditionExpected(condition),\n jsReason: result.reason,\n };\n }\n return {\n actual: resolveNamedConditionActual(condition, ctx),\n expected: resolveNamedConditionExpected(condition),\n };\n}\n\nfunction segmentConditionDiagnostic(\n rule: SegmentTargetingRule,\n condition: SegmentCondition,\n index: number,\n status: ConditionDiagnostic[\"status\"],\n reason: string | undefined,\n actual?: unknown,\n expected?: unknown,\n): ConditionDiagnostic {\n const jsCode = condition.js?.code?.trim();\n return {\n id: `segment:${rule.id || \"rule\"}:${index}`,\n label: rule.name ? `${rule.name}: ${condition.signal}` : `Segment condition: ${condition.signal}`,\n status,\n reason,\n operator: condition.operator,\n signal: condition.signal,\n expected,\n actual,\n source: jsCode || rule.id,\n sourceType: jsCode ? \"js\" : \"segment\",\n };\n}\n\nfunction segmentRuleDiagnosticConditions(rule: SegmentTargetingRule): SegmentCondition[] {\n const groups = Array.isArray(rule.rules?.groups)\n ? rule.rules.groups.filter((group) => Array.isArray(group) && group.length > 0)\n : [];\n return groups.length ? groups.flat() : rule.rules?.conditions ?? [];\n}\n\nfunction skippedSegmentRuleConditions(rule: SegmentTargetingRule, reason: string): ConditionDiagnostic[] {\n const conditions = segmentRuleDiagnosticConditions(rule);\n return conditions.map((condition, index) =>\n segmentConditionDiagnostic(\n rule,\n condition,\n index,\n \"skipped\",\n reason,\n undefined,\n resolveNamedConditionExpected(condition),\n ),\n );\n}\n\nfunction diagnoseSegmentCondition(\n rule: SegmentTargetingRule,\n condition: SegmentCondition,\n index: number,\n ctx: { url: string; attributes: Record<string, unknown> },\n): { matched: boolean; diagnostic: ConditionDiagnostic } {\n const resolved = resolveSegmentConditionForDiagnostics(condition, ctx);\n const matched = matchSegmentConditionValues(condition, resolved.actual, resolved.expected);\n return {\n matched,\n diagnostic: segmentConditionDiagnostic(\n rule,\n condition,\n index,\n matched ? \"passed\" : \"failed\",\n matched ? undefined : resolved.jsReason ?? \"segment_mismatch\",\n resolved.actual,\n resolved.expected,\n ),\n };\n}\n\nfunction diagnoseSegmentRule(\n rule: SegmentTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): { matched: boolean; conditions: ConditionDiagnostic[] } {\n const diagnostics: ConditionDiagnostic[] = [];\n const groups = Array.isArray(rule.rules?.groups)\n ? rule.rules.groups.filter((group) => Array.isArray(group) && group.length > 0)\n : [];\n\n if (groups.length) {\n let flatIndex = 0;\n for (let groupOffset = 0; groupOffset < groups.length; groupOffset += 1) {\n const group = groups[groupOffset];\n let groupMatched = false;\n for (let groupIndex = 0; groupIndex < group.length; groupIndex += 1) {\n const condition = group[groupIndex];\n if (groupMatched) {\n diagnostics.push(segmentConditionDiagnostic(\n rule,\n condition,\n flatIndex,\n \"skipped\",\n \"segment_group_matched\",\n undefined,\n resolveNamedConditionExpected(condition),\n ));\n flatIndex += 1;\n continue;\n }\n const result = diagnoseSegmentCondition(rule, condition, flatIndex, ctx);\n diagnostics.push(result.diagnostic);\n groupMatched = result.matched;\n flatIndex += 1;\n }\n if (!groupMatched) {\n for (const remainingGroup of groups.slice(groupOffset + 1)) {\n for (const condition of remainingGroup) {\n diagnostics.push(segmentConditionDiagnostic(\n rule,\n condition,\n flatIndex,\n \"skipped\",\n \"segment_group_failed\",\n undefined,\n resolveNamedConditionExpected(condition),\n ));\n flatIndex += 1;\n }\n }\n return { matched: false, conditions: diagnostics };\n }\n }\n return { matched: true, conditions: diagnostics };\n }\n\n const conditions = rule.rules?.conditions ?? [];\n if (!conditions.length) return { matched: true, conditions: diagnostics };\n if (rule.rules.operator === \"or\") {\n let matched = false;\n for (let index = 0; index < conditions.length; index += 1) {\n const condition = conditions[index];\n if (matched) {\n diagnostics.push(segmentConditionDiagnostic(\n rule,\n condition,\n index,\n \"skipped\",\n \"segment_or_matched\",\n undefined,\n resolveNamedConditionExpected(condition),\n ));\n continue;\n }\n const result = diagnoseSegmentCondition(rule, condition, index, ctx);\n diagnostics.push(result.diagnostic);\n matched = result.matched;\n }\n return { matched, conditions: diagnostics };\n }\n\n let matched = true;\n for (let index = 0; index < conditions.length; index += 1) {\n const condition = conditions[index];\n if (!matched) {\n diagnostics.push(segmentConditionDiagnostic(\n rule,\n condition,\n index,\n \"skipped\",\n \"segment_and_failed\",\n undefined,\n resolveNamedConditionExpected(condition),\n ));\n continue;\n }\n const result = diagnoseSegmentCondition(rule, condition, index, ctx);\n diagnostics.push(result.diagnostic);\n matched = result.matched;\n }\n return { matched, conditions: diagnostics };\n}\n\nfunction attributeCondition(\n rule: AttributeRule,\n index: number,\n status: ConditionDiagnostic[\"status\"],\n reason: string | undefined,\n actual?: unknown,\n): ConditionDiagnostic {\n return {\n id: `attribute:${rule.attribute}:${index}`,\n label: `Attribute rule: ${rule.attribute}`,\n status,\n reason,\n operator: rule.operator,\n signal: rule.attribute,\n expected: rule.value,\n actual,\n source: rule.attribute,\n sourceType: \"attribute\",\n };\n}\n\nfunction diagnoseAttributeRules(\n rules: AttributeRule[],\n attrs: Record<string, unknown>,\n): { matched: boolean; conditions: ConditionDiagnostic[] } {\n const conditions: ConditionDiagnostic[] = [];\n let matched = true;\n for (let index = 0; index < rules.length; index += 1) {\n const rule = rules[index];\n const actual = attrs[rule.attribute];\n if (!matched) {\n conditions.push(attributeCondition(rule, index, \"skipped\", \"attribute_mismatch\", actual));\n continue;\n }\n const ruleMatched = matchAttributeRule(attrs, rule);\n conditions.push(attributeCondition(\n rule,\n index,\n ruleMatched ? \"passed\" : \"failed\",\n ruleMatched ? undefined : \"attribute_mismatch\",\n actual,\n ));\n matched = ruleMatched;\n }\n return { matched, conditions };\n}\n\nfunction skippedAttributeConditions(rules: AttributeRule[], reason: string): ConditionDiagnostic[] {\n return rules.map((rule, index) =>\n attributeCondition(rule, index, \"skipped\", reason, undefined),\n );\n}\n\nfunction diagnoseSegmentRules(\n rules: SegmentTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): { matched: boolean; conditions: ConditionDiagnostic[] } {\n const conditions: ConditionDiagnostic[] = [];\n if (!rules.length) return { matched: true, conditions };\n\n let hasInclude = false;\n let included = false;\n let stopped = false;\n for (const rule of rules) {\n if (stopped) {\n conditions.push(...skippedSegmentRuleConditions(rule, \"segment_exclude_matched\"));\n continue;\n }\n const result = diagnoseSegmentRule(rule, ctx);\n conditions.push(...result.conditions);\n if (rule.include === false) {\n if (result.matched) stopped = true;\n } else {\n hasInclude = true;\n if (result.matched) included = true;\n }\n }\n\n return { matched: stopped ? false : included || !hasInclude, conditions };\n}\n\nfunction skippedSegmentConditions(rules: SegmentTargetingRule[], reason: string): ConditionDiagnostic[] {\n return rules.flatMap((rule) => skippedSegmentRuleConditions(rule, reason));\n}\n\nexport function evaluateTargetingGatesWithConditionDiagnostics(\n targeting: Targeting | undefined,\n ctx: { url: string; attributes: Record<string, unknown> },\n): TargetingDiagnostics {\n const conditions: ConditionDiagnostic[] = [];\n if (!targeting) {\n return {\n matched: true,\n gates: [\n { id: \"page\", label: \"Page check\", status: \"skipped\", reason: \"no_page_rules\" },\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n ],\n conditions,\n };\n }\n\n const gates: ActivationGateDiagnostic[] = [];\n const urlRules = normalizeRuntimeUrlRules(targeting);\n const pageRules = targeting.pageRules ?? [];\n const pageHasRules = urlRules.length > 0 || pageRules.length > 0;\n const url = diagnoseUrlRules(ctx.url, urlRules);\n conditions.push(...url.conditions);\n\n let pageRulesMatched = true;\n if (url.matched) {\n const page = diagnosePageRules(pageRules, ctx);\n pageRulesMatched = page.matched;\n conditions.push(...page.conditions);\n } else {\n pageRulesMatched = false;\n conditions.push(...skippedPageRuleConditions(pageRules, \"url_mismatch\"));\n }\n\n const pageMatched = pageHasRules ? url.matched && pageRulesMatched : true;\n gates.push({\n id: \"page\",\n label: \"Page check\",\n status: pageHasRules ? (pageMatched ? \"passed\" : \"failed\") : \"skipped\",\n reason: pageHasRules ? (pageMatched ? \"url_matched\" : \"url_mismatch\") : \"no_page_rules\",\n detail: pageHasRules ? { url: ctx.url, rules: urlRules.length, pageRules: pageRules.length } : undefined,\n });\n\n const attributeRules = targeting.attributes ?? [];\n const segmentRules = targeting.segmentRules ?? [];\n if (!pageMatched) {\n conditions.push(...skippedAttributeConditions(attributeRules, \"page_mismatch\"));\n conditions.push(...skippedSegmentConditions(segmentRules, \"page_mismatch\"));\n gates.push({\n id: \"audience\",\n label: \"Audience check\",\n status: \"skipped\",\n reason: \"page_mismatch\",\n detail: { skipped: true },\n });\n return { matched: false, gates, conditions };\n }\n\n const attributes = diagnoseAttributeRules(attributeRules, ctx.attributes);\n conditions.push(...attributes.conditions);\n\n const segments = diagnoseSegmentRules(segmentRules, ctx);\n conditions.push(...segments.conditions);\n\n const audienceHasRules = attributeRules.length > 0 || segmentRules.length > 0;\n const audienceMatched = attributes.matched && segments.matched;\n gates.push({\n id: \"audience\",\n label: \"Audience check\",\n status: audienceHasRules ? (audienceMatched ? \"passed\" : \"failed\") : \"skipped\",\n reason: audienceHasRules\n ? (audienceMatched ? \"audience_matched\" : !attributes.matched ? \"attribute_mismatch\" : \"segment_mismatch\")\n : \"no_audience_rules\",\n detail: audienceHasRules ? { attributeRules: attributeRules.length, segmentRules: segmentRules.length } : undefined,\n });\n\n return {\n matched: pageMatched && audienceMatched,\n gates,\n conditions,\n };\n}\n","import {\n AttributeRule,\n ActivationGateDiagnostic,\n Experiment,\n PageTargetingRule,\n SegmentCondition,\n SegmentTargetingRule,\n Targeting,\n TargetingDiagnostics,\n UrlRule,\n} from \"./types\";\nimport { createApexRuntimeTools } from \"./runtime-tools\";\nimport { safeRegexTest } from \"./safe-regex\";\nimport { getSignals, rememberProduct } from \"./signals\";\nimport { evaluateTargetingGatesWithConditionDiagnostics } from \"./targeting-diagnostics\";\n\ndeclare const __DRIP_QA_BUILD__: boolean;\n\nfunction evalSimpleUrlPart(actual: string, pattern: string, isPath: boolean): boolean {\n try {\n let escaped = pattern\n .replace(/[*.+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/_____/g, \".*\");\n if (isPath) {\n escaped = \"\\\\/?\" + escaped.replace(/(^\\/|\\/$)/g, \"\") + \"\\\\/?\";\n }\n const regex = new RegExp(\"^\" + escaped + \"$\", \"i\");\n return regex.test(actual);\n } catch {\n return false;\n }\n}\n\nfunction evalSimpleUrlTarget(actual: URL, pattern: string): boolean {\n try {\n const expected = new URL(\n pattern.replace(/^([^:/?]*)\\./i, \"https://$1.\").replace(/\\*/g, \"_____\"),\n \"https://_____\",\n );\n const comps: Array<[string, string, boolean]> = [\n [actual.host, expected.host, false],\n [actual.pathname, expected.pathname, true],\n ];\n if (expected.hash) comps.push([actual.hash, expected.hash, false]);\n expected.searchParams.forEach((v, k) => {\n comps.push([actual.searchParams.get(k) || \"\", v, false]);\n });\n return !comps.some((data) => !evalSimpleUrlPart(data[0], data[1], data[2]));\n } catch {\n return false;\n }\n}\n\nfunction unescapeRegexLiteral(value: string): string {\n return value.replace(/\\\\([.*+?^${}()|[\\]\\\\\\/])/g, \"$1\");\n}\n\nexport function evalUrlRule(url: string, rule: UrlRule): boolean {\n try {\n const parsed = new URL(url, \"https://_\");\n const matchType = rule.matchType ?? rule.match_type;\n if (matchType === \"contains\") {\n const actual = parsed.href.toLowerCase();\n const pattern = rule.pattern.toLowerCase();\n return actual.includes(pattern) || actual.includes(unescapeRegexLiteral(pattern));\n }\n if (rule.type === \"regex\") {\n const escaped = rule.pattern.replace(/([^\\\\])\\//g, \"$1\\\\/\");\n return safeRegexTest(escaped, parsed.href) || safeRegexTest(escaped, parsed.href.substring(parsed.origin.length));\n }\n return evalSimpleUrlTarget(parsed, rule.pattern);\n } catch {\n return false;\n }\n}\n\nfunction normalizeRuntimeUrlRule(value: unknown): UrlRule | null {\n if (typeof value === \"string\") {\n const pattern = value.trim();\n return pattern ? { type: \"simple\", pattern, include: true } : null;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n\n const raw = value as Record<string, unknown>;\n const rawPattern = raw.pattern ?? raw.value ?? raw.url ?? raw.path;\n const pattern = typeof rawPattern === \"string\" ? rawPattern.trim() : \"\";\n if (!pattern) return null;\n\n const include = typeof raw.include === \"boolean\" ? raw.include : true;\n const matchType =\n raw.matchType === \"exact\" ||\n raw.matchType === \"contains\" ||\n raw.matchType === \"wildcard\" ||\n raw.matchType === \"regex\"\n ? raw.matchType\n : raw.match_type === \"exact\" ||\n raw.match_type === \"contains\" ||\n raw.match_type === \"wildcard\" ||\n raw.match_type === \"regex\"\n ? raw.match_type\n : raw.type === \"url_contains\"\n ? \"contains\"\n : undefined;\n\n if (raw.type === \"url_contains\") {\n return { type: \"simple\", pattern, include, matchType: \"contains\" };\n }\n return {\n type: raw.type === \"regex\" || raw.type === \"url_regex\" ? \"regex\" : \"simple\",\n pattern,\n include,\n ...(matchType ? { matchType } : {}),\n };\n}\n\nexport function normalizeRuntimeUrlRules(targeting: Targeting | undefined): UrlRule[] {\n const raw = targeting as unknown as Record<string, unknown> | undefined;\n if (!raw || typeof raw !== \"object\") return [];\n\n const urlSource = Array.isArray(raw.url)\n ? raw.url\n : raw.url === undefined || raw.url === null\n ? []\n : [raw.url];\n const legacyRules = Array.isArray(raw.rules) ? raw.rules : [];\n\n return urlSource\n .concat(legacyRules)\n .map(normalizeRuntimeUrlRule)\n .filter((rule): rule is UrlRule => Boolean(rule));\n}\n\nexport function matchUrlRules(url: string, rules: UrlRule[]): boolean {\n if (!rules.length) return true;\n let hasInclude = false;\n let included = false;\n for (const rule of rules) {\n const match = evalUrlRule(url, rule);\n if (rule.include === false) {\n if (match) return false;\n } else {\n hasInclude = true;\n if (match) included = true;\n }\n }\n return included || !hasInclude;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction jsErrorReason(error: unknown): string {\n const message = errorMessage(error);\n return message ? `js_error: ${message}` : \"js_error\";\n}\n\ntype BooleanDiagnosticResult = {\n matched: boolean;\n reason?: string;\n error?: unknown;\n};\n\nexport function evaluatePageAdvancedConditionResult(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): BooleanDiagnosticResult {\n const code = rule.advancedCondition?.code?.trim();\n if (!code) return { matched: true };\n try {\n const url = new URL(\n ctx.url,\n typeof location !== \"undefined\" ? location.origin : \"https://_\",\n );\n const fn = new Function(\n \"context\",\n `\"use strict\";` +\n `const attributes=context.attributes;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const url=context.url;` +\n `const window=context.window;` +\n `return Boolean((function(){${/\\breturn\\b|;\\s*$|\\bthrow\\b/.test(code) ? code : `return (${code});`}}).call(window));`,\n );\n const matched = Boolean(fn({\n attributes: ctx.attributes,\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n url,\n window: typeof window !== \"undefined\" ? window : undefined,\n }));\n return { matched, reason: matched ? undefined : \"js_false\" };\n } catch (error) {\n return { matched: false, reason: jsErrorReason(error), error };\n }\n}\n\nfunction evaluatePageAdvancedCondition(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n const result = evaluatePageAdvancedConditionResult(rule, ctx);\n if (!result.matched && result.reason?.startsWith(\"js_error\")) {\n try {\n console.warn(\"[drip] Page trigger failed closed\", {\n pageId: rule.id,\n pageName: rule.name,\n error: result.error,\n });\n } catch {}\n }\n return result.matched;\n}\n\nexport function pageManualTriggerMatches(\n rule: PageTargetingRule,\n ctx: { attributes: Record<string, unknown> },\n): boolean {\n const mode = rule.trigger?.mode;\n if (mode !== \"manual-callback\" && mode !== \"manual-api\") return true;\n const signal = rule.trigger?.signal;\n if (!signal) return false;\n return ctx.attributes[signal] === true;\n}\n\nfunction matchPageTargetingRule(\n rule: PageTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n if (rule.disabled || rule.trigger?.disabled) return false;\n const includeRules = rule.includeRules ?? [];\n const excludeRules = (rule.excludeRules ?? []).map((item) => ({ ...item, include: false }));\n const urlMatched = matchUrlRules(ctx.url, [...includeRules, ...excludeRules]);\n return urlMatched && pageManualTriggerMatches(rule, ctx) && evaluatePageAdvancedCondition(rule, ctx);\n}\n\nfunction matchPageRules(\n rules: PageTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n if (!rules.length) return true;\n let hasInclude = false;\n let included = false;\n\n for (const rule of rules) {\n const matched = matchPageTargetingRule(rule, ctx);\n if (rule.include === false) {\n if (matched) return false;\n } else {\n hasInclude = true;\n if (matched) included = true;\n }\n }\n\n return included || !hasInclude;\n}\n\nexport function matchAttributeRule(\n attrs: Record<string, unknown>,\n rule: AttributeRule,\n): boolean {\n const value = attrs[rule.attribute];\n switch (rule.operator) {\n case \"exists\":\n return value !== undefined && value !== null;\n case \"equals\":\n return value === rule.value;\n case \"contains\":\n return typeof value === \"string\" && typeof rule.value === \"string\"\n ? value.includes(rule.value)\n : false;\n case \"in\":\n return Array.isArray(rule.value) ? rule.value.includes(String(value)) : false;\n default:\n return false;\n }\n}\n\nfunction wildcardToRegex(pattern: string): string {\n return `^${pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\")}$`;\n}\n\ntype RuntimeNavigator = Navigator & {\n userAgentData?: {\n mobile?: boolean;\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n fullVersionList?: Array<{ brand: string; version: string }>;\n getHighEntropyValues?: (hints: string[]) => Promise<unknown>;\n };\n};\n\ntype BrowserInfo = {\n name: string;\n version: string;\n};\n\ntype OsInfo = {\n name: string;\n version: string;\n};\n\nconst EMPTY_BROWSER_INFO: BrowserInfo = { name: \"\", version: \"\" };\nconst EMPTY_OS_INFO: OsInfo = { name: \"\", version: \"\" };\nlet highEntropyBrowserInfo: BrowserInfo | null = null;\nlet highEntropyBrowserInfoRequested = false;\n\nfunction runtimeNavigator(): RuntimeNavigator | undefined {\n return typeof navigator === \"undefined\" ? undefined : navigator as RuntimeNavigator;\n}\n\nfunction lower(value: unknown): string {\n return typeof value === \"string\" ? value.toLowerCase() : \"\";\n}\n\nfunction normalizeVersion(value: unknown): string {\n if (typeof value !== \"string\") return \"\";\n const match = value.match(/\\d+(?:[._]\\d+)*/);\n return match ? match[0].replace(/_/g, \".\") : \"\";\n}\n\nfunction firstVersionMatch(ua: string, patterns: RegExp[]): string {\n for (const pattern of patterns) {\n const match = ua.match(pattern);\n const version = normalizeVersion(match?.[1]);\n if (version) return version;\n }\n return \"\";\n}\n\nfunction getUserAgent(): string {\n return runtimeNavigator()?.userAgent ?? \"\";\n}\n\nfunction getPlatform(): string {\n const nav = runtimeNavigator();\n return nav?.userAgentData?.platform || nav?.platform || \"\";\n}\n\nfunction getDeviceTypeFromUserAgent(ua: string, platform: string): string {\n const normalizedUa = ua.toLowerCase();\n const normalizedPlatform = platform.toLowerCase();\n if (!normalizedUa && !normalizedPlatform) return \"\";\n\n const isIpad =\n /\\bipad\\b/.test(normalizedUa) ||\n (normalizedPlatform === \"macintel\" &&\n typeof navigator !== \"undefined\" &&\n Number((navigator as Navigator).maxTouchPoints || 0) > 1);\n if (isIpad || /\\btablet\\b|playbook|silk|kindle|nexus 7|nexus 9|sm-t|gt-p/i.test(ua)) {\n return \"tablet\";\n }\n if (/\\bmobi\\b|iphone|ipod|android.*mobile|windows phone|blackberry|bb10/i.test(ua)) {\n return \"mobile\";\n }\n if (/android/i.test(ua)) return \"tablet\";\n // Client-hints platform \"Android\" with mobile=false and no UA string is a\n // tablet, not a desktop.\n if (/android/i.test(normalizedPlatform)) return \"tablet\";\n if (/windows|macintosh|mac os x|linux|x11|cros/i.test(ua) || normalizedPlatform) {\n return \"desktop\";\n }\n return \"\";\n}\n\nfunction getDeviceType(): string {\n const nav = runtimeNavigator();\n if (nav?.userAgentData?.mobile === true) return \"mobile\";\n\n const fromUa = getDeviceTypeFromUserAgent(getUserAgent(), getPlatform());\n if (fromUa) return fromUa;\n\n if (typeof window === \"undefined\") return \"\";\n const width = window.innerWidth || 0;\n if (width > 0 && width < 768) return \"mobile\";\n if (width >= 768 && width < 1024) return \"tablet\";\n return \"desktop\";\n}\n\nfunction browserInfoFromBrands(brands: unknown): BrowserInfo {\n if (!Array.isArray(brands)) return EMPTY_BROWSER_INFO;\n\n for (const item of brands) {\n if (!item || typeof item !== \"object\") continue;\n const record = item as Record<string, unknown>;\n const brand = lower(record.brand);\n const version = normalizeVersion(record.version);\n if (!brand || brand.includes(\"not\") || brand.includes(\"brand\")) continue;\n if (brand.includes(\"edge\")) return { name: \"edge\", version };\n if (brand.includes(\"chrome\") || brand.includes(\"chromium\")) return { name: \"chrome\", version };\n if (brand.includes(\"firefox\")) return { name: \"firefox\", version };\n if (brand.includes(\"safari\")) return { name: \"safari\", version };\n }\n\n return EMPTY_BROWSER_INFO;\n}\n\nfunction requestHighEntropyBrowserInfo(): void {\n const userAgentData = runtimeNavigator()?.userAgentData;\n if (!userAgentData?.getHighEntropyValues || highEntropyBrowserInfoRequested) return;\n highEntropyBrowserInfoRequested = true;\n try {\n userAgentData\n .getHighEntropyValues([\"brands\", \"fullVersionList\"])\n .then((values) => {\n if (!values || typeof values !== \"object\") return;\n const record = values as Record<string, unknown>;\n const info = browserInfoFromBrands(record.fullVersionList ?? record.brands);\n if (info.name) highEntropyBrowserInfo = info;\n })\n .catch(() => {});\n } catch {}\n}\n\nfunction getBrowserInfoFromClientHints(): BrowserInfo {\n const userAgentData = runtimeNavigator()?.userAgentData;\n const fullVersionInfo = browserInfoFromBrands(userAgentData?.fullVersionList);\n if (fullVersionInfo.name) return fullVersionInfo;\n if (highEntropyBrowserInfo?.name) return highEntropyBrowserInfo;\n requestHighEntropyBrowserInfo();\n return browserInfoFromBrands(userAgentData?.brands);\n}\n\nfunction browserWithVersionPriority(name: string, uaVersion: string, hinted: BrowserInfo): BrowserInfo {\n return {\n name,\n version: hinted.name === name && hinted.version ? hinted.version : uaVersion || hinted.version,\n };\n}\n\nfunction getBrowserInfo(): BrowserInfo {\n const hinted = getBrowserInfoFromClientHints();\n const ua = getUserAgent();\n if (!ua) return hinted;\n\n if (/Edg\\//.test(ua)) {\n return browserWithVersionPriority(\"edge\", firstVersionMatch(ua, [/Edg\\/([\\d.]+)/]), hinted);\n }\n if (/Firefox\\//.test(ua)) {\n return browserWithVersionPriority(\"firefox\", firstVersionMatch(ua, [/Firefox\\/([\\d.]+)/]), hinted);\n }\n if (/CriOS\\//.test(ua)) {\n return browserWithVersionPriority(\"chrome\", firstVersionMatch(ua, [/CriOS\\/([\\d.]+)/]), hinted);\n }\n if (/Chrome\\//.test(ua) && !/Chromium|OPR\\/|Edg\\//.test(ua)) {\n return browserWithVersionPriority(\"chrome\", firstVersionMatch(ua, [/Chrome\\/([\\d.]+)/]), hinted);\n }\n if (/Version\\/[\\d.]+.*Safari\\//.test(ua) && !/Chrome|CriOS|FxiOS|Edg\\//.test(ua)) {\n return browserWithVersionPriority(\"safari\", firstVersionMatch(ua, [/Version\\/([\\d.]+)/]), hinted);\n }\n\n return hinted;\n}\n\nfunction getOsInfo(): OsInfo {\n const ua = getUserAgent();\n const platform = getPlatform();\n const normalized = `${ua} ${platform}`.toLowerCase();\n if (!normalized.trim()) return EMPTY_OS_INFO;\n\n if (/iphone|ipad|ipod/.test(normalized) || (platform === \"MacIntel\" && typeof navigator !== \"undefined\" && Number(navigator.maxTouchPoints || 0) > 1)) {\n return { name: \"ios\", version: firstVersionMatch(ua, [/OS ([\\d_]+)/]) };\n }\n if (/android/.test(normalized)) {\n return { name: \"android\", version: firstVersionMatch(ua, [/Android ([\\d.]+)/]) };\n }\n if (/windows/.test(normalized)) {\n return { name: \"windows\", version: firstVersionMatch(ua, [/Windows NT ([\\d.]+)/]) };\n }\n if (/mac os x|macintosh|macintel/.test(normalized)) {\n return { name: \"macos\", version: firstVersionMatch(ua, [/Mac OS X ([\\d_]+)/]) };\n }\n if (/linux|x11/.test(normalized)) {\n return { name: \"linux\", version: \"\" };\n }\n\n return EMPTY_OS_INFO;\n}\n\nfunction getLanguage(): string {\n const navLanguage = runtimeNavigator()?.language;\n if (typeof navLanguage === \"string\" && navLanguage.trim()) return navLanguage;\n if (typeof document !== \"undefined\") return document.documentElement.lang || \"\";\n return \"\";\n}\n\nfunction decodeCookieComponent(value: string): string {\n try {\n return decodeURIComponent(value.replace(/\\+/g, \" \"));\n } catch {\n return value;\n }\n}\n\nfunction getCookieValue(name: string): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n const needle = name.trim();\n if (!needle) return undefined;\n const pairs = document.cookie ? document.cookie.split(\";\") : [];\n for (const pair of pairs) {\n const index = pair.indexOf(\"=\");\n const rawName = (index >= 0 ? pair.slice(0, index) : pair).trim();\n if (decodeCookieComponent(rawName) !== needle) continue;\n return decodeCookieComponent(index >= 0 ? pair.slice(index + 1) : \"\");\n }\n return undefined;\n}\n\nfunction parseNamedValue(value: unknown): { name: string; expected: string } {\n const raw = String(value ?? \"\").trim();\n const index = raw.indexOf(\"=\");\n if (index < 0) return { name: raw, expected: \"\" };\n return {\n name: raw.slice(0, index).trim(),\n expected: raw.slice(index + 1),\n };\n}\n\nfunction getPersistedUtmValue(key: string): string {\n try {\n const params = new URLSearchParams(location.search);\n const direct = params.get(key);\n if (direct) return direct;\n } catch {}\n try {\n const stored = sessionStorage.getItem(\"drip_utm\");\n if (!stored) return \"\";\n const parsed = JSON.parse(stored) as Record<string, unknown>;\n return typeof parsed[key] === \"string\" ? parsed[key] : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeReferrer(): string {\n if (typeof document === \"undefined\") return \"\";\n const referrer = document.referrer;\n if (!referrer) return \"(direct)\";\n try {\n const host = new URL(referrer).hostname;\n return host === location.hostname ? \"(internal)\" : host;\n } catch {\n return \"(direct)\";\n }\n}\n\nfunction normalizeTrafficSource(utmSource: unknown, referrer: unknown): string {\n const source = typeof utmSource === \"string\" ? utmSource.toLowerCase() : \"\";\n const ref = typeof referrer === \"string\" ? referrer.toLowerCase() : \"\";\n if (source.includes(\"facebook\") || source.includes(\"instagram\") || source.includes(\"meta\") || source.includes(\"tiktok\")) {\n return \"paid-social\";\n }\n if (source.includes(\"google\") || source.includes(\"bing\") || ref.includes(\"google\") || ref.includes(\"bing\")) {\n return \"search\";\n }\n if (source.includes(\"email\") || source.includes(\"newsletter\")) return \"email\";\n if (source) return source;\n if (ref && ref !== \"(direct)\" && ref !== \"(internal)\") return \"referral\";\n return \"direct\";\n}\n\nfunction readShopifySignal(signal: string): unknown {\n if (typeof window === \"undefined\") return undefined;\n const root = (window as any).ShopifyAnalytics?.meta ?? (window as any).Shopify?.analytics?.meta;\n if (!root || typeof root !== \"object\") return undefined;\n\n if (signal === \"shopify.page_type\") {\n return root.page?.pageType ?? root.page?.page_type ?? root.pageType;\n }\n if (signal === \"shopify.product_type\") {\n return root.product?.type ?? root.product?.product_type;\n }\n if (signal === \"shopify.product_tag\") {\n return root.product?.tags;\n }\n if (signal === \"shopify.customer_tag\") {\n return root.customer?.tags;\n }\n return undefined;\n}\n\nexport function buildTargetingAttributes(\n baseAttributes: Record<string, unknown> = {},\n currentUrl?: string,\n options: { persistSignals?: boolean } = {},\n): Record<string, unknown> {\n const attrs: Record<string, unknown> = { ...baseAttributes };\n const href = currentUrl || (typeof location !== \"undefined\" ? location.href : \"\");\n const persistSignals = options.persistSignals !== false;\n\n try {\n const parsed = new URL(href, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n attrs[\"url.full\"] ??= parsed.href;\n attrs[\"url.path\"] ??= parsed.pathname;\n attrs[\"url.query\"] ??= parsed.search;\n } catch {}\n\n attrs[\"utm.source\"] ??= baseAttributes.utm_source ?? getPersistedUtmValue(\"utm_source\");\n attrs[\"utm.medium\"] ??= baseAttributes.utm_medium ?? getPersistedUtmValue(\"utm_medium\");\n attrs[\"utm.campaign\"] ??= baseAttributes.utm_campaign ?? getPersistedUtmValue(\"utm_campaign\");\n attrs.referrer ??= normalizeReferrer();\n attrs[\"device.type\"] ??= baseAttributes.device ?? getDeviceType();\n const browser = getBrowserInfo();\n attrs[\"device.browser\"] ??= browser.name;\n attrs[\"device.browser.version\"] ??= browser.version;\n const os = getOsInfo();\n attrs[\"device.os\"] ??= os.name;\n attrs[\"device.os.version\"] ??= os.version;\n attrs[\"navigator.language\"] ??= getLanguage();\n attrs[\"traffic.source\"] ??= normalizeTrafficSource(attrs[\"utm.source\"], attrs.referrer);\n\n for (const signal of [\n \"shopify.page_type\",\n \"shopify.product_type\",\n \"shopify.product_tag\",\n \"shopify.customer_tag\",\n ]) {\n attrs[signal] ??= readShopifySignal(signal);\n }\n\n if (persistSignals) {\n const productMeta = readShopifyProductMeta();\n if (productMeta) rememberProduct(productMeta);\n }\n\n for (const [signal, value] of Object.entries(getSignals({ markVisitorSeen: persistSignals }))) {\n attrs[signal] ??= value;\n }\n\n return attrs;\n}\n\nfunction resolveUrlQueryValue(url: string, conditionValue: unknown): string | undefined {\n const { name } = parseNamedValue(conditionValue);\n if (!name) return undefined;\n try {\n const parsed = new URL(url, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n return parsed.searchParams.get(name) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function resolveNamedConditionActual(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): unknown {\n if (condition.signal === \"cookie.value\") {\n const { name } = parseNamedValue(condition.value);\n return getCookieValue(name);\n }\n if (condition.signal === \"url.query\") {\n if (isLegacyRawQueryCondition(condition)) {\n return rawQueryString(ctx.url);\n }\n return resolveUrlQueryValue(ctx.url, condition.value);\n }\n return condition.js\n ? evaluateJsTrigger(condition, ctx)\n : resolveSignalValue(ctx.attributes, ctx.url, condition.signal);\n}\n\nexport function resolveNamedConditionExpected(condition: SegmentCondition): SegmentCondition[\"value\"] {\n if (condition.signal !== \"cookie.value\" && condition.signal !== \"url.query\") return condition.value;\n if (condition.operator === \"is_set\" || condition.operator === \"is_empty\") return condition.value;\n if (condition.signal === \"url.query\" && isLegacyRawQueryCondition(condition)) {\n return condition.value;\n }\n return parseNamedValue(condition.value).expected;\n}\n\n// Pre-fix url.query rules matched against the raw query string. Substring\n// operators without a name=value form keep that raw semantics so existing\n// audiences like `url.query contains \"spring\"` continue to match; presence\n// and equality operators use the named-parameter semantics from APX-59.\nconst LEGACY_RAW_QUERY_OPERATORS = new Set([\"contains\", \"not_contains\", \"starts_with\", \"ends_with\"]);\n\nfunction isLegacyRawQueryCondition(condition: SegmentCondition): boolean {\n if (!LEGACY_RAW_QUERY_OPERATORS.has(String(condition.operator))) return false;\n return !String(condition.value ?? \"\").includes(\"=\");\n}\n\nfunction rawQueryString(url: string): string {\n try {\n const parsed = new URL(url, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n return parsed.search || \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction readShopifyProductMeta(): Parameters<typeof rememberProduct>[0] | null {\n if (typeof window === \"undefined\") return null;\n const root = (window as any).ShopifyAnalytics?.meta ?? (window as any).Shopify?.analytics?.meta;\n const product = root?.product;\n if (!product || typeof product !== \"object\") return null;\n const id = product.id ?? product.gid ?? product.product_id;\n if (!id && !product.handle) return null;\n return {\n id,\n handle: product.handle,\n title: product.title,\n type: product.type ?? product.product_type,\n vendor: product.vendor,\n tags: Array.isArray(product.tags) ? product.tags : undefined,\n price: product.price,\n };\n}\n\nfunction resolveSignalValue(\n attrs: Record<string, unknown>,\n url: string,\n signal: string,\n): unknown {\n if (attrs[signal] !== undefined) return attrs[signal];\n\n try {\n const parsed = new URL(url, \"https://_\");\n if (signal === \"url.full\") return parsed.href;\n if (signal === \"url.path\") return parsed.pathname;\n if (signal === \"url.query\") return parsed.search;\n } catch {}\n\n return undefined;\n}\n\nfunction buildJsTriggerSource(code: string): string {\n const trimmed = code.trim();\n if (!trimmed) return \"return false;\";\n if (/\\breturn\\b/.test(trimmed)) return trimmed;\n return `return (${trimmed});`;\n}\n\nfunction isActivateJsTrigger(condition: SegmentCondition): boolean {\n const code = condition.js?.code ?? \"\";\n return condition.js?.mode === \"activate\" ||\n /\\bactivate\\s*\\(/.test(code) ||\n /\\bcallbackFn\\b/.test(code);\n}\n\nfunction evaluateJsTrigger(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): unknown {\n return evaluateJsTriggerResult(condition, ctx).actual;\n}\n\nexport function evaluateJsTriggerResult(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): { actual: unknown; reason?: string } {\n const code = condition.js?.code?.trim();\n if (!code || code.length > 4000) return { actual: undefined };\n if (isActivateJsTrigger(condition)) {\n return { actual: resolveSignalValue(ctx.attributes, ctx.url, condition.signal) };\n }\n\n try {\n const url = new URL(\n ctx.url,\n typeof location !== \"undefined\" ? location.origin : \"https://_\",\n );\n const apexTools = createApexRuntimeTools();\n const context = {\n apexTools,\n attributes: ctx.attributes,\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n signal: condition.signal,\n url,\n value: condition.value,\n window: typeof window !== \"undefined\" ? window : undefined,\n };\n const fn = new Function(\n \"context\",\n `\"use strict\";` +\n `const attributes=context.attributes;` +\n `const apexTools=context.apexTools;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const signal=context.signal;` +\n `const url=context.url;` +\n `const value=context.value;` +\n `const window=context.window;` +\n `return Boolean((function(){${buildJsTriggerSource(code)}}).call(window));`,\n );\n const actual = Boolean(fn(context));\n return { actual, reason: actual ? undefined : \"js_false\" };\n } catch (error) {\n return { actual: false, reason: jsErrorReason(error) };\n }\n}\n\nfunction stringValues(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => String(item).trim())\n .filter(Boolean);\n }\n if (value === undefined || value === null) return [];\n return [String(value)];\n}\n\nfunction hasMeaningfulValue(value: unknown): boolean {\n if (value === undefined || value === null) return false;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"string\") return value.trim().length > 0;\n return true;\n}\n\nfunction compareNumber(actual: unknown, expected: unknown, predicate: (a: number, b: number) => boolean): boolean {\n const actualNumber = Number(Array.isArray(actual) ? actual[0] : actual);\n const expectedNumber = Number(Array.isArray(expected) ? expected[0] : expected);\n return Number.isFinite(actualNumber) &&\n Number.isFinite(expectedNumber) &&\n predicate(actualNumber, expectedNumber);\n}\n\nfunction matchSegmentCondition(\n condition: SegmentCondition,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n const actual = resolveNamedConditionActual(condition, ctx);\n const expected = resolveNamedConditionExpected(condition);\n return matchSegmentConditionValues(condition, actual, expected);\n}\n\nexport function matchSegmentConditionValues(\n condition: SegmentCondition,\n actual: unknown,\n expected: SegmentCondition[\"value\"],\n): boolean {\n const actualValues = stringValues(actual);\n const expectedValues = stringValues(expected);\n const firstExpected = expectedValues[0] ?? \"\";\n\n switch (condition.operator) {\n case \"equals\":\n return actualValues.some((value) => value === String(expected ?? \"\"));\n case \"not_equals\":\n return !actualValues.some((value) => value === String(expected ?? \"\"));\n case \"contains\":\n return actualValues.some((value) =>\n expectedValues.length > 1\n ? expectedValues.includes(value)\n : value.includes(firstExpected),\n );\n case \"not_contains\":\n return !actualValues.some((value) =>\n expectedValues.length > 1\n ? expectedValues.includes(value)\n : value.includes(firstExpected),\n );\n case \"starts_with\":\n return actualValues.some((value) => value.startsWith(firstExpected));\n case \"ends_with\":\n return actualValues.some((value) => value.endsWith(firstExpected));\n case \"is_set\":\n return hasMeaningfulValue(actual);\n case \"is_empty\":\n return !hasMeaningfulValue(actual);\n case \"in\":\n return actualValues.some((value) => expectedValues.includes(value));\n case \"not_in\":\n return !actualValues.some((value) => expectedValues.includes(value));\n case \"matches_wildcard\":\n return actualValues.some((value) => safeRegexTest(wildcardToRegex(firstExpected), value));\n case \"matches_regex\":\n return actualValues.some((value) => safeRegexTest(firstExpected, value));\n case \"greater_than\":\n return compareNumber(actual, expected, (a, b) => a > b);\n case \"greater_than_or_equal\":\n return compareNumber(actual, expected, (a, b) => a >= b);\n case \"less_than\":\n return compareNumber(actual, expected, (a, b) => a < b);\n case \"less_than_or_equal\":\n return compareNumber(actual, expected, (a, b) => a <= b);\n default:\n return false;\n }\n}\n\nfunction matchSegmentRule(\n rule: SegmentTargetingRule,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n const groups = Array.isArray(rule.rules?.groups)\n ? rule.rules.groups.filter((group) => Array.isArray(group) && group.length > 0)\n : [];\n if (groups.length) {\n return groups.every((group) =>\n group.some((condition) => matchSegmentCondition(condition, ctx)),\n );\n }\n\n const conditions = rule.rules?.conditions ?? [];\n if (!conditions.length) return true;\n if (rule.rules.operator === \"or\") {\n return conditions.some((condition) => matchSegmentCondition(condition, ctx));\n }\n return conditions.every((condition) => matchSegmentCondition(condition, ctx));\n}\n\nfunction matchSegmentRules(\n rules: SegmentTargetingRule[],\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n if (!rules.length) return true;\n let hasInclude = false;\n let included = false;\n\n for (const rule of rules) {\n const matched = matchSegmentRule(rule, ctx);\n if (rule.include === false) {\n if (matched) return false;\n } else {\n hasInclude = true;\n if (matched) included = true;\n }\n }\n\n return included || !hasInclude;\n}\n\nexport function matchesTargeting(\n targeting: Targeting | undefined,\n ctx: { url: string; attributes: Record<string, unknown> },\n): boolean {\n return evaluateTargetingGates(targeting, ctx).matched;\n}\n\nexport function targetingHasJsTriggers(experiments: Experiment[]): boolean {\n return experiments.some((experiment) =>\n (experiment.targeting?.pageRules ?? []).some((rule) =>\n Boolean(rule.advancedCondition?.code?.trim()) ||\n Boolean(rule.trigger?.triggerJs?.trim()),\n ) ||\n (experiment.targeting?.segmentRules ?? []).some((rule) =>\n (rule.rules?.conditions ?? []).some((condition) =>\n Boolean(condition.js?.code?.trim()),\n ),\n ),\n );\n}\n\nexport function evaluateTargetingGatesDetailed(\n targeting: Targeting | undefined,\n ctx: { url: string; attributes: Record<string, unknown> },\n): TargetingDiagnostics {\n if (!__DRIP_QA_BUILD__) {\n const aggregate = evaluateTargetingGates(targeting, ctx);\n return { ...aggregate, conditions: [] };\n }\n return evaluateTargetingGatesWithConditionDiagnostics(targeting, ctx);\n}\n\nexport function evaluateTargetingGates(\n targeting: Targeting | undefined,\n ctx: { url: string; attributes: Record<string, unknown> },\n): { matched: boolean; gates: ActivationGateDiagnostic[] } {\n const gates: ActivationGateDiagnostic[] = [];\n if (!targeting) {\n return {\n matched: true,\n gates: [\n { id: \"page\", label: \"Page check\", status: \"skipped\", reason: \"no_page_rules\" },\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n ],\n };\n }\n\n const urlRules = normalizeRuntimeUrlRules(targeting);\n const pageRules = targeting.pageRules ?? [];\n const pageHasRules = urlRules.length > 0 || pageRules.length > 0;\n const pageMatched = pageHasRules\n ? matchUrlRules(ctx.url, urlRules) && matchPageRules(pageRules, ctx)\n : true;\n gates.push({\n id: \"page\",\n label: \"Page check\",\n status: pageHasRules ? (pageMatched ? \"passed\" : \"failed\") : \"skipped\",\n reason: pageHasRules ? (pageMatched ? \"url_matched\" : \"url_mismatch\") : \"no_page_rules\",\n detail: pageHasRules ? { url: ctx.url, rules: urlRules.length, pageRules: pageRules.length } : undefined,\n });\n\n if (!pageMatched) {\n gates.push({\n id: \"audience\",\n label: \"Audience check\",\n status: \"skipped\",\n reason: \"page_mismatch\",\n detail: { skipped: true },\n });\n return { matched: false, gates };\n }\n\n let attributesMatched = true;\n const attributeRules = targeting.attributes ?? [];\n for (const rule of attributeRules) {\n if (!matchAttributeRule(ctx.attributes, rule)) {\n attributesMatched = false;\n break;\n }\n }\n\n const segmentRules = targeting.segmentRules ?? [];\n const segmentRulesMatched = matchSegmentRules(segmentRules, ctx);\n const audienceHasRules = attributeRules.length > 0 || segmentRules.length > 0;\n const audienceMatched = attributesMatched && segmentRulesMatched;\n gates.push({\n id: \"audience\",\n label: \"Audience check\",\n status: audienceHasRules ? (audienceMatched ? \"passed\" : \"failed\") : \"skipped\",\n reason: audienceHasRules\n ? (audienceMatched ? \"audience_matched\" : !attributesMatched ? \"attribute_mismatch\" : \"segment_mismatch\")\n : \"no_audience_rules\",\n detail: audienceHasRules ? { attributeRules: attributeRules.length, segmentRules: segmentRules.length } : undefined,\n });\n\n return {\n matched: pageMatched && audienceMatched,\n gates,\n };\n}\n","import { cleanUrl, onPageExit } from \"./analytics\";\nimport { lifetimeIdentityStorage } from \"./hash\";\nimport { TrackEvent } from \"./types\";\n\ntype TrackerOptions = {\n endpoint: string;\n shopId?: string;\n ingestShopId?: string;\n ingestSignature?: string;\n visitorId?: string;\n flushIntervalMs?: number;\n maxBatchSize?: number;\n /** Returns the active experiment/variation at unload time for page_exit attribution. */\n getActiveAssignment?: () => { experimentId: string; variationId: string } | null;\n /** Builds global and experiment-scoped page-exit events without flushing during unload. */\n buildPageExitEvents?: (type: string, data?: Record<string, unknown>) => TrackEvent[];\n /** When true, all events are tagged as QA traffic. */\n qaMode?: boolean;\n /** Unique QA session identifier for grouping QA events. */\n qaSessionId?: string;\n /** Active Apex environment stamped onto every outgoing event. */\n environment?: string;\n};\n\nconst RECOVERY_KEY = \"drip_events\";\nconst VISITOR_SESSIONS_KEY = \"drip_visitor_sessions_v1\";\n\nfunction carriesVisitorSessions(type: string): boolean {\n return /^(experiment_viewed|personalization_rendered|goal|conversion|pageview)$/.test(type);\n}\n\n// Enough remembered session ids that parallel tabs (each with its own\n// per-tab session) cannot ping-pong the counter upward on reloads.\nconst VISITOR_SESSIONS_REMEMBERED = 8;\n\nfunction visitorSessionCount(sessionId: string): number | undefined {\n try {\n // Respect the configured storage policy: without a lifetime store\n // (sessionStorage/memory/cookie modes) a cross-session count would lie\n // (\"new\" every session), so the field is simply not stamped.\n const store = lifetimeIdentityStorage();\n if (!store) return undefined;\n const raw = store.getItem(VISITOR_SESSIONS_KEY);\n let stored: { count?: unknown; lastSessionId?: unknown; recentSessionIds?: unknown } | undefined;\n try {\n stored = JSON.parse(raw || \"0\");\n } catch {\n // Malformed state is equivalent to a missing counter and recovers at one.\n }\n const storedRecent = stored?.recentSessionIds;\n const storedLast = stored?.lastSessionId;\n const recent: string[] = Array.isArray(storedRecent)\n ? (storedRecent as unknown[]).filter(\n (id): id is string => typeof id === \"string\",\n )\n : typeof storedLast === \"string\"\n ? [storedLast]\n : [];\n const storedCount = stored?.count;\n const count =\n Number.isInteger(storedCount) && Number(storedCount) > 0 && recent.length > 0\n ? Number(storedCount)\n : 0;\n if (count && recent.includes(sessionId)) return count;\n const next = count + 1;\n store.setItem(\n VISITOR_SESSIONS_KEY,\n JSON.stringify({\n count: next,\n recentSessionIds: [sessionId, ...recent].slice(0, VISITOR_SESSIONS_REMEMBERED),\n }),\n );\n // sessionStorage is per-tab, so parallel tabs mint separate sessions.\n // This deliberately follows the SDK's existing session model; clearing\n // browser storage restarts the lifetime counter at one.\n return next;\n } catch {\n return undefined;\n }\n}\n\nfunction createEventId(): string {\n const cryptoApi = globalThis.crypto as Crypto | undefined;\n if (typeof cryptoApi?.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n return [\n Date.now().toString(36),\n Math.random().toString(36).slice(2),\n Math.random().toString(36).slice(2),\n ].join(\"-\");\n}\n\nexport class Tracker {\n private endpoint: string;\n private shopId: string;\n private ingestShopId: string;\n private ingestSignature: string;\n private visitorId: string;\n private sessionId: string;\n private visitorSessions: number | undefined;\n private flushIntervalMs: number;\n private maxBatchSize: number;\n private queue: TrackEvent[] = [];\n private activeBatch: TrackEvent[] | null = null;\n private timer: number | null = null;\n private flushInFlight = false;\n private flushPromise: Promise<void> | null = null;\n private nextFlushAt = 0;\n private backoffMs = 0;\n private readonly maxQueueSize = 2000;\n private getActiveAssignment: (() => { experimentId: string; variationId: string } | null) | null;\n private buildPageExitEvents: ((type: string, data?: Record<string, unknown>) => TrackEvent[]) | null;\n private qaMode: boolean;\n private qaSessionId: string;\n private environment: string;\n private pagehideHandler: ((event?: PageTransitionEvent) => void) | null = null;\n private beforeUnloadHandler: (() => void) | null = null;\n private pageshowHandler: (() => void) | null = null;\n private beforeUnloadResetTimer: number | null = null;\n private visibilityHandler: (() => void) | null = null;\n private pageLifecycleFlushed = false;\n private pageTeardownStarted = false;\n\n constructor(options: TrackerOptions) {\n this.endpoint = options.endpoint;\n this.shopId = options.shopId ?? \"\";\n this.ingestShopId = options.ingestShopId ?? options.shopId ?? \"\";\n this.ingestSignature = options.ingestSignature ?? \"\";\n this.visitorId = options.visitorId ?? \"\";\n this.sessionId = this.getOrCreateSessionId();\n this.visitorSessions = visitorSessionCount(this.sessionId);\n this.flushIntervalMs = options.flushIntervalMs ?? 5000;\n this.maxBatchSize = options.maxBatchSize ?? 20;\n this.getActiveAssignment = options.getActiveAssignment ?? null;\n this.buildPageExitEvents = options.buildPageExitEvents ?? null;\n this.qaMode = options.qaMode ?? false;\n this.qaSessionId = options.qaSessionId ?? \"\";\n this.environment = options.environment || \"production\";\n }\n\n private getOrCreateSessionId(): string {\n const key = \"drip_sid\";\n try {\n const existing = sessionStorage.getItem(key);\n if (existing) return existing;\n const id = Math.random().toString(36).slice(2) + Date.now().toString(36);\n sessionStorage.setItem(key, id);\n return id;\n } catch {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n }\n }\n\n /** Public accessor for the session ID (used by the Shopify pixel bridge). */\n getSessionId(): string {\n return this.sessionId;\n }\n\n start(): void {\n if (this.timer !== null) return;\n this.recoverEvents();\n this.timer = window.setInterval(() => this.flush(), this.flushIntervalMs);\n this.listenUnload();\n }\n\n stop(): void {\n if (this.timer !== null) {\n window.clearInterval(this.timer);\n this.timer = null;\n }\n if (this.pagehideHandler) window.removeEventListener(\"pagehide\", this.pagehideHandler);\n if (this.beforeUnloadHandler) window.removeEventListener(\"beforeunload\", this.beforeUnloadHandler);\n if (this.pageshowHandler) window.removeEventListener(\"pageshow\", this.pageshowHandler);\n if (this.beforeUnloadResetTimer !== null) window.clearTimeout(this.beforeUnloadResetTimer);\n this.pagehideHandler = null;\n this.beforeUnloadHandler = null;\n this.pageshowHandler = null;\n this.beforeUnloadResetTimer = null;\n if (this.visibilityHandler && typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\n this.visibilityHandler = null;\n }\n }\n\n track(event: TrackEvent): void {\n const enriched = this.enrichEvent(event);\n this.queue.push(enriched);\n // Prevent unbounded growth during outages (Black Friday spikes, offline, ad blockers).\n if (this.queue.length > this.maxQueueSize) {\n this.queue.splice(0, this.queue.length - this.maxQueueSize);\n }\n if (this.queue.length >= this.maxBatchSize) {\n void this.flush();\n }\n }\n\n private enrichEvent(event: TrackEvent): TrackEvent {\n const enriched: TrackEvent = {\n ...event,\n event_id:\n typeof event.event_id === \"string\" && event.event_id.trim()\n ? event.event_id\n : createEventId(),\n shopId: event.shopId ?? this.shopId,\n visitorId: event.visitorId ?? this.visitorId,\n sessionId: event.sessionId ?? this.sessionId,\n url: event.url ?? (typeof location !== \"undefined\" ? location.href : \"\"),\n ts: event.ts ?? Date.now(),\n environment: this.environment,\n };\n if (\n this.visitorSessions &&\n carriesVisitorSessions(event.type) &&\n !(\"visitor_sessions\" in (event.data ?? {}))\n ) {\n enriched.data = { ...event.data, visitor_sessions: this.visitorSessions };\n }\n if (this.qaMode) {\n enriched.qa_mode = true;\n if (this.qaSessionId) enriched.qa_session_id = this.qaSessionId;\n }\n return enriched;\n }\n\n private scheduleBackoff(ms: number): void {\n const jitter = Math.floor(Math.random() * 250);\n this.backoffMs = Math.max(this.backoffMs, ms);\n this.nextFlushAt = Date.now() + this.backoffMs + jitter;\n }\n\n private resetBackoff(): void {\n this.backoffMs = 0;\n this.nextFlushAt = 0;\n }\n\n private parseRetryAfterSeconds(value: string | null): number | null {\n if (!value) return null;\n const n = Number.parseInt(value, 10);\n if (Number.isFinite(n) && n > 0) return n;\n return null;\n }\n\n async flush(): Promise<void> {\n if (this.flushPromise) return this.flushPromise;\n if (!this.queue.length || !this.endpoint) return;\n if (this.nextFlushAt && Date.now() < this.nextFlushAt) return;\n\n const flushPromise = this.drainQueue();\n this.flushPromise = flushPromise;\n try {\n await flushPromise;\n } finally {\n if (this.flushPromise === flushPromise) {\n this.flushPromise = null;\n }\n }\n }\n\n private async drainQueue(): Promise<void> {\n try {\n this.flushInFlight = true;\n while (this.queue.length && this.endpoint) {\n if (this.nextFlushAt && Date.now() < this.nextFlushAt) return;\n\n // Never send unbounded payloads. Worker rejects >200 events; keep batches small.\n const batch = this.queue.splice(0, this.maxBatchSize);\n this.activeBatch = batch;\n if (!batch.length) return;\n const res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: this.buildPayload(batch),\n keepalive: true,\n });\n if (res.ok) {\n this.removeRecovery(batch);\n this.activeBatch = null;\n this.resetBackoff();\n continue;\n }\n\n // Re-queue on any non-2xx response.\n this.queue.unshift(...batch);\n this.activeBatch = null;\n if (this.pageTeardownStarted) this.saveRecovery(batch);\n\n if (res.status === 429) {\n const retryAfter = this.parseRetryAfterSeconds(res.headers.get(\"Retry-After\"));\n const waitMs = retryAfter ? retryAfter * 1000 : 5_000;\n this.scheduleBackoff(waitMs);\n return;\n }\n\n if (res.status === 401 || res.status === 403) {\n // Likely expired/invalid signature. Keep events in memory/sessionStorage and retry rarely.\n this.scheduleBackoff(5 * 60_000);\n return;\n }\n\n if (res.status >= 500) {\n // Exponential backoff up to 60s.\n const next = this.backoffMs ? Math.min(60_000, this.backoffMs * 2) : 1_000;\n this.scheduleBackoff(next);\n return;\n }\n\n // For other 4xx (e.g. bad payload), don't spin. Retry slowly.\n this.scheduleBackoff(30_000);\n return;\n }\n } catch {\n // Network failure (offline, blocked, transient). Requeue and back off.\n if (this.activeBatch?.length) {\n this.queue.unshift(...this.activeBatch);\n if (this.pageTeardownStarted) this.saveRecovery(this.activeBatch);\n this.activeBatch = null;\n }\n const next = this.backoffMs ? Math.min(60_000, this.backoffMs * 2) : 1_000;\n this.scheduleBackoff(next);\n } finally {\n this.flushInFlight = false;\n }\n }\n\n private buildPayload(batch: TrackEvent[]): string {\n const body: Record<string, unknown> = { events: batch };\n // Include auth in payload body so sendBeacon (which can't set headers) works.\n if (this.ingestShopId) body._shopId = this.ingestShopId;\n if (this.ingestSignature) body._signature = this.ingestSignature;\n return JSON.stringify(body);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (this.ingestShopId) headers[\"X-Drip-Shop\"] = this.ingestShopId;\n if (this.ingestSignature) headers[\"X-Drip-Signature\"] = this.ingestSignature;\n return headers;\n }\n\n private recoveryEventKey(event: TrackEvent): string | null {\n const eventId = typeof event.event_id === \"string\" ? event.event_id.trim() : \"\";\n if (!eventId) return null;\n return JSON.stringify([\n eventId,\n event.type,\n event.experimentId ?? null,\n event.variationId ?? null,\n event.environment || \"production\",\n ]);\n }\n\n private readRecovery(): TrackEvent[] {\n try {\n const raw = sessionStorage.getItem(RECOVERY_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed as TrackEvent[] : [];\n } catch {\n return [];\n }\n }\n\n private saveRecovery(events: TrackEvent[]): void {\n if (!events.length) return;\n const merged = [...this.readRecovery(), ...events];\n const keyed = new Map<string, TrackEvent>();\n const unkeyed: TrackEvent[] = [];\n for (const event of merged) {\n const key = this.recoveryEventKey(event);\n if (key) keyed.set(key, event);\n else unkeyed.push(event);\n }\n const bounded = [...keyed.values(), ...unkeyed].slice(-this.maxQueueSize);\n try {\n sessionStorage.setItem(RECOVERY_KEY, JSON.stringify(bounded));\n } catch {}\n }\n\n private removeRecovery(events: TrackEvent[]): void {\n const deliveredKeys = new Set(\n events\n .map((event) => this.recoveryEventKey(event))\n .filter((key): key is string => key !== null),\n );\n if (deliveredKeys.size === 0) return;\n try {\n const remaining = this.readRecovery().filter((event) => {\n const key = this.recoveryEventKey(event);\n return key === null || !deliveredKeys.has(key);\n });\n if (remaining.length) sessionStorage.setItem(RECOVERY_KEY, JSON.stringify(remaining));\n else sessionStorage.removeItem(RECOVERY_KEY);\n } catch {}\n }\n\n private queuePageExitEvents(): void {\n const assignment = this.getActiveAssignment?.() ?? null;\n onPageExit((type, data) => {\n const events = this.buildPageExitEvents\n ? this.buildPageExitEvents(type, data)\n : [{\n type,\n data,\n experimentId: assignment?.experimentId,\n variationId: assignment?.variationId,\n url: cleanUrl(),\n }];\n this.queue.push(...events.map((event) => this.enrichEvent(event)));\n });\n }\n\n private flushForPageLifecycle(terminal = false): void {\n const alreadyFlushed = this.pageLifecycleFlushed;\n if (terminal) this.pageTeardownStarted = true;\n if (alreadyFlushed && (!terminal || this.queue.length === 0)) return;\n if (!alreadyFlushed) {\n this.pageLifecycleFlushed = true;\n this.queuePageExitEvents();\n }\n // drainQueue already handed activeBatch to a keepalive fetch. Sending that\n // same batch again with beacon creates a guaranteed overlap when both\n // requests reach the Worker. If the active request later fails, drainQueue\n // persists its stable event IDs because the page has entered teardown.\n const lifecycleEvents = this.queue.splice(0);\n if (!lifecycleEvents.length) return;\n if (!this.endpoint) {\n this.saveRecovery(lifecycleEvents);\n return;\n }\n\n while (lifecycleEvents.length) {\n const batch = lifecycleEvents.splice(0, this.maxBatchSize);\n const payload = this.buildPayload(batch);\n let queued = false;\n\n try {\n const nav = typeof navigator !== \"undefined\" ? navigator : undefined;\n if (typeof nav?.sendBeacon === \"function\") {\n queued = nav.sendBeacon(\n this.endpoint,\n new Blob([payload], { type: \"text/plain\" }),\n );\n }\n } catch {\n queued = false;\n }\n\n if (queued) continue;\n\n try {\n void fetch(this.endpoint, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: payload,\n keepalive: true,\n })\n .then((response) => {\n if (!response.ok) this.saveRecovery(batch);\n })\n .catch(() => {\n this.saveRecovery(batch);\n });\n } catch {\n this.saveRecovery(batch);\n }\n }\n }\n\n private recoverEvents(): void {\n try {\n const events = this.readRecovery().map((event) => ({\n ...event,\n environment: event.environment || this.environment,\n }));\n if (events.length) {\n sessionStorage.removeItem(RECOVERY_KEY);\n this.queue.unshift(...events);\n }\n } catch {}\n }\n\n private resetPageLifecycle(): void {\n this.pageLifecycleFlushed = false;\n this.pageTeardownStarted = false;\n this.beforeUnloadResetTimer = null;\n }\n\n private listenUnload(): void {\n if (this.pagehideHandler) return;\n const onPagehide = (event?: PageTransitionEvent) => {\n this.flushForPageLifecycle(event?.persisted !== true);\n };\n const onBeforeUnload = () => {\n this.flushForPageLifecycle(true);\n // A beforeunload prompt can be canceled. A real navigation prevents this\n // task from running (and pagehide confirms terminal teardown); a live tab\n // clears the provisional terminal state before later retries.\n if (this.beforeUnloadResetTimer === null && typeof window.setTimeout === \"function\") {\n this.beforeUnloadResetTimer = window.setTimeout(() => this.resetPageLifecycle(), 0);\n }\n };\n const onPageShow = () => this.resetPageLifecycle();\n this.pagehideHandler = onPagehide;\n this.beforeUnloadHandler = onBeforeUnload;\n this.pageshowHandler = onPageShow;\n window.addEventListener(\"pagehide\", onPagehide);\n window.addEventListener(\"beforeunload\", onBeforeUnload);\n window.addEventListener(\"pageshow\", onPageShow);\n if (typeof document !== \"undefined\") {\n const onVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") this.flushForPageLifecycle();\n else this.resetPageLifecycle();\n };\n this.visibilityHandler = onVisibilityChange;\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n }\n}\n","/**\n * defineExperiment — typed experiment definitions with validation.\n *\n * Usage:\n * const hero = defineExperiment({\n * slug: \"hero-banner-v2\",\n * name: \"Hero Banner V2\",\n * variations: [\n * { id: \"control\", weight: 0.5, mutations: [], isControl: true },\n * { id: \"variant-a\", weight: 0.5, mutations: [{ selector: \".hero h1\", action: \"text\", text: \"New headline\" }] },\n * ],\n * targeting: { url: [{ type: \"simple\", pattern: \"/\" }] },\n * goals: [{ id: \"cta-click\", type: \"click\", selector: \".hero-cta\" }],\n * });\n */\n\nimport type { Experiment, Goal, Mutation, Targeting, Variation } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Input types — looser than runtime types for developer ergonomics\n// ---------------------------------------------------------------------------\n\nexport interface ExperimentDefinition {\n /** Unique slug for GitOps upsert. Required for code-first experiments. */\n slug: string;\n /** Human-readable name. */\n name: string;\n /** Traffic allocation percentage (0–1). Default: 1. */\n trafficAllocation?: number;\n /** Targeting rules. */\n targeting?: Targeting;\n /** Hash attribute override (default: visitor cookie). */\n hashAttribute?: string;\n /** Variation definitions. At least two required. */\n variations: VariationDefinition[];\n /** Goal definitions for conversion tracking. */\n goals?: GoalDefinition[];\n}\n\nexport interface VariationDefinition {\n /** Variation identifier (used as slug within the experiment). */\n id: string;\n /** Display name. Falls back to id if omitted. */\n name?: string;\n /** Traffic weight (0–1). All weights should sum to 1. */\n weight: number;\n /** DOM mutations to apply. Default: []. */\n mutations?: Mutation[];\n /** Optional typed value returned by feature-flag helpers. */\n value?: unknown;\n /** Custom CSS injected when this variation is active. */\n css?: string;\n /** Custom JavaScript executed when this variation is active. */\n js?: string;\n /** Reset JavaScript executed on SPA navigation away. */\n resetJs?: string;\n /** External CSS artifact URL loaded when this variation is active. */\n externalCssUrl?: string;\n /** External JS artifact URL loaded when this variation is active. */\n externalJsUrl?: string;\n /** Mark as control variation. Exactly one variation should be control. */\n isControl?: boolean;\n}\n\nexport interface GoalDefinition {\n /** Goal identifier (used as slug). */\n id: string;\n /** Goal type. */\n type: \"click\" | \"pageview\" | \"custom\" | \"revenue\";\n /** CSS selector for click/element goals. */\n selector?: string;\n /** URL pattern for pageview goals. */\n urlPattern?: string;\n /** Only count once per session. Default: false. */\n countOnce?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Validation errors\n// ---------------------------------------------------------------------------\n\nexport class ExperimentDefinitionError extends Error {\n public readonly issues: string[];\n\n constructor(slug: string, issues: string[]) {\n super(`Invalid experiment \"${slug}\": ${issues.join(\"; \")}`);\n this.name = \"ExperimentDefinitionError\";\n this.issues = issues;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nfunction validate(def: ExperimentDefinition): string[] {\n const issues: string[] = [];\n\n if (!def.slug || typeof def.slug !== \"string\") {\n issues.push(\"slug is required and must be a non-empty string\");\n } else if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(def.slug) && def.slug.length > 1) {\n issues.push(\"slug must be lowercase alphanumeric with hyphens (e.g. 'hero-banner-v2')\");\n }\n\n if (!def.name || typeof def.name !== \"string\") {\n issues.push(\"name is required\");\n }\n\n if (!Array.isArray(def.variations) || def.variations.length < 2) {\n issues.push(\"at least 2 variations are required\");\n } else {\n const controls = def.variations.filter((v) => v.isControl);\n if (controls.length === 0) {\n issues.push(\"exactly one variation must be marked as control (isControl: true)\");\n } else if (controls.length > 1) {\n issues.push(\"only one variation can be the control\");\n }\n\n const totalWeight = def.variations.reduce((sum, v) => sum + v.weight, 0);\n if (Math.abs(totalWeight - 1) > 0.01) {\n issues.push(`variation weights should sum to 1 (got ${totalWeight.toFixed(3)})`);\n }\n\n const ids = new Set<string>();\n for (const v of def.variations) {\n if (!v.id) issues.push(\"every variation must have an id\");\n if (ids.has(v.id)) issues.push(`duplicate variation id: \"${v.id}\"`);\n ids.add(v.id);\n if (v.weight < 0 || v.weight > 1) issues.push(`variation \"${v.id}\" weight must be between 0 and 1`);\n }\n }\n\n if (def.trafficAllocation !== undefined) {\n if (def.trafficAllocation < 0 || def.trafficAllocation > 1) {\n issues.push(\"trafficAllocation must be between 0 and 1\");\n }\n }\n\n if (def.goals) {\n const goalIds = new Set<string>();\n for (const g of def.goals) {\n if (!g.id) issues.push(\"every goal must have an id\");\n if (goalIds.has(g.id)) issues.push(`duplicate goal id: \"${g.id}\"`);\n goalIds.add(g.id);\n\n if (g.type === \"click\" && !g.selector) {\n issues.push(`click goal \"${g.id}\" requires a selector`);\n }\n }\n }\n\n return issues;\n}\n\n// ---------------------------------------------------------------------------\n// defineExperiment\n// ---------------------------------------------------------------------------\n\n/**\n * Define a typed, validated experiment configuration.\n *\n * Returns a frozen Experiment object ready for use with `init({ experiments: [...] })`.\n * Throws `ExperimentDefinitionError` if the definition is invalid.\n */\nexport function defineExperiment(def: ExperimentDefinition): Experiment & { slug: string } {\n const issues = validate(def);\n if (issues.length > 0) {\n throw new ExperimentDefinitionError(def.slug ?? \"(unnamed)\", issues);\n }\n\n const experiment: Experiment & { slug: string } = {\n id: def.slug, // slug is used as the id for code-first experiments\n slug: def.slug,\n name: def.name,\n trafficAllocation: def.trafficAllocation ?? 1,\n targeting: def.targeting,\n hashAttribute: def.hashAttribute,\n variations: def.variations.map((v) => ({\n id: v.id,\n name: v.name,\n weight: v.weight,\n mutations: v.mutations ?? [],\n value: v.value,\n css: v.css,\n js: v.js,\n resetJs: v.resetJs,\n externalCssUrl: v.externalCssUrl,\n externalJsUrl: v.externalJsUrl,\n isControl: v.isControl ?? false,\n })),\n goals: def.goals?.map((g) => ({\n id: g.id,\n type: g.type,\n selector: g.selector,\n urlPattern: g.urlPattern,\n countOnce: g.countOnce,\n })),\n };\n\n return Object.freeze(experiment) as Experiment & { slug: string };\n}\n\n/**\n * Define multiple experiments at once. Validates all, throws on first invalid.\n */\nexport function defineExperiments(defs: ExperimentDefinition[]): Array<Experiment & { slug: string }> {\n return defs.map(defineExperiment);\n}\n","/**\n * Feature flags — thin wrapper over experiment assignments.\n *\n * A feature flag is simply a two-variation experiment where:\n * - control = flag OFF\n * - variant = flag ON\n *\n * Usage:\n * import { evaluateFlag, defineFlagExperiment } from \"@drip-apex/sdk/flags\";\n *\n * const darkMode = defineFlagExperiment({\n * slug: \"dark-mode-rollout\",\n * name: \"Dark Mode Rollout\",\n * rolloutPercent: 25,\n * });\n *\n * const isEnabled = evaluateFlag(\"dark-mode-rollout\", [darkMode], { userId: \"user-123\" });\n */\n\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { defineExperiment } from \"./define\";\nimport type { Experiment, Assignment } from \"./types\";\nimport { getUserId, hashToFloat, variationHashToFloat } from \"./hash\";\nimport { buildTargetingAttributes, matchesTargeting } from \"./targeting\";\n\n// ---------------------------------------------------------------------------\n// evaluateFlag — check if a flag is ON for a given user\n// ---------------------------------------------------------------------------\n\nexport interface FlagContext {\n url?: string;\n attributes?: Record<string, unknown>;\n userId?: string;\n}\n\n/**\n * Evaluate whether a feature flag is enabled.\n *\n * @param flagId - The experiment slug/id of the flag experiment.\n * @param experiments - Array of experiment configs to search (from init or defineExperiment).\n * @param context - Optional user context for targeting/bucketing.\n * @returns `true` if the user is bucketed into a non-control variation.\n */\nexport function evaluateFlag(\n flagId: string,\n experiments: Experiment[],\n context?: FlagContext,\n): boolean {\n const experiment = experiments.find((e) => e.id === flagId);\n if (!experiment) return false;\n\n const url = context?.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n const attributes = buildTargetingAttributes(context?.attributes ?? {}, url);\n\n if (!matchesTargeting(experiment.targeting, { url, attributes })) {\n return false;\n }\n\n const userId = getUserId(context?.userId);\n const hashValue = hashToFloat(experiment.id, userId);\n\n if (!inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1)) {\n return false;\n }\n\n const allocation = experiment.trafficAllocation ?? 1;\n const variationHashValue =\n allocation >= 1 ? hashValue : variationHashToFloat(experiment.id, userId);\n const weights = experiment.variations.map((v) => v.weight);\n const index = chooseVariation(variationHashValue, weights);\n if (index < 0 || index >= experiment.variations.length) return false;\n\n const variation = experiment.variations[index];\n return !variation.isControl;\n}\n\n/**\n * Evaluate a flag and return the full assignment (or null if flag is off / not found).\n */\nexport function evaluateFlagAssignment(\n flagId: string,\n experiments: Experiment[],\n context?: FlagContext,\n): Assignment | null {\n const experiment = experiments.find((e) => e.id === flagId);\n if (!experiment) return null;\n\n const url = context?.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n const attributes = buildTargetingAttributes(context?.attributes ?? {}, url);\n\n if (!matchesTargeting(experiment.targeting, { url, attributes })) {\n return null;\n }\n\n const userId = getUserId(context?.userId);\n const hashValue = hashToFloat(experiment.id, userId);\n\n if (!inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1)) {\n return null;\n }\n\n const allocation = experiment.trafficAllocation ?? 1;\n const variationHashValue =\n allocation >= 1 ? hashValue : variationHashToFloat(experiment.id, userId);\n const weights = experiment.variations.map((v) => v.weight);\n const index = chooseVariation(variationHashValue, weights);\n if (index < 0 || index >= experiment.variations.length) return null;\n\n const variation = experiment.variations[index];\n\n return {\n experimentId: experiment.id,\n experimentName: undefined,\n variationId: variation.id,\n index,\n mutations: variation.mutations ?? [],\n value: variation.value,\n featureFlag: experiment.featureFlag,\n kind: experiment.kind ?? (experiment.featureFlag ? \"feature_flag\" : \"experiment\"),\n css: variation.css,\n js: variation.js,\n resetJs: variation.resetJs,\n externalCssUrl: variation.externalCssUrl,\n externalJsUrl: variation.externalJsUrl,\n harnessSession: variation.harnessSession,\n isControl: Boolean(variation.isControl),\n hashValue: userId,\n };\n}\n\n/**\n * Evaluate a typed feature flag value.\n *\n * Returns the assigned variation value for boolean, string, number, or JSON\n * flags. If the visitor is not eligible, the flag is missing, or no assignment\n * can be made, the fallback is returned.\n */\nexport function evaluateFlagValue<T = unknown>(\n flagId: string,\n experiments: Experiment[],\n context?: FlagContext,\n fallback?: T,\n): T | unknown {\n const assignment = evaluateFlagAssignment(flagId, experiments, context);\n if (!assignment) return fallback;\n return assignment.value === undefined ? fallback : assignment.value;\n}\n\n// ---------------------------------------------------------------------------\n// defineFlagExperiment — convenience for creating flag-style experiments\n// ---------------------------------------------------------------------------\n\nexport interface FlagDefinition {\n /** Unique slug for the flag. */\n slug: string;\n /** Human-readable name. */\n name: string;\n /** Percentage of traffic to enable the flag for (0–100). Default: 0 (off). */\n rolloutPercent?: number;\n /** Targeting rules. */\n targeting?: Experiment[\"targeting\"];\n /** Value returned when the flag is disabled. Default: false. */\n offValue?: unknown;\n /** Value returned when the flag is enabled. Default: true. */\n onValue?: unknown;\n}\n\n/**\n * Create a flag-style experiment with two variations: control (OFF) and enabled (ON).\n */\nexport function defineFlagExperiment(def: FlagDefinition): Experiment & { slug: string } {\n const rollout = Math.max(0, Math.min(100, def.rolloutPercent ?? 0)) / 100;\n\n const flag = defineExperiment({\n slug: def.slug,\n name: def.name,\n trafficAllocation: 1,\n targeting: def.targeting,\n variations: [\n {\n id: \"control\",\n weight: 1 - rollout,\n mutations: [],\n isControl: true,\n value: def.offValue ?? false,\n },\n {\n id: \"enabled\",\n weight: rollout,\n mutations: [],\n value: def.onValue ?? true,\n },\n ],\n });\n\n return {\n ...flag,\n variations: flag.variations.map((variation) => ({ ...variation })),\n featureFlag: { key: def.slug },\n };\n}\n","import { Mutation } from \"./types\";\nimport { applyTrackedMutation, isInsertAction, isInsertDuplicate, getMutationKey } from \"./mutate\";\n\ntype WaitEntry = {\n selector: string;\n callback: (el: Element) => void;\n handled: WeakSet<Element>;\n matched: boolean;\n expiresAt: number;\n onMiss?: () => void;\n};\n\nconst entries: WaitEntry[] = [];\nlet observer: MutationObserver | null = null;\nlet pending = false;\nconst pendingRoots = new Set<ParentNode>();\nconst DEFAULT_WAIT_TTL_MS = 30_000;\nlet expiryTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction isElement(node: Node): node is Element {\n return node.nodeType === Node.ELEMENT_NODE;\n}\n\nfunction hasQuerySelectorAll(node: ParentNode): node is ParentNode & { querySelectorAll: (selectors: string) => NodeListOf<Element> } {\n return typeof (node as ParentNode & { querySelectorAll?: unknown }).querySelectorAll === \"function\";\n}\n\nfunction applyToEntry(entry: WaitEntry, element: Element): void {\n if (entry.expiresAt <= Date.now()) return;\n if (entry.handled.has(element)) return;\n entry.handled.add(element);\n entry.matched = true;\n entry.callback(element);\n}\n\nfunction clearExpiryTimer(): void {\n if (expiryTimer !== null) {\n clearTimeout(expiryTimer);\n expiryTimer = null;\n }\n}\n\nfunction scheduleExpiryPrune(): void {\n clearExpiryTimer();\n if (entries.length === 0) return;\n const nextExpiry = Math.min(...entries.map((entry) => entry.expiresAt));\n const delay = Math.max(1, nextExpiry - Date.now() + 1);\n expiryTimer = setTimeout(() => {\n expiryTimer = null;\n pruneExpiredEntries();\n }, delay);\n}\n\nfunction pruneExpiredEntries(): void {\n const ts = Date.now();\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n if (entries[i].expiresAt <= ts) {\n const [expired] = entries.splice(i, 1);\n if (!expired.matched) {\n try {\n expired.onMiss?.();\n } catch {}\n }\n }\n }\n if (entries.length === 0 && observer) {\n observer.disconnect();\n observer = null;\n pending = false;\n pendingRoots.clear();\n clearExpiryTimer();\n } else {\n scheduleExpiryPrune();\n }\n}\n\nfunction buildSelectorMap(): Map<string, WaitEntry[]> {\n pruneExpiredEntries();\n const selectorMap = new Map<string, WaitEntry[]>();\n for (const entry of entries) {\n const group = selectorMap.get(entry.selector);\n if (group) {\n group.push(entry);\n } else {\n selectorMap.set(entry.selector, [entry]);\n }\n }\n return selectorMap;\n}\n\nfunction runSelectorOnRoot(selector: string, root: ParentNode): Element[] {\n const matched: Element[] = [];\n try {\n if (isElement(root) && root.matches(selector)) {\n matched.push(root);\n }\n if (hasQuerySelectorAll(root)) {\n root.querySelectorAll(selector).forEach((el) => matched.push(el));\n }\n } catch {\n return [];\n }\n return matched;\n}\n\nconst debouncedCheck = () => {\n if (pending) return;\n pending = true;\n queueMicrotask(() => {\n pending = false;\n flushChecks();\n });\n};\n\nfunction checkAllEntries(): void {\n const selectorMap = buildSelectorMap();\n for (const [selector, selectorEntries] of selectorMap) {\n try {\n const elements = document.querySelectorAll(selector);\n elements.forEach((el) => {\n selectorEntries.forEach((entry) => applyToEntry(entry, el));\n });\n } catch {}\n }\n pruneExpiredEntries();\n}\n\nfunction checkPendingRoots(): void {\n if (pendingRoots.size === 0) return;\n const roots = Array.from(pendingRoots);\n pendingRoots.clear();\n\n const selectorMap = buildSelectorMap();\n for (const [selector, selectorEntries] of selectorMap) {\n for (const root of roots) {\n const matches = runSelectorOnRoot(selector, root);\n for (const element of matches) {\n selectorEntries.forEach((entry) => applyToEntry(entry, element));\n }\n }\n }\n pruneExpiredEntries();\n}\n\nfunction flushChecks(): void {\n if (entries.length === 0) return;\n if (pendingRoots.size > 0) {\n checkPendingRoots();\n return;\n }\n checkAllEntries();\n}\n\nfunction ensureObserver(): void {\n if (observer) return;\n observer = new MutationObserver((records) => {\n for (const record of records) {\n if (record.type === \"childList\") {\n record.addedNodes.forEach((node) => {\n if (isElement(node)) {\n pendingRoots.add(node);\n } else if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n pendingRoots.add(node as DocumentFragment);\n }\n });\n } else if (record.type === \"attributes\" && isElement(record.target)) {\n pendingRoots.add(record.target);\n } else if (record.type === \"characterData\" && record.target.parentElement) {\n pendingRoots.add(record.target.parentElement);\n }\n }\n if (pendingRoots.size > 0) debouncedCheck();\n });\n observer.observe(document.documentElement, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n}\n\nexport function waitForElement(\n selector: string,\n callback: (el: Element) => void,\n options: { ttlMs?: number; onMiss?: () => void } = {},\n): void {\n const handled = new WeakSet<Element>();\n let matched = false;\n try {\n const existing = document.querySelectorAll(selector);\n existing.forEach((el) => {\n handled.add(el);\n matched = true;\n callback(el);\n });\n } catch {\n options.onMiss?.();\n return;\n }\n const ttlMs = Math.max(1_000, Math.min(options.ttlMs ?? DEFAULT_WAIT_TTL_MS, 120_000));\n entries.push({ selector, callback, handled, matched, expiresAt: Date.now() + ttlMs, onMiss: options.onMiss });\n scheduleExpiryPrune();\n ensureObserver();\n}\n\nexport function applyMutationWithWait(\n mutation: Mutation,\n index: number,\n onApplied?: ((mutation: Mutation, element: Element, index: number) => void) | null,\n onMiss?: ((mutation: Mutation, index: number) => void) | null,\n): void {\n const key = getMutationKey(mutation, index);\n waitForElement(mutation.selector, (element) => {\n if (isInsertAction(mutation.action)) {\n if (isInsertDuplicate(element, key)) {\n onApplied?.(mutation, element, index);\n return;\n }\n applyTrackedMutation(mutation, element, key);\n } else {\n applyTrackedMutation(mutation, element, key);\n }\n onApplied?.(mutation, element, index);\n }, {\n onMiss: () => onMiss?.(mutation, index),\n });\n}\n\nexport function resetWaitEntries(): void {\n entries.length = 0;\n pending = false;\n pendingRoots.clear();\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n clearExpiryTimer();\n}\n","/**\n * Drip SDK Devtools Overlay\n *\n * Enable via: `?drip_devtools=1`, `?drip_debug=1`, or `localStorage.drip_devtools=1`\n *\n * Renders a draggable panel (shadow DOM) showing:\n * - Active experiments and assignments\n * - Targeting evaluation results\n * - Event log (assignments, mutations, goals, tracking)\n * - Force variation controls\n * - Performance timings\n */\n\nimport type { ActivationGateDiagnostic, Assignment, Experiment, SdkDiagnostics } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Event log\n// ---------------------------------------------------------------------------\n\nexport interface DevtoolsEvent {\n ts: number;\n type: string;\n label: string;\n detail?: Record<string, unknown>;\n}\n\nconst eventLog: DevtoolsEvent[] = [];\nconst MAX_LOG_ENTRIES = 200;\nconst eventListeners = new Set<(event: DevtoolsEvent) => void>();\n\nexport function logDevtoolsEvent(\n type: string,\n label: string,\n detail?: Record<string, unknown>,\n): void {\n const event = { ts: Date.now(), type, label, detail };\n eventLog.push(event);\n if (eventLog.length > MAX_LOG_ENTRIES) eventLog.shift();\n for (const listener of eventListeners) {\n try {\n listener(event);\n } catch {\n // Devtools listeners must not affect SDK runtime behavior.\n }\n }\n // Notify mounted devtools\n if (panelInstance) panelInstance.refresh();\n}\n\nexport function subscribeDevtoolsEvents(listener: (event: DevtoolsEvent) => void): () => void {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\nexport function isDevtoolsEnabled(): boolean {\n try {\n if (typeof URLSearchParams !== \"undefined\") {\n const params = new URLSearchParams(location.search);\n if (params.get(\"drip_devtools\") === \"1\") return true;\n if (params.get(\"drip_debug\") === \"1\") return true;\n if (params.get(\"apex_debug\") === \"1\") return true;\n }\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"drip_devtools\") === \"1\";\n }\n } catch {\n // ignore\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Panel instance\n// ---------------------------------------------------------------------------\n\nlet panelInstance: DevtoolsPanel | null = null;\n\ninterface MountOptions {\n experiments: Experiment[];\n assignments: Assignment[];\n diagnostics?: SdkDiagnostics | null;\n forceMap: Record<string, string> | null;\n onForceVariation: (experimentId: string, variationId: string) => void;\n}\n\nexport function mountDevtools(opts: MountOptions): void {\n if (panelInstance) {\n panelInstance.update(opts);\n return;\n }\n panelInstance = new DevtoolsPanel(opts);\n}\n\nexport function unmountDevtools(): void {\n if (panelInstance) {\n panelInstance.destroy();\n panelInstance = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Panel implementation\n// ---------------------------------------------------------------------------\n\nclass DevtoolsPanel {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private opts: MountOptions;\n private collapsed = false;\n private activeTab: \"sequence\" | \"assignments\" | \"log\" | \"force\" = \"sequence\";\n private dragState: { startX: number; startY: number; offsetX: number; offsetY: number } | null = null;\n\n constructor(opts: MountOptions) {\n this.opts = opts;\n this.host = document.createElement(\"div\");\n this.host.id = \"drip-devtools-host\";\n this.shadow = this.host.attachShadow({ mode: \"closed\" });\n document.body.appendChild(this.host);\n this.render();\n this.attachDrag();\n }\n\n update(opts: MountOptions): void {\n this.opts = opts;\n this.render();\n }\n\n refresh(): void {\n this.render();\n }\n\n destroy(): void {\n this.host.remove();\n }\n\n private render(): void {\n const { experiments, assignments, diagnostics, forceMap } = this.opts;\n\n this.shadow.innerHTML = `\n <style>${PANEL_CSS}</style>\n <div class=\"dt-panel\" id=\"dt-panel\">\n <div class=\"dt-header\" id=\"dt-header\">\n <span class=\"dt-title\">Drip Devtools</span>\n <span class=\"dt-badge\">${assignments.length} active</span>\n <button class=\"dt-btn dt-toggle\" id=\"dt-toggle\">${this.collapsed ? \"+\" : \"−\"}</button>\n </div>\n ${this.collapsed ? \"\" : `\n <div class=\"dt-tabs\">\n <button class=\"dt-tab ${this.activeTab === \"sequence\" ? \"active\" : \"\"}\" data-tab=\"sequence\">Sequence</button>\n <button class=\"dt-tab ${this.activeTab === \"assignments\" ? \"active\" : \"\"}\" data-tab=\"assignments\">Assignments</button>\n <button class=\"dt-tab ${this.activeTab === \"log\" ? \"active\" : \"\"}\" data-tab=\"log\">Log (${eventLog.length})</button>\n <button class=\"dt-tab ${this.activeTab === \"force\" ? \"active\" : \"\"}\" data-tab=\"force\">Force</button>\n </div>\n <div class=\"dt-body\">\n ${this.renderTabContent(experiments, assignments, diagnostics ?? null, forceMap)}\n </div>\n `}\n </div>\n `;\n\n // Bind events\n this.shadow.getElementById(\"dt-toggle\")?.addEventListener(\"click\", () => {\n this.collapsed = !this.collapsed;\n this.render();\n });\n\n this.shadow.querySelectorAll(\".dt-tab\").forEach((tab) => {\n tab.addEventListener(\"click\", () => {\n this.activeTab = (tab as HTMLElement).dataset.tab as typeof this.activeTab;\n this.render();\n });\n });\n\n // Force variation selects\n this.shadow.querySelectorAll<HTMLSelectElement>(\".dt-force-select\").forEach((select) => {\n select.addEventListener(\"change\", () => {\n const expId = select.dataset.expId!;\n const varId = select.value;\n if (varId) this.opts.onForceVariation(expId, varId);\n });\n });\n }\n\n private renderTabContent(\n experiments: Experiment[],\n assignments: Assignment[],\n diagnostics: SdkDiagnostics | null,\n forceMap: Record<string, string> | null,\n ): string {\n switch (this.activeTab) {\n case \"sequence\":\n return this.renderSequence(diagnostics);\n case \"assignments\":\n return this.renderAssignments(assignments);\n case \"log\":\n return this.renderLog();\n case \"force\":\n return this.renderForce(experiments, forceMap);\n }\n }\n\n private renderSequence(diagnostics: SdkDiagnostics | null): string {\n if (!diagnostics) return `<div class=\"dt-empty\">No diagnostics available</div>`;\n const project = diagnostics.activation.project.gates;\n const experiments = diagnostics.activation.experiments;\n return `\n <div class=\"dt-section-title\">Project</div>\n <div class=\"dt-card\">${project.map((gate) => this.renderGate(gate)).join(\"\")}</div>\n <div class=\"dt-section-title\">Experiments</div>\n ${experiments.length === 0\n ? `<div class=\"dt-empty compact\">No experiment sequence yet</div>`\n : experiments.map((experiment) => `\n <div class=\"dt-card\">\n <div class=\"dt-card-title\">${esc(experiment.experimentName || experiment.experimentId)}</div>\n <div class=\"dt-card-row\"><span>Status:</span> <span class=\"dt-status dt-status-${experiment.status}\">${esc(experiment.status)}</span></div>\n ${experiment.assignedVariationId\n ? `<div class=\"dt-card-row\"><span>Variation:</span> <span>${esc(experiment.assignedVariationId)}</span></div>`\n : `<div class=\"dt-card-row\"><span>Reason:</span> <span>${esc(experiment.reason || \"not_assigned\")}</span></div>`}\n <div class=\"dt-gates\">${experiment.gates.map((gate) => this.renderGate(gate)).join(\"\")}</div>\n </div>\n `).join(\"\")}\n `;\n }\n\n private renderGate(gate: ActivationGateDiagnostic): string {\n return `\n <div class=\"dt-gate\">\n <span class=\"dt-dot dt-dot-${gate.status}\"></span>\n <span class=\"dt-gate-label\">${esc(gate.label)}</span>\n <span class=\"dt-gate-reason\">${esc(gate.reason || gate.status)}</span>\n </div>\n `;\n }\n\n private renderAssignments(assignments: Assignment[]): string {\n if (assignments.length === 0) {\n return `<div class=\"dt-empty\">No active assignments</div>`;\n }\n return assignments\n .map(\n (a) => `\n <div class=\"dt-card\">\n <div class=\"dt-card-title\">${esc(a.experimentId)}</div>\n <div class=\"dt-card-row\"><span>Variation:</span> <span>${esc(a.variationId)}</span></div>\n <div class=\"dt-card-row\"><span>Index:</span> <span>${a.index}</span></div>\n <div class=\"dt-card-row\"><span>Control:</span> <span>${a.isControl ? \"Yes\" : \"No\"}</span></div>\n <div class=\"dt-card-row\"><span>Mutations:</span> <span>${a.mutations.length}</span></div>\n <div class=\"dt-card-row\"><span>CSS:</span> <span>${a.css ? \"Yes\" : \"No\"}</span></div>\n <div class=\"dt-card-row\"><span>JS:</span> <span>${a.js ? \"Yes\" : \"No\"}</span></div>\n <div class=\"dt-card-row\"><span>External CSS:</span> <span>${a.externalCssUrl ? \"Yes\" : \"No\"}</span></div>\n <div class=\"dt-card-row\"><span>External JS:</span> <span>${a.externalJsUrl ? \"Yes\" : \"No\"}</span></div>\n <div class=\"dt-card-row\"><span>Harness:</span> <span>${a.harnessSession ? `v${a.harnessSession.version ?? 0}` : \"No\"}</span></div>\n </div>\n `,\n )\n .join(\"\");\n }\n\n private renderLog(): string {\n if (eventLog.length === 0) {\n return `<div class=\"dt-empty\">No events logged yet</div>`;\n }\n const entries = [...eventLog].reverse().slice(0, 50);\n return `<div class=\"dt-log\">${entries\n .map(\n (e) => `<div class=\"dt-log-entry\">\n <span class=\"dt-log-time\">${new Date(e.ts).toLocaleTimeString()}</span>\n <span class=\"dt-log-type dt-type-${e.type}\">${esc(e.type)}</span>\n <span class=\"dt-log-label\">${esc(e.label)}</span>\n </div>`,\n )\n .join(\"\")}</div>`;\n }\n\n private renderForce(\n experiments: Experiment[],\n forceMap: Record<string, string> | null,\n ): string {\n if (experiments.length === 0) {\n return `<div class=\"dt-empty\">No experiments available</div>`;\n }\n return experiments\n .map(\n (exp) => `\n <div class=\"dt-card\">\n <div class=\"dt-card-title\">${esc(exp.id)}</div>\n <select class=\"dt-force-select\" data-exp-id=\"${esc(exp.id)}\">\n <option value=\"\">— Natural assignment —</option>\n ${exp.variations\n .map(\n (v, i) =>\n `<option value=\"${esc(v.id)}\" ${forceMap?.[exp.id] === v.id ? \"selected\" : \"\"}>${esc(v.id)}${v.isControl ? \" (control)\" : \"\"} — ${(v.weight * 100).toFixed(0)}%</option>`,\n )\n .join(\"\")}\n </select>\n </div>\n `,\n )\n .join(\"\");\n }\n\n private attachDrag(): void {\n const header = () => this.shadow.getElementById(\"dt-header\");\n const panel = () => this.shadow.getElementById(\"dt-panel\");\n\n const onMouseDown = (e: MouseEvent) => {\n const p = panel();\n if (!p) return;\n const rect = p.getBoundingClientRect();\n this.dragState = {\n startX: e.clientX,\n startY: e.clientY,\n offsetX: rect.left,\n offsetY: rect.top,\n };\n e.preventDefault();\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.dragState) return;\n const p = panel();\n if (!p) return;\n const dx = e.clientX - this.dragState.startX;\n const dy = e.clientY - this.dragState.startY;\n p.style.left = `${this.dragState.offsetX + dx}px`;\n p.style.top = `${this.dragState.offsetY + dy}px`;\n p.style.right = \"auto\";\n p.style.bottom = \"auto\";\n };\n\n const onMouseUp = () => {\n this.dragState = null;\n };\n\n // Use capturing on the host document to ensure drag works even outside shadow\n const attachHeader = () => {\n const h = header();\n if (h) h.addEventListener(\"mousedown\", onMouseDown);\n };\n attachHeader();\n\n // Re-attach after renders\n const origRender = this.render.bind(this);\n this.render = () => {\n origRender();\n attachHeader();\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n }\n}\n\n// ---------------------------------------------------------------------------\n// HTML escaping\n// ---------------------------------------------------------------------------\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n// ---------------------------------------------------------------------------\n// Panel CSS\n// ---------------------------------------------------------------------------\n\nconst PANEL_CSS = `\n * { box-sizing: border-box; margin: 0; padding: 0; }\n\n .dt-panel {\n position: fixed;\n bottom: 16px;\n right: 16px;\n width: 340px;\n max-height: 480px;\n background: #1a1a2e;\n border: 1px solid #333;\n border-radius: 8px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 12px;\n color: #e0e0e0;\n z-index: 2147483647;\n box-shadow: 0 4px 24px rgba(0,0,0,0.5);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .dt-header {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n background: #16213e;\n cursor: move;\n user-select: none;\n border-bottom: 1px solid #333;\n }\n\n .dt-title {\n font-weight: 600;\n font-size: 13px;\n color: #fff;\n flex: 1;\n }\n\n .dt-badge {\n background: #0f3460;\n color: #e0e0e0;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n margin-right: 8px;\n }\n\n .dt-btn {\n background: none;\n border: none;\n color: #aaa;\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n padding: 2px 6px;\n }\n .dt-btn:hover { color: #fff; }\n\n .dt-tabs {\n display: flex;\n border-bottom: 1px solid #333;\n }\n\n .dt-tab {\n flex: 1;\n padding: 6px 8px;\n background: none;\n border: none;\n color: #888;\n cursor: pointer;\n font-size: 11px;\n text-align: center;\n border-bottom: 2px solid transparent;\n }\n .dt-tab:hover { color: #ccc; }\n .dt-tab.active { color: #53c1de; border-bottom-color: #53c1de; }\n\n .dt-body {\n overflow-y: auto;\n max-height: 360px;\n padding: 8px;\n }\n\n .dt-empty {\n text-align: center;\n color: #666;\n padding: 24px;\n }\n .dt-empty.compact { padding: 12px; }\n\n .dt-section-title {\n color: #888;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.04em;\n margin: 4px 2px 6px;\n text-transform: uppercase;\n }\n\n .dt-card {\n background: #16213e;\n border-radius: 6px;\n padding: 8px 10px;\n margin-bottom: 6px;\n }\n\n .dt-card-title {\n font-weight: 600;\n color: #fff;\n margin-bottom: 4px;\n font-size: 12px;\n }\n\n .dt-card-row {\n display: flex;\n justify-content: space-between;\n padding: 1px 0;\n color: #aaa;\n font-size: 11px;\n }\n .dt-card-row span:last-child { color: #e0e0e0; }\n\n .dt-status {\n border-radius: 3px;\n font-size: 10px;\n padding: 1px 5px;\n text-transform: uppercase;\n }\n .dt-status-passed { background: #166534; color: #dcfce7 !important; }\n .dt-status-failed { background: #7f1d1d; color: #fee2e2 !important; }\n .dt-status-skipped { background: #334155; color: #e2e8f0 !important; }\n\n .dt-gates {\n margin-top: 6px;\n border-top: 1px solid rgba(255,255,255,0.08);\n padding-top: 5px;\n }\n\n .dt-gate {\n display: grid;\n grid-template-columns: 10px minmax(86px, 1fr) minmax(0, 1fr);\n align-items: center;\n gap: 6px;\n padding: 3px 0;\n color: #b8c1d1;\n font-size: 11px;\n }\n\n .dt-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n display: inline-block;\n }\n .dt-dot-passed { background: #22c55e; }\n .dt-dot-failed { background: #ef4444; }\n .dt-dot-skipped { background: #64748b; }\n .dt-gate-label { color: #e5e7eb; }\n .dt-gate-reason {\n color: #8b95a7;\n overflow: hidden;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dt-force-select {\n width: 100%;\n margin-top: 6px;\n padding: 4px 8px;\n background: #0f3460;\n border: 1px solid #444;\n color: #e0e0e0;\n border-radius: 4px;\n font-size: 11px;\n }\n\n .dt-log {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .dt-log-entry {\n display: flex;\n gap: 6px;\n padding: 3px 4px;\n border-radius: 3px;\n font-size: 11px;\n line-height: 1.4;\n }\n .dt-log-entry:hover { background: rgba(255,255,255,0.03); }\n\n .dt-log-time { color: #666; flex-shrink: 0; font-family: monospace; }\n .dt-log-type { flex-shrink: 0; font-weight: 600; text-transform: uppercase; font-size: 9px; padding: 1px 4px; border-radius: 3px; }\n .dt-log-label { color: #ccc; }\n\n .dt-type-init { background: #1a6; color: #fff; }\n .dt-type-eval { background: #36a; color: #fff; }\n .dt-type-apply { background: #a63; color: #fff; }\n .dt-type-track { background: #63a; color: #fff; }\n .dt-type-goal { background: #a36; color: #fff; }\n .dt-type-qa { background: #3aa; color: #fff; }\n .dt-type-guard { background: #666; color: #fff; }\n .dt-type-tracker { background: #636; color: #fff; }\n`;\n","import type { Assignment, Experiment } from \"./types\";\n\ntype TrackFn = (\n type: string,\n data: Record<string, unknown>,\n experimentId: string,\n variationId: string,\n) => void;\n\ntype CaptureAssignment = Assignment & {\n capture: NonNullable<Experiment[\"behaviorCapture\"]>;\n};\n\ntype HeatmapController = {\n stop: () => void;\n update: (assignments: Assignment[], experiments: Experiment[]) => void;\n};\n\nconst SCROLL_BUCKETS = [25, 50, 75, 90, 100];\nconst MOVEMENT_SAMPLE_MS = 200;\nconst MOVEMENT_FLUSH_MS = 60_000;\nconst MOVEMENT_GRID_SIZE = 5;\nconst MOVEMENT_POINTS_MAX_LENGTH = 900;\nconst MOVEMENT_MIN_DWELL_MS = 1_000;\nconst RAGE_CLICK_WINDOW_MS = 1_200;\nconst RAGE_CLICK_RADIUS_PX = 32;\nconst RAGE_CLICK_BUFFER_SIZE = 4;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction cleanUrl(): string {\n return location.origin + location.pathname;\n}\n\nfunction stableSampleKey(assignment: Assignment): string {\n return `drip_hm:${assignment.experimentId}:${assignment.variationId}`;\n}\n\nfunction sampledIn(assignment: Assignment, sampleRate: number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n try {\n const key = stableSampleKey(assignment);\n const existing = sessionStorage.getItem(key);\n if (existing === \"1\") return true;\n if (existing === \"0\") return false;\n const selected = Math.random() < sampleRate;\n sessionStorage.setItem(key, selected ? \"1\" : \"0\");\n return selected;\n } catch {\n return Math.random() < sampleRate;\n }\n}\n\nfunction normalizeSampleRate(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return 0.05;\n return clamp(value, 0, 1);\n}\n\nfunction captureSelector(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n while (current && current !== document.documentElement && parts.length < 4) {\n const tag = current.tagName.toLowerCase();\n const id = current.id && /^[A-Za-z][\\w-]{0,80}$/.test(current.id)\n ? `#${current.id}`\n : \"\";\n if (id) {\n parts.unshift(`${tag}${id}`);\n break;\n }\n\n const testId =\n current.getAttribute(\"data-testid\") ||\n current.getAttribute(\"data-test\") ||\n current.getAttribute(\"data-drip-id\");\n if (testId && /^[\\w-]{1,80}$/.test(testId)) {\n parts.unshift(`${tag}[data-testid=\"${testId}\"]`);\n break;\n }\n\n let nth = 1;\n let sibling = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) nth += 1;\n sibling = sibling.previousElementSibling;\n }\n parts.unshift(`${tag}:nth-of-type(${nth})`);\n current = current.parentElement;\n }\n return parts.join(\" > \");\n}\n\nfunction safeElementText(element: Element): string {\n const tag = element.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return \"\";\n return (element.textContent || \"\").replace(/\\s+/g, \" \").trim().slice(0, 80);\n}\n\nfunction scrollPercent(): number {\n const docHeight = Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n );\n const viewportHeight = window.innerHeight || 1;\n if (docHeight <= viewportHeight) return 100;\n return Math.round(((window.scrollY + viewportHeight) / docHeight) * 100);\n}\n\nfunction resolveCaptureAssignments(\n assignments: Assignment[],\n experiments: Experiment[],\n): CaptureAssignment[] {\n const experimentsById = new Map(experiments.map((experiment) => [experiment.id, experiment]));\n const out: CaptureAssignment[] = [];\n for (const assignment of assignments) {\n const capture = experimentsById.get(assignment.experimentId)?.behaviorCapture;\n if (!capture?.enabled) continue;\n if (!sampledIn(assignment, normalizeSampleRate(capture.sampleRate))) continue;\n out.push({ ...assignment, capture });\n }\n return out;\n}\n\nexport function startHeatmapCapture(\n assignments: Assignment[],\n experiments: Experiment[],\n track: TrackFn,\n): HeatmapController {\n let active = resolveCaptureAssignments(assignments, experiments);\n const seenScrollBuckets = new Set<string>();\n let lastClickAt = 0;\n let recentClicks: Array<{ x: number; y: number; t: number }> = [];\n let lastPosition: { clientX: number; pageY: number } | null = null;\n let movementBuckets = new Map<string, number>();\n let bucketPageUrl = cleanUrl();\n let movementSampleTimer: number | null = null;\n let movementFlushTimer: number | null = null;\n\n const movementEnabled = () =>\n active.some((assignment) => assignment.capture.moves !== false);\n\n const encodeMovementPoints = (buckets: Map<string, number>): string => {\n const sorted = [...buckets.entries()].sort((a, b) => {\n const dwellDifference = b[1] - a[1];\n return dwellDifference !== 0 ? dwellDifference : a[0].localeCompare(b[0]);\n });\n const encoded: string[] = [];\n let length = 0;\n for (const [bucket, dwell] of sorted) {\n const point = `${bucket}:${Math.round(dwell)}`;\n const nextLength = length + (encoded.length > 0 ? 1 : 0) + point.length;\n if (nextLength > MOVEMENT_POINTS_MAX_LENGTH) break;\n encoded.push(point);\n length = nextLength;\n }\n return encoded.join(\";\");\n };\n\n const flushMovement = () => {\n if (movementBuckets.size === 0) return;\n const buckets = movementBuckets;\n movementBuckets = new Map();\n const totalDwell = Math.round(\n [...buckets.values()].reduce((sum, dwell) => sum + dwell, 0),\n );\n if (totalDwell < MOVEMENT_MIN_DWELL_MS) return;\n\n const points = encodeMovementPoints(buckets);\n if (!points) return;\n let path = location.pathname;\n try {\n path = new URL(bucketPageUrl).pathname;\n } catch {\n // Keep the current pathname if the page URL cannot be parsed.\n }\n const payload = {\n path,\n page_url: bucketPageUrl,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n document_height: Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n ),\n sample_ms: totalDwell,\n points,\n };\n\n for (const assignment of active) {\n if (assignment.capture.moves === false) continue;\n track(\"heatmap_move\", payload, assignment.experimentId, assignment.variationId);\n }\n };\n\n const sampleMovement = () => {\n if (document.visibilityState !== \"visible\" || !lastPosition) return;\n const currentPageUrl = cleanUrl();\n if (currentPageUrl !== bucketPageUrl) {\n flushMovement();\n bucketPageUrl = currentPageUrl;\n lastPosition = null;\n return;\n }\n\n const documentHeight = Math.max(\n 1,\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n );\n const xPercent = clamp(\n (lastPosition.clientX / Math.max(1, window.innerWidth)) * 100,\n 0,\n 99.999,\n );\n const yPercent = clamp(\n (lastPosition.pageY / documentHeight) * 100,\n 0,\n 99.999,\n );\n const xBucket =\n Math.floor(xPercent / MOVEMENT_GRID_SIZE) * MOVEMENT_GRID_SIZE;\n const yBucket =\n Math.floor(yPercent / MOVEMENT_GRID_SIZE) * MOVEMENT_GRID_SIZE;\n const key = `${xBucket}:${yBucket}`;\n movementBuckets.set(\n key,\n (movementBuckets.get(key) ?? 0) + MOVEMENT_SAMPLE_MS,\n );\n };\n\n const onPointerMove = (event: PointerEvent) => {\n lastPosition = { clientX: event.clientX, pageY: event.pageY };\n };\n\n const onVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") flushMovement();\n };\n\n const stopMovement = (flush: boolean) => {\n if (flush) flushMovement();\n if (movementSampleTimer !== null) {\n window.clearInterval(movementSampleTimer);\n movementSampleTimer = null;\n }\n if (movementFlushTimer !== null) {\n window.clearInterval(movementFlushTimer);\n movementFlushTimer = null;\n }\n document.removeEventListener(\"pointermove\", onPointerMove);\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n window.removeEventListener(\"pagehide\", flushMovement);\n lastPosition = null;\n };\n\n const syncMovementCapture = () => {\n if (!movementEnabled()) {\n stopMovement(false);\n movementBuckets.clear();\n return;\n }\n if (movementSampleTimer !== null) return;\n bucketPageUrl = cleanUrl();\n document.addEventListener(\"pointermove\", onPointerMove, { passive: true });\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n window.addEventListener(\"pagehide\", flushMovement, { passive: true });\n movementSampleTimer = window.setInterval(sampleMovement, MOVEMENT_SAMPLE_MS);\n movementFlushTimer = window.setInterval(flushMovement, MOVEMENT_FLUSH_MS);\n };\n\n const emitScroll = () => {\n if (!active.some((assignment) => assignment.capture.scrolls !== false)) return;\n const pct = scrollPercent();\n const payload = {\n path: location.pathname,\n page_url: cleanUrl(),\n scroll_percent: pct,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n document_height: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),\n };\n\n for (const assignment of active) {\n if (assignment.capture.scrolls === false) continue;\n for (const bucket of SCROLL_BUCKETS) {\n if (pct < bucket) continue;\n const key = `${assignment.experimentId}:${assignment.variationId}:${cleanUrl()}:${bucket}`;\n if (seenScrollBuckets.has(key)) continue;\n seenScrollBuckets.add(key);\n track(\n \"heatmap_scroll\",\n { ...payload, scroll_bucket: bucket },\n assignment.experimentId,\n assignment.variationId,\n );\n }\n }\n };\n\n const onClick = (event: MouseEvent) => {\n if (!active.some((assignment) => assignment.capture.clicks !== false)) return;\n const now = Date.now();\n if (now - lastClickAt < 100) return;\n lastClickAt = now;\n\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n const rect = target.getBoundingClientRect();\n const pageX = event.pageX;\n const pageY = event.pageY;\n recentClicks = recentClicks\n .filter((click) => now - click.t <= RAGE_CLICK_WINDOW_MS)\n .slice(-(RAGE_CLICK_BUFFER_SIZE - 1));\n recentClicks.push({ x: pageX, y: pageY, t: now });\n const clusteredClicks = recentClicks.filter((click) =>\n Math.hypot(click.x - pageX, click.y - pageY) <= RAGE_CLICK_RADIUS_PX,\n );\n const rage = clusteredClicks.length >= 3;\n const payload = {\n path: location.pathname,\n page_url: cleanUrl(),\n x: Math.round(pageX),\n y: Math.round(pageY),\n viewport_x: Math.round(event.clientX),\n viewport_y: Math.round(event.clientY),\n x_pct: Math.round((event.clientX / Math.max(1, window.innerWidth)) * 1000) / 10,\n y_pct: Math.round((event.clientY / Math.max(1, window.innerHeight)) * 1000) / 10,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n document_height: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),\n selector: captureSelector(target),\n element_tag: target.tagName.toLowerCase(),\n element_text: safeElementText(target),\n element_x: Math.round(rect.left + window.scrollX),\n element_y: Math.round(rect.top + window.scrollY),\n element_width: Math.round(rect.width),\n element_height: Math.round(rect.height),\n ...(rage ? { rage: 1 } : {}),\n };\n\n for (const assignment of active) {\n if (assignment.capture.clicks === false) continue;\n track(\"heatmap_click\", payload, assignment.experimentId, assignment.variationId);\n }\n };\n\n const onScroll = () => {\n window.requestAnimationFrame(emitScroll);\n };\n\n document.addEventListener(\"click\", onClick, { capture: true, passive: true });\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", emitScroll, { passive: true });\n window.setTimeout(emitScroll, 500);\n syncMovementCapture();\n\n return {\n update(nextAssignments, nextExperiments) {\n if (movementEnabled()) flushMovement();\n active = resolveCaptureAssignments(nextAssignments, nextExperiments);\n syncMovementCapture();\n emitScroll();\n },\n stop() {\n stopMovement(true);\n document.removeEventListener(\"click\", onClick, { capture: true });\n window.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", emitScroll);\n },\n };\n}\n","import type { SemanticTrackingRule, SemanticTrackingSettings } from \"./types\";\n\ntype TrackFn = (type: string, data?: Record<string, unknown>) => void;\n\ntype Controller = {\n stop: () => void;\n};\n\ntype NormalizedRule = Required<\n Pick<\n SemanticTrackingRule,\n \"id\" | \"eventType\" | \"action\" | \"selector\" | \"labelSource\" | \"indexStrategy\" | \"oncePerSession\"\n >\n> &\n Omit<\n SemanticTrackingRule,\n \"id\" | \"eventType\" | \"action\" | \"selector\" | \"labelSource\" | \"indexStrategy\" | \"oncePerSession\"\n >;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction normalizeSampleRate(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value)\n ? clamp(value, 0, 1)\n : 0.25;\n}\n\nfunction sampledIn(sampleRate: number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n const key = \"drip_semantic_sample\";\n try {\n const existing = sessionStorage.getItem(key);\n if (existing === \"1\") return true;\n if (existing === \"0\") return false;\n const selected = Math.random() < sampleRate;\n sessionStorage.setItem(key, selected ? \"1\" : \"0\");\n return selected;\n } catch {\n return Math.random() < sampleRate;\n }\n}\n\nfunction cleanUrl(): string {\n return location.origin + location.pathname;\n}\n\nfunction normalizeRules(settings: SemanticTrackingSettings): NormalizedRule[] {\n const rules = Array.isArray(settings.rules) ? settings.rules : [];\n return rules\n .map((rule): NormalizedRule | null => {\n const id = rule.id?.trim();\n const eventType = rule.eventType?.trim();\n const selector = rule.selector?.trim();\n if (!id || !eventType || !selector) return null;\n return {\n ...rule,\n id,\n eventType,\n selector,\n action: rule.action === \"visibility\" ? \"visibility\" : \"click\",\n labelSource: rule.labelSource ?? \"text\",\n indexStrategy: rule.indexStrategy ?? \"dom_order\",\n oncePerSession: rule.oncePerSession !== false,\n };\n })\n .filter((rule): rule is NormalizedRule => Boolean(rule));\n}\n\nfunction pathMatches(rule: NormalizedRule): boolean {\n const pattern = rule.pathPattern?.trim();\n if (!pattern) return true;\n const path = `${location.pathname}${location.search}`;\n if (pattern.startsWith(\"regex:\")) {\n try {\n return new RegExp(pattern.slice(6)).test(path);\n } catch {\n return false;\n }\n }\n return path.includes(pattern);\n}\n\nfunction elementText(element: Element): string {\n const tag = element.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") {\n return (\n element.getAttribute(\"aria-label\") ||\n element.getAttribute(\"title\") ||\n element.getAttribute(\"value\") ||\n \"\"\n ).replace(/\\s+/g, \" \").trim().slice(0, 120);\n }\n return (\n element.textContent ||\n element.getAttribute(\"aria-label\") ||\n element.getAttribute(\"title\") ||\n element.getAttribute(\"alt\") ||\n \"\"\n ).replace(/\\s+/g, \" \").trim().slice(0, 120);\n}\n\nfunction labelFor(rule: NormalizedRule, element: Element): string {\n if (rule.labelSource === \"constant\") return rule.label || rule.elementRole || rule.id;\n if (rule.labelSource === \"attribute\" && rule.attribute) {\n return (element.getAttribute(rule.attribute) || rule.label || elementText(element)).slice(0, 180);\n }\n return (rule.label || elementText(element) || rule.elementRole || rule.id).slice(0, 180);\n}\n\nfunction productContext(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const canonical = document.querySelector<HTMLLinkElement>(\"link[rel='canonical']\")?.href;\n const productId = document.querySelector<HTMLElement>(\"[data-product-id]\")?.dataset.productId;\n const handle = canonical ? canonical.split(\"/products/\")[1]?.split(/[?#/]/)[0] : undefined;\n if (productId) out.product_id = productId;\n if (handle) out.product_handle = handle;\n return out;\n}\n\nfunction elementIndex(rule: NormalizedRule, element: Element, elements: Element[]): number | null {\n if (rule.indexStrategy === \"none\") return null;\n const index = elements.indexOf(element);\n return index >= 0 ? index + 1 : null;\n}\n\nfunction basePayload(rule: NormalizedRule, element: Element, elements: Element[]) {\n const rect = element.getBoundingClientRect();\n const index = elementIndex(rule, element, elements);\n return {\n semantic_rule_id: rule.id,\n semantic_event: rule.eventType,\n semantic_role: rule.elementRole ?? \"\",\n semantic_label: labelFor(rule, element),\n page_type: rule.pageType ?? \"\",\n element_index: index,\n element_tag: element.tagName.toLowerCase(),\n element_text: elementText(element),\n element_width: Math.round(rect.width),\n element_height: Math.round(rect.height),\n path: location.pathname,\n page_url: cleanUrl(),\n ...productContext(),\n };\n}\n\nfunction dedupeKey(rule: NormalizedRule, element: Element, elements: Element[]): string {\n const index = elementIndex(rule, element, elements) ?? 0;\n return `${rule.id}:${cleanUrl()}:${index}:${labelFor(rule, element)}`;\n}\n\nexport function startSemanticCapture(\n settings: SemanticTrackingSettings | undefined,\n track: TrackFn,\n): Controller | null {\n if (!settings?.enabled) return null;\n if (!sampledIn(normalizeSampleRate(settings.sampleRate))) return null;\n\n const rules = normalizeRules(settings).filter(pathMatches);\n if (!rules.length) return null;\n\n const maxEvents = Math.max(1, Math.min(500, Math.round(settings.maxEventsPerSession ?? 120)));\n const minVisibleMs = Math.max(100, Math.min(10_000, Math.round(settings.minVisibleMs ?? 700)));\n const threshold = Math.max(0.05, Math.min(1, settings.visibilityThreshold ?? 0.5));\n const seen = new Set<string>();\n const timers = new Map<Element, number>();\n let emitted = 0;\n\n function emit(rule: NormalizedRule, element: Element, elements: Element[], extra: Record<string, unknown> = {}) {\n if (emitted >= maxEvents) return;\n const key = dedupeKey(rule, element, elements);\n if (rule.oncePerSession && seen.has(key)) return;\n seen.add(key);\n emitted += 1;\n track(rule.eventType, { ...basePayload(rule, element, elements), ...extra });\n }\n\n const visibilityRules = rules.filter((rule) => rule.action === \"visibility\");\n const clickRules = rules.filter((rule) => rule.action === \"click\");\n const observers: IntersectionObserver[] = [];\n\n for (const rule of visibilityRules) {\n let elements: Element[] = [];\n try {\n elements = Array.from(document.querySelectorAll(rule.selector));\n } catch {\n continue;\n }\n if (!elements.length) continue;\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.intersectionRatio < threshold) continue;\n if (timers.has(entry.target)) continue;\n const timer = window.setTimeout(() => {\n timers.delete(entry.target);\n const rect = entry.target.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return;\n emit(rule, entry.target, elements, {\n visible_ms: minVisibleMs,\n visibility_pct: Math.round(entry.intersectionRatio * 100),\n });\n }, minVisibleMs);\n timers.set(entry.target, timer);\n }\n },\n { threshold: [threshold] },\n );\n elements.forEach((element) => observer.observe(element));\n observers.push(observer);\n }\n\n const onClick = (event: MouseEvent) => {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n for (const rule of clickRules) {\n if (!pathMatches(rule)) continue;\n let matched: Element | null = null;\n try {\n matched = target.closest(rule.selector);\n } catch {\n continue;\n }\n if (!matched) continue;\n const elements = Array.from(document.querySelectorAll(rule.selector));\n emit(rule, matched, elements, {\n viewport_x: Math.round(event.clientX),\n viewport_y: Math.round(event.clientY),\n });\n }\n };\n\n document.addEventListener(\"click\", onClick, { capture: true, passive: true });\n\n return {\n stop() {\n document.removeEventListener(\"click\", onClick, { capture: true });\n observers.forEach((observer) => observer.disconnect());\n for (const timer of timers.values()) window.clearTimeout(timer);\n timers.clear();\n },\n };\n}\n","import type { InitConfig } from \"./types\";\n\nconst DEFAULT_AUDIT_ENDPOINT = \"https://app.drip-apex.com/api/shop-audits/collect\";\nconst MAX_TEXT_SAMPLE = 3000;\nconst MAX_ITEMS = 80;\n\ntype RuntimeAuditContext = {\n configSource: string;\n trackerStarted: boolean;\n platform: string;\n};\n\ntype ResourceError = {\n url: string;\n tag: string;\n type: string;\n};\n\nconst resourceErrors: ResourceError[] = [];\nlet listenersInstalled = false;\nlet inMemorySentToken = \"\";\n\nfunction installAuditListeners(): void {\n if (listenersInstalled || typeof window === \"undefined\") return;\n listenersInstalled = true;\n\n window.addEventListener(\"error\", (event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const url =\n target instanceof HTMLScriptElement ||\n target instanceof HTMLImageElement\n ? target.src\n : target instanceof HTMLLinkElement\n ? target.href\n : \"\";\n if (!url) return;\n resourceErrors.push({\n url: redactUrl(url),\n tag: target.tagName.toLowerCase(),\n type: \"resource_error\",\n });\n if (resourceErrors.length > 30) resourceErrors.shift();\n }, true);\n\n window.addEventListener(\"unhandledrejection\", () => {\n resourceErrors.push({\n url: redactUrl(location.href),\n tag: \"window\",\n type: \"unhandled_rejection\",\n });\n if (resourceErrors.length > 30) resourceErrors.shift();\n });\n}\n\ninstallAuditListeners();\n\nfunction queryToken(): string | null {\n try {\n return new URLSearchParams(location.search).get(\"apex_audit\");\n } catch {\n return null;\n }\n}\n\nfunction oncePerPage(token: string): boolean {\n const key = `drip_audit_sent:${token}:${location.origin}${location.pathname}`;\n if (inMemorySentToken === key) return false;\n inMemorySentToken = key;\n try {\n if (sessionStorage.getItem(key) === \"1\") return false;\n sessionStorage.setItem(key, \"1\");\n } catch {\n // Storage may be blocked; the in-memory guard still prevents immediate duplicates.\n }\n return true;\n}\n\nfunction schedule(callback: () => void): void {\n const win = window as Window & {\n requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n };\n if (typeof win.requestIdleCallback === \"function\") {\n win.requestIdleCallback(callback, { timeout: 1500 });\n return;\n }\n window.setTimeout(callback, document.readyState === \"complete\" ? 400 : 1200);\n}\n\nfunction textOf(el: Element | null): string {\n return (el?.textContent || \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction collectText(selector: string, limit: number): string[] {\n return Array.from(document.querySelectorAll(selector))\n .map(textOf)\n .filter(Boolean)\n .slice(0, limit);\n}\n\nfunction redactUrl(raw: string): string {\n try {\n const url = new URL(raw, location.href);\n return `${url.origin}${url.pathname}`;\n } catch {\n return raw.split(\"?\")[0]?.slice(0, 180) || \"\";\n }\n}\n\nfunction rgbToHex(value: string): string | null {\n const match = value.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/i);\n if (!match) return null;\n const parts = match.slice(1, 4).map((part) => {\n const n = Math.max(0, Math.min(255, Number.parseInt(part, 10) || 0));\n return n.toString(16).padStart(2, \"0\");\n });\n const hex = `#${parts.join(\"\")}`;\n return hex === \"#000000\" || hex === \"#ffffff\" ? null : hex;\n}\n\nfunction unique(values: string[], limit: number): string[] {\n return Array.from(new Set(values.filter(Boolean))).slice(0, limit);\n}\n\nfunction collectStyles() {\n const colors: string[] = [];\n const fonts: string[] = [];\n const buttonStyles: string[] = [];\n const elements = Array.from(document.querySelectorAll(\"body *\")).slice(0, 220);\n\n for (const el of elements) {\n const style = getComputedStyle(el);\n const color = rgbToHex(style.color);\n const bg = rgbToHex(style.backgroundColor);\n const border = rgbToHex(style.borderColor);\n if (color) colors.push(color);\n if (bg) colors.push(bg);\n if (border) colors.push(border);\n if (style.fontFamily) fonts.push(style.fontFamily.split(\",\")[0]?.replace(/\"/g, \"\").trim() || \"\");\n\n const isButton =\n el.tagName === \"BUTTON\" ||\n el.getAttribute(\"role\") === \"button\" ||\n (el instanceof HTMLAnchorElement && /button|btn|cta/i.test(el.className));\n if (isButton) {\n buttonStyles.push([\n `color ${color || style.color}`,\n `background ${bg || style.backgroundColor}`,\n `radius ${style.borderRadius}`,\n ].join(\", \"));\n }\n }\n\n return {\n colors: unique(colors, 12),\n fonts: unique(fonts, 8),\n buttons: unique(buttonStyles, 8),\n };\n}\n\nfunction hasStorage(storage: Storage | undefined): boolean {\n if (!storage) return false;\n const key = \"__drip_audit_test__\";\n try {\n storage.setItem(key, \"1\");\n storage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction storageAvailable(kind: \"localStorage\" | \"sessionStorage\"): boolean {\n try {\n return hasStorage(window[kind]);\n } catch {\n return false;\n }\n}\n\nfunction detectPlatform(): string {\n const win = window as Window & { Shopify?: unknown; WooCommerce?: unknown };\n const html = document.documentElement.innerHTML.slice(0, 120000);\n if (win.Shopify || /cdn\\.shopify\\.com|Shopify\\.theme/i.test(html)) return \"shopify\";\n if (win.WooCommerce || /wp-content|woocommerce/i.test(html)) return \"woocommerce\";\n if (/__NEXT_DATA__|next\\/static/i.test(html)) return \"nextjs\";\n return \"unknown\";\n}\n\nfunction detectConsentBanner(): boolean {\n const selectors = [\n \"[id*='consent' i]\",\n \"[class*='consent' i]\",\n \"[id*='cookie' i]\",\n \"[class*='cookie' i]\",\n \"[aria-label*='cookie' i]\",\n ];\n if (selectors.some((selector) => document.querySelector(selector))) return true;\n return /cookie|consent|gdpr|privacy preferences/i.test(document.body.innerText.slice(0, 6000));\n}\n\nfunction collectSchemaTypes(): string[] {\n const types: string[] = [];\n const scripts = Array.from(document.querySelectorAll(\"script[type='application/ld+json']\"));\n scripts.forEach((script) => {\n try {\n const parsed = JSON.parse(script.textContent || \"{}\");\n const items = Array.isArray(parsed) ? parsed : [parsed];\n items.forEach((item) => {\n const record = item && typeof item === \"object\" ? item as Record<string, unknown> : {};\n const type = String(record[\"@type\"] || \"\");\n if (type) types.push(type);\n });\n } catch {\n // Ignore malformed schema blocks.\n }\n });\n return unique(types, 12);\n}\n\nexport function isApexScriptSrc(raw: string): boolean {\n if (!raw) return false;\n try {\n const url = new URL(raw, location.href);\n const host = url.hostname.toLowerCase();\n const path = url.pathname.toLowerCase();\n return (\n host.includes(\"drip-sdk\") ||\n host.includes(\"drip-apex\") ||\n /(^|\\/)(?:drip|apex)(?:[-.]sdk)?(?:\\.min)?\\.js$/.test(path) ||\n /\\/(?:drip|apex)-sdk(?:\\.min)?\\.js$/.test(path)\n );\n } catch {\n return /(?:^|\\/)(?:drip|apex)(?:[-.]sdk)?(?:\\.min)?\\.js(?:$|\\?)/i.test(raw);\n }\n}\n\nfunction collectNetwork(config: InitConfig) {\n const entries = typeof performance !== \"undefined\"\n ? performance.getEntriesByType(\"resource\") as PerformanceResourceTiming[]\n : [];\n const resources = entries.slice(0, MAX_ITEMS).map((entry) => ({\n url: redactUrl(entry.name),\n type: entry.initiatorType,\n durationMs: Math.round(entry.duration),\n transferSize: Math.max(0, Math.round(entry.transferSize || 0)),\n }));\n const currentHost = location.hostname;\n const thirdParties: string[] = [];\n resources.forEach((resource) => {\n try {\n const host = new URL(resource.url).hostname;\n if (host && host !== currentHost) thirdParties.push(host);\n } catch {\n // Ignore invalid resource URLs.\n }\n });\n const notableThirdParties = unique(thirdParties, 18);\n const apexRequests = resources.filter((resource) =>\n /drip-apex|drip-sdk|drip\\.js|\\/events$|\\/config$/i.test(resource.url),\n ).slice(0, 20);\n const configuredEndpoint = config.endpoint ? redactUrl(config.endpoint) : \"\";\n\n return {\n configuredEndpoint,\n apexRequests,\n notableThirdParties,\n resources,\n failedResources: resourceErrors.slice(0, 20),\n };\n}\n\nfunction collectSnapshot(config: InitConfig, runtime: RuntimeAuditContext) {\n const headings = collectText(\"h1,h2,h3\", 16);\n const buttons = collectText(\"button,a[role='button'],input[type='submit'],a[href*='/cart']\", 16);\n const imageAlts = unique(Array.from(document.images)\n .map((img) => img.alt.trim())\n .filter(Boolean), 12);\n const schemaTypes = collectSchemaTypes();\n const textSample = document.body.innerText.replace(/\\s+/g, \" \").trim().slice(0, MAX_TEXT_SAMPLE);\n const offerPhrases = unique(\n (textSample.match(/\\b(?:free shipping|discount|sale|guarantee|subscribe|bundle|save \\d+%|limited time)\\b/gi) || [])\n .map((item) => item.toLowerCase()),\n 10,\n );\n const apexScriptCount = Array.from(document.scripts)\n .filter((script) => isApexScriptSrc(script.src || \"\"))\n .length;\n\n return {\n page: {\n url: redactUrl(location.href),\n title: document.title,\n referrer: document.referrer ? redactUrl(document.referrer) : \"\",\n language: document.documentElement.lang || navigator.language || \"\",\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n devicePixelRatio: window.devicePixelRatio,\n },\n },\n sdk: {\n installed: true,\n version: \"0.1.0\",\n shopId: config.shopId || \"\",\n configSource: runtime.configSource,\n trackerStarted: runtime.trackerStarted,\n eventsEndpointReachable: runtime.trackerStarted || Boolean(config.endpoint),\n duplicateInstalls: apexScriptCount > 1,\n scriptCount: apexScriptCount,\n },\n site: {\n platform: runtime.platform || detectPlatform(),\n spaDetected: Boolean(document.querySelector(\"[data-reactroot], [ng-version], [data-v-app], [data-sveltekit], #__next\")),\n consentBannerDetected: detectConsentBanner(),\n cartDetected: Boolean(document.querySelector(\"a[href*='/cart'], form[action*='/cart']\")),\n productJsonLdDetected: schemaTypes.some((type) => /product/i.test(type)),\n schemaTypes,\n },\n dom: {\n headings,\n buttons,\n imageAlts,\n sections: collectText(\"nav,header,main,footer,section\", 10),\n offerPhrases,\n textSample,\n },\n styles: collectStyles(),\n browserCapabilities: {\n cookiesAvailable: navigator.cookieEnabled,\n localStorageAvailable: storageAvailable(\"localStorage\"),\n sessionStorageAvailable: storageAvailable(\"sessionStorage\"),\n cspWarnings: [],\n blockedRequests: resourceErrors.map((item) => `${item.type}: ${item.url}`).slice(0, 12),\n },\n network: collectNetwork(config),\n capturedAt: new Date().toISOString(),\n };\n}\n\nexport function runAuditIfRequested(config: InitConfig, runtime: RuntimeAuditContext): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n const token = queryToken();\n if (!token || !oncePerPage(token)) return;\n\n schedule(() => {\n const endpoint = config.auditEndpoint || DEFAULT_AUDIT_ENDPOINT;\n const body = JSON.stringify({\n token,\n snapshot: collectSnapshot(config, runtime),\n });\n\n fetch(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body,\n keepalive: body.length < 60000,\n }).catch(() => {\n // The audit should never affect storefront behavior.\n });\n });\n}\n","/**\n * QA Toolbar — floating in-page toolbar for QA preview sessions.\n *\n * Renders inside a Shadow DOM to avoid style interference with the host page.\n * Shows active experiments, variation switcher, and exit QA button.\n */\n\nimport { Assignment, Experiment } from \"./types\";\n\nexport interface QaToolbarOptions {\n experiments: Experiment[];\n assignments: Assignment[];\n forceMap: Record<string, string> | null;\n qaSessionId?: string;\n onSwitchVariation: (experimentId: string, variationId: string) => void;\n onExitQa: () => void;\n onReloadLatest?: () => void;\n onExitHarness?: () => void;\n}\n\nconst TOOLBAR_ID = \"drip-qa-toolbar\";\n\nfunction serializeForceMap(forceMap: Record<string, string>): string {\n return Object.entries(forceMap)\n .map(([experimentId, variationId]) => `${experimentId}:${variationId}`)\n .join(\",\");\n}\n\nfunction currentForceMap(options: QaToolbarOptions): Record<string, string> {\n const map: Record<string, string> = { ...(options.forceMap ?? {}) };\n for (const assignment of options.assignments) {\n if (!map[assignment.experimentId]) {\n map[assignment.experimentId] = assignment.variationId;\n }\n }\n return map;\n}\n\nfunction buildQaDebugUrl(forceMap: Record<string, string>, qaSessionId?: string): string {\n const url = new URL(location.href);\n const entries = Object.entries(forceMap).filter(\n ([experimentId, variationId]) => experimentId && variationId,\n );\n const filteredForceMap: Record<string, string> = {};\n for (const [experimentId, variationId] of entries) {\n filteredForceMap[experimentId] = variationId;\n }\n const force = serializeForceMap(filteredForceMap);\n if (force) url.searchParams.set(\"drip_force\", force);\n if (entries.length === 1) {\n url.searchParams.set(\"drip_experiment_id\", entries[0][0]);\n url.searchParams.set(\"drip_variation_id\", entries[0][1]);\n } else {\n url.searchParams.delete(\"drip_experiment_id\");\n url.searchParams.delete(\"drip_variation_id\");\n }\n url.searchParams.set(\"drip_qa\", \"1\");\n url.searchParams.set(\"drip_debug\", \"1\");\n if (qaSessionId) url.searchParams.set(\"drip_qa_session\", qaSessionId);\n return url.toString();\n}\n\nfunction replaceQaUrl(forceMap: Record<string, string>, qaSessionId?: string): void {\n try {\n history.replaceState(null, \"\", buildQaDebugUrl(forceMap, qaSessionId));\n } catch {}\n}\n\nasync function copyText(value: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(value);\n return;\n }\n const textarea = document.createElement(\"textarea\");\n textarea.value = value;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n}\n\nconst TOOLBAR_STYLES = `\n :host {\n all: initial;\n position: fixed;\n bottom: 16px;\n right: 16px;\n z-index: 2147483647;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n }\n .toolbar {\n background: #1a1a2e;\n border: 1px solid rgba(139, 92, 246, 0.4);\n border-radius: 12px;\n padding: 12px 16px;\n color: #e2e8f0;\n font-size: 13px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);\n min-width: 260px;\n max-width: 360px;\n }\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n padding-bottom: 8px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n .badge {\n background: #8b5cf6;\n color: #fff;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 3px 8px;\n border-radius: 4px;\n }\n .exit-btn {\n background: rgba(239, 68, 68, 0.15);\n color: #ef4444;\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: 6px;\n padding: 4px 10px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n }\n .exit-btn:hover {\n background: rgba(239, 68, 68, 0.25);\n }\n .tool-btn {\n background: rgba(83, 193, 222, 0.12);\n color: #7dd3fc;\n border: 1px solid rgba(125, 211, 252, 0.25);\n border-radius: 6px;\n padding: 4px 8px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n }\n .debug-actions {\n display: flex;\n gap: 6px;\n margin-bottom: 10px;\n }\n .debug-actions .tool-btn {\n flex: 1;\n min-width: 0;\n }\n .harness {\n border: 1px solid rgba(125, 211, 252, 0.25);\n border-radius: 8px;\n padding: 8px;\n margin-bottom: 10px;\n color: #bae6fd;\n background: rgba(14, 116, 144, 0.12);\n }\n .harness-title {\n font-size: 11px;\n font-weight: 700;\n margin-bottom: 6px;\n text-transform: uppercase;\n }\n .harness-actions {\n display: flex;\n gap: 6px;\n }\n .session {\n border: 1px solid rgba(255, 255, 255, 0.1);\n border-radius: 8px;\n padding: 7px 8px;\n margin-bottom: 10px;\n background: rgba(255, 255, 255, 0.04);\n }\n .session-label {\n color: #94a3b8;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.04em;\n margin-bottom: 3px;\n text-transform: uppercase;\n }\n .session-id {\n color: #e2e8f0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .experiment {\n margin-bottom: 8px;\n }\n .experiment:last-child {\n margin-bottom: 0;\n }\n .exp-name {\n font-size: 12px;\n color: #94a3b8;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .var-select {\n width: 100%;\n background: rgba(255, 255, 255, 0.06);\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: 6px;\n color: #e2e8f0;\n font-size: 13px;\n padding: 6px 8px;\n cursor: pointer;\n outline: none;\n appearance: none;\n -webkit-appearance: none;\n }\n .var-select:focus {\n border-color: #8b5cf6;\n }\n .var-select option {\n background: #1a1a2e;\n color: #e2e8f0;\n }\n .no-experiments {\n color: #64748b;\n font-size: 12px;\n font-style: italic;\n }\n .collapse-btn {\n background: none;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n font-size: 16px;\n padding: 0 4px;\n line-height: 1;\n }\n .collapsed .body {\n display: none;\n }\n .collapsed .toolbar {\n min-width: auto;\n }\n`;\n\nexport function mountQaToolbar(options: QaToolbarOptions): void {\n // Don't mount twice\n if (document.getElementById(TOOLBAR_ID)) return;\n\n const host = document.createElement(\"div\");\n host.id = TOOLBAR_ID;\n const shadow = host.attachShadow({ mode: \"closed\" });\n\n const style = document.createElement(\"style\");\n style.textContent = TOOLBAR_STYLES;\n shadow.appendChild(style);\n\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"toolbar\";\n\n // Header\n const header = document.createElement(\"div\");\n header.className = \"header\";\n\n const badge = document.createElement(\"span\");\n badge.className = \"badge\";\n badge.textContent = \"QA Preview\";\n\n const actions = document.createElement(\"div\");\n actions.style.cssText = \"display:flex;gap:6px;align-items:center;\";\n\n const collapseBtn = document.createElement(\"button\");\n collapseBtn.className = \"collapse-btn\";\n collapseBtn.textContent = \"\\u2212\";\n collapseBtn.title = \"Collapse\";\n let collapsed = false;\n collapseBtn.addEventListener(\"click\", () => {\n collapsed = !collapsed;\n toolbar.classList.toggle(\"collapsed\", collapsed);\n collapseBtn.textContent = collapsed ? \"+\" : \"\\u2212\";\n });\n\n const exitBtn = document.createElement(\"button\");\n exitBtn.className = \"exit-btn\";\n exitBtn.textContent = \"Exit QA\";\n exitBtn.addEventListener(\"click\", options.onExitQa);\n\n actions.appendChild(collapseBtn);\n actions.appendChild(exitBtn);\n header.appendChild(badge);\n header.appendChild(actions);\n toolbar.appendChild(header);\n\n // Body\n const body = document.createElement(\"div\");\n body.className = \"body\";\n const activeForceMap = currentForceMap(options);\n\n const harnessAssignment = options.assignments.find((assignment) => assignment.harnessSession);\n if (harnessAssignment?.harnessSession) {\n const harness = document.createElement(\"div\");\n harness.className = \"harness\";\n const title = document.createElement(\"div\");\n title.className = \"harness-title\";\n title.textContent = `Harness v${harnessAssignment.harnessSession.version ?? 0}`;\n harness.appendChild(title);\n const harnessActions = document.createElement(\"div\");\n harnessActions.className = \"harness-actions\";\n const reload = document.createElement(\"button\");\n reload.className = \"tool-btn\";\n reload.textContent = \"Reload latest\";\n reload.addEventListener(\"click\", () => options.onReloadLatest?.());\n const exitHarness = document.createElement(\"button\");\n exitHarness.className = \"tool-btn\";\n exitHarness.textContent = \"Exit harness\";\n exitHarness.addEventListener(\"click\", () => options.onExitHarness?.());\n harnessActions.appendChild(reload);\n harnessActions.appendChild(exitHarness);\n harness.appendChild(harnessActions);\n body.appendChild(harness);\n }\n\n if (options.experiments.length === 0) {\n const noExp = document.createElement(\"div\");\n noExp.className = \"no-experiments\";\n noExp.textContent = \"No experiments on this page\";\n body.appendChild(noExp);\n } else {\n const debugActions = document.createElement(\"div\");\n debugActions.className = \"debug-actions\";\n const copyDebugLink = document.createElement(\"button\");\n copyDebugLink.className = \"tool-btn\";\n copyDebugLink.type = \"button\";\n copyDebugLink.textContent = \"Copy debug link\";\n copyDebugLink.title = \"Copy a forced QA URL with experiment and variation ids\";\n copyDebugLink.addEventListener(\"click\", () => {\n const originalLabel = copyDebugLink.textContent;\n copyText(buildQaDebugUrl(activeForceMap, options.qaSessionId))\n .then(() => {\n copyDebugLink.textContent = \"Copied\";\n window.setTimeout(() => {\n copyDebugLink.textContent = originalLabel;\n }, 1600);\n })\n .catch(() => {\n copyDebugLink.textContent = \"Copy failed\";\n window.setTimeout(() => {\n copyDebugLink.textContent = originalLabel;\n }, 1600);\n });\n });\n\n const openDebugPanel = document.createElement(\"button\");\n openDebugPanel.className = \"tool-btn\";\n openDebugPanel.type = \"button\";\n openDebugPanel.textContent = \"Open debug panel\";\n openDebugPanel.title = \"Enable Apex debug tools and reload this forced variation\";\n openDebugPanel.addEventListener(\"click\", () => {\n try {\n localStorage.setItem(\"drip_devtools\", \"1\");\n } catch {}\n replaceQaUrl(activeForceMap, options.qaSessionId);\n location.reload();\n });\n\n debugActions.appendChild(copyDebugLink);\n debugActions.appendChild(openDebugPanel);\n body.appendChild(debugActions);\n\n if (options.qaSessionId) {\n const session = document.createElement(\"div\");\n session.className = \"session\";\n const sessionLabel = document.createElement(\"div\");\n sessionLabel.className = \"session-label\";\n sessionLabel.textContent = \"QA session\";\n const sessionId = document.createElement(\"div\");\n sessionId.className = \"session-id\";\n sessionId.textContent = options.qaSessionId;\n sessionId.title = options.qaSessionId;\n session.appendChild(sessionLabel);\n session.appendChild(sessionId);\n body.appendChild(session);\n }\n\n for (const exp of options.experiments) {\n const expDiv = document.createElement(\"div\");\n expDiv.className = \"experiment\";\n\n const nameEl = document.createElement(\"div\");\n nameEl.className = \"exp-name\";\n nameEl.textContent = exp.id;\n nameEl.title = exp.id;\n expDiv.appendChild(nameEl);\n\n const select = document.createElement(\"select\");\n select.className = \"var-select\";\n\n const currentForced = options.forceMap?.[exp.id];\n const activeForced = activeForceMap[exp.id];\n const currentAssignment = options.assignments.find(\n (a) => a.experimentId === exp.id,\n );\n\n for (const v of exp.variations) {\n const opt = document.createElement(\"option\");\n opt.value = v.id;\n const label = v.isControl ? \"(Control)\" : `Variation`;\n opt.textContent = `${label} — ${v.id.slice(0, 8)}`;\n if (\n activeForced === v.id ||\n currentForced === v.id ||\n (!activeForced && !currentForced && currentAssignment?.variationId === v.id)\n ) {\n opt.selected = true;\n }\n select.appendChild(opt);\n }\n\n select.addEventListener(\"change\", () => {\n activeForceMap[exp.id] = select.value;\n replaceQaUrl(activeForceMap, options.qaSessionId);\n options.onSwitchVariation(exp.id, select.value);\n });\n\n expDiv.appendChild(select);\n body.appendChild(expDiv);\n }\n }\n\n toolbar.appendChild(body);\n shadow.appendChild(toolbar);\n document.body.appendChild(host);\n}\n\nexport function unmountQaToolbar(): void {\n const el = document.getElementById(TOOLBAR_ID);\n if (el) el.remove();\n}\n","import type {\n Assignment,\n ConditionDiagnostic,\n Experiment,\n ExperimentActivationDiagnostic,\n Variation,\n} from \"./types\";\nimport { exitQaMode } from \"./guards\";\nimport type { DevtoolsEvent } from \"./devtools\";\nimport { subscribeDevtoolsEvents } from \"./devtools\";\nimport {\n __forceQaAssistantVariation,\n __getQaAssistantRuntimeSnapshot,\n __resetQaAssistantForce,\n __subscribeQaAssistantRuntime,\n} from \"./index\";\n\nexport type QaExperimentModel = {\n id: string; name: string;\n variationId: string | null; variationName: string | null;\n applied: boolean; forced: boolean;\n subline: string;\n triggerPill: \"accepted\" | \"rejected\" | \"not evaluated\" | \"all pages\";\n segmentPill: \"accepted\" | \"rejected\" | \"not evaluated\" | \"all visitors\";\n displayFrequencyPill: \"accepted\" | \"outside traffic %\" | \"personalization stop\" | \"excluded by overlap\" | \"not running\" | \"not evaluated\" | \"forced\";\n conditions: Array<{ id: string; group: \"pages\" | \"audience\"; state: \"pass\"|\"fail\"|\"skip\"|\"error\"; text: string; detail: string | null; rawCode: string | null }>;\n variations: Array<{ id: string; name: string; isControl: boolean; isCurrent: boolean; isReal: boolean }>;\n};\nexport type QaEventModel = { at: number; type: \"exposure\"|\"goal\"|\"revenue\"|\"pageview\"; label: string; value: string | null; duplicateOf?: number };\nexport type QaTransactionsModel =\n | { kind: \"unsupported\" }\n | { kind: \"shopify\"; cartStamped: boolean; variationName: string | null; stampedAt: number | null; attribution: Array<{ experimentName: string; variationName: string | null }> }\n | { kind: \"order\"; orderNumber: string | null; attribution: Array<{ experimentName: string; variationName: string | null }>; serverReceipt: \"pending\"|\"confirmed\"|\"unknown\" };\nexport type QaAssistantState = { experiments: QaExperimentModel[]; events: QaEventModel[]; transactions: QaTransactionsModel; forcedSummary: string | null };\nexport type QaAssistantStore = {\n getState(): QaAssistantState;\n subscribe(listener: (s: QaAssistantState) => void): () => void;\n forceVariation(experimentId: string, variationId: string): void;\n resetForce(experimentId?: string): void;\n exitQa(): void;\n};\nexport function createQaAssistantStore(): QaAssistantStore {\n let state = buildState([], { kind: \"unsupported\" });\n const listeners = new Set<(s: QaAssistantState) => void>();\n let cartFetchSignature: string | null = null;\n let disposed = false;\n\n function emit(): void {\n for (const listener of listeners) {\n listener(state);\n }\n }\n\n function setState(next: QaAssistantState): void {\n state = next;\n emit();\n }\n\n function refresh(): void {\n const baseTransactions = transactionShell();\n setState(buildState(state.events, baseTransactions));\n void refreshShopifyCart(baseTransactions);\n }\n\n async function refreshShopifyCart(baseTransactions: QaTransactionsModel): Promise<void> {\n if (baseTransactions.kind !== \"shopify\") return;\n const runtime = __getQaAssistantRuntimeSnapshot();\n const signature = runtime.assignments\n .map((assignment) => `${assignment.experimentId}:${assignment.variationId}`)\n .sort()\n .join(\"|\");\n if (cartFetchSignature === signature) return;\n cartFetchSignature = signature;\n const cart = await readShopifyCart();\n if (disposed || cartFetchSignature !== signature) return;\n setState(buildState(state.events, {\n ...baseTransactions,\n cartStamped: cartMatchesAssignments(cart, runtime.assignments),\n variationName: primaryStampedVariationName(cart, runtime.config?.experiments ?? []),\n stampedAt: null,\n }));\n }\n\n const unsubscribeRuntime = __subscribeQaAssistantRuntime(refresh);\n const unsubscribeEvents = subscribeDevtoolsEvents((event) => {\n const mapped = mapDevtoolsEvent(event);\n if (!mapped) return;\n const events = appendEvent(state.events, mapped);\n setState(buildState(events, state.transactions));\n });\n\n refresh();\n\n return {\n getState() {\n return state;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n forceVariation(experimentId, variationId) {\n __forceQaAssistantVariation(experimentId, variationId);\n },\n resetForce(experimentId) {\n __resetQaAssistantForce(experimentId);\n },\n exitQa() {\n disposed = true;\n unsubscribeRuntime();\n unsubscribeEvents();\n exitQaMode();\n removeAssistantHost();\n },\n };\n}\n\nfunction buildState(events: QaEventModel[], transactions: QaTransactionsModel): QaAssistantState {\n const runtime = __getQaAssistantRuntimeSnapshot();\n return {\n experiments: mapExperiments(\n runtime.config?.experiments ?? [],\n runtime.assignments,\n runtime.activationDiagnostics.experiments,\n ),\n events,\n transactions,\n forcedSummary: forcedSummary(runtime.config?.experiments ?? [], runtime.forceMap),\n };\n}\n\nfunction mapExperiments(\n experiments: Experiment[],\n assignments: Assignment[],\n diagnostics: ExperimentActivationDiagnostic[],\n): QaExperimentModel[] {\n const assignmentByExperiment = new Map(assignments.map((assignment) => [assignment.experimentId, assignment]));\n const diagnosticByExperiment = new Map(diagnostics.map((diagnostic) => [diagnostic.experimentId, diagnostic]));\n return experiments.map((experiment) => {\n const assignment = assignmentByExperiment.get(experiment.id) ?? null;\n const diagnostic = diagnosticByExperiment.get(experiment.id) ?? null;\n const variation = assignment\n ? experiment.variations.find((item) => item.id === assignment.variationId) ?? null\n : null;\n const variationName = variation ? variationDisplayName(variation, experiment.variations.indexOf(variation)) : null;\n // \"Forced\" in the model requires the force to be in effect: overlap\n // resolution / stop-after-match remove the assignment while preserving\n // diagnostic.forced, and a non-displayed campaign must not group as forced.\n const forced = Boolean(diagnostic?.forced) && Boolean(assignment);\n const conditions = (diagnostic?.targetingConditions ?? []).map(mapCondition);\n const pageConditions = conditions.filter((condition) => condition.group === \"pages\");\n const audienceConditions = conditions.filter((condition) => condition.group === \"audience\");\n return {\n id: experiment.id,\n name: experiment.name || shortId(experiment.id),\n variationId: assignment?.variationId ?? null,\n variationName,\n applied: Boolean(assignment),\n forced,\n triggerPill: targetingPill(pageConditions, \"all pages\", diagnostic?.gates.find((gate) => gate.id === \"page\")),\n segmentPill: targetingPill(audienceConditions, \"all visitors\", diagnostic?.gates.find((gate) => gate.id === \"audience\")),\n displayFrequencyPill: displayFrequencyPill(diagnostic),\n subline: experimentSubline(Boolean(assignment), forced, variationName, conditions, diagnostic),\n conditions,\n variations: experiment.variations.map((item, index) => ({\n id: item.id,\n name: variationDisplayName(item, index),\n isControl: Boolean(item.isControl),\n isCurrent: item.id === assignment?.variationId,\n isReal: true,\n })),\n };\n });\n}\n\nfunction experimentSubline(\n applied: boolean,\n forced: boolean,\n variationName: string | null,\n conditions: QaExperimentModel[\"conditions\"],\n diagnostic: ExperimentActivationDiagnostic | null,\n): string {\n if (applied) return `${forced ? \"Forced to\" : \"Showing\"} ${variationName ?? \"variation\"}`;\n const firstFailed = conditions.find((condition) => condition.state === \"fail\" || condition.state === \"error\");\n if (firstFailed) return firstFailed.text;\n return diagnostic?.reason || \"Not applied\";\n}\n\nfunction mapCondition(condition: ConditionDiagnostic): QaExperimentModel[\"conditions\"][number] {\n const reason = condition.reason ?? \"\";\n const isJsError = condition.sourceType === \"js\" && reason.startsWith(\"js_error\");\n return {\n id: condition.id,\n group: condition.sourceType === \"attribute\" || condition.sourceType === \"segment\" || condition.id.startsWith(\"segment:\") || condition.id.startsWith(\"attribute:\") ? \"audience\" : \"pages\",\n state: isJsError ? \"error\" : condition.status === \"passed\" ? \"pass\" : condition.status === \"failed\" ? \"fail\" : \"skip\",\n text: conditionText(condition),\n detail: conditionDetail(condition, isJsError),\n rawCode: condition.sourceType === \"js\" ? condition.source ?? null : null,\n };\n}\n\nfunction conditionText(condition: ConditionDiagnostic): string {\n if (condition.sourceType === \"js\") return \"Custom JS trigger\";\n if (condition.sourceType === \"attribute\" || condition.sourceType === \"segment\") {\n return condition.signal\n ? `${condition.signal} ${condition.operator ?? \"matches\"}`\n : condition.label || condition.source || condition.id;\n }\n return condition.label || condition.source || condition.id;\n}\n\nfunction conditionDetail(condition: ConditionDiagnostic, isJsError: boolean): string | null {\n if (isJsError) return (condition.reason ?? \"\").replace(/^js_error:\\s*/, \"\") || \"JavaScript error\";\n if (condition.status === \"skipped\") {\n return `Skipped — ${condition.reason || \"an earlier gate\"} failed first`;\n }\n const parts: string[] = [];\n if (condition.signal) parts.push(`Signal: ${condition.signal}`);\n if (condition.operator) parts.push(`Operator: ${condition.operator}`);\n if (condition.sourceType === \"page_rule\" && condition.source) parts.push(`Rules: ${condition.source}`);\n const jsPatternSummary = condition.sourceType === \"js\" && isPageRulePatternSummary(condition.expected);\n if (jsPatternSummary) parts.push(`Rules: ${formatValue(condition.expected)}`);\n else if (condition.expected !== undefined) parts.push(`Expected: ${formatValue(condition.expected)}`);\n if (condition.actual !== undefined) parts.push(`Actual: ${formatValue(condition.actual)}`);\n return parts.length ? parts.join(\" · \") : condition.reason ?? null;\n}\n\nfunction targetingPill(conditions: QaExperimentModel[\"conditions\"], empty: \"all pages\", gate?: ExperimentActivationDiagnostic[\"gates\"][number]): QaExperimentModel[\"triggerPill\"];\nfunction targetingPill(conditions: QaExperimentModel[\"conditions\"], empty: \"all visitors\", gate?: ExperimentActivationDiagnostic[\"gates\"][number]): QaExperimentModel[\"segmentPill\"];\nfunction targetingPill(\n conditions: QaExperimentModel[\"conditions\"],\n empty: \"all pages\" | \"all visitors\",\n gate?: ExperimentActivationDiagnostic[\"gates\"][number],\n): \"accepted\" | \"rejected\" | \"not evaluated\" | \"all pages\" | \"all visitors\" {\n const noRulesReason = empty === \"all pages\" ? \"no_page_rules\" : \"no_audience_rules\";\n if (gate?.status === \"skipped\" && gate.reason === noRulesReason) return empty;\n if (gate?.status === \"skipped\") return \"not evaluated\";\n if (gate?.status === \"passed\") return \"accepted\";\n if (gate?.status === \"failed\") return \"rejected\";\n // No page/audience gate at all means evaluation returned before targeting\n // ran (paused campaign, no variations) — configured rules were never\n // checked, so neither the no-rules labels nor acceptance apply.\n if (conditions.length === 0) return \"not evaluated\";\n if (conditions.every((condition) => condition.state === \"skip\")) return \"not evaluated\";\n return conditions.some((condition) => condition.state === \"fail\" || condition.state === \"error\")\n ? \"rejected\"\n : \"accepted\";\n}\n\nfunction isPageRulePatternSummary(value: unknown): boolean {\n if (typeof value !== \"string\") return false;\n try {\n const rules = JSON.parse(value) as unknown;\n return Array.isArray(rules) && rules.length > 0 && rules.every((rule) =>\n typeof rule === \"object\" && rule !== null && \"pattern\" in rule\n );\n } catch {\n return false;\n }\n}\n\nfunction displayFrequencyPill(\n diagnostic: ExperimentActivationDiagnostic | null,\n): QaExperimentModel[\"displayFrequencyPill\"] {\n // Suppression reasons outrank the forced flag: a forced lower-priority\n // personalization removed by stop-after-match keeps diagnostic.forced but\n // has no active assignment.\n if (diagnostic?.reason === \"personalization_stopped_after_prior_match\") return \"personalization stop\";\n // Exclusion-group suppression ALSO outranks forced: forcing multiple\n // experiments in one exclusion group removes the losers' assignments and\n // sets an overlap reason while preserving diagnostic.forced — labeling\n // the suppressed campaign \"forced\" would falsely claim it is displayed.\n if (diagnostic?.reason === \"exclusion_group_overlap_lost\" || diagnostic?.reason === \"exclusion_group_sticky_other\") return \"excluded by overlap\";\n // \"forced\" requires evidence the force actually took effect — a force\n // request that targeting blocked leaves no forced diagnostic and must not\n // render as displayed.\n if (diagnostic?.forced || diagnostic?.reason === \"forced_variation\") return \"forced\";\n if (diagnostic?.reason === \"outside_allocation\") return \"outside traffic %\";\n if (diagnostic?.reason?.startsWith(\"status_\")) return \"not running\";\n // Derive from the traffic gate: when targeting rejected the campaign,\n // evaluation returns before the traffic gate runs — display frequency was\n // never checked, so \"accepted\" would be a false claim.\n const trafficGate = diagnostic?.gates.find((gate) => gate.id === \"traffic\");\n if (trafficGate?.status === \"passed\") return \"accepted\";\n if (trafficGate?.status === \"failed\") return \"outside traffic %\";\n if (trafficGate?.status === \"skipped\" && trafficGate.reason === \"forced_variation\") return \"forced\";\n return \"not evaluated\";\n}\n\nfunction transactionShell(): QaTransactionsModel {\n const runtime = __getQaAssistantRuntimeSnapshot();\n const attribution = attributionFromAssignments(runtime.config?.experiments ?? [], runtime.assignments);\n if (runtime.orderIdentity) {\n return {\n kind: \"order\",\n orderNumber: runtime.orderIdentity.orderNumber ?? runtime.orderIdentity.platformOrderId,\n attribution,\n serverReceipt: \"unknown\",\n };\n }\n const shopifyConfigured =\n runtime.platform === \"shopify\" ||\n runtime.config?.platformHint === \"shopify\" ||\n runtime.config?.profile?.platform === \"shopify\";\n const shopifyRuntime = typeof window !== \"undefined\" && Boolean((window as unknown as { Shopify?: unknown }).Shopify);\n if (shopifyConfigured && shopifyRuntime) {\n return {\n kind: \"shopify\",\n cartStamped: false,\n variationName: primaryAssignmentVariationName(runtime.config?.experiments ?? [], runtime.assignments),\n stampedAt: null,\n attribution,\n };\n }\n return { kind: \"unsupported\" };\n}\n\nasync function readShopifyCart(): Promise<Record<string, unknown> | null> {\n if (typeof fetch !== \"function\") return null;\n try {\n const response = await fetch(\"/cart.js\", { headers: { Accept: \"application/json\" } });\n if (!response.ok) return null;\n const cart = await response.json();\n return cart && typeof cart === \"object\" && !Array.isArray(cart)\n ? cart as Record<string, unknown>\n : null;\n } catch {\n return null;\n }\n}\n\nfunction readCartAttributes(cart: Record<string, unknown> | null): Record<string, unknown> {\n const attributes = cart?.attributes;\n return attributes && typeof attributes === \"object\" && !Array.isArray(attributes)\n ? attributes as Record<string, unknown>\n : {};\n}\n\nfunction parseCartAssignments(cart: Record<string, unknown> | null): Array<{ experimentId: string; variationId: string }> {\n const attributes = readCartAttributes(cart);\n const raw = attributes.apex_assignments;\n if (typeof raw === \"string\") {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n return parsed\n .map((item) => ({\n experimentId: typeof item?.e === \"string\" ? item.e : \"\",\n variationId: typeof item?.v === \"string\" ? item.v : \"\",\n }))\n .filter((item) => item.experimentId && item.variationId);\n }\n } catch {}\n }\n const experimentId = typeof attributes.apex_experiment_id === \"string\" ? attributes.apex_experiment_id : \"\";\n const variationId = typeof attributes.apex_variation_id === \"string\" ? attributes.apex_variation_id : \"\";\n return experimentId && variationId ? [{ experimentId, variationId }] : [];\n}\n\nfunction cartMatchesAssignments(cart: Record<string, unknown> | null, assignments: Assignment[]): boolean {\n const stamped = parseCartAssignments(cart);\n if (!stamped.length || !assignments.length) return false;\n const active = new Set(assignments.map((assignment) => `${assignment.experimentId}:${assignment.variationId}`));\n return stamped.some((assignment) => active.has(`${assignment.experimentId}:${assignment.variationId}`));\n}\n\nfunction primaryStampedVariationName(cart: Record<string, unknown> | null, experiments: Experiment[]): string | null {\n const [primary] = parseCartAssignments(cart);\n if (!primary) return null;\n return variationNameById(experiments, primary.experimentId, primary.variationId);\n}\n\nfunction attributionFromAssignments(\n experiments: Experiment[],\n assignments: Assignment[],\n): Array<{ experimentName: string; variationName: string | null }> {\n return assignments.map((assignment) => ({\n experimentName: experimentNameById(experiments, assignment.experimentId),\n variationName: variationNameById(experiments, assignment.experimentId, assignment.variationId),\n }));\n}\n\nfunction forcedSummary(experiments: Experiment[], forceMap: Record<string, string> | null): string | null {\n const entries = Object.entries(forceMap ?? {});\n if (!entries.length) return null;\n return entries.map(([experimentId, variationId]) => {\n const experimentName = experimentNameById(experiments, experimentId);\n const variationName = variationNameById(experiments, experimentId, variationId) ?? shortId(variationId);\n return `${experimentName}: ${variationName}`;\n }).join(\", \");\n}\n\nfunction primaryAssignmentVariationName(experiments: Experiment[], assignments: Assignment[]): string | null {\n const [assignment] = assignments;\n return assignment ? variationNameById(experiments, assignment.experimentId, assignment.variationId) : null;\n}\n\nfunction experimentNameById(experiments: Experiment[], experimentId: string): string {\n const experiment = experiments.find((item) => item.id === experimentId);\n return experiment?.name || shortId(experimentId);\n}\n\nfunction variationNameById(experiments: Experiment[], experimentId: string, variationId: string): string | null {\n const experiment = experiments.find((item) => item.id === experimentId);\n const index = experiment?.variations.findIndex((item) => item.id === variationId) ?? -1;\n const variation = index >= 0 ? experiment?.variations[index] : null;\n return variation ? variationDisplayName(variation, index) : shortId(variationId);\n}\n\nfunction variationDisplayName(variation: Variation, index: number): string {\n return variation.name || (variation.isControl ? \"Control\" : shortId(variation.id || `variation-${index + 1}`));\n}\n\nfunction shortId(id: string): string {\n return id.length > 12 ? id.slice(0, 8) : id;\n}\n\nfunction mapDevtoolsEvent(event: DevtoolsEvent): QaEventModel | null {\n if (event.type !== \"track\") return null;\n const detail = event.detail ?? {};\n const type = eventType(event.label, detail);\n if (!type) return null;\n return {\n at: event.ts,\n type,\n label: eventLabel(type, event.label, detail),\n value: eventValue(type, detail),\n };\n}\n\nfunction eventType(label: string, detail: Record<string, unknown>): QaEventModel[\"type\"] | null {\n if (label === \"experiment_viewed\" || label === \"personalization_rendered\") return \"exposure\";\n if (label === \"pageview\" || label === \"experiment_pageview\") return \"pageview\";\n if (label === \"goal\") return detail.goalId === \"__revenue__\" || detail.revenue !== undefined ? \"revenue\" : \"goal\";\n return null;\n}\n\nfunction eventLabel(type: QaEventModel[\"type\"], label: string, detail: Record<string, unknown>): string {\n if (type === \"goal\") return typeof detail.goalId === \"string\" ? detail.goalId : \"Goal\";\n if (type === \"revenue\") return \"Revenue\";\n if (type === \"pageview\") return typeof detail.path === \"string\" ? detail.path : \"Pageview\";\n const runtime = __getQaAssistantRuntimeSnapshot();\n const experimentId = typeof detail.experimentId === \"string\" ? detail.experimentId : \"\";\n const variationId = typeof detail.variationId === \"string\" ? detail.variationId : \"\";\n const experimentName = experimentId ? experimentNameById(runtime.config?.experiments ?? [], experimentId) : \"Exposure\";\n const variationName = experimentId && variationId\n ? variationNameById(runtime.config?.experiments ?? [], experimentId, variationId)\n : null;\n return variationName ? `${experimentName} / ${variationName}` : experimentName || label;\n}\n\nfunction eventValue(type: QaEventModel[\"type\"], detail: Record<string, unknown>): string | null {\n if (type !== \"revenue\") return null;\n const revenue = detail.revenue;\n const currency = typeof detail.currency === \"string\" ? detail.currency.trim().toUpperCase() : \"\";\n if (typeof revenue === \"number\" && Number.isFinite(revenue)) {\n return currency ? `${formatNumber(revenue)} ${currency}` : formatNumber(revenue);\n }\n return currency && revenue != null ? `${String(revenue)} ${currency}` : revenue == null ? null : String(revenue);\n}\n\nfunction appendEvent(events: QaEventModel[], event: QaEventModel): QaEventModel[] {\n let duplicate: QaEventModel | undefined;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const candidate = events[index];\n if (\n candidate.type === event.type &&\n candidate.label === event.label &&\n event.at - candidate.at <= 1500\n ) {\n duplicate = candidate;\n break;\n }\n }\n return [...events, duplicate ? { ...event, duplicateOf: duplicate.at } : event].slice(-100);\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value == null) return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(2);\n}\n\nfunction removeAssistantHost(): void {\n if (typeof document === \"undefined\") return;\n const selectors = [\n \"#drip-qa-assistant-host\",\n \"#apex-qa-assistant-host\",\n \"[data-drip-qa-assistant-host]\",\n ];\n for (const selector of selectors) {\n document.querySelectorAll(selector).forEach((element) => element.remove());\n }\n}\n","// QA Assistant panel view — vanilla DOM inside a shadow root, rendered from\n// QaAssistantState. Pixel spec: the \"Operator QA Assistant\" Claude Design\n// canvas (opqa-*.jsx). Sentence case; monospace only inside real code blocks.\n\nimport type {\n QaAssistantState,\n QaAssistantStore,\n QaEventModel,\n QaExperimentModel,\n QaTransactionsModel,\n} from \"./qa-assistant-state\";\n\nexport const QA_ASSISTANT_HOST_ID = \"drip-qa-assistant-host\";\n\ntype TabId = \"exp\" | \"ev\" | \"tx\";\n\ntype ViewState = {\n tab: TabId;\n minimized: boolean;\n expanded: Set<string>;\n codeOpen: Set<string>;\n pageFilter: \"all\" | \"on\" | \"off\";\n statusFilter: \"all\" | \"accepted\" | \"rejected\" | \"forced\";\n search: string;\n firstMount: boolean;\n};\n\nconst MINIMIZED_KEY = \"drip_qa_assistant_min\";\n\n/* ── icons (Lucide-style paths from the design's icon set) ─────────────── */\nconst P = {\n check: \"M5 13l4 4L19 7\",\n x: \"M18 6L6 18M6 6l12 12\",\n minus: \"M5 12h14\",\n alert:\n \"M10.3 3.9L1.8 18a2 2 0 001.7 3h17a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0zM12 9v4M12 17h.01\",\n chevR: \"M9 6l6 6-6 6\",\n chevD: \"M6 9l6 6 6-6\",\n chevUp: \"M18 15l-6-6-6 6\",\n bolt: \"M13 2L3 14h7l-1 8 10-12h-7l1-8z\",\n eyeOff:\n \"M17.9 17.9A10 10 0 016.1 6.1M9.9 4.2A10.6 10.6 0 0122 12a17 17 0 01-3.2 3.7M3 3l18 18M14.1 14.1a3 3 0 01-4.2-4.2M2 12a17 17 0 013.8-4.3\",\n clock: \"M12 22a10 10 0 100-20 10 10 0 000 20zM12 7v5l3 2\",\n store:\n \"M3 9l1.5-5h15L21 9M4 9v10a1 1 0 001 1h14a1 1 0 001-1V9M3 9h18M9 20v-6h6v6\",\n target:\n \"M12 2a10 10 0 100 20 10 10 0 000-20zM12 7a5 5 0 100 10 5 5 0 000-10zM12 11a1 1 0 100 2 1 1 0 000-2z\",\n checkSquare:\n \"M9 11l3 3L20 6M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11\",\n help:\n \"M12 22a10 10 0 100-20 10 10 0 000 20zM9.2 9.2a3 3 0 015.6 1.3c0 2-3 2.5-3 4M12 17.5h.01\",\n activity: \"M22 12h-4l-3 8L9 4l-3 8H2\",\n code: \"M16 18l6-6-6-6M8 6l-6 6 6 6\",\n};\n\nfunction svg(d: string, size: number, sw = 1.6): string {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${sw}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"flex-shrink:0\"><path d=\"${d}\"/></svg>`;\n}\n\n/* ── safety ─────────────────────────────────────────────────────────────── */\nfunction esc(value: string | null | undefined): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/* ── copy helpers ───────────────────────────────────────────────────────── */\nconst REASON_WORDS: Record<string, string> = {\n url_mismatch: \"page rules\",\n url_exclude_matched: \"page rules\",\n page_rule_failed: \"page rules\",\n segment_mismatch: \"the audience rule\",\n segment_and_failed: \"the audience rule\",\n attribute_mismatch: \"the audience rule\",\n js_false: \"the custom JS trigger\",\n js_error: \"the custom JS trigger\",\n};\n\nfunction humanizeSkipDetail(detail: string | null): string | null {\n if (!detail) return detail;\n return detail.replace(/Skipped — (\\S+) failed first/, (whole, reason: string) => {\n const words = REASON_WORDS[reason];\n return words ? `Skipped — ${words} failed first` : \"Skipped — an earlier rule failed first\";\n });\n}\n\nfunction formatTime(at: number): string {\n const d = new Date(at);\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\n/* ── stylesheet (exact TK/QAT values from the design) ───────────────────── */\nconst CSS = `\n:host { all: initial; }\n* { box-sizing: border-box; margin: 0; }\n.root {\n --bg1: #0A0A0C; --panel: #0C0C10; --raised: #141419; --inset: #0B0B0E;\n --bd: rgba(255,255,255,0.06); --bd-hi: rgba(255,255,255,0.10); --bd-px: rgba(255,255,255,0.14);\n --t1: #FAFAFA; --t2: rgba(255,255,255,0.66); --t3: rgba(255,255,255,0.42); --t4: rgba(255,255,255,0.26);\n --p500: #5B29FF; --p400: #7C54FF; --p200: #C8B4FF;\n --p-soft: rgba(91,41,255,0.14); --p-bd: rgba(124,84,255,0.34);\n --pos: #3DD68C; --pos-soft: rgba(61,214,140,0.14); --pos-bd: rgba(61,214,140,0.26);\n --warn: #F59E0B; --warn-soft: rgba(245,158,11,0.12); --warn-bd: rgba(245,158,11,0.26);\n --neg: #EB5252; --neg-soft: rgba(235,82,82,0.10); --neg-bd: rgba(235,82,82,0.26);\n --info: #1DDFEC; --info-soft: rgba(29,223,236,0.10); --info-bd: rgba(29,223,236,0.22);\n font-family: Inter, system-ui, sans-serif;\n position: fixed; right: 24px; bottom: 24px; z-index: 2147483000;\n color: var(--t1); font-size: 12px; line-height: 1.45; letter-spacing: -0.01em;\n -webkit-font-smoothing: antialiased;\n}\nbutton { font-family: inherit; background: none; border: 0; padding: 0; color: inherit; cursor: pointer; text-align: left; }\n.panel {\n width: 380px; max-height: min(72vh, 640px); display: flex; flex-direction: column;\n border-radius: 14px; background: var(--panel); border: 1px solid var(--bd-px);\n box-shadow: 0 32px 80px rgba(0,0,0,0.6), 0 8px 24px rgba(0,0,0,0.4); overflow: hidden;\n}\n.hdr { padding: 11px 12px 10px 14px; border-bottom: 1px solid var(--bd); flex-shrink: 0; }\n.hdr-row { display: flex; align-items: center; gap: 9px; }\n.mark { width: 24px; height: 24px; border-radius: 6px; flex-shrink: 0; background: linear-gradient(135deg,#1A1A21,#0E0E12);\n border: 1px solid var(--bd-hi); display: flex; align-items: center; justify-content: center; }\n.hdr-title { font-size: 13px; font-weight: 600; white-space: nowrap; }\n.hdr-sub { font-size: 11px; color: var(--t3); margin-top: 6px; }\n.hdr-actions { margin-left: auto; display: flex; align-items: center; gap: 4px; }\n.chip { display: inline-flex; align-items: center; gap: 5px; height: 19px; padding: 0 7px; border-radius: 6, ; border-radius: 6px;\n font-size: 10.5px; font-weight: 600; white-space: nowrap; flex-shrink: 0; }\n.chip::before { content: \"\"; width: 4.5px; height: 4.5px; border-radius: 50%; background: currentColor; }\n.chip-applied { background: var(--pos-soft); border: 1px solid var(--pos-bd); color: var(--pos); }\n.chip-off { background: rgba(255,255,255,0.05); border: 1px solid var(--bd-hi); color: var(--t3); }\n.chip-forced { background: var(--p-soft); border: 1px solid var(--p-bd); color: var(--p200); }\n.btn-ghost { height: 24px; padding: 0 9px; border-radius: 7px; border: 1px solid var(--bd-hi); color: var(--t2);\n font-size: 11px; font-weight: 600; white-space: nowrap; display: inline-flex; align-items: center; }\n.btn-icon { width: 24px; height: 24px; border-radius: 7px; display: inline-flex; align-items: center; justify-content: center; color: var(--t3); }\n.btn-icon:hover, .btn-ghost:hover { background: rgba(255,255,255,0.05); }\n.forced-bar { display: flex; align-items: center; gap: 8px; padding: 7px 14px; background: var(--p-soft);\n border-bottom: 1px solid var(--p-bd); flex-shrink: 0; color: var(--p200); }\n.forced-bar .txt { font-size: 11px; font-weight: 600; flex: 1; min-width: 0; }\n.forced-bar .reset { font-size: 11px; font-weight: 600; color: var(--t1); white-space: nowrap; }\n.tabs { display: flex; padding: 0 8px; border-bottom: 1px solid var(--bd); background: rgba(255,255,255,0.015); flex-shrink: 0; }\n.tab { display: inline-flex; align-items: center; gap: 6px; padding: 10px 9px 9px; font-size: 12px; font-weight: 600;\n color: var(--t3); white-space: nowrap; }\n.tab[data-on=\"true\"] { color: var(--t1); box-shadow: inset 0 -2px 0 var(--p400); }\n.tab .n { font-size: 10px; font-weight: 600; color: var(--t4); }\n.tab[data-on=\"true\"] .n { color: var(--p200); }\n.body { overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.ftr { display: flex; align-items: center; padding: 8px 14px; border-top: 1px solid var(--bd); background: var(--bg1); flex-shrink: 0; }\n.ftr .hide { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--t3); font-weight: 600; }\n.ftr .reset { margin-left: auto; font-size: 11px; color: var(--p200); font-weight: 600; white-space: nowrap; }\n.grp { display: flex; align-items: baseline; gap: 6px; padding: 10px 14px 5px; }\n.grp .l { font-size: 11px; font-weight: 600; color: var(--t3); }\n.grp .n { font-size: 10.5px; color: var(--t4); }\n.exp { border-bottom: 1px solid var(--bd); }\n.exp:last-child { border-bottom: 0; }\n.exp-head { display: flex; align-items: center; gap: 8px; padding: 9px 14px; width: 100%; }\n.exp-head[data-open=\"true\"] { background: rgba(255,255,255,0.02); }\n.exp-head .cv { color: var(--t4); display: inline-flex; }\n.exp-name { font-size: 12px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.exp-sub { font-size: 10.5px; color: var(--t3); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.pills { display:flex; flex-wrap:wrap; gap:4px; margin-top:5px; }\n.rule-pill { font-size:9.5px; color:var(--t3); border:1px solid var(--bd); border-radius:999px; padding:2px 6px; }\n.rule-pill[data-state=\"accepted\"], .rule-pill[data-state=\"forced\"] { color:var(--pos); border-color:var(--pos-bd); }\n.rule-pill[data-state=\"rejected\"], .rule-pill[data-state=\"outside traffic %\"], .rule-pill[data-state=\"not running\"], .rule-pill[data-state=\"excluded by overlap\"] { color:var(--neg); border-color:var(--neg-bd); }\n.filters { display:flex; gap:6px; padding:8px 12px; border-bottom:1px solid var(--bd); flex-wrap:wrap; }\n.filters select,.filters input { background:var(--inset); color:var(--t2); border:1px solid var(--bd); border-radius:7px; height:28px; padding:0 8px; font-size:10.5px; }\n.filters input { flex:1; min-width:110px; }\n.cond-group { font-size:10px; text-transform:uppercase; letter-spacing:.05em; color:var(--t4); margin-top:10px; }\n.exp-main { flex: 1; min-width: 0; }\n.exp-detail { padding: 0 14px 11px 33px; }\n.cond { padding: 5px 0; }\n.cond-row { display: flex; align-items: center; gap: 8px; }\n.cond-dot { width: 16px; height: 16px; border-radius: 50%; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; }\n.cond-text { font-size: 11.5px; flex: 1; min-width: 0; }\n.cond-state { font-size: 10.5px; font-weight: 600; flex-shrink: 0; }\n.cond-detail { font-size: 10.5px; color: var(--t3); margin: 3px 0 0 24px; }\n.codeblk { margin: 6px 0 2px 24px; border-radius: 8px; background: var(--inset); border: 1px solid var(--bd); overflow: hidden; }\n.codeblk-head { display: flex; align-items: center; gap: 6px; padding: 5px 9px; width: 100%; color: var(--t3); }\n.codeblk-head .t { font-size: 10.5px; font-weight: 600; }\n.codeblk-head .cv { margin-left: auto; color: var(--t4); display: inline-flex; }\n.codeblk pre { padding: 8px 10px; border-top: 1px solid var(--bd);\n font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace; font-size: 10.5px; line-height: 1.6;\n color: var(--t2); white-space: pre-wrap; word-break: break-word; }\n.mono { font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace; }\n.act-btn { margin-top: 8px; height: 26px; padding: 0 11px; border-radius: 7px; display: inline-flex; align-items: center;\n background: var(--p-soft); border: 1px solid var(--p-bd); color: var(--p200); font-size: 11px; font-weight: 600; white-space: nowrap; }\n.varpick { display: flex; flex-direction: column; gap: 4px; margin: 4px 0 2px; }\n.varopt { display: flex; align-items: center; gap: 9px; padding: 7px 10px; border-radius: 8px; border: 1px solid var(--bd); width: 100%; }\n.varopt[data-on=\"true\"] { background: var(--p-soft); border-color: var(--p-bd); }\n.varopt .radio { width: 14px; height: 14px; border-radius: 50%; flex-shrink: 0; border: 1.5px solid var(--t4); }\n.varopt[data-on=\"true\"] .radio { border: 4.5px solid var(--p400); background: #fff; }\n.varopt .nm { font-size: 11.5px; font-weight: 600; color: var(--t2); flex: 1; }\n.varopt[data-on=\"true\"] .nm { color: var(--t1); }\n.varopt .note { font-size: 10.5px; color: var(--t4); white-space: nowrap; }\n.varopt[data-on=\"true\"] .note { color: var(--p200); }\n.note-line { font-size: 10.5px; color: var(--t3); margin-top: 7px; line-height: 1.5; }\n.sumline { display: flex; align-items: center; gap: 7px; padding: 10px 14px 4px; font-size: 11.5px; color: var(--t2); }\n.live { display: flex; align-items: center; gap: 7px; padding: 9px 14px; border-bottom: 1px solid var(--bd); }\n.live .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--pos); box-shadow: 0 0 6px var(--pos); }\n.live .t { font-size: 11px; color: var(--t3); }\n.live .clear { margin-left: auto; font-size: 11px; color: var(--t4); font-weight: 600; }\n.ev { padding: 8px 14px; border-bottom: 1px solid var(--bd); }\n.ev:last-child { border-bottom: 0; }\n.ev[data-dup=\"true\"] { background: rgba(245,158,11,0.05); box-shadow: inset 2px 0 0 var(--warn); }\n.ev-row { display: flex; align-items: center; gap: 8px; }\n.ev-t { font-size: 10.5px; color: var(--t4); width: 48px; flex-shrink: 0; }\n.ev-type { display: inline-flex; align-items: center; height: 18px; padding: 0 7px; border-radius: 5px; flex-shrink: 0;\n font-size: 10px; font-weight: 600; white-space: nowrap; }\n.ev-label { font-size: 11.5px; flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.ev-val { font-size: 11.5px; font-weight: 600; flex-shrink: 0; }\n.qatag { height: 16px; padding: 0 5px; border-radius: 5px; background: var(--p-soft); border: 1px solid var(--p-bd);\n color: var(--p200); font-size: 9.5px; font-weight: 600; display: inline-flex; align-items: center; flex-shrink: 0; }\n.ev-dup { display: flex; align-items: center; gap: 6px; margin: 5px 0 0 56px; font-size: 10.5px; color: var(--warn); }\n.empty { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 36px 32px 40px; }\n.empty .icon { width: 36px; height: 36px; border-radius: 10px; background: var(--raised); border: 1px solid var(--bd);\n display: flex; align-items: center; justify-content: center; color: var(--t3); }\n.empty .h { font-size: 12.5px; font-weight: 600; margin-top: 12px; }\n.empty .s { font-size: 11px; color: var(--t3); margin-top: 5px; line-height: 1.55; max-width: 250px; }\n.tx { padding: 12px 14px; }\n.tx-card { border-radius: 10px; background: var(--raised); border: 1px solid var(--bd); padding: 11px 12px; }\n.tx-card .row { display: flex; align-items: center; gap: 8px; }\n.tx-card .h { font-size: 12.5px; font-weight: 600; flex: 1; }\n.tx-card .meta { font-size: 10.5px; color: var(--t3); margin-top: 5px; }\n.tx-card .attr { display: flex; align-items: center; gap: 7px; margin-top: 9px; padding-top: 9px; border-top: 1px solid var(--bd); font-size: 12px; }\n.attr-row { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--bd); }\n.attr-row:last-child { border-bottom: 0; }\n.attr-row .nm { font-size: 11.5px; color: var(--t2); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.attr-row .vr { font-size: 11.5px; font-weight: 600; color: var(--p200); white-space: nowrap; }\n.attr-row .vr[data-none=\"true\"] { color: var(--t4); }\n.receipt { display: flex; align-items: center; gap: 8px; padding: 9px 12px; border-radius: 9px; margin-top: 10px; }\n.receipt.ok { background: var(--pos-soft); border: 1px solid var(--pos-bd); }\n.receipt.pending { background: var(--warn-soft); border: 1px solid var(--warn-bd); }\n.receipt .h { font-size: 11.5px; font-weight: 600; }\n.receipt.ok .h { color: var(--pos); }\n.receipt.pending .h { color: var(--warn); }\n.receipt .s { font-size: 10.5px; color: var(--t3); margin-top: 2px; }\n.infonote { display: flex; gap: 8px; padding: 9px 12px; border-radius: 9px; margin-top: 10px;\n background: var(--p-soft); border: 1px solid var(--p-bd); }\n.infonote .t { font-size: 10.5px; color: var(--t2); line-height: 1.55; }\n.pill { display: inline-flex; align-items: center; gap: 8px; height: 38px; padding: 0 13px 0 9px; border-radius: 999px;\n background: rgba(10,10,14,0.85); border: 1px solid var(--bd-px); backdrop-filter: blur(14px);\n box-shadow: 0 16px 40px rgba(0,0,0,0.5); }\n.pill .t { font-size: 12px; font-weight: 600; white-space: nowrap; }\n@media (max-width: 560px) {\n .root { right: 0; bottom: 0; left: 0; }\n .panel { width: 100%; max-height: 78vh; border-radius: 18px 18px 0 0; border-bottom: 0; }\n .exp-head { padding: 13px 16px; min-height: 44px; }\n .tab { padding: 12px 10px 11px; font-size: 12.5px; }\n .root .pill-dock { position: absolute; right: 16px; bottom: 16px; }\n}\n@media (prefers-reduced-motion: no-preference) {\n .panel[data-enter=\"true\"] { animation: qa-in 220ms cubic-bezier(0.22, 1, 0.36, 1); }\n @keyframes qa-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }\n}\n`;\n\n/* ── renderers ──────────────────────────────────────────────────────────── */\nfunction chip(label: string, tone: \"applied\" | \"off\" | \"forced\"): string {\n return `<span class=\"chip chip-${tone}\">${esc(label)}</span>`;\n}\n\nfunction condRow(\n expId: string,\n c: QaExperimentModel[\"conditions\"][number],\n codeOpen: Set<string>,\n): string {\n const m = {\n pass: { d: P.check, cls: \"var(--pos)\", bg: \"var(--pos-soft)\", label: \"Passed\" },\n fail: { d: P.x, cls: \"var(--neg)\", bg: \"var(--neg-soft)\", label: \"Failed\" },\n skip: { d: P.minus, cls: \"var(--t4)\", bg: \"rgba(255,255,255,0.05)\", label: \"Skipped\" },\n error: { d: P.alert, cls: \"var(--neg)\", bg: \"var(--neg-soft)\", label: \"Error\" },\n }[c.state];\n const key = `${expId}:${c.id}`;\n const detail = c.state === \"skip\" ? humanizeSkipDetail(c.detail) : c.detail;\n let codeBlock = \"\";\n if (c.rawCode) {\n const open = codeOpen.has(key);\n codeBlock = `\n <div class=\"codeblk\">\n <button class=\"codeblk-head\" data-action=\"toggle-code\" data-key=\"${esc(key)}\">\n ${svg(P.code, 10.5)}<span class=\"t\">Custom JS trigger — raw code</span>\n <span class=\"cv\">${svg(open ? P.chevUp : P.chevD, 10)}</span>\n </button>\n ${open ? `<pre>${esc(c.rawCode)}</pre>` : \"\"}\n </div>`;\n }\n return `\n <div class=\"cond\">\n <div class=\"cond-row\">\n <span class=\"cond-dot\" style=\"background:${m.bg};color:${m.cls}\">${svg(m.d, 9, 2.4)}</span>\n <span class=\"cond-text\">${esc(c.text)}</span>\n <span class=\"cond-state\" style=\"color:${m.cls}\">${m.label}</span>\n </div>\n ${detail ? `<div class=\"cond-detail\">${esc(detail)}</div>` : \"\"}\n ${codeBlock}\n </div>`;\n}\n\nfunction experimentRow(e: QaExperimentModel, view: ViewState): string {\n const open = view.expanded.has(e.id);\n const chipHtml = e.forced\n ? chip(\"Forced\", \"forced\")\n : e.applied\n ? chip(\"Applied\", \"applied\")\n : chip(\"Not applied\", \"off\");\n let detail = \"\";\n if (open) {\n let forceControls = \"\";\n if (e.forced) {\n const options = e.variations\n .map(\n (v) => `\n <button class=\"varopt\" data-on=\"${v.isCurrent}\" data-action=\"pick-variation\" data-exp=\"${esc(e.id)}\" data-var=\"${esc(v.id)}\">\n <span class=\"radio\"></span>\n <span class=\"nm\">${esc(v.name)}</span>\n <span class=\"note\">${v.isCurrent ? \"Forced now\" : v.isReal ? \"Your real assignment\" : \"\"}</span>\n </button>`,\n )\n .join(\"\");\n forceControls = `\n <div class=\"varpick\">${options}</div>\n <div class=\"note-line\">Forcing only changes what you see — it never writes to results.</div>\n <button class=\"act-btn\" data-action=\"reset-force\" data-exp=\"${esc(e.id)}\">Reset to real assignment</button>`;\n } else {\n forceControls =\n e.variations.length > 1\n ? `<button class=\"act-btn\" data-action=\"open-force\" data-exp=\"${esc(e.id)}\">Force this variation</button>`\n : \"\";\n }\n const pages = e.conditions.filter((c) => c.group === \"pages\").map((c) => condRow(e.id, c, view.codeOpen)).join(\"\");\n const audience = e.conditions.filter((c) => c.group === \"audience\").map((c) => condRow(e.id, c, view.codeOpen)).join(\"\");\n detail = `<div class=\"exp-detail\">\n <div class=\"cond-group\">Pages · Trigger</div>${pages || `<div class=\"cond-detail\">${e.triggerPill === \"not evaluated\" ? \"Not evaluated\" : e.triggerPill === \"accepted\" ? \"Matched on this page (rule detail unavailable)\" : e.triggerPill === \"rejected\" ? \"Did not match this page (rule detail unavailable)\" : \"All pages\"}</div>`}\n <div class=\"cond-group\">Audience · Segment</div>${audience || `<div class=\"cond-detail\">${e.segmentPill === \"not evaluated\" ? \"Not evaluated\" : e.segmentPill === \"accepted\" ? \"Matched for this visitor (rule detail unavailable)\" : e.segmentPill === \"rejected\" ? \"Did not match this visitor (rule detail unavailable)\" : \"All visitors\"}</div>`}\n <div class=\"cond-group\">Display frequency</div><div class=\"cond-detail\">${esc(e.displayFrequencyPill)}</div>\n ${forceControls}</div>`;\n }\n return `\n <div class=\"exp\">\n <button class=\"exp-head\" data-open=\"${open}\" data-action=\"toggle-exp\" data-exp=\"${esc(e.id)}\">\n <span class=\"cv\">${svg(open ? P.chevD : P.chevR, 11)}</span>\n <span class=\"exp-main\">\n <span class=\"exp-name\" style=\"display:block\">${esc(e.name)}</span>\n <span class=\"exp-sub\" style=\"display:block\">${esc(e.subline)}</span>\n <span class=\"pills\">\n <span class=\"rule-pill\" data-state=\"${esc(e.triggerPill)}\">Trigger: ${esc(e.triggerPill)}</span>\n <span class=\"rule-pill\" data-state=\"${esc(e.segmentPill)}\">Segment: ${esc(e.segmentPill)}</span>\n <span class=\"rule-pill\" data-state=\"${esc(e.displayFrequencyPill)}\">Display: ${esc(e.displayFrequencyPill)}</span>\n </span>\n </span>\n ${chipHtml}\n </button>\n ${detail}\n </div>`;\n}\n\nfunction experimentsBody(state: QaAssistantState, view: ViewState): string {\n const query = view.search.trim().toLowerCase();\n const visible = state.experiments.filter((e) => {\n const pageOk = view.pageFilter === \"all\" || (view.pageFilter === \"on\" ? e.triggerPill === \"accepted\" || e.triggerPill === \"all pages\" : e.triggerPill === \"rejected\");\n const statusOk = view.statusFilter === \"all\" || (view.statusFilter === \"forced\" ? e.forced : view.statusFilter === \"accepted\" ? e.applied && !e.forced : !e.applied && !e.forced);\n return pageOk && statusOk && (!query || e.name.toLowerCase().includes(query) || e.id.toLowerCase().includes(query));\n });\n const applied = visible.filter((e) => e.applied || e.forced);\n const rejected = visible.filter((e) => !e.applied && !e.forced);\n const filters = `<div class=\"filters\">\n <select data-action=\"page-filter\"><option value=\"all\">On or off this page</option><option value=\"on\" ${view.pageFilter === \"on\" ? \"selected\" : \"\"}>On this page</option><option value=\"off\" ${view.pageFilter === \"off\" ? \"selected\" : \"\"}>Not on this page</option></select>\n <select data-action=\"status-filter\"><option value=\"all\">All</option><option value=\"accepted\" ${view.statusFilter === \"accepted\" ? \"selected\" : \"\"}>Applied</option><option value=\"rejected\" ${view.statusFilter === \"rejected\" ? \"selected\" : \"\"}>Not applied</option><option value=\"forced\" ${view.statusFilter === \"forced\" ? \"selected\" : \"\"}>Forced</option></select>\n <input data-action=\"search\" aria-label=\"Search campaigns\" placeholder=\"Search name or ID\" value=\"${esc(view.search)}\">\n </div>`;\n // Summary lines describe the whole campaign set, never the filtered view —\n // a filter that hides rejected rows must not make \"all apply\" claims.\n const totalRejected = state.experiments.filter((e) => !e.applied && !e.forced).length;\n let summary = \"\";\n if (state.experiments.length > 0 && totalRejected === 0) {\n summary = `<div class=\"sumline\" style=\"color:var(--t2)\"><span style=\"color:var(--pos);display:inline-flex\">${svg(P.check, 12, 2.2)}</span>All ${state.experiments.length} experiment${state.experiments.length === 1 ? \"\" : \"s\"} apply on this page.</div>`;\n } else if (state.experiments.length > 0 && totalRejected === state.experiments.length) {\n summary = `<div class=\"sumline\" style=\"color:var(--t2)\"><span style=\"color:var(--warn);display:inline-flex\">${svg(P.alert, 12)}</span>Nothing runs on this page — every experiment was rejected.</div>`;\n } else if (state.experiments.length === 0) {\n return filters + `<div class=\"empty\">\n <div class=\"icon\">${svg(P.target, 16)}</div>\n <div class=\"h\">No experiments on this shop yet</div>\n <div class=\"s\">Running and draft experiments show up here when the QA link opens a page they could target.</div>\n </div>`;\n }\n const appliedHtml = applied.length\n ? `<div class=\"grp\"><span class=\"l\">Applied</span><span class=\"n\">${applied.length}</span></div>` +\n applied.map((e) => experimentRow(e, view)).join(\"\")\n : \"\";\n const rejectedHtml = rejected.length\n ? `<div class=\"grp\"><span class=\"l\">Not applied</span><span class=\"n\">${rejected.length}</span></div>` +\n rejected.map((e) => experimentRow(e, view)).join(\"\")\n : \"\";\n return filters + summary + appliedHtml + rejectedHtml;\n}\n\nfunction eventRow(ev: QaEventModel): string {\n const tones: Record<QaEventModel[\"type\"], { fg: string; bg: string; bd: string; label: string }> = {\n exposure: { fg: \"var(--p200)\", bg: \"var(--p-soft)\", bd: \"var(--p-bd)\", label: \"Exposure\" },\n goal: { fg: \"var(--info)\", bg: \"var(--info-soft)\", bd: \"var(--info-bd)\", label: \"Goal\" },\n revenue: { fg: \"var(--pos)\", bg: \"var(--pos-soft)\", bd: \"var(--pos-bd)\", label: \"Revenue\" },\n pageview: { fg: \"var(--t3)\", bg: \"rgba(255,255,255,0.05)\", bd: \"var(--bd-hi)\", label: \"Pageview\" },\n };\n const t = tones[ev.type];\n const dup = ev.duplicateOf != null;\n return `\n <div class=\"ev\" data-dup=\"${dup}\">\n <div class=\"ev-row\">\n <span class=\"ev-t\">${formatTime(ev.at)}</span>\n <span class=\"ev-type\" style=\"color:${t.fg};background:${t.bg};border:1px solid ${t.bd}\">${t.label}</span>\n <span class=\"ev-label\">${esc(ev.label)}</span>\n ${ev.value ? `<span class=\"ev-val\">${esc(ev.value)}</span>` : \"\"}\n <span class=\"qatag\">QA</span>\n </div>\n ${dup ? `<div class=\"ev-dup\">${svg(P.alert, 11)}Fired twice within a second — likely a double-bound click handler</div>` : \"\"}\n </div>`;\n}\n\nfunction eventsBody(state: QaAssistantState): string {\n const live = `\n <div class=\"live\">\n <span class=\"dot\"></span>\n <span class=\"t\">Live · this browser only · every event is QA-tagged</span>\n <button class=\"clear\" data-action=\"clear-events\">Clear</button>\n </div>`;\n if (state.events.length === 0) {\n return (\n live +\n `<div class=\"empty\">\n <div class=\"icon\">${svg(P.activity, 16)}</div>\n <div class=\"h\">No events yet</div>\n <div class=\"s\">Click around the page — exposures, goals and revenue show up here the moment they fire.</div>\n </div>`\n );\n }\n const rows = [...state.events]\n .sort((a, b) => b.at - a.at)\n .slice(0, 80)\n .map(eventRow)\n .join(\"\");\n return live + rows;\n}\n\nfunction attributionRows(list: Array<{ experimentName: string; variationName: string | null }>): string {\n if (!list.length) return \"\";\n return `\n <div class=\"grp\"><span class=\"l\">Attribution by experiment</span></div>\n <div style=\"padding:0 2px\">\n ${list\n .map(\n (a) => `\n <div class=\"attr-row\">\n <span class=\"nm\">${esc(a.experimentName)}</span>\n <span class=\"vr\" data-none=\"${a.variationName == null}\">${esc(a.variationName ?? \"Not in experiment\")}</span>\n </div>`,\n )\n .join(\"\")}\n </div>`;\n}\n\nfunction transactionsBody(tx: QaTransactionsModel): string {\n if (tx.kind === \"unsupported\") return \"\";\n if (tx.kind === \"shopify\") {\n const head = tx.cartStamped\n ? `Your cart is stamped with <span style=\"color:var(--p200)\">${esc(tx.variationName ?? \"your variation\")}</span>`\n : \"No cart stamp yet — add something to the cart first\";\n const meta = tx.stampedAt ? `Cart attribute written ${formatTime(tx.stampedAt)}` : \"The stamp is written when the cart updates\";\n return `\n <div class=\"tx\">\n <div class=\"tx-card\">\n <div class=\"row\"><span style=\"color:var(--p200);display:inline-flex\">${svg(P.checkSquare, 14)}</span><span class=\"h\">${head}</span></div>\n <div class=\"meta\">${esc(meta)}</div>\n </div>\n ${attributionRows(tx.attribution)}\n <div class=\"infonote\">\n <span style=\"color:var(--p200);display:inline-flex;margin-top:1px\">${svg(P.help, 13)}</span>\n <span class=\"t\">Shopify’s checkout runs in a sandbox we can’t see into. Your final order confirmation appears in the dashboard once Shopify sends the order back.</span>\n </div>\n </div>`;\n }\n const receipt =\n tx.serverReceipt === \"confirmed\"\n ? `<div class=\"receipt ok\">${svg(P.check, 13, 2.4)}<div><div class=\"h\">Server receipt · Confirmed</div><div class=\"s\">Our backend received this order.</div></div></div>`\n : `<div class=\"receipt pending\">${svg(P.clock, 13)}<div><div class=\"h\">Server receipt · Pending…</div><div class=\"s\">Waiting for our backend to receive this order.</div></div></div>`;\n const orderHead = tx.orderNumber\n ? `Order ${esc(tx.orderNumber)}`\n : \"Waiting for your test checkout\";\n return `\n <div class=\"tx\">\n <div class=\"tx-card\">\n <div class=\"row\"><span style=\"color:var(--t3);display:inline-flex\">${svg(P.store, 14)}</span><span class=\"h\">${orderHead}</span>${tx.orderNumber ? chip(\"Detected\", \"applied\") : \"\"}</div>\n <div class=\"meta\">${tx.orderNumber ? \"Your test checkout on this browser\" : \"Complete a checkout in this browser and it shows up here\"}</div>\n </div>\n ${attributionRows(tx.attribution)}\n ${tx.orderNumber ? receipt : \"\"}\n </div>`;\n}\n\n/* ── shell ──────────────────────────────────────────────────────────────── */\nfunction buildTabs(state: QaAssistantState): Array<{ id: TabId; label: string; count: number }> {\n const hideTx = state.transactions.kind === \"unsupported\";\n return [\n { id: \"exp\", label: \"Campaigns\", count: state.experiments.length },\n { id: \"ev\", label: \"Events\", count: state.events.length },\n ...(hideTx ? [] : [{ id: \"tx\" as TabId, label: \"Transactions\", count: state.transactions.kind === \"order\" && state.transactions.orderNumber ? 1 : 0 }]),\n ];\n}\n\nfunction tabsHtml(tabs: Array<{ id: TabId; label: string; count: number }>, activeTab: TabId): string {\n return tabs\n .map((t) => `<button class=\"tab\" data-on=\"${t.id === activeTab}\" data-action=\"tab\" data-tab=\"${t.id}\">${t.label}<span class=\"n\">${t.count}</span></button>`)\n .join(\"\");\n}\n\nfunction panelHtml(state: QaAssistantState, view: ViewState): string {\n const hideTx = state.transactions.kind === \"unsupported\";\n const tabs = buildTabs(state);\n const activeTab: TabId = hideTx && view.tab === \"tx\" ? \"exp\" : view.tab;\n const body =\n activeTab === \"exp\"\n ? experimentsBody(state, view)\n : activeTab === \"ev\"\n ? eventsBody(state)\n : transactionsBody(state.transactions);\n return `\n <div class=\"panel\" data-enter=\"${view.firstMount}\" role=\"dialog\" aria-label=\"Apex QA assistant\">\n <div class=\"hdr\">\n <div class=\"hdr-row\">\n <span class=\"mark\">${operatorMarkSvg(14)}</span>\n <span class=\"hdr-title\">Apex QA</span>\n ${chip(\"QA mode\", \"forced\")}\n <span class=\"hdr-actions\">\n <button class=\"btn-ghost\" data-action=\"exit-qa\">Exit QA</button>\n <button class=\"btn-icon\" data-action=\"minimize\" title=\"Minimize\" aria-label=\"Minimize\">${svg(P.minus, 13)}</button>\n </span>\n </div>\n <div class=\"hdr-sub\">You’re previewing as QA — nothing here counts toward results.</div>\n </div>\n <div data-region=\"forced\">${forcedBarHtml(state)}</div>\n <div class=\"tabs\" data-region=\"tabs\">\n ${tabsHtml(tabs, activeTab)}\n </div>\n <div class=\"body\">${body}</div>\n <div class=\"ftr\">\n <button class=\"hide\" data-action=\"minimize\">${svg(P.eyeOff, 12)}Hide panel</button>\n <button class=\"reset\" data-action=\"reset-force\">Reset to real assignment</button>\n </div>\n </div>`;\n}\n\nfunction forcedBarHtml(state: QaAssistantState): string {\n return state.forcedSummary\n ? `<div class=\"forced-bar\">${svg(P.bolt, 12)}<span class=\"txt\">${esc(state.forcedSummary)}</span><button class=\"reset\" data-action=\"reset-force\">Reset</button></div>`\n : \"\";\n}\n\nfunction pillHtml(state: QaAssistantState): string {\n const n = state.experiments.length;\n return `\n <button class=\"pill\" data-action=\"restore\" aria-label=\"Restore Apex QA panel\">\n <span class=\"mark\" style=\"width:22px;height:22px\">${operatorMarkSvg(13)}</span>\n <span class=\"t\">Apex QA · ${n} experiment${n === 1 ? \"\" : \"s\"}</span>\n ${svg(P.chevUp, 12)}\n </button>`;\n}\n\nfunction operatorMarkSvg(size: number): string {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" fill=\"none\" style=\"flex-shrink:0\">\n <defs><mask id=\"qa-op-cut\"><rect width=\"120\" height=\"120\" fill=\"#fff\"/><rect x=\"0\" y=\"68\" width=\"120\" height=\"6\" fill=\"#000\"/></mask></defs>\n <path d=\"M60 14 C92 14 106 36 106 60 C106 84 92 106 60 106 C28 106 14 84 14 60 C14 36 28 14 60 14 Z M60 38 C46 38 38 48 38 60 C38 72 46 82 60 82 C74 82 82 72 82 60 C82 48 74 38 60 38 Z\" fill=\"#fff\" fill-rule=\"evenodd\" mask=\"url(#qa-op-cut)\"/>\n <rect x=\"92\" y=\"92\" width=\"14\" height=\"14\" rx=\"2\" fill=\"#5B29FF\"/>\n </svg>`;\n}\n\n/* ── controller ─────────────────────────────────────────────────────────── */\nexport type QaAssistantView = { destroy(): void };\n\nexport function mountQaAssistantView(store: QaAssistantStore): QaAssistantView {\n const existing = document.getElementById(QA_ASSISTANT_HOST_ID);\n if (existing) existing.remove();\n\n const host = document.createElement(\"div\");\n host.id = QA_ASSISTANT_HOST_ID;\n const shadow = host.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = CSS;\n const root = document.createElement(\"div\");\n root.className = \"root\";\n shadow.append(style, root);\n document.body.appendChild(host);\n\n let minimized = false;\n try {\n minimized = sessionStorage.getItem(MINIMIZED_KEY) === \"1\";\n } catch {\n // storage unavailable — start expanded\n }\n const view: ViewState = {\n tab: \"exp\", minimized, expanded: new Set(), codeOpen: new Set(),\n pageFilter: \"all\", statusFilter: \"all\", search: \"\", firstMount: true,\n };\n // Events cleared locally: hide everything at or before this timestamp.\n let clearedBefore = 0;\n\n let mounted = false;\n let renderTimer: ReturnType<typeof setTimeout> | null = null;\n let lastSignature = \"\";\n let composingSearch = false;\n\n const currentState = (): QaAssistantState => {\n const raw = store.getState();\n return clearedBefore\n ? { ...raw, events: raw.events.filter((e) => e.at > clearedBefore) }\n : raw;\n };\n\n const signature = (state: QaAssistantState): string => JSON.stringify({\n experiments: state.experiments,\n forcedSummary: state.forcedSummary,\n transactions: state.transactions,\n events: view.tab === \"ev\" ? state.events : undefined,\n view: [view.tab, view.minimized, [...view.expanded], [...view.codeOpen], view.pageFilter, view.statusFilter, view.search],\n });\n\n const render = (immediate = false) => {\n if (!immediate) {\n if (renderTimer) clearTimeout(renderTimer);\n renderTimer = setTimeout(() => render(true), 100);\n return;\n }\n if (renderTimer) clearTimeout(renderTimer);\n renderTimer = null;\n if (composingSearch) {\n renderTimer = setTimeout(() => render(true), 100);\n return;\n }\n const state = currentState();\n const nextSignature = signature(state);\n if (mounted && nextSignature === lastSignature) {\n const eventsBadge = root.querySelector<HTMLElement>('.tab[data-tab=\"ev\"] .n');\n if (eventsBadge) eventsBadge.textContent = String(state.events.length);\n return;\n }\n lastSignature = nextSignature;\n if (!mounted || view.minimized || !root.querySelector(\".panel\")) {\n root.innerHTML = view.minimized ? pillHtml(state) : panelHtml(state, view);\n mounted = true;\n view.firstMount = false;\n return;\n }\n const body = root.querySelector<HTMLElement>(\".body\");\n const scrollTop = body?.scrollTop ?? 0;\n const focused = shadow.activeElement as HTMLInputElement | null;\n const focusedAction = focused?.dataset.action;\n const selection = focusedAction === \"search\" && focused\n ? [focused.selectionStart, focused.selectionEnd] as const\n : null;\n const activeTab = state.transactions.kind === \"unsupported\" && view.tab === \"tx\" ? \"exp\" : view.tab;\n if (body) {\n body.innerHTML = activeTab === \"exp\" ? experimentsBody(state, view) : activeTab === \"ev\" ? eventsBody(state) : transactionsBody(state.transactions);\n body.scrollTop = scrollTop;\n if (focusedAction) {\n const replacement = body.querySelector<HTMLInputElement>(`[data-action=\"${focusedAction}\"]`);\n replacement?.focus();\n if (replacement && selection?.[0] != null && selection[1] != null) replacement.setSelectionRange(selection[0], selection[1]);\n }\n }\n const forced = root.querySelector<HTMLElement>('[data-region=\"forced\"]');\n if (forced) forced.innerHTML = forcedBarHtml(state);\n const tabsRegion = root.querySelector<HTMLElement>('[data-region=\"tabs\"]');\n if (tabsRegion) {\n tabsRegion.innerHTML = tabsHtml(buildTabs(state), activeTab);\n }\n };\n\n root.addEventListener(\"click\", (event) => {\n const target = (event.target as HTMLElement | null)?.closest?.(\"[data-action]\") as HTMLElement | null;\n if (!target) return;\n const action = target.dataset.action;\n const expId = target.dataset.exp;\n if (action === \"minimize\") {\n view.minimized = true;\n try {\n sessionStorage.setItem(MINIMIZED_KEY, \"1\");\n } catch { /* ignore */ }\n } else if (action === \"restore\") {\n view.minimized = false;\n try {\n sessionStorage.removeItem(MINIMIZED_KEY);\n } catch { /* ignore */ }\n } else if (action === \"tab\") {\n view.tab = (target.dataset.tab as TabId) ?? \"exp\";\n } else if (action === \"toggle-exp\" && expId) {\n if (view.expanded.has(expId)) view.expanded.delete(expId);\n else view.expanded.add(expId);\n } else if (action === \"toggle-code\") {\n const key = target.dataset.key ?? \"\";\n if (view.codeOpen.has(key)) view.codeOpen.delete(key);\n else view.codeOpen.add(key);\n } else if (action === \"open-force\" && expId) {\n // Entering force mode pins the current variation as forced, which flips\n // the row into the picker so QA can switch or reset from there.\n const experiment = store.getState().experiments.find((e) => e.id === expId);\n const current = experiment?.variations.find((v) => v.isCurrent) ?? experiment?.variations[0];\n if (experiment && current) store.forceVariation(experiment.id, current.id);\n view.expanded.add(expId);\n } else if (action === \"pick-variation\" && expId) {\n const varId = target.dataset.var;\n if (varId) store.forceVariation(expId, varId);\n } else if (action === \"reset-force\") {\n store.resetForce(expId || undefined);\n } else if (action === \"exit-qa\") {\n store.exitQa();\n host.remove();\n return;\n } else if (action === \"clear-events\") {\n clearedBefore = Date.now();\n }\n render(true);\n });\n\n root.addEventListener(\"change\", (event) => {\n const target = event.target as HTMLInputElement | HTMLSelectElement;\n if (target.dataset.action === \"page-filter\") view.pageFilter = target.value as ViewState[\"pageFilter\"];\n else if (target.dataset.action === \"status-filter\") view.statusFilter = target.value as ViewState[\"statusFilter\"];\n else if (target.dataset.action === \"search\") view.search = target.value;\n else return;\n render(true);\n });\n\n // Keep in-progress search text in ViewState on every keystroke — a\n // store-driven refresh between \"input\" and \"change\" would otherwise rebuild\n // the field from a stale value and wipe the user's query.\n root.addEventListener(\"input\", (event) => {\n const target = event.target as HTMLInputElement;\n if (target.dataset?.action !== \"search\") return;\n view.search = target.value;\n if (composingSearch) return;\n render(true);\n });\n\n root.addEventListener(\"compositionstart\", (event) => {\n const target = event.target as HTMLInputElement;\n if (target.dataset?.action === \"search\") composingSearch = true;\n });\n\n root.addEventListener(\"compositionend\", (event) => {\n const target = event.target as HTMLInputElement;\n if (target.dataset?.action !== \"search\") return;\n composingSearch = false;\n view.search = target.value;\n render(true);\n });\n\n const unsubscribe = store.subscribe(() => {\n render();\n });\n\n render(true);\n\n return {\n destroy() {\n unsubscribe();\n if (renderTimer) clearTimeout(renderTimer);\n host.remove();\n },\n };\n}\n","import { createQaAssistantStore, type QaAssistantStore } from \"./qa-assistant-state\";\nimport { mountQaAssistantView, type QaAssistantView } from \"./qa-assistant-view\";\n\nlet qaAssistantStore: QaAssistantStore | null = null;\nlet qaAssistantView: QaAssistantView | null = null;\n\n/**\n * Mounts the QA Assistant panel (store + shadow-DOM view). QA-only module:\n * live/heatmap builds stub this file out entirely (see build.mjs), and the\n * caller in index.ts additionally gates on QA mode.\n */\nexport function mountQaAssistant(): QaAssistantView | null {\n if (typeof document === \"undefined\") return null;\n qaAssistantStore = qaAssistantStore ?? createQaAssistantStore();\n if (qaAssistantView) return qaAssistantView;\n\n const mount = () => {\n if (!qaAssistantStore) return;\n qaAssistantView = mountQaAssistantView(qaAssistantStore);\n };\n if (document.body) {\n mount();\n return qaAssistantView;\n }\n // Body not parsed yet — mounting is scheduled, which still counts as\n // available (callers use null to fall back to the legacy toolbar).\n document.addEventListener(\"DOMContentLoaded\", mount, { once: true });\n return {\n destroy() {\n document.removeEventListener(\"DOMContentLoaded\", mount);\n qaAssistantView?.destroy();\n qaAssistantView = null;\n },\n };\n}\n\nexport function getQaAssistantStore(): QaAssistantStore {\n qaAssistantStore = qaAssistantStore ?? createQaAssistantStore();\n return qaAssistantStore;\n}\n","import { cleanUrl, onPageEnter, onPageExit } from \"./analytics\";\nimport { applyAntiFlicker, removeAntiFlicker } from \"./antiflicker\";\nimport {\n clearPersistedAssignments,\n findPersistedVariation,\n persistAssignmentForExperiment,\n prunePersistedAssignments,\n removePersistedAssignmentsForExperiments,\n __assignmentStoreInternals,\n} from \"./assignment-store\";\nimport { cleanupBucketingStorage } from \"./bucketing-cleanup\";\nimport { chooseVariation, inTrafficAllocation } from \"./bucket\";\nimport { getCwvMetrics, markCwvReveal, startCwvMeasurement, waitForCwvMetrics } from \"./cwv\";\nimport {\n clearBrowserGroupStickyStore,\n resolveExclusionGroups,\n type ExclusionGroupDecision,\n} from \"./exclusion-groups\";\nimport {\n applyCommercePrice,\n isCommercePriceWorkPending,\n cleanupCommercePrice,\n hasCommercePriceState,\n COMMERCE_PRICE_SELECTORS,\n isCommercePriceActive,\n isCommercePriceExposureEligible,\n notifyCommerceCartStampConfirmed,\n setCommercePriceExposureListener,\n} from \"./commerce-price\";\nimport {\n applyCommerceShipping,\n classifyShippingExposure,\n cleanupCommerceShipping,\n isShippingCartEligible,\n isShippingCartEligibilityConfirmed,\n} from \"./commerce-shipping\";\nimport { injectCss, injectExperimentCss, injectExternalCss, removeAllCss } from \"./css\";\nimport { configureDebug, debugLog, debugWarn, debugGroup, debugGroupEnd, isDebugEnabled } from \"./debug\";\nimport { observeDomChanges } from \"./dom-trigger\";\nimport { normalizeDataLayerEntry } from \"./data-layer-normalize\";\nimport { interceptEditorLaunch, isEditorDevicePreview } from \"./editor-bootstrap\";\nimport { cleanupGoals, setupGoals, triggerGoal, triggerGoalsForEvent } from \"./goals\";\nimport { isBot, isDuplicate, isIframe, isOptedOut, isQaMode, isScreenshotMode, parseForceParam, persistQaForce, exitQaMode, getQaSessionId } from \"./guards\";\nimport { adoptUserId, configureIdentityStorage, getEphemeralUserId, getUserId, hashToFloat, variationHashToFloat } from \"./hash\";\nimport { createBucketingHandoverPayload, handoverMintTimeoutMs, hasBucketingHandover, installBucketingHandover, readBucketingHandover } from \"./handover\";\nimport { revealAll } from \"./hideflicker\";\nimport { execJs, loadExternalJs, removeAllExternalJs, setJsPolicy } from \"./js\";\nimport { applyMutations, applyToElement, reassertNonStructuralMutations, resetAppliedMutations } from \"./mutate\";\nimport { registerMutedObserver, runMuted, unregisterMutedObserver } from \"./observer-mute\";\nimport { assignmentsHaveVisualWork, awaitHydration, hasMutationHold, holdMutations, releaseMutations, signalHydrated } from \"./hydration\";\nimport { trackAppliedMutation } from \"./reassert-sentinel\";\nimport { observeRouteChanges } from \"./router\";\nimport { buildExposureSignalContext } from \"./exposure-signals\";\nimport { buildPrerequisiteContext, evaluateProjectPrerequisite } from \"./prerequisites\";\nimport {\n buildCartAttributeEntries,\n buildSignedCartAttributeEntries,\n cannotRequestRequiredCommerceAuthorization,\n invalidateShopifyCartAttributeSync,\n syncShopifyCartAttributes,\n type CartAssignment,\n type CartAttributeEntry,\n type CartAttributeSyncInput,\n} from \"./shopify-cart\";\nimport { onShopifyCartMutation } from \"./shopify-cart-events\";\nimport {\n getPendingGiftChoices,\n noteCartSnapshotForGifts,\n selectGiftOption,\n syncGiftWithPurchase,\n type GiftSyncOptions,\n} from \"./commerce-gift\";\nimport { CART_DRAWER_OPEN_SIGNAL, installSurfaceSignals } from \"./surface-signals\";\nimport {\n assignmentSignature,\n canUseEmptyProjectProfile,\n computeUrlDiffNeeds,\n getBlankScreenMs,\n readPerfFlags,\n resolveActivationMode,\n resolvePlatform,\n resolveRouterMode,\n shouldReevaluateForUrlChange,\n} from \"./runtime\";\nimport type { PerfFlagState } from \"./runtime\";\nimport {\n buildTargetingAttributes,\n evaluateTargetingGatesDetailed,\n targetingHasJsTriggers,\n} from \"./targeting\";\nimport { createApexRuntimeTools, type ApexRuntimeTools } from \"./runtime-tools\";\nimport { Tracker } from \"./track\";\nimport {\n clearStoredSignals,\n configureSignalPersistenceAllowed,\n clearRuntimeSignal,\n getSignals as getStoredSignals,\n getSignalDiagnostics,\n rememberProduct,\n setCartSignals,\n setRuntimeSignal,\n setSearchSignal,\n setSignal as setStoredSignal,\n} from \"./signals\";\nimport {\n evaluateFlag as evaluateFlagFromExperiments,\n evaluateFlagAssignment as evaluateFlagAssignmentFromExperiments,\n evaluateFlagValue as evaluateFlagValueFromExperiments,\n} from \"./flags\";\nimport {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ActivationDiagnostics,\n ActivationGateDiagnostic,\n ConditionDiagnostic,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n DebugSettings,\n ExecutionMode,\n Experiment,\n ExperimentActivationDiagnostic,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTargetingRule,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n ProjectPrerequisites,\n RouterMode,\n SegmentCondition,\n SpaSettings,\n Targeting,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n RuntimeSignalDefinition,\n SdkDiagnostics,\n SnippetCriticalMutation,\n SnippetCriticalMutationPlanItem,\n SnippetDeliveryUrlRule,\n BucketingCleanupSettings,\n DataProtectionSettings,\n DataLayerSignalMapping,\n DataLayerTriggerSettings,\n ExposureDestinationsSettings,\n Mutation,\n TrackEvent,\n TrackingStart,\n Variation,\n} from \"./types\";\nimport { applyMutationWithWait, resetWaitEntries } from \"./wait\";\n\ndeclare const __DRIP_FEATURE_QA__: boolean;\ndeclare const __DRIP_FEATURE_DEVTOOLS__: boolean;\ndeclare const __DRIP_FEATURE_AUDIT__: boolean;\ndeclare const __DRIP_FEATURE_HEATMAP__: boolean;\ndeclare const __DRIP_FEATURE_HARNESS__: boolean;\n\nconst FEATURE_QA = __DRIP_FEATURE_QA__;\nconst FEATURE_DEVTOOLS = __DRIP_FEATURE_DEVTOOLS__;\nconst FEATURE_AUDIT = __DRIP_FEATURE_AUDIT__;\nconst FEATURE_HEATMAP = __DRIP_FEATURE_HEATMAP__;\nconst FEATURE_HARNESS = __DRIP_FEATURE_HARNESS__;\nconst SDK_SCRIPT_SRC =\n typeof document !== \"undefined\"\n ? (document.currentScript as HTMLScriptElement | null)?.src\n : undefined;\n\ntype HeatmapController = {\n stop: () => void;\n update: (assignments: Assignment[], experiments: Experiment[]) => void;\n};\n\ntype SemanticController = {\n stop: () => void;\n};\n\ntype FetchAttemptInfo = {\n attempt: number;\n elapsedMs: number;\n error?: string;\n status?: number;\n timedOut?: boolean;\n};\n\ntype FetchRetryOptions = {\n timeoutMs?: number;\n firstAttemptTimeoutMs?: number;\n slowMs?: number;\n onAttemptStart?: (attempt: number) => void;\n onAttemptEnd?: (info: FetchAttemptInfo) => void;\n onSlow?: (info: { attempt: number; elapsedMs: number }) => void;\n};\n\nconst DEFAULT_CONFIG_FETCH_TIMEOUT_MS = 4500;\nconst DEFAULT_CONFIG_FETCH_SLOW_MS = 1500;\n\nfunction createFetchTimeoutError(): Error | DOMException {\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction fetchWithTimeout(url: string, timeoutMs: number): Promise<Response> {\n if (typeof AbortController === \"undefined\") {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return Promise.race([\n fetch(url),\n new Promise<Response>((_, reject) => {\n timer = setTimeout(() => reject(createFetchTimeoutError()), timeoutMs);\n }),\n ]).finally(() => {\n if (timer !== null) clearTimeout(timer);\n });\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n return fetch(url, { signal: controller.signal }).finally(() => {\n clearTimeout(timer);\n });\n}\n\nasync function fetchWithRetry(\n url: string,\n retries = 2,\n delayMs = 500,\n options: FetchRetryOptions = {},\n): Promise<Response> {\n const timeoutMs = normalizeNumber(options.timeoutMs, DEFAULT_CONFIG_FETCH_TIMEOUT_MS);\n const firstAttemptTimeoutMs = normalizeNumber(options.firstAttemptTimeoutMs, timeoutMs);\n for (let attempt = 0; attempt <= retries; attempt++) {\n const startedAt = Date.now();\n let slowTimer: ReturnType<typeof setTimeout> | null = null;\n let slowMarked = false;\n options.onAttemptStart?.(attempt + 1);\n if (options.onSlow) {\n const slowMs = normalizeNumber(options.slowMs, DEFAULT_CONFIG_FETCH_SLOW_MS);\n slowTimer = setTimeout(() => {\n slowMarked = true;\n options.onSlow?.({ attempt: attempt + 1, elapsedMs: Date.now() - startedAt });\n }, slowMs);\n }\n try {\n const attemptTimeoutMs = attempt === 0 ? firstAttemptTimeoutMs : timeoutMs;\n const res = await fetchWithTimeout(url, attemptTimeoutMs);\n if (slowTimer !== null) clearTimeout(slowTimer);\n options.onAttemptEnd?.({\n attempt: attempt + 1,\n elapsedMs: Date.now() - startedAt,\n status: res.status,\n });\n if (res.ok || attempt === retries) return res;\n } catch (err) {\n if (slowTimer !== null) clearTimeout(slowTimer);\n const error = err instanceof Error ? err.message : String(err);\n const timedOut = typeof DOMException !== \"undefined\" && err instanceof DOMException\n ? err.name === \"AbortError\"\n : /abort|timeout/i.test(error);\n options.onAttemptEnd?.({\n attempt: attempt + 1,\n elapsedMs: Date.now() - startedAt,\n error,\n timedOut,\n });\n if (attempt === retries) throw err;\n }\n if (slowTimer !== null && !slowMarked) clearTimeout(slowTimer);\n await new Promise((r) => setTimeout(r, delayMs * (attempt + 1)));\n }\n throw new Error(\"Failed to fetch after retries\");\n}\n\nconst CONFIG_CACHE_KEY_PREFIX = \"drip_cfg:\";\nconst DEFAULT_CONFIG_CACHE_TTL_MS = 5 * 60 * 1000;\nconst DEFAULT_ANTI_FLICKER_TIMEOUT_MS = 1200;\nconst DEFAULT_TRACKING_IDLE_TIMEOUT_MS = 2000;\nconst DEFAULT_EXECUTION_MODE: ExecutionMode = \"auto\";\nconst DEFAULT_TRACKING_START: TrackingStart = \"idle\";\nconst DEFAULT_JS_POLICY: CustomJsPolicy = \"hybrid\";\nconst CONSENT_COOKIE_NAME = \"drip_consent\";\nconst IDENTITY_CONTEXT_COOKIE_NAME = \"drip_ctx\";\nconst IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nconst IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES = 1024;\nconst SESSION_STORAGE_KEY = \"drip_sid\";\n\n/** Collect unique CSS selectors from experiments for scoped anti-flicker. */\nfunction collectScopedSelectors(experiments: Experiment[], config?: InitConfig, assignments: Assignment[] = []): string[] {\n const selectors = new Set<string>();\n for (const exp of experiments) {\n if (exp.status && exp.status !== \"running\") continue;\n for (const v of exp.variations) {\n v.antiFlickerSelectors?.forEach((selector) => selectors.add(selector));\n for (const m of v.mutations) {\n if (m.selector) selectors.add(m.selector);\n }\n }\n }\n if (isCommercePriceActive(config?.commerce?.price, assignments)) {\n COMMERCE_PRICE_SELECTORS.forEach((selector) => selectors.add(selector));\n }\n return Array.from(selectors);\n}\n\ntype ResolvedRuntimeConfig = {\n executionMode: ExecutionMode;\n antiFlickerMode: AntiFlickerMode;\n antiFlickerTimeoutMs: number;\n antiFlickerCustomCss?: string;\n trackingStart: TrackingStart;\n trackingIdleTimeoutMs: number;\n customJsPolicy: CustomJsPolicy;\n};\n\ntype UrlDiffNeeds = {\n path: boolean;\n search: boolean;\n hash: boolean;\n};\n\ntype ConfigSource = \"inline\" | \"cache\" | \"network\" | \"none\";\n\ntype PendingPerfEvent = {\n assignment_ready_ms: number;\n init_total_ms?: number;\n guard_resolve_ms?: number;\n consent_identity_ms?: number;\n runtime_setup_ms?: number;\n targeting_assignment_ms?: number;\n mutation_finalize_ms?: number;\n unattributed_init_ms?: number;\n blank_screen_ms: number;\n platform: PlatformHint;\n config_source: ConfigSource;\n activation_mode: ActivationMode;\n sdk_version: string;\n sdk_delivery_mode: string;\n sdk_delivery_source: string;\n sdk_policy_revision: string;\n snippet_revision?: number;\n runtime_profile: string;\n experiment_count?: number;\n assignment_count?: number;\n mutation_count?: number;\n script_exec_start?: number;\n anti_flicker_inserted_at?: number;\n assignment_ready_at?: number;\n first_mutation_at?: number;\n reveal_at?: number;\n hidden_duration_ms?: number;\n current_page_hide_selector_count?: number;\n delivery_state?: string;\n script_cache_source?: string;\n install_surface?: string;\n first_install_surface?: string;\n config_fetch_ms?: number;\n config_fetch_attempts?: number;\n config_fetch_status?: RuntimeLoadDiagnostic[\"configFetchStatus\"];\n config_fetch_status_code?: number;\n mutation_apply_pending?: number;\n mutation_apply_applied?: number;\n mutation_apply_missed?: number;\n cls_total?: number;\n cls_after_reveal?: number;\n hydration_detected_at?: number;\n apply_delayed_ms?: number;\n hydration_timeout?: boolean;\n hold_timeout?: boolean;\n reapply_count?: number;\n reassert_loop_detected?: boolean;\n};\n\ntype InitPhaseKey =\n | \"guard_resolve_ms\"\n | \"consent_identity_ms\"\n | \"runtime_setup_ms\"\n | \"targeting_assignment_ms\"\n | \"mutation_finalize_ms\";\n\ntype InitPerfContext = {\n startedAt: number;\n phases: Partial<Record<InitPhaseKey, number>>;\n includesConfigFetch: boolean;\n};\n\nconst MAX_PERF_DURATION_MS = 60_000;\n\nfunction monotonicNow(): number {\n const value = globalThis.performance?.now?.();\n return typeof value === \"number\" && Number.isFinite(value) ? value : Date.now();\n}\n\nfunction boundedPerfDuration(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(Math.min(MAX_PERF_DURATION_MS, Math.max(0, value)) * 10) / 10;\n}\n\nfunction createInitPerfContext(): InitPerfContext {\n return { startedAt: monotonicNow(), phases: {}, includesConfigFetch: false };\n}\n\nfunction addInitPhase(context: InitPerfContext, phase: InitPhaseKey, startedAt: number): void {\n const elapsed = boundedPerfDuration(monotonicNow() - startedAt);\n context.phases[phase] = boundedPerfDuration((context.phases[phase] ?? 0) + elapsed);\n}\n\ntype DeliveryHealthStatus = \"applied\" | \"partial\" | \"miss\" | \"control\" | \"no_mutations\";\n\ntype DeliveryHealthTracker = {\n assignment: Assignment;\n expected: number;\n applied: Set<number>;\n missed: Set<number>;\n emitted: boolean;\n};\n\ntype RouteDiagnostic = {\n previousUrl: string;\n nextUrl: string;\n reason: string;\n at: number;\n reEvaluated: boolean;\n};\n\ntype DataLayerDiagnostic = {\n eventName: string;\n dataLayerName: string;\n at: number;\n mappedSignals: string[];\n gtagNormalized?: boolean;\n};\n\ntype ShopifySyncDiagnostic = {\n at: number;\n status: \"pending\" | \"sent\" | \"skipped\" | \"failed\";\n reason?: string;\n assignmentCount: number;\n};\n\ntype ExposureDestinationDiagnostic = {\n type: string;\n status: \"sent\" | \"skipped\" | \"failed\";\n at: number;\n reason?: string;\n};\n\ntype RuntimeLoadDiagnostic = SdkDiagnostics[\"load\"];\n\ntype DripPerfWindow = Window & {\n __dripPerf?: Record<string, unknown>;\n};\n\nfunction normalizeNumber(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) return value;\n return fallback;\n}\n\nfunction resolveRuntimeConfig(config: InitConfig): ResolvedRuntimeConfig {\n const executionMode = config.executionMode ?? DEFAULT_EXECUTION_MODE;\n\n const antiFlickerMode = config.antiFlickerMode\n ?? (config.antiFlicker === false ? \"off\" : config.antiFlicker === true ? \"full\" : \"scoped\");\n\n const antiFlickerTimeoutMs = normalizeNumber(\n config.antiFlickerTimeoutMs ?? config.antiFlickerTimeout,\n DEFAULT_ANTI_FLICKER_TIMEOUT_MS,\n );\n\n const trackingStart = config.trackingStart\n ?? (typeof config.deferTracking === \"boolean\"\n ? (config.deferTracking ? \"idle\" : \"immediate\")\n : DEFAULT_TRACKING_START);\n\n const trackingIdleTimeoutMs = normalizeNumber(\n config.trackingIdleTimeoutMs,\n DEFAULT_TRACKING_IDLE_TIMEOUT_MS,\n );\n\n const customJsPolicy = config.customJsPolicy ?? DEFAULT_JS_POLICY;\n\n return {\n executionMode,\n antiFlickerMode,\n antiFlickerTimeoutMs,\n antiFlickerCustomCss: config.antiFlickerCustomCss,\n trackingStart,\n trackingIdleTimeoutMs,\n customJsPolicy,\n };\n}\n\nfunction resolvePageTriggerMode(config: InitConfig): PageTriggerMode {\n const mode = config.pageTrigger?.defaultMode;\n if (mode === \"url_change\" || mode === \"dom_change\" || mode === \"manual\") return mode;\n return \"direct\";\n}\n\nfunction resolveDomPageTrigger(config: InitConfig, pageTriggerMode: PageTriggerMode): boolean {\n if (config.spa?.domChangeTrigger === false) return false;\n return (\n config.spa?.domChangeTrigger === true ||\n pageTriggerMode === \"dom_change\" ||\n pageTriggerMode === \"url_change\" ||\n config.platformHint === \"spa\"\n );\n}\n\nfunction edgeRuntimeActive(): boolean {\n const w = globalThis as Record<string, unknown>;\n return w.__dripEdgeInit === true;\n}\n\n/** Bridge: log to both debug console and devtools overlay */\nfunction dtLog(type: string, label: string, detail?: Record<string, unknown>): void {\n if (!FEATURE_DEVTOOLS) return;\n try {\n import(\"./devtools\").then(({ logDevtoolsEvent }) => {\n logDevtoolsEvent(type, label, detail);\n }).catch(() => {});\n } catch {\n // Dynamic import not supported.\n }\n}\n\nfunction traceName(id: string, name?: string): string {\n return name && name !== id ? `\"${name}\" (${id})` : id;\n}\n\nfunction traceStep(message: string, data?: Record<string, unknown>): void {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"trace\", message, data);\n}\n\nfunction traceGate(experiment: Experiment, gate: ActivationGateDiagnostic): void {\n const status = gate.status === \"passed\"\n ? \"matching\"\n : gate.status === \"failed\"\n ? \"not matching\"\n : \"skipped\";\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${experiment.id}: ${gate.label} is ${status}`, {\n reason: gate.reason,\n ...(gate.detail && typeof gate.detail === \"object\" ? { detail: gate.detail } : {}),\n });\n}\n\nfunction browserDoNotTrackEnabled(): boolean {\n const nav = globalThis.navigator as Navigator & { msDoNotTrack?: string } | undefined;\n const win = globalThis as unknown as Window & { doNotTrack?: string };\n const value = nav?.doNotTrack ?? nav?.msDoNotTrack ?? win.doNotTrack ?? \"\";\n return value === \"1\" || value.toLowerCase() === \"yes\";\n}\n\nfunction trackingBlocked(): boolean {\n return state.trackingDisabledByDnt || (state.consentRequired && !state.consentGranted);\n}\n\nfunction doNotTrackEnabled(config: InitConfig): boolean {\n return config.dataProtection?.respectDoNotTrack === true && browserDoNotTrackEnabled();\n}\n\nfunction storageAllowed(consentRequired: boolean, consentGranted: boolean, trackingDisabledByDnt: boolean): boolean {\n return (!consentRequired || consentGranted) && !trackingDisabledByDnt;\n}\n\nfunction readPath(root: unknown, path: string | undefined): unknown {\n if (!path) return undefined;\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean);\n let current = root as Record<string, unknown> | undefined;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = current[part] as Record<string, unknown> | undefined;\n }\n return current;\n}\n\nfunction readWindowPath(path: string | undefined): unknown {\n if (!path) return undefined;\n return readPath(globalThis as Record<string, unknown>, path);\n}\n\nfunction consentTokenMatches(value: unknown, required: string): boolean {\n if (value == null) return false;\n return String(value).trim().toLowerCase() === required.trim().toLowerCase();\n}\n\nfunction readUsercentricsConsent(requiredGroup?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n const uc = root.UC_UI ?? (root.window as Record<string, any> | undefined)?.UC_UI;\n if (!uc || typeof uc.getServicesBaseInfo !== \"function\") return null;\n\n let services: unknown;\n try {\n services = uc.getServicesBaseInfo();\n } catch {\n return null;\n }\n if (!Array.isArray(services)) return null;\n\n const required = requiredGroup?.trim() || \"Apex\";\n const service = services.find((item) => {\n if (!item || typeof item !== \"object\") return false;\n const candidate = item as Record<string, unknown>;\n return [\n candidate.name,\n candidate.id,\n candidate.serviceId,\n candidate.templateId,\n candidate.dataProcessor,\n candidate.dataProcessorName,\n ].some((value) => consentTokenMatches(value, required));\n }) as Record<string, any> | undefined;\n\n if (!service) return false;\n return service.consent?.status === true || service.consentStatus === true || service.status === true;\n}\n\nfunction readCookiebotConsent(requiredGroup?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n const cookiebot = root.Cookiebot ?? (root.window as Record<string, any> | undefined)?.Cookiebot;\n if (!cookiebot || typeof cookiebot !== \"object\") return null;\n\n const consent = cookiebot.consent;\n if (!consent || typeof consent !== \"object\") return null;\n\n const category = (requiredGroup?.trim() || \"statistics\").toLowerCase();\n const aliases: Record<string, string> = {\n analytics: \"statistics\",\n stats: \"statistics\",\n statistic: \"statistics\",\n statistics: \"statistics\",\n marketing: \"marketing\",\n preference: \"preferences\",\n preferences: \"preferences\",\n necessary: \"necessary\",\n };\n const key = aliases[category] || category;\n const value = consent[key];\n return typeof value === \"boolean\" ? value : false;\n}\n\nfunction readCcm19Consent(requiredGroup?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n const ccm = root.CCM ?? (root.window as Record<string, any> | undefined)?.CCM;\n if (!ccm || typeof ccm !== \"object\") return null;\n const embeddings = ccm.acceptedEmbeddings;\n if (!Array.isArray(embeddings)) return null;\n\n const required = requiredGroup?.trim() || \"Apex\";\n const requiredName = required.toLowerCase();\n return embeddings.some((item) => {\n if (!item || typeof item !== \"object\") return false;\n const candidate = item as Record<string, unknown>;\n const name = typeof candidate.name === \"string\" ? candidate.name.trim().toLowerCase() : \"\";\n const id = typeof candidate.id === \"string\" ? candidate.id : \"\";\n return name === requiredName || id === required;\n });\n}\n\nfunction readPandectesConsent(requiredGroup?: string): boolean | null {\n const root = globalThis as Record<string, any>;\n const purpose = (requiredGroup?.trim() || \"analytics\").toLowerCase();\n const methods: Record<string, string> = {\n analytics: \"analyticsProcessingAllowed\",\n statistics: \"analyticsProcessingAllowed\",\n statistic: \"analyticsProcessingAllowed\",\n stats: \"analyticsProcessingAllowed\",\n marketing: \"marketingAllowed\",\n preferences: \"preferencesProcessingAllowed\",\n preference: \"preferencesProcessingAllowed\",\n sale_of_data: \"saleOfDataAllowed\",\n saleofdata: \"saleOfDataAllowed\",\n \"sale-of-data\": \"saleOfDataAllowed\",\n sale: \"saleOfDataAllowed\",\n };\n const methodName = methods[purpose];\n if (!methodName) return false;\n const sources = [\n root.Pandectes ?? (root.window as Record<string, any> | undefined)?.Pandectes,\n root.Shopify?.customerPrivacy ?? (root.window as Record<string, any> | undefined)?.Shopify?.customerPrivacy,\n ];\n\n for (const source of sources) {\n if (!source || typeof source !== \"object\" || typeof source[methodName] !== \"function\") continue;\n try {\n const value = source[methodName]();\n if (typeof value === \"boolean\") return value;\n } catch {\n // Try Shopify's Customer Privacy API when the Pandectes API is not ready.\n }\n }\n return null;\n}\n\nfunction configuredConsentGranted(config: InitConfig): boolean | null {\n const consent = config.consentMode;\n if (consent?.provider === \"usercentrics\") {\n return readUsercentricsConsent(consent.requiredGroup);\n }\n if (consent?.provider === \"cookiebot\") {\n return readCookiebotConsent(consent.requiredGroup);\n }\n if (consent?.provider === \"ccm19\") {\n return readCcm19Consent(consent.requiredGroup);\n }\n if (consent?.provider === \"pandectes\") {\n return readPandectesConsent(consent.requiredGroup);\n }\n if (!consent?.getter && consent?.provider !== \"onetrust\") return null;\n const raw = readWindowPath(consent.getter ?? \"OnetrustActiveGroups\");\n if (typeof raw === \"boolean\") return raw;\n const required = consent.requiredGroup;\n if (!required) return raw != null && String(raw).trim() !== \"\";\n if (Array.isArray(raw)) return raw.map(String).includes(required);\n if (typeof raw === \"string\") {\n return raw.split(\",\").map((item) => item.trim()).filter(Boolean).includes(required);\n }\n return false;\n}\n\nfunction syncConfiguredConsent(config: InitConfig): void {\n if (!state.consentRequired) return;\n const configured = configuredConsentGranted(config);\n if (configured == null || configured === state.consentGranted) return;\n setConsent(configured);\n}\n\nconst CUSTOM_CONSENT_POLL_INTERVAL_MS = 1000;\nconst CUSTOM_CONSENT_POLL_MAX_MS = 10 * 60 * 1000;\nconst EVENT_DRIVEN_CONSENT_PROVIDERS = new Set([\"onetrust\", \"usercentrics\", \"cookiebot\", \"ccm19\"]);\n\nfunction shouldPollConfiguredConsent(config: InitConfig): boolean {\n const consent = config.consentMode;\n if (!consent?.enabled || state.consentGranted) return false;\n if (consent.provider && EVENT_DRIVEN_CONSENT_PROVIDERS.has(consent.provider)) return false;\n return consent.provider === \"custom\" || consent.provider === \"pandectes\" || typeof consent.getter === \"string\";\n}\n\nfunction installConsentChangeListeners(config: InitConfig): (() => void) | null {\n if (!config.consentMode?.enabled || typeof window === \"undefined\") return null;\n const events = [\n \"OneTrustGroupsUpdated\",\n \"OptanonConsentChanged\",\n \"CookiebotOnConsentReady\",\n \"CookiebotOnAccept\",\n \"CookiebotOnDecline\",\n \"CookieConsentDeclaration\",\n \"UC_UI_CMP_EVENT\",\n \"ccm19EmbeddingAccepted\",\n \"ccm19WidgetClosed\",\n \"ccm19WidgetLoaded\",\n \"PandectesInitialized\",\n \"visitorConsentCollected\",\n ];\n const handler = () => syncConfiguredConsent(config);\n events.forEach((event) => window.addEventListener(event, handler));\n const documentEvents = [\"PandectesInitialized\", \"visitorConsentCollected\"];\n if (typeof document !== \"undefined\") {\n documentEvents.forEach((event) => document.addEventListener(event, handler));\n }\n\n let pollTimer: ReturnType<typeof setInterval> | null = null;\n let pollCapTimer: ReturnType<typeof setTimeout> | null = null;\n const stopPolling = () => {\n if (pollTimer !== null) {\n clearInterval(pollTimer);\n pollTimer = null;\n }\n if (pollCapTimer !== null) {\n clearTimeout(pollCapTimer);\n pollCapTimer = null;\n }\n };\n\n if (shouldPollConfiguredConsent(config)) {\n pollTimer = setInterval(() => {\n syncConfiguredConsent(config);\n if (state.consentGranted) stopPolling();\n }, CUSTOM_CONSENT_POLL_INTERVAL_MS);\n pollCapTimer = setTimeout(stopPolling, CUSTOM_CONSENT_POLL_MAX_MS);\n }\n\n return () => {\n stopPolling();\n events.forEach((event) => window.removeEventListener(event, handler));\n if (typeof document !== \"undefined\") {\n documentEvents.forEach((event) => document.removeEventListener(event, handler));\n }\n };\n}\n\nfunction resolveConsentRequired(config: InitConfig): boolean {\n return (\n config.requireConsent === true ||\n typeof config.hasConsent === \"boolean\" ||\n config.consentMode?.enabled === true\n );\n}\n\nfunction resolveConsentGranted(config: InitConfig, consentRequired: boolean): boolean {\n if (!consentRequired) return true;\n if (typeof config.hasConsent === \"boolean\") return config.hasConsent;\n const configured = configuredConsentGranted(config);\n if (configured != null) return configured;\n return readConsentCookie();\n}\n\nfunction persistentStorageAllowed(): boolean {\n return storageAllowed(state.consentRequired, state.consentGranted, state.trackingDisabledByDnt);\n}\n\nconfigureSignalPersistenceAllowed(() => persistentStorageAllowed());\n\nfunction coerceSignalValue(value: unknown, valueType?: RuntimeSignalDefinition[\"valueType\"]): unknown {\n if (value === undefined || value === null) return undefined;\n if (valueType === \"number\") {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : undefined;\n }\n if (valueType === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n const normalized = String(value).trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n return undefined;\n }\n if (valueType === \"string_array\") {\n if (Array.isArray(value)) return value.map((item) => String(item).trim()).filter(Boolean);\n return String(value).split(\",\").map((item) => item.trim()).filter(Boolean);\n }\n if (valueType === \"json\") return value;\n return String(value);\n}\n\nfunction captureUrlSignals(config: InitConfig): void {\n const definitions = config.signals ?? [];\n if (!definitions.length) return;\n let parsed: URL | null = null;\n try {\n parsed = new URL(config.url ?? location.href, typeof location !== \"undefined\" ? location.origin : \"https://_\");\n } catch {\n parsed = null;\n }\n if (!parsed) return;\n\n for (const definition of definitions) {\n const capture = definition.capture;\n if (!definition.key || capture?.mode !== \"url_parameter\" || !capture.parameter) continue;\n const raw = parsed.searchParams.get(capture.parameter);\n if (raw == null || raw === \"\") {\n if (capture.persist === false) clearRuntimeSignal(definition.key);\n continue;\n }\n const value = coerceSignalValue(raw, definition.valueType);\n if (value !== undefined) {\n setCapturedSignal(definition.key, value, {\n ttlDays: definition.ttlDays,\n persist: capture.persist,\n source: \"url_parameter\",\n });\n }\n }\n}\n\nfunction installClickSignalCaptures(config: InitConfig): (() => void) | null {\n const definitions = (config.signals ?? []).filter((definition) =>\n definition.capture?.mode === \"click_selector\" && definition.capture.selector,\n );\n if (!definitions.length || typeof document === \"undefined\" || !document.addEventListener) {\n return null;\n }\n\n const handler = (event: Event) => {\n if (!persistentStorageAllowed()) return;\n const target = event.target;\n if (!target || typeof (target as Element).closest !== \"function\") return;\n const targetElement = target as Element;\n\n for (const definition of definitions) {\n const capture = definition.capture!;\n const selector = capture.selector;\n if (!selector) continue;\n let element: Element | null = null;\n try {\n element = targetElement.closest(selector);\n } catch {\n element = null;\n }\n if (!element) continue;\n\n let raw: unknown = true;\n if (capture.source === \"text\") raw = element.textContent?.trim() ?? \"\";\n if (capture.source === \"attribute\" && capture.attribute) raw = element.getAttribute(capture.attribute);\n if (capture.source === \"dataset\" && capture.attribute) {\n const key = capture.attribute.replace(/^data-/, \"\").replace(/-([a-z])/g, (_, char: string) => char.toUpperCase());\n raw = (element as HTMLElement).dataset?.[key];\n }\n if (capture.source === \"constant\") raw = capture.value ?? true;\n\n const value = coerceSignalValue(raw, definition.valueType);\n if (value !== undefined) setStoredSignal(definition.key, value, definition.ttlDays, \"click_selector\");\n }\n };\n\n document.addEventListener(\"click\", handler, true);\n return () => document.removeEventListener?.(\"click\", handler, true);\n}\n\nfunction captureEventPropertySignals(type: string, data?: Record<string, unknown>): void {\n if (!state.config || !persistentStorageAllowed()) return;\n const definitions = state.config.signals ?? [];\n if (!definitions.length || !data) return;\n\n for (const definition of definitions) {\n const capture = definition.capture;\n if (capture?.mode !== \"event_property\") continue;\n if (!capture.eventName || !capture.property || capture.eventName !== type) continue;\n const value = coerceSignalValue(data[capture.property], definition.valueType);\n if (value !== undefined) setStoredSignal(definition.key, value, definition.ttlDays, \"event_property\");\n }\n}\n\nfunction setCapturedSignal(\n key: string,\n value: unknown,\n opts: { ttlDays?: number; persist?: boolean; source: string },\n): void {\n if (!key) return;\n if (opts.persist === false || !persistentStorageAllowed()) {\n setRuntimeSignal(key, value, opts.source);\n return;\n }\n setStoredSignal(key, value, opts.ttlDays, opts.source);\n setRuntimeSignal(key, value, opts.source);\n}\n\nfunction setPublicSignal(key: string, value: unknown, ttlDays?: number, source = \"manual\"): void {\n if (persistentStorageAllowed()) {\n setStoredSignal(key, value, ttlDays, source);\n } else {\n setRuntimeSignal(key, value, source);\n }\n}\n\nfunction getPublicSignals(options: { markVisitorSeen?: boolean } = {}): ReturnType<typeof getStoredSignals> {\n return getStoredSignals({\n ...options,\n markVisitorSeen: options.markVisitorSeen === false ? false : persistentStorageAllowed(),\n });\n}\n\nfunction normalizePageApiName(value: unknown): string {\n if (typeof value !== \"string\") return \"\";\n const key = value\n .trim()\n .toLowerCase()\n .replace(/['\"`]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .replace(/_+/g, \"_\");\n if (!key) return \"\";\n return /^[a-z]/.test(key) ? key : `segment_${key}`;\n}\n\nfunction pageTriggerSignal(normalizedApiName: string): string {\n return `page.trigger.${normalizedApiName}`;\n}\n\nfunction triggerPage(apiName: unknown, active: unknown = true): void {\n const normalizedApiName = normalizePageApiName(apiName);\n if (!normalizedApiName) return;\n const nextActive =\n active === false\n ? false\n : active && typeof active === \"object\" && \"isActive\" in active\n ? Boolean((active as { isActive?: unknown }).isActive)\n : true;\n setRuntimeSignal(pageTriggerSignal(normalizedApiName), nextActive, \"page_api\");\n try {\n document.dispatchEvent(new CustomEvent(\"drip:signals-changed\", {\n detail: { source: \"page_api\", apiName: normalizedApiName, active: nextActive },\n }));\n } catch {}\n}\n\nfunction readElementCaptureValue(element: Element, capture: NonNullable<RuntimeSignalDefinition[\"capture\"]>): unknown {\n if (capture.source === \"attribute\" && capture.attribute) return element.getAttribute(capture.attribute);\n if (capture.source === \"dataset\" && capture.attribute) {\n const key = capture.attribute.replace(/^data-/, \"\").replace(/-([a-z])/g, (_, char: string) => char.toUpperCase());\n return (element as HTMLElement).dataset?.[key];\n }\n if (capture.source === \"constant\") return capture.value ?? true;\n return element.textContent?.trim() ?? \"\";\n}\n\nfunction captureDomAndGlobalSignals(config: InitConfig): void {\n const definitions = config.signals ?? [];\n for (const definition of definitions) {\n const capture = definition.capture;\n if (!capture) continue;\n if (capture.mode === \"dom_selector\" && capture.selector && typeof document !== \"undefined\") {\n let element: Element | null = null;\n try {\n element = document.querySelector(capture.selector);\n } catch {\n element = null;\n }\n if (!element) continue;\n const value = coerceSignalValue(readElementCaptureValue(element, capture), definition.valueType);\n if (value !== undefined) {\n setCapturedSignal(definition.key, value, {\n ttlDays: definition.ttlDays,\n persist: capture.persist,\n source: \"dom_selector\",\n });\n }\n }\n if (capture.mode === \"global\" && capture.path) {\n const value = coerceSignalValue(readWindowPath(capture.path), definition.valueType);\n if (value !== undefined) {\n setCapturedSignal(definition.key, value, {\n ttlDays: definition.ttlDays,\n persist: capture.persist,\n source: \"global\",\n });\n }\n }\n }\n}\n\nfunction consentAwareDataProtection(config: InitConfig): DataProtectionSettings | undefined {\n if (persistentStorageAllowed()) return config.dataProtection;\n return { ...(config.dataProtection ?? {}), storageMode: \"memory\" };\n}\n\nfunction writeConsentCookie(granted: boolean): void {\n if (!globalThis.document) return;\n try {\n globalThis.document.cookie = granted\n ? `${CONSENT_COOKIE_NAME}=1; Max-Age=31536000; Path=/; SameSite=Lax`\n : `${CONSENT_COOKIE_NAME}=; Max-Age=0; Path=/; SameSite=Lax`;\n } catch {\n // ignore cookie failures\n }\n}\n\nfunction readConsentCookie(): boolean {\n if (!globalThis.document?.cookie) return false;\n try {\n return new RegExp(`(?:^|;\\\\s*)${CONSENT_COOKIE_NAME}=1(?:;|$)`).test(globalThis.document.cookie);\n } catch {\n return false;\n }\n}\n\nfunction clearConsentStorage(): void {\n try {\n const storage = globalThis.localStorage;\n storage?.removeItem(\"drip_uid\");\n storage?.removeItem(\"drip_goals\");\n storage?.removeItem(\"drip_visitor_sessions_v1\");\n storage?.removeItem(ORDER_EXPOSURE_STORAGE_KEY);\n clearStoredSignals();\n if (storage) {\n for (let i = storage.length - 1; i >= 0; i--) {\n const key = storage.key(i);\n if (key?.startsWith(CONFIG_CACHE_KEY_PREFIX)) storage.removeItem(key);\n }\n }\n } catch {}\n try {\n const storage = globalThis.sessionStorage;\n storage?.removeItem(\"drip_uid\");\n storage?.removeItem(\"drip_sid\");\n storage?.removeItem(\"drip_events\");\n storage?.removeItem(\"drip_utm\");\n if (storage) {\n for (let i = storage.length - 1; i >= 0; i--) {\n const key = storage.key(i);\n if (key?.startsWith(\"drip_hm:\")) storage.removeItem(key);\n }\n }\n } catch {}\n clearIdentityContextCookie();\n clearPersistedAssignments();\n clearBrowserGroupStickyStore();\n if (globalThis.document) {\n try {\n globalThis.document.cookie = \"drip_uid=; Max-Age=0; Path=/; SameSite=Lax\";\n } catch {}\n }\n}\n\nfunction applyConsentStorageMode(): void {\n if (!state.config) return;\n configureIdentityStorage(consentAwareDataProtection(state.config));\n if (persistentStorageAllowed() && state.userId) {\n adoptUserId(state.userId);\n }\n}\n\nfunction runWhenDomReady(callback: () => void): void {\n if (!globalThis.document || document.readyState !== \"loading\") {\n callback();\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", callback, { once: true });\n}\n\nfunction applyProjectCode(config: InitConfig): void {\n const projectCode = config.projectCode;\n if (!projectCode?.enabled) return;\n if (projectCode.css && globalThis.document) {\n const id = \"drip-project-css\";\n let style = document.getElementById(id) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = id;\n (document.head || document.documentElement).appendChild(style);\n }\n style.textContent = projectCode.css;\n }\n if (projectCode.helperJs) execJs(projectCode.helperJs, \"project-helper\");\n}\n\nfunction runProjectStartupCode(config: InitConfig): void {\n const projectCode = config.projectCode;\n const js = projectCode?.js;\n if (!projectCode?.enabled || !js) return;\n runWhenDomReady(() => execJs(js, \"project-startup\"));\n}\n\nfunction collectJsTriggerConditions(experiments: Experiment[]): SegmentCondition[] {\n const seen = new Set<string>();\n const conditions: SegmentCondition[] = [];\n for (const experiment of experiments) {\n for (const rule of experiment.targeting?.segmentRules ?? []) {\n for (const condition of rule.rules?.conditions ?? []) {\n const code = condition.js?.code?.trim();\n if (!code) continue;\n const key = `${condition.signal}:${code}`;\n if (seen.has(key)) continue;\n seen.add(key);\n conditions.push(condition);\n }\n }\n }\n return conditions;\n}\n\nfunction collectPageTriggerRules(experiments: Experiment[]): PageTargetingRule[] {\n const seen = new Set<string>();\n const rules: PageTargetingRule[] = [];\n for (const experiment of experiments) {\n for (const rule of experiment.targeting?.pageRules ?? []) {\n const mode = rule.trigger?.mode;\n if (mode !== \"manual-callback\" && mode !== \"manual-api\") continue;\n const code = rule.trigger?.triggerJs?.trim();\n const signal = rule.trigger?.signal;\n if (!code || !signal) continue;\n const key = `${signal}:${code}`;\n if (seen.has(key)) continue;\n seen.add(key);\n rules.push(rule);\n }\n }\n return rules;\n}\n\nfunction conditionUsesActivateTrigger(condition: SegmentCondition): boolean {\n const code = condition.js?.code ?? \"\";\n return condition.js?.mode === \"activate\" ||\n /\\bactivate\\s*\\(/.test(code) ||\n /\\bcallbackFn\\b/.test(code);\n}\n\nfunction buildJsTriggerContext(condition: SegmentCondition): Record<string, unknown> {\n const href = typeof window !== \"undefined\" ? window.location.href : \"https://_\";\n const apexTools = getRuntimeTools();\n return {\n apexTools,\n attributes: buildTargetingAttributes({}, href),\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n signal: condition.signal,\n url: new URL(href, \"https://_\"),\n value: condition.value,\n window: typeof window !== \"undefined\" ? window : undefined,\n };\n}\n\nfunction runJsTriggerReset(condition: SegmentCondition): void {\n const resetCode = condition.js?.resetCode?.trim();\n if (!resetCode || resetCode.length > 4000) return;\n try {\n const context = buildJsTriggerContext(condition);\n const fn = new Function(\n \"context\",\n `\"use strict\";` +\n `const attributes=context.attributes;` +\n `const apexTools=context.apexTools;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const signal=context.signal;` +\n `const url=context.url;` +\n `const value=context.value;` +\n `const window=context.window;` +\n `(function(){${resetCode}}).call(window);`,\n );\n fn(context);\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"JS trigger reset failed\", error instanceof Error ? error.message : String(error));\n }\n}\n\nfunction installActivateJsTrigger(condition: SegmentCondition, onChange: () => void): () => void {\n const source = condition.js?.code?.trim();\n if (!source || source.length > 4000) return () => {};\n\n let teardown: unknown;\n let active = Boolean(getPublicSignals({ markVisitorSeen: false })[condition.signal]);\n const options = { isActive: active };\n const activate = (next?: unknown) => {\n const nextActive =\n next === false\n ? false\n : next && typeof next === \"object\" && \"isActive\" in next\n ? Boolean((next as { isActive?: unknown }).isActive)\n : true;\n active = nextActive;\n options.isActive = nextActive;\n setRuntimeSignal(condition.signal, nextActive);\n onChange();\n };\n\n try {\n const context = buildJsTriggerContext(condition);\n const fn = new Function(\n \"activate\",\n \"options\",\n \"context\",\n `\"use strict\";` +\n `const attributes=context.attributes;` +\n `const apexTools=context.apexTools;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const signal=context.signal;` +\n `const url=context.url;` +\n `const value=context.value;` +\n `const window=context.window;` +\n `${source}\\n` +\n `if (typeof callbackFn === \"function\") return callbackFn(activate, options);`,\n );\n teardown = fn(activate, options, context);\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"JS trigger activation failed\", error instanceof Error ? error.message : String(error));\n setRuntimeSignal(condition.signal, false);\n }\n\n return () => {\n try {\n if (typeof teardown === \"function\") teardown();\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"JS trigger teardown failed\", error instanceof Error ? error.message : String(error));\n }\n runJsTriggerReset(condition);\n clearRuntimeSignal(condition.signal);\n onChange();\n };\n}\n\nfunction installPageTriggerRule(rule: PageTargetingRule, onChange: () => void): () => void {\n const mode = rule.trigger?.mode;\n if (mode !== \"manual-callback\" && mode !== \"manual-api\") return () => {};\n const source = rule.trigger?.triggerJs?.trim();\n const signal = rule.trigger?.signal;\n if (!source || source.length > 8000 || !signal) return () => {};\n\n let teardown: unknown;\n let active = Boolean(getPublicSignals({ markVisitorSeen: false })[signal]);\n const options = { isActive: active, pageId: rule.id, apiName: rule.trigger?.apiName };\n const activate = (next?: unknown) => {\n const nextActive =\n next === false\n ? false\n : next && typeof next === \"object\" && \"isActive\" in next\n ? Boolean((next as { isActive?: unknown }).isActive)\n : true;\n active = nextActive;\n options.isActive = nextActive;\n setRuntimeSignal(signal, nextActive, \"page_trigger\");\n onChange();\n };\n\n try {\n const href = typeof window !== \"undefined\" ? window.location.href : \"https://_\";\n const context = {\n apexTools: getRuntimeTools(),\n attributes: buildTargetingAttributes({}, href),\n document: typeof document !== \"undefined\" ? document : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n pageId: rule.id,\n apiName: rule.trigger?.apiName,\n signal,\n url: new URL(href, \"https://_\"),\n window: typeof window !== \"undefined\" ? window : undefined,\n };\n const fn = new Function(\n \"activate\",\n \"options\",\n \"context\",\n `\"use strict\";` +\n `const apexTools=context.apexTools;` +\n `const attributes=context.attributes;` +\n `const document=context.document;` +\n `const location=context.location;` +\n `const pageId=context.pageId;` +\n `const apiName=context.apiName;` +\n `const signal=context.signal;` +\n `const url=context.url;` +\n `const window=context.window;` +\n `${source}\\n`,\n );\n teardown = fn(activate, options, context);\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"Page trigger JS failed\", error instanceof Error ? error.message : String(error));\n setRuntimeSignal(signal, false, \"page_trigger\");\n }\n\n return () => {\n try {\n if (typeof teardown === \"function\") teardown();\n } catch (error) {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"Page trigger teardown failed\", error instanceof Error ? error.message : String(error));\n }\n clearRuntimeSignal(signal);\n onChange();\n };\n}\n\nfunction installJsTriggerObserver(experiments: Experiment[], onChange: () => void): () => void {\n if (\n !targetingHasJsTriggers(experiments) ||\n typeof window === \"undefined\" ||\n typeof document === \"undefined\"\n ) {\n return () => {};\n }\n\n const jsTriggerConditions = collectJsTriggerConditions(experiments);\n const activateCleanups = jsTriggerConditions\n .filter(conditionUsesActivateTrigger)\n .map((condition) => installActivateJsTrigger(condition, onChange));\n const pageTriggerCleanups = collectPageTriggerRules(experiments)\n .map((rule) => installPageTriggerRule(rule, onChange));\n\n let timeoutId: number | null = null;\n const schedule = () => {\n if (timeoutId !== null) return;\n timeoutId = window.setTimeout(() => {\n timeoutId = null;\n onChange();\n }, 80);\n };\n\n const listeners: Array<[EventTarget, string, EventListener, AddEventListenerOptions?]> = [\n [document, \"click\", schedule, { capture: true, passive: true }],\n [document, \"input\", schedule, { capture: true, passive: true }],\n [document, \"change\", schedule, { capture: true, passive: true }],\n [document, \"keyup\", schedule, { capture: true }],\n [document, \"drip:trigger\", schedule],\n [document, \"drip:signals-changed\", schedule],\n [window, \"resize\", schedule, { passive: true }],\n [window, \"scroll\", schedule, { passive: true }],\n ];\n\n let observer: MutationObserver | null = null;\n if (typeof MutationObserver !== \"undefined\" && document.documentElement) {\n observer = new MutationObserver(schedule);\n registerMutedObserver(observer, schedule);\n observer.observe(document.documentElement, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n }\n\n listeners.forEach(([target, event, listener, options]) => {\n target.addEventListener(event, listener, options);\n });\n\n return () => {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n if (observer) {\n observer.disconnect();\n unregisterMutedObserver(observer);\n }\n activateCleanups.forEach((cleanup) => cleanup());\n pageTriggerCleanups.forEach((cleanup) => cleanup());\n listeners.forEach(([target, event, listener, options]) => {\n target.removeEventListener(event, listener, options);\n });\n };\n}\n\ntype OrderIdentityPlatform =\n | \"shopify\"\n | \"shopware\"\n | \"woocommerce\"\n | \"centra\"\n | \"custom\";\n\ntype SDKState = {\n config: InitConfig | null;\n userId: string | null;\n tracker: Tracker | null;\n assignments: Assignment[];\n stopObserver: (() => void) | null;\n stopDomObserver: (() => void) | null;\n stopHandover: (() => void) | null;\n heatmapController: HeatmapController | null;\n semanticController: SemanticController | null;\n forceMap: Record<string, string> | null;\n analyticsStarted: boolean;\n trackingStart: TrackingStart;\n trackingIdleTimeoutMs: number;\n consentRequired: boolean;\n consentGranted: boolean;\n consentModeEnabled: boolean;\n trackingPrerequisiteMet: boolean;\n variationPrerequisiteMet: boolean;\n activationDiagnostics: ActivationDiagnostics;\n trackingDisabledByDnt: boolean;\n analyticsTimeoutId: number | null;\n analyticsIdleId: number | null;\n qaMode: boolean;\n qaSessionId: string;\n screenshotMode: boolean;\n platform: PlatformHint;\n routerMode: RouterMode;\n activationMode: ActivationMode;\n perfFlags: PerfFlagState;\n urlDiffNeeds: UrlDiffNeeds;\n lastUrl: string;\n lastAssignmentSignature: string;\n pendingPerf: PendingPerfEvent | null;\n configSource: ConfigSource;\n runtimeConfig: ResolvedRuntimeConfig | null;\n pageTriggerMode: PageTriggerMode;\n stopSignalCaptures: (() => void) | null;\n stopSurfaceSignals: (() => void) | null;\n stopJsTriggerSignals: (() => void) | null;\n stopDataLayerTriggers: (() => void) | null;\n stopConsentListeners: (() => void) | null;\n stopShopifyCartMutationSync: (() => void) | null;\n lastRouteChange: RouteDiagnostic | null;\n lastDataLayerTrigger: DataLayerDiagnostic | null;\n lastShopifyAssignmentSync: ShopifySyncDiagnostic | null;\n lastShopifyCartSync: ShopifySyncDiagnostic | null;\n exposureDestinationDiagnostics: ExposureDestinationDiagnostic[];\n exposedAssignmentKeys: Set<string>;\n authorizedPriceAssignmentKeys: Set<string> | null;\n authorizedShippingAssignmentKeys: Set<string> | null;\n authorizedOffersAssignmentKeys: Set<string> | null;\n initializingAssignments: boolean;\n pendingInitialApply: Promise<void> | null;\n queuedRecheck: {\n reason: \"url\" | \"dom\" | \"manual\" | \"prerequisite\";\n forceReapply: boolean;\n } | null;\n routeAnalyticsGeneration: number;\n assignmentApplyGeneration: number;\n pendingDeliveryHealth: TrackEvent[];\n load: RuntimeLoadDiagnostic;\n orderIdentityInFlight: Set<string>;\n orderIdentityDetectionUrl: string;\n orderIdentityDetection: {\n platform: OrderIdentityPlatform;\n platformOrderId: string | null;\n orderNumber: string | null;\n } | null | undefined;\n};\n\ntype QaAssistantRuntimeSnapshot = {\n config: InitConfig | null;\n assignments: Assignment[];\n activationDiagnostics: ActivationDiagnostics;\n forceMap: Record<string, string> | null;\n platform: PlatformHint;\n qaMode: boolean;\n orderIdentity: {\n platform: OrderIdentityPlatform;\n platformOrderId: string | null;\n orderNumber: string | null;\n } | null;\n};\n\nconst qaAssistantRuntimeListeners = new Set<() => void>();\n\nconst state: SDKState = {\n config: null,\n userId: null,\n tracker: null,\n assignments: [],\n stopObserver: null,\n stopDomObserver: null,\n stopHandover: null,\n heatmapController: null,\n semanticController: null,\n forceMap: null,\n analyticsStarted: false,\n trackingStart: \"idle\",\n trackingIdleTimeoutMs: DEFAULT_TRACKING_IDLE_TIMEOUT_MS,\n consentRequired: false,\n consentGranted: true,\n consentModeEnabled: false,\n trackingPrerequisiteMet: true,\n variationPrerequisiteMet: true,\n activationDiagnostics: {\n project: { gates: [] },\n experiments: [],\n },\n trackingDisabledByDnt: false,\n analyticsTimeoutId: null,\n analyticsIdleId: null,\n qaMode: false,\n qaSessionId: \"\",\n screenshotMode: false,\n platform: \"auto\",\n routerMode: \"history\",\n activationMode: \"observer\",\n perfFlags: readPerfFlags({}),\n urlDiffNeeds: { path: false, search: false, hash: false },\n lastUrl: \"\",\n lastAssignmentSignature: \"none\",\n pendingPerf: null,\n configSource: \"none\",\n runtimeConfig: null,\n pageTriggerMode: \"direct\",\n stopSignalCaptures: null,\n stopSurfaceSignals: null,\n stopJsTriggerSignals: null,\n stopDataLayerTriggers: null,\n stopConsentListeners: null,\n stopShopifyCartMutationSync: null,\n lastRouteChange: null,\n lastDataLayerTrigger: null,\n lastShopifyAssignmentSync: null,\n lastShopifyCartSync: null,\n exposureDestinationDiagnostics: [],\n exposedAssignmentKeys: new Set(),\n authorizedPriceAssignmentKeys: null,\n authorizedShippingAssignmentKeys: null,\n authorizedOffersAssignmentKeys: null,\n initializingAssignments: false,\n pendingInitialApply: null,\n queuedRecheck: null,\n routeAnalyticsGeneration: 0,\n assignmentApplyGeneration: 0,\n pendingDeliveryHealth: [],\n load: { stage: \"idle\", configFetchStatus: \"idle\" },\n orderIdentityInFlight: new Set(),\n orderIdentityDetectionUrl: \"\",\n orderIdentityDetection: undefined,\n};\n\nfunction notifyQaAssistantRuntimeListeners(): void {\n for (const listener of qaAssistantRuntimeListeners) {\n try {\n listener();\n } catch {\n // QA panel subscriptions must not affect storefront behavior.\n }\n }\n}\n\ntype HarnessManifest = {\n version?: number;\n expiresAt?: string;\n externalJsUrl?: string | null;\n externalCssUrl?: string | null;\n manifestUrl?: string;\n pollIntervalMs?: number;\n};\n\nlet harnessPollTimer: number | null = null;\nlet harnessPollKey = \"\";\nlet harnessVisibilityInstalled = false;\n\nfunction activeHarnessAssignment(assignments: Assignment[]): Assignment | null {\n if (!FEATURE_HARNESS) return null;\n return assignments.find((assignment) => assignment.harnessSession?.manifestUrl) ?? null;\n}\n\nfunction stopHarnessPolling(): void {\n if (harnessPollTimer !== null) {\n window.clearInterval(harnessPollTimer);\n harnessPollTimer = null;\n }\n harnessPollKey = \"\";\n}\n\nfunction applyHarnessManifest(manifest: HarnessManifest): void {\n if (!manifest.version || manifest.version <= 0) return;\n const current = activeHarnessAssignment(state.assignments);\n if (!current?.harnessSession?.manifestUrl) return;\n if (current.harnessSession.version === manifest.version) return;\n\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"harness\", `Reloading harness version ${manifest.version}`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"reload\", { version: manifest.version });\n\n spaCleanup(state.assignments);\n state.assignments = state.assignments.map((assignment) => {\n const sessionInfo = assignment.harnessSession;\n if (!sessionInfo || sessionInfo.manifestUrl !== current.harnessSession?.manifestUrl) return assignment;\n return {\n ...assignment,\n externalJsUrl: manifest.externalJsUrl ?? undefined,\n externalCssUrl: manifest.externalCssUrl ?? undefined,\n harnessSession: {\n ...sessionInfo,\n version: manifest.version,\n expiresAt: manifest.expiresAt ?? sessionInfo.expiresAt,\n manifestUrl: manifest.manifestUrl ?? sessionInfo.manifestUrl,\n pollIntervalMs: manifest.pollIntervalMs ?? sessionInfo.pollIntervalMs,\n },\n };\n });\n applyAssignments(state.assignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n}\n\nfunction pollHarnessManifest(manifestUrl: string): void {\n if (!FEATURE_HARNESS) return;\n if (document.hidden) return;\n fetch(manifestUrl, { cache: \"no-store\" })\n .then((res) => {\n if (!res.ok) throw new Error(\"Harness manifest failed: \" + res.status);\n return res.json() as Promise<HarnessManifest>;\n })\n .then(applyHarnessManifest)\n .catch((error) => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"harness\", error instanceof Error ? error.message : String(error));\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"poll failed\", {});\n });\n}\n\nfunction startHarnessPolling(assignments: Assignment[]): void {\n if (!FEATURE_HARNESS) return;\n const assignment = activeHarnessAssignment(assignments);\n const manifestUrl = assignment?.harnessSession?.manifestUrl;\n if (!manifestUrl) {\n stopHarnessPolling();\n return;\n }\n\n const intervalMs = Math.max(250, assignment.harnessSession?.pollIntervalMs ?? 750);\n const nextKey = `${manifestUrl}:${intervalMs}`;\n if (harnessPollKey === nextKey && harnessPollTimer !== null) return;\n\n stopHarnessPolling();\n harnessPollKey = nextKey;\n pollHarnessManifest(manifestUrl);\n harnessPollTimer = window.setInterval(() => pollHarnessManifest(manifestUrl), intervalMs);\n\n if (!harnessVisibilityInstalled) {\n harnessVisibilityInstalled = true;\n document.addEventListener(\"visibilitychange\", () => {\n const current = activeHarnessAssignment(state.assignments);\n if (!document.hidden && current?.harnessSession?.manifestUrl) {\n pollHarnessManifest(current.harnessSession.manifestUrl);\n }\n });\n }\n}\n\n/**\n * Normalize endpoint: strip trailing slashes and a trailing \"/events\" path\n * so both \"https://host.com\" and \"https://host.com/events\" resolve to the base.\n */\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint.replace(/\\/+$/, \"\").replace(/\\/events$/, \"\");\n}\n\nfunction getEventsEndpoint(config: InitConfig): string | undefined {\n return config.endpoint\n ? normalizeEndpoint(config.endpoint) + \"/events\"\n : undefined;\n}\n\nasync function mintBucketingHandoverPayload(\n config: InitConfig,\n visitorId: string,\n assignments: Assignment[],\n): Promise<string | null> {\n if (!config.shopId || !config.ingestSignature || config.externalTracking?.signed === false) {\n return null;\n }\n if (!config.endpoint) return null;\n\n const timeoutMs = handoverMintTimeoutMs(config.externalTracking);\n const controller = new AbortController();\n const timeoutId = window.setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(`${normalizeEndpoint(config.endpoint)}/v1/handover/mint`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Drip-Shop\": config.ingestShopId || config.shopId,\n \"X-Drip-Signature\": config.ingestSignature,\n },\n body: JSON.stringify({\n visitorId,\n ttlSeconds: config.externalTracking?.handoverTtlSeconds,\n assignments: assignments.map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n })),\n }),\n signal: controller.signal,\n credentials: \"omit\",\n keepalive: false,\n });\n if (!response.ok) return null;\n const payload = await response.json() as { token?: unknown };\n return typeof payload.token === \"string\" && payload.token ? payload.token : null;\n } catch {\n return null;\n } finally {\n window.clearTimeout(timeoutId);\n }\n}\n\nasync function verifyBucketingHandoverToken(config: InitConfig, token: string): Promise<unknown> {\n if (!config.shopId || !config.endpoint) return null;\n const response = await fetch(`${normalizeEndpoint(config.endpoint)}/v1/handover/verify`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Drip-Shop\": config.shopId,\n },\n body: JSON.stringify({ verifyToken: token }),\n signal: AbortSignal.timeout(handoverMintTimeoutMs(config.externalTracking)),\n });\n if (!response.ok) return null;\n return (await response.json() as { payload?: unknown }).payload;\n}\n\nfunction clearScheduledAnalyticsStart(): void {\n if (state.analyticsTimeoutId !== null) {\n window.clearTimeout(state.analyticsTimeoutId);\n state.analyticsTimeoutId = null;\n }\n const w = globalThis as Record<string, unknown>;\n const cancelIdle = w.cancelIdleCallback;\n if (state.analyticsIdleId !== null && typeof cancelIdle === \"function\") {\n (cancelIdle as (id: number) => void)(state.analyticsIdleId);\n state.analyticsIdleId = null;\n }\n}\n\nfunction normalizeDataLayerTriggers(config: InitConfig): DataLayerTriggerSettings[] {\n return (config.dataLayerTriggers ?? []).filter((trigger) => trigger?.enabled !== false && Boolean(trigger.eventName));\n}\n\nfunction applyDataLayerMappings(\n eventPayload: Record<string, unknown>,\n mappings: DataLayerSignalMapping[] | undefined,\n): string[] {\n const mapped: string[] = [];\n for (const mapping of mappings ?? []) {\n if (!mapping?.from || !mapping.to) continue;\n const value = coerceSignalValue(readPath(eventPayload, mapping.from), mapping.valueType);\n if (value === undefined) continue;\n setCapturedSignal(mapping.to, value, {\n ttlDays: mapping.ttlDays,\n persist: mapping.persist,\n source: \"data_layer\",\n });\n mapped.push(mapping.to);\n }\n return mapped;\n}\n\nfunction readNumericPath(payload: Record<string, unknown>, path: string | undefined): number | undefined {\n const value = coerceSignalValue(readPath(payload, path), \"number\");\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readStringPath(payload: Record<string, unknown>, path: string | undefined): string | undefined {\n const value = coerceSignalValue(readPath(payload, path), \"string\");\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nconst RESERVED_DATA_LAYER_REVENUE_KEYS = new Set([\n \"revenue\",\n \"source\",\n \"dataLayerEvent\",\n \"orderId\",\n \"currency\",\n \"cost\",\n \"profit\",\n \"goalId\",\n]);\n\nfunction trackDataLayerRevenue(trigger: DataLayerTriggerSettings, payload: Record<string, unknown>): void {\n const settings = trigger.trackRevenue;\n if (!settings || settings.enabled === false) return;\n\n const revenue = readNumericPath(payload, settings.revenueFrom || \"value\");\n if (revenue === undefined) return;\n\n const eventData: Record<string, unknown> = {\n source: \"data_layer\",\n dataLayerEvent: trigger.eventName,\n };\n const orderId = readStringPath(payload, settings.orderIdFrom || \"transaction_id\");\n const currency = readStringPath(payload, settings.currencyFrom || \"currency\");\n const cost = readNumericPath(payload, settings.costFrom);\n const profit = readNumericPath(payload, settings.profitFrom);\n if (orderId) eventData.orderId = orderId;\n if (currency) eventData.currency = currency;\n if (cost !== undefined) eventData.cost = cost;\n if (profit !== undefined) eventData.profit = profit;\n\n for (const mapping of settings.properties ?? []) {\n if (!mapping?.from || !mapping.to) continue;\n if (RESERVED_DATA_LAYER_REVENUE_KEYS.has(mapping.to)) continue;\n const value = coerceSignalValue(readPath(payload, mapping.from), mapping.valueType);\n if (value !== undefined) eventData[mapping.to] = value;\n }\n\n trackRevenue(revenue, eventData);\n}\n\nfunction handleDataLayerEvent(\n trigger: DataLayerTriggerSettings,\n payload: Record<string, unknown>,\n dataLayerName: string,\n gtagNormalized = false,\n): void {\n const mappedSignals = applyDataLayerMappings(payload, trigger.mappings);\n state.lastDataLayerTrigger = {\n eventName: trigger.eventName,\n dataLayerName,\n at: Date.now(),\n mappedSignals,\n ...(gtagNormalized ? { gtagNormalized: true } : {}),\n };\n\n if (state.initializingAssignments) return;\n\n const trackEventName = typeof trigger.trackEventName === \"string\" && trigger.trackEventName.length > 0\n ? trigger.trackEventName\n : null;\n if (trigger.trackPageview === true || trackEventName) {\n track(trackEventName ?? \"pageview\", {\n source: \"data_layer\",\n dataLayerEvent: trigger.eventName,\n ...payload,\n });\n }\n\n trackDataLayerRevenue(trigger, payload);\n\n if (trigger.reEvaluate !== false) {\n reevaluateAssignments(\"dom\");\n }\n}\n\nfunction installDataLayerTriggers(config: InitConfig): (() => void) | null {\n const triggers = normalizeDataLayerTriggers(config);\n if (!triggers.length || typeof window === \"undefined\") return null;\n\n const byLayer = new Map<string, DataLayerTriggerSettings[]>();\n for (const trigger of triggers) {\n const layerName = trigger.dataLayerName || \"dataLayer\";\n byLayer.set(layerName, [...(byLayer.get(layerName) ?? []), trigger]);\n }\n\n const cleanups: Array<() => void> = [];\n for (const [layerName, layerTriggers] of byLayer.entries()) {\n const w = window as unknown as Record<string, any>;\n const layer = Array.isArray(w[layerName]) ? w[layerName] : [];\n w[layerName] = layer;\n const originalPush = layer.push;\n let active = true;\n const process = (item: unknown) => {\n if (!active) return;\n const payload = normalizeDataLayerEntry(item);\n if (!payload) return;\n const eventName = typeof payload.event === \"string\" ? payload.event : \"\";\n for (const trigger of layerTriggers) {\n if (eventName === trigger.eventName) {\n handleDataLayerEvent(trigger, payload, layerName, payload !== item);\n }\n }\n };\n\n layer.slice(Math.max(0, layer.length - 50)).forEach(process);\n const wrappedPush = function (...items: unknown[]) {\n const result = originalPush.apply(layer, items);\n items.forEach(process);\n return result;\n };\n layer.push = wrappedPush as typeof layer.push;\n cleanups.push(() => {\n active = false;\n if (layer.push === wrappedPush) layer.push = originalPush;\n });\n }\n\n return () => cleanups.forEach((cleanup) => cleanup());\n}\n\nfunction experimentsUseSurfaceSignals(experiments: Experiment[]): boolean {\n return experiments.some((experiment) => {\n try {\n return JSON.stringify(experiment.targeting ?? {}).includes(CART_DRAWER_OPEN_SIGNAL);\n } catch {\n return false;\n }\n });\n}\n\nfunction rememberExposureDestination(result: ExposureDestinationDiagnostic): void {\n state.exposureDestinationDiagnostics = [result, ...state.exposureDestinationDiagnostics].slice(0, 20);\n}\n\nlet clarityUpgradeSent = false;\n\nfunction clarityTagKey(prefix: string, name: string): string {\n const key = `${prefix}${name}`\n .replace(/[^A-Za-z0-9 _-]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 80);\n return key || \"apex experiment\";\n}\n\nfunction pushExposureToQueue(destination: NonNullable<ExposureDestinationsSettings[\"queues\"]>[number], payload: Record<string, unknown>): void {\n const queue = readWindowPath(destination.globalName) as any;\n if (!queue) throw new Error(\"queue_missing\");\n const eventName = destination.eventName || \"Viewed an experiment\";\n if (Array.isArray(queue)) {\n queue.push(destination.method\n ? { method: destination.method, event_name: eventName, event_attributes: payload }\n : { event: eventName, ...payload });\n return;\n }\n if (typeof queue.push === \"function\") {\n queue.push(destination.method\n ? { method: destination.method, event_name: eventName, event_attributes: payload }\n : { event: eventName, ...payload });\n return;\n }\n throw new Error(\"queue_push_missing\");\n}\n\nfunction emitExposureDestinations(assignment: Assignment, config: InitConfig): void {\n const destinations = config.exposureDestinations;\n if (!destinations) return;\n const payload = {\n project_id: config.shopId ?? \"\",\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n experiment_name: assignment.experimentName ?? assignment.experimentId,\n variation_index: assignment.index,\n variation_name: assignment.variationId,\n is_control: assignment.isControl,\n };\n const at = Date.now();\n\n if (destinations.dataLayer?.enabled) {\n try {\n const dataLayerName = destinations.dataLayer.dataLayerName || \"dataLayer\";\n const w = window as unknown as Record<string, any>;\n const layer = Array.isArray(w[dataLayerName]) ? w[dataLayerName] : [];\n w[dataLayerName] = layer;\n layer.push({\n event: destinations.dataLayer.eventName || \"apex_experiment_viewed\",\n ...(destinations.dataLayer.includeMetadata === false ? {\n experiment_id: assignment.experimentId,\n variation_id: assignment.variationId,\n } : payload),\n });\n rememberExposureDestination({ type: \"dataLayer\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"dataLayer\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.hotjar?.enabled) {\n try {\n const hj = (window as any).hj;\n if (typeof hj !== \"function\") throw new Error(\"hotjar_missing\");\n if (destinations.hotjar.mode === \"event\") {\n hj(\"event\", destinations.hotjar.eventName || \"apex_experiment_viewed\");\n } else {\n hj(\"identify\", null, { apex_ab_test: `${assignment.experimentId}-${assignment.variationId}` });\n }\n rememberExposureDestination({ type: \"hotjar\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"hotjar\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.clarity?.enabled) {\n try {\n const clarityFn = (window as any).clarity;\n if (typeof clarityFn !== \"function\") throw new Error(\"clarity_missing\");\n const mode = destinations.clarity.mode === \"event\" || destinations.clarity.mode === \"both\"\n ? destinations.clarity.mode\n : \"set\";\n if (mode === \"set\" || mode === \"both\") {\n const key = clarityTagKey(\n destinations.clarity.tagPrefix ?? \"apex \",\n assignment.experimentName ?? assignment.experimentId,\n );\n const value = assignment.isControl ? \"control\" : `variant-${assignment.index}`;\n clarityFn(\"set\", key, value);\n }\n if (mode === \"event\" || mode === \"both\") {\n clarityFn(\"event\", destinations.clarity.eventName || \"apex_experiment_viewed\");\n }\n if (destinations.clarity.upgrade && !clarityUpgradeSent) {\n try {\n clarityFn(\"upgrade\", \"apex_experiment\");\n clarityUpgradeSent = true;\n } catch {\n // Leave clarityUpgradeSent false so the upgrade retries on the next exposure.\n }\n }\n rememberExposureDestination({ type: \"clarity\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"clarity\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.contentsquare?.enabled) {\n try {\n const w = window as any;\n const uxa = (w._uxa = Array.isArray(w._uxa) || (w._uxa && typeof w._uxa.push === \"function\") ? w._uxa : []);\n const key = clarityTagKey(\n destinations.contentsquare.keyPrefix ?? \"apex \",\n assignment.experimentName ?? assignment.experimentId,\n ).slice(0, 50);\n uxa.push([\n \"trackDynamicVariable\",\n {\n key,\n value: assignment.isControl ? \"control\" : `variant-${assignment.index}`,\n },\n ]);\n rememberExposureDestination({ type: \"contentsquare\", status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({ type: \"contentsquare\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n if (destinations.posthog?.enabled) {\n try {\n const posthog = (window as any).posthog;\n if (!posthog || (typeof posthog !== \"object\" && typeof posthog !== \"function\") || typeof posthog.capture !== \"function\") {\n rememberExposureDestination({ type: \"posthog\", status: \"failed\", at, reason: \"posthog_missing\" });\n } else {\n const mode = destinations.posthog.mode === \"capture\" || destinations.posthog.mode === \"register\"\n ? destinations.posthog.mode\n : \"both\";\n if (mode === \"capture\" || mode === \"both\") {\n posthog.capture(destinations.posthog.eventName || \"apex_experiment_viewed\", payload);\n }\n if (mode === \"register\" || mode === \"both\") {\n if (typeof posthog.register !== \"function\") {\n rememberExposureDestination({ type: \"posthog\", status: \"failed\", at, reason: \"posthog_register_missing\" });\n } else {\n posthog.register({ [`apex_exp_${assignment.experimentId}`]: assignment.variationId });\n rememberExposureDestination({ type: \"posthog\", status: \"sent\", at });\n }\n } else {\n rememberExposureDestination({ type: \"posthog\", status: \"sent\", at });\n }\n }\n } catch (error) {\n rememberExposureDestination({ type: \"posthog\", status: \"failed\", at, reason: error instanceof Error ? error.message : String(error) });\n }\n }\n\n for (const queue of destinations.queues ?? []) {\n if (queue.enabled === false) continue;\n try {\n pushExposureToQueue(queue, payload);\n rememberExposureDestination({ type: `queue:${queue.globalName}`, status: \"sent\", at });\n } catch (error) {\n rememberExposureDestination({\n type: `queue:${queue.globalName}`,\n status: \"failed\",\n at,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nfunction ensureTrackerStarted(config: InitConfig): void {\n if (state.tracker) return;\n if (state.screenshotMode) return;\n if (state.trackingDisabledByDnt) return;\n const eventsEndpoint = getEventsEndpoint(config);\n if (!eventsEndpoint) return;\n\n state.tracker = new Tracker({\n endpoint: eventsEndpoint,\n shopId: config.shopId,\n ingestShopId: config.ingestShopId ?? config.shopId,\n ingestSignature: config.ingestSignature,\n visitorId: state.userId ?? undefined,\n getActiveAssignment: () => {\n const a = state.assignments.length > 0 ? state.assignments[0] : null;\n return a ? { experimentId: a.experimentId, variationId: a.variationId } : null;\n },\n buildPageExitEvents: buildPageExitEvents,\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n environment: config.environments?.activeKey || \"production\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"tracker\", \"Tracker started\", { endpoint: eventsEndpoint, qaMode: state.qaMode });\n state.tracker.start();\n}\n\nfunction exposureAssignmentKey(assignment: Assignment): string {\n const entityId = assignment.kind === \"personalization\" && assignment.personalization\n ? assignment.personalization.id\n : assignment.experimentId;\n return `${entityId}:${assignment.variationId}:${assignment.assignmentEpoch ?? \"\"}`;\n}\n\nfunction priceAssignmentAuthorizationKey(assignment: {\n experimentId: string;\n variationId: string;\n assignmentEpoch?: number;\n}): string {\n return `${assignment.experimentId}:${assignment.variationId}:${assignment.assignmentEpoch ?? \"\"}`;\n}\n\nfunction isPriceDisplayAssignmentAuthorized(assignment: Assignment): boolean {\n const authorization = state.config?.commerce?.price?.authorization;\n if (\n authorization?.version !== 1 ||\n !Number.isSafeInteger(authorization.revision) ||\n authorization.revision <= 0 ||\n !authorization.experimentIds?.includes(assignment.experimentId)\n ) return true;\n // Inside a mixed experiment, a variation without any charged adjustment is\n // display-only: it needs no cart proof even though its experiment is on\n // the authorization plane.\n const adjustments = state.config?.commerce?.price?.experiments\n .find((experiment) => experiment.experiment_id === assignment.experimentId)\n ?.variants[assignment.variationId];\n if (\n adjustments &&\n !adjustments.some((adjustment) => typeof adjustment.fixedPricePerUnit === \"string\")\n ) return true;\n return state.authorizedPriceAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true;\n}\n\nfunction isShippingDisplayAssignmentAuthorized(assignment: Assignment): boolean {\n const authorization = state.config?.commerce?.shipping?.authorization;\n if (\n authorization?.version !== 1 ||\n !Number.isSafeInteger(authorization.revision) ||\n authorization.revision <= 0 ||\n !authorization.experimentIds?.includes(assignment.experimentId)\n ) return true;\n return state.authorizedShippingAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true;\n}\n\nfunction isOffersDisplayAssignmentAuthorized(assignment: Assignment): boolean {\n const authorization = state.config?.commerce?.offers?.authorization;\n if (\n authorization?.version !== 1 ||\n !Number.isSafeInteger(authorization.revision) ||\n authorization.revision <= 0 ||\n !authorization.experimentIds?.includes(assignment.experimentId)\n ) return true;\n return state.authorizedOffersAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true;\n}\n\nfunction giftSyncOptions(extra?: Partial<GiftSyncOptions>): GiftSyncOptions {\n return {\n // Proof comes from the CURRENT stamped offers plane, not config: a\n // shared price+offers assignment whose offers proof was refused must\n // not insert (or keep) a gift the Function will not discount.\n isArmProven: (assignment) =>\n state.authorizedOffersAssignmentKeys?.has(\n priceAssignmentAuthorizationKey(assignment),\n ) === true,\n ...extra,\n };\n}\n\n/** Every artifact applyAssignments/applyAssignmentCode can render. */\nfunction assignmentHasRenderableArtifacts(assignment: Assignment): boolean {\n return Boolean(\n assignment.mutations.length ||\n assignment.css ||\n assignment.js ||\n assignment.experimentCss ||\n assignment.experimentJs ||\n assignment.externalCssUrl ||\n assignment.externalJsUrl,\n );\n}\n\n/** Install offers display keys and render any DOM they just unlocked. */\nfunction authorizeOffersDisplayAndRender(\n authorizedAssignments: CartAssignment[],\n): void {\n const previous = state.authorizedOffersAssignmentKeys;\n const next = new Set(\n authorizedAssignments.map(priceAssignmentAuthorizationKey),\n );\n state.authorizedOffersAssignmentKeys = next;\n // Re-apply only when authorization just unlocked withheld DOM for an\n // offers-enforced assignment; the identity guard breaks the\n // apply -> sync -> already-stamped -> authorize loop.\n const offersEnforcedIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n const newlyRenderable = state.assignments.some((assignment) =>\n offersEnforcedIds.has(assignment.experimentId) &&\n next.has(priceAssignmentAuthorizationKey(assignment)) &&\n !previous?.has(priceAssignmentAuthorizationKey(assignment)) &&\n assignmentHasRenderableArtifacts(assignment));\n if (newlyRenderable) {\n // Full reapply behind the established cleanup (the adoption pattern):\n // without it, parallel already-rendered assignments would duplicate\n // structural insert mutations and re-run custom JS un-reset.\n spaCleanup(state.assignments);\n applyAssignments(state.assignments, state.activationMode);\n }\n}\n\n/** Revoke the previous cart's offer grant and restore un-authorized DOM. */\nfunction revokeOffersDisplayAuthorization(): void {\n const previous = state.authorizedOffersAssignmentKeys;\n if (!previous || previous.size === 0) return;\n const offersEnforcedIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n const hadRenderable = state.assignments.some((assignment) =>\n offersEnforcedIds.has(assignment.experimentId) &&\n previous.has(priceAssignmentAuthorizationKey(assignment)) &&\n assignmentHasRenderableArtifacts(assignment));\n state.authorizedOffersAssignmentKeys = new Set();\n if (hadRenderable) {\n // The new cart holds no stamp for these arms; retire their treatment\n // (cleanup + withheld reapply) until its authorization is confirmed.\n spaCleanup(state.assignments);\n applyAssignments(state.assignments, state.activationMode);\n }\n}\n\nfunction exposureEligibleAssignments(config: InitConfig): Assignment[] {\n return state.assignments\n .filter(\n (assignment) =>\n assignment.isControl ||\n (isPriceDisplayAssignmentAuthorized(assignment) &&\n isCommercePriceExposureEligible(config.commerce?.price, assignment)),\n )\n .filter(\n (assignment) =>\n isShippingDisplayAssignmentAuthorized(assignment) &&\n isShippingExposureCartEligible(config, assignment),\n )\n .filter(isOffersDisplayAssignmentAuthorized);\n}\n\nfunction isShippingExposureCartEligible(\n config: InitConfig,\n assignment: Assignment,\n): boolean {\n const experiment = config.commerce?.shipping?.experiments.find(\n (candidate) => candidate.experiment_id === assignment.experimentId,\n );\n if (!experiment) return true;\n const exposure = classifyShippingExposure(\n experiment.variants,\n Boolean(assignment.isControl),\n experiment.variants[assignment.variationId],\n );\n return (!exposure.needsTargetProof && !exposure.isCurrencyBound)\n || isShippingCartEligibilityConfirmed(assignment.experimentId);\n}\n\nfunction trackViewedAssignmentsAfterShippingEligibility(): void {\n if (state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config);\n }\n}\n\nsetCommercePriceExposureListener(\n trackViewedAssignmentsAfterShippingEligibility,\n);\n\nfunction trackViewedAssignments(config: InitConfig): void {\n if (config.autoTrack === false) return;\n const assignments = exposureEligibleAssignments(config);\n if (assignments.length === 0) return;\n const url = config.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n const attributes = buildTargetingAttributes(config.attributes ?? {}, url, {\n persistSignals: persistentStorageAllowed(),\n });\n const exposureSignals = buildExposureSignalContext({\n attributes,\n customSignals: config.signals,\n });\n assignments.forEach((a) => {\n const exposureKey = exposureAssignmentKey(a);\n if (state.exposedAssignmentKeys.has(exposureKey)) return;\n state.exposedAssignmentKeys.add(exposureKey);\n if (a.kind === \"personalization\" && a.personalization) {\n track(\n \"personalization_rendered\",\n {\n index: a.index,\n ...(exposureSignals ? { signals: exposureSignals } : {}),\n entity_kind: \"personalization\",\n personalization_id: a.personalization.id,\n personalization_key: a.personalization.key,\n personalization_rule_id: a.personalization.ruleId,\n personalization_experience_id: a.personalization.experienceId,\n personalization_surface: a.personalization.surface,\n personalization_template_key: a.personalization.templateKey,\n },\n a.experimentId,\n a.variationId,\n );\n } else {\n track(\n \"experiment_viewed\",\n {\n index: a.index,\n ...(exposureSignals ? { signals: exposureSignals } : {}),\n },\n a.experimentId,\n a.variationId,\n );\n }\n emitExposureDestinations(a, config);\n rememberOrderExposure(a);\n config.onExperimentViewed?.(a);\n });\n}\n\nfunction setupGoalTracking(assignments: Assignment[], experiments: Experiment[]): void {\n cleanupGoals();\n setupGoals(assignments, experiments, (goalId, assignment, data) => {\n track(\"goal\", { goalId, ...data }, assignment.experimentId, assignment.variationId);\n });\n}\n\nfunction setupHeatmapTracking(assignments: Assignment[], experiments: Experiment[]): void {\n if (!FEATURE_HEATMAP) return;\n if (!state.tracker || trackingBlocked()) return;\n if (state.heatmapController) {\n state.heatmapController.update(assignments, experiments);\n return;\n }\n import(\"./heatmap\").then(({ startHeatmapCapture }) => {\n if (!state.tracker || trackingBlocked() || state.heatmapController) return;\n state.heatmapController = startHeatmapCapture(assignments, experiments, track);\n }).catch(() => {});\n}\n\nfunction cleanupHeatmapTracking(): void {\n if (!state.heatmapController) return;\n state.heatmapController.stop();\n state.heatmapController = null;\n}\n\nfunction setupSemanticTracking(config: InitConfig): void {\n if (!state.tracker || trackingBlocked()) return;\n if (state.semanticController) return;\n import(\"./semantic\").then(({ startSemanticCapture }) => {\n if (!state.tracker || trackingBlocked() || state.semanticController) return;\n state.semanticController = startSemanticCapture(config.semanticTracking, track);\n }).catch(() => {});\n}\n\nfunction cleanupSemanticTracking(): void {\n if (!state.semanticController) return;\n state.semanticController.stop();\n state.semanticController = null;\n}\n\nfunction buildExperimentBehaviorEvents(\n type: \"experiment_pageview\" | \"experiment_page_exit\",\n data?: Record<string, unknown>,\n): TrackEvent[] {\n return state.assignments.map((assignment) => ({\n type,\n data: withAssignmentEpochData(data, assignment.experimentId, assignment.variationId),\n url: cleanUrl(),\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n }));\n}\n\nfunction buildPageExitEvents(type: string, data?: Record<string, unknown>): TrackEvent[] {\n const a = state.assignments.length > 0 ? state.assignments[0] : null;\n return [\n {\n type,\n data: withAssignmentEpochData(data, a?.experimentId, a?.variationId),\n url: cleanUrl(),\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n },\n ...buildExperimentBehaviorEvents(\"experiment_page_exit\", data),\n ];\n}\n\n/** Track analytics events with legacy global events plus per-assignment behavior events. */\nfunction analyticsTrack(type: string, data?: Record<string, unknown>): void {\n if (trackingBlocked()) return;\n if (!state.tracker) return;\n // Attach the first active experiment assignment so analytics events\n // are attributed to the correct variation in Tinybird.\n const a = state.assignments.length > 0 ? state.assignments[0] : null;\n const event: TrackEvent = {\n type,\n data: withAssignmentEpochData(data, a?.experimentId, a?.variationId),\n url: cleanUrl(),\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n };\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"track\", type, {\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n ...data,\n });\n state.tracker.track(event);\n if (type === \"pageview\") {\n if (state.config) scheduleOrderIdentityBeacon(state.config);\n for (const behaviorEvent of buildExperimentBehaviorEvents(\"experiment_pageview\", data)) {\n state.tracker.track(behaviorEvent);\n }\n } else if (type === \"page_exit\") {\n for (const behaviorEvent of buildExperimentBehaviorEvents(\"experiment_page_exit\", data)) {\n state.tracker.track(behaviorEvent);\n }\n }\n}\n\nfunction syncLoadDiagnosticsToPerf(): void {\n if (typeof window === \"undefined\") return;\n const perfWindow = window as DripPerfWindow;\n const perf = perfWindow.__dripPerf = perfWindow.__dripPerf ?? {};\n perf.load_stage = state.load.stage;\n perf.config_fetch_status = state.load.configFetchStatus;\n if (state.load.configFetchAttempts !== undefined) perf.config_fetch_attempts = state.load.configFetchAttempts;\n if (state.load.configFetchMs !== undefined) perf.config_fetch_ms = state.load.configFetchMs;\n if (state.load.assignmentReadyMs !== undefined) perf.assignment_ready_ms = state.load.assignmentReadyMs;\n if (state.load.pendingMutations !== undefined) perf.pending_mutations = state.load.pendingMutations;\n if (state.load.appliedMutations !== undefined) perf.applied_mutations = state.load.appliedMutations;\n if (state.load.missedMutations !== undefined) perf.missed_mutations = state.load.missedMutations;\n}\n\nfunction updateLoadDiagnostics(patch: Partial<RuntimeLoadDiagnostic> & { stage: string }): void {\n state.load = {\n ...state.load,\n ...patch,\n updatedAt: Date.now(),\n };\n syncLoadDiagnosticsToPerf();\n try {\n document.dispatchEvent(new CustomEvent(\"drip_runtime_status\", { detail: { ...state.load } }));\n } catch {\n // ignore event dispatch failures\n }\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"trace\", `Runtime status: ${patch.stage}`, patch as Record<string, unknown>);\n}\n\nfunction resetLoadDiagnostics(stage = \"boot\"): void {\n const now = Date.now();\n state.load = {\n stage,\n startedAt: now,\n updatedAt: now,\n configFetchStatus: \"idle\",\n configFetchAttempts: 0,\n appliedMutations: 0,\n missedMutations: 0,\n };\n syncLoadDiagnosticsToPerf();\n}\n\nfunction queuePerfEvent(data: PendingPerfEvent): void {\n if (trackingBlocked()) return;\n state.pendingPerf = {\n ...data,\n config_fetch_ms: state.load.configFetchMs,\n config_fetch_attempts: state.load.configFetchAttempts,\n config_fetch_status: state.load.configFetchStatus,\n config_fetch_status_code: state.load.configFetchStatusCode,\n mutation_apply_pending: state.load.pendingMutations,\n mutation_apply_applied: state.load.appliedMutations,\n mutation_apply_missed: state.load.missedMutations,\n };\n}\n\ntype RuntimeInstallClaim = {\n installSurface: string;\n sdkVersion: string;\n runtimeProfile: string;\n};\n\nconst RUNTIME_INSTALL_CLAIM_KEY = \"__dripRuntimeInstallClaim\";\nconst RUNTIME_INSTALL_CONFLICT_KEY = \"__dripRuntimeInstallConflictEmitted\";\n\nfunction telemetryLabel(value: unknown, fallback = \"unknown\"): string {\n if (typeof value !== \"string\") return fallback;\n const cleaned = value.trim().slice(0, 120);\n return cleaned || fallback;\n}\n\nfunction readRuntimeInstallClaim(): RuntimeInstallClaim | null {\n const value = (globalThis as Record<string, unknown>)[RUNTIME_INSTALL_CLAIM_KEY];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n return {\n installSurface: telemetryLabel(record.installSurface, \"direct_script\"),\n sdkVersion: telemetryLabel(record.sdkVersion),\n runtimeProfile: telemetryLabel(record.runtimeProfile, \"full\"),\n };\n}\n\nfunction rememberRuntimeInstallClaim(config: InitConfig): RuntimeInstallClaim {\n const claim = {\n installSurface: telemetryLabel(config.installSurface, \"direct_script\"),\n sdkVersion: telemetryLabel(config.sdkVersion),\n runtimeProfile: telemetryLabel(config.runtimeProfile, \"full\"),\n };\n const runtimeGlobal = globalThis as Record<string, unknown>;\n runtimeGlobal[RUNTIME_INSTALL_CLAIM_KEY] = claim;\n delete runtimeGlobal[RUNTIME_INSTALL_CONFLICT_KEY];\n return claim;\n}\n\nfunction claimInstallConflictEmission(): boolean {\n const runtimeGlobal = globalThis as Record<string, unknown>;\n if (runtimeGlobal[RUNTIME_INSTALL_CONFLICT_KEY] === true) return false;\n runtimeGlobal[RUNTIME_INSTALL_CONFLICT_KEY] = true;\n return true;\n}\n\nfunction sdkAttributionData(config: InitConfig): Record<string, unknown> {\n const firstInstall = readRuntimeInstallClaim();\n const snippetRevision = config.delivery?.revision;\n return {\n sdk_version: telemetryLabel(config.sdkVersion),\n sdk_delivery_mode: telemetryLabel(config.sdkDeliveryMode),\n sdk_delivery_source: telemetryLabel(config.sdkDeliverySource),\n sdk_policy_revision: telemetryLabel(config.sdkPolicyRevision),\n snippet_revision: typeof snippetRevision === \"number\" && Number.isFinite(snippetRevision)\n ? Math.max(0, Math.floor(snippetRevision))\n : undefined,\n runtime_profile: telemetryLabel(config.runtimeProfile, \"full\"),\n install_surface: telemetryLabel(config.installSurface, \"direct_script\"),\n first_install_surface: firstInstall?.installSurface ?? telemetryLabel(config.installSurface, \"direct_script\"),\n };\n}\n\nfunction sendRuntimeEventNow(\n config: InitConfig,\n type: string,\n data: Record<string, unknown>,\n userId?: string | null,\n): void {\n if (trackingBlocked()) return;\n if (state.screenshotMode) return;\n const endpoint = getEventsEndpoint(config);\n if (!endpoint || !config.shopId) return;\n try {\n const tracker = new Tracker({\n endpoint,\n shopId: config.shopId,\n ingestShopId: config.ingestShopId ?? config.shopId,\n ingestSignature: config.ingestSignature,\n visitorId: userId ?? undefined,\n flushIntervalMs: 60_000,\n maxBatchSize: 1,\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n environment: config.environments?.activeKey || \"production\",\n });\n tracker.track({\n type,\n data: { ...sdkAttributionData(config), ...data },\n url: cleanUrl(),\n });\n void tracker.flush().finally(() => tracker.stop());\n } catch {\n // best-effort runtime telemetry\n }\n}\n\nfunction sendRuntimePerfNow(\n config: InitConfig,\n data: Record<string, unknown>,\n userId?: string | null,\n): void {\n sendRuntimeEventNow(config, \"sdk_perf\", data, userId);\n}\n\nfunction readDripPerf(): Record<string, unknown> {\n return ((window as DripPerfWindow).__dripPerf ?? {}) as Record<string, unknown>;\n}\n\nfunction markDripPerf(name: string): number {\n const perfWindow = window as DripPerfWindow;\n const perf = perfWindow.__dripPerf = perfWindow.__dripPerf ?? {};\n const current = perf[name];\n if (typeof current === \"number\" && Number.isFinite(current)) return current;\n const now = Date.now();\n perf[name] = now;\n return now;\n}\n\nfunction numberPerf(perf: Record<string, unknown>, name: string): number | undefined {\n const value = perf[name];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction coexistencePerfFields(perf: Record<string, unknown>): Partial<PendingPerfEvent> {\n return {\n ...getCwvMetrics(),\n hydration_detected_at: numberPerf(perf, \"hydration_detected_at\"),\n apply_delayed_ms: numberPerf(perf, \"apply_delayed_ms\"),\n hydration_timeout: perf.hydration_timeout === true,\n hold_timeout: perf.hold_timeout === true,\n reapply_count: numberPerf(perf, \"reapply_count\") ?? 0,\n reassert_loop_detected: perf.reassert_loop_detected === true,\n };\n}\n\nfunction buildPerfEvent(config: InitConfig, timing: {\n assignmentReadyMs: number;\n initTotalMs?: number;\n phases?: Partial<Record<InitPhaseKey, number>>;\n includesConfigFetch?: boolean;\n blankScreenMs: number;\n assignmentReadyAt?: number;\n}): PendingPerfEvent {\n const perf = readDripPerf();\n const assignmentReadyAt = timing.assignmentReadyAt ?? Date.now();\n const antiFlickerInsertedAt = numberPerf(perf, \"anti_flicker_inserted_at\");\n const revealAt = numberPerf(perf, \"reveal_at\");\n const phases = timing.phases ?? {};\n const measuredPhaseMs = Object.values(phases).reduce((total, value) => total + (value ?? 0), 0);\n const configFetchMs = timing.includesConfigFetch ? state.load.configFetchMs ?? 0 : 0;\n const unattributedInitMs = timing.initTotalMs === undefined\n ? undefined\n : boundedPerfDuration(timing.initTotalMs - measuredPhaseMs - configFetchMs);\n const mutationCount = state.assignments.reduce(\n (total, assignment) => total + assignment.mutations.length,\n 0,\n );\n const attribution = sdkAttributionData(config);\n return {\n assignment_ready_ms: timing.assignmentReadyMs,\n init_total_ms: timing.initTotalMs,\n guard_resolve_ms: phases.guard_resolve_ms,\n consent_identity_ms: phases.consent_identity_ms,\n runtime_setup_ms: phases.runtime_setup_ms,\n targeting_assignment_ms: phases.targeting_assignment_ms,\n mutation_finalize_ms: phases.mutation_finalize_ms,\n unattributed_init_ms: unattributedInitMs,\n blank_screen_ms: timing.blankScreenMs,\n platform: state.platform,\n config_source: state.configSource,\n activation_mode: state.activationMode,\n sdk_version: String(attribution.sdk_version),\n sdk_delivery_mode: String(attribution.sdk_delivery_mode),\n sdk_delivery_source: String(attribution.sdk_delivery_source),\n sdk_policy_revision: String(attribution.sdk_policy_revision),\n snippet_revision: typeof attribution.snippet_revision === \"number\" ? attribution.snippet_revision : undefined,\n runtime_profile: String(attribution.runtime_profile),\n experiment_count: config.experiments?.length ?? 0,\n assignment_count: state.assignments.length,\n mutation_count: mutationCount,\n script_exec_start: numberPerf(perf, \"script_exec_start\"),\n anti_flicker_inserted_at: antiFlickerInsertedAt,\n assignment_ready_at: assignmentReadyAt,\n first_mutation_at: numberPerf(perf, \"first_mutation_at\"),\n reveal_at: revealAt,\n hidden_duration_ms: antiFlickerInsertedAt && revealAt ? Math.max(0, revealAt - antiFlickerInsertedAt) : undefined,\n current_page_hide_selector_count: numberPerf(perf, \"current_page_hide_selector_count\"),\n delivery_state: typeof config.deliveryState === \"string\" ? config.deliveryState : undefined,\n script_cache_source: typeof config.scriptCacheSource === \"string\" ? config.scriptCacheSource : undefined,\n install_surface: String(attribution.install_surface),\n first_install_surface: String(attribution.first_install_surface),\n ...coexistencePerfFields(perf),\n };\n}\n\nfunction flushPendingPerf(): void {\n if (!state.pendingPerf || !state.tracker) return;\n const pendingPerf = state.pendingPerf;\n state.pendingPerf = null;\n const a = state.assignments.length > 0 ? state.assignments[0] : null;\n const perf = readDripPerf();\n const event: TrackEvent = {\n type: \"sdk_perf\",\n data: withAssignmentEpochData({\n ...pendingPerf,\n ...coexistencePerfFields(perf),\n }, a?.experimentId, a?.variationId),\n url: cleanUrl(),\n experimentId: a?.experimentId,\n variationId: a?.variationId,\n };\n state.tracker.track(event);\n const completion = waitForCwvMetrics();\n const experimentId = a?.experimentId;\n const variationId = a?.variationId;\n const url = cleanUrl();\n void completion.then((metrics) => {\n if (!metrics || state.screenshotMode || trackingBlocked() || !state.tracker) return;\n state.tracker.track({\n type: \"sdk_cwv\",\n data: withAssignmentEpochData({\n ...metrics,\n cwv_finalized: true,\n }, experimentId, variationId),\n url,\n experimentId,\n variationId,\n });\n });\n}\n\nfunction orderIdentityEndpoint(config: InitConfig): string | null {\n if (!config.endpoint) return null;\n return normalizeEndpoint(config.endpoint) + \"/order-identity\";\n}\n\nconst ORDER_EXPOSURE_STORAGE_KEY = \"drip_exposures\";\nconst ORDER_EXPOSURE_MAX_ENTRIES = 50;\nconst ORDER_EXPOSURE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\n\ntype StoredOrderExposure = {\n e: string;\n v: string;\n t: number;\n};\n\nfunction pruneStoredOrderExposures(exposures: StoredOrderExposure[], now = Date.now()): StoredOrderExposure[] {\n return exposures\n .filter((entry) =>\n typeof entry.e === \"string\" &&\n entry.e &&\n typeof entry.v === \"string\" &&\n entry.v &&\n typeof entry.t === \"number\" &&\n Number.isFinite(entry.t) &&\n now - entry.t <= ORDER_EXPOSURE_TTL_MS,\n )\n .sort((a, b) => a.t - b.t)\n .slice(-ORDER_EXPOSURE_MAX_ENTRIES);\n}\n\nfunction readStoredOrderExposures(): StoredOrderExposure[] {\n if (!persistentStorageAllowed()) return [];\n try {\n const raw = globalThis.localStorage?.getItem(ORDER_EXPOSURE_STORAGE_KEY);\n const parsed = raw ? JSON.parse(raw) : [];\n if (!Array.isArray(parsed)) return [];\n return pruneStoredOrderExposures(parsed as StoredOrderExposure[]);\n } catch {\n return [];\n }\n}\n\nfunction writeStoredOrderExposures(exposures: StoredOrderExposure[]): void {\n if (!persistentStorageAllowed()) return;\n try {\n globalThis.localStorage?.setItem(\n ORDER_EXPOSURE_STORAGE_KEY,\n JSON.stringify(pruneStoredOrderExposures(exposures)),\n );\n } catch {}\n}\n\nfunction clearIdentityContextCookie(): void {\n if (!globalThis.document) return;\n try {\n globalThis.document.cookie = `${IDENTITY_CONTEXT_COOKIE_NAME}=; Max-Age=0; Path=/; SameSite=Lax`;\n } catch {}\n}\n\nfunction recentIdentityContextExposures(): StoredOrderExposure[] {\n const deduped = new Map<string, StoredOrderExposure>();\n const exposures = readStoredOrderExposures();\n for (let index = exposures.length - 1; index >= 0; index--) {\n const exposure = exposures[index];\n if (deduped.has(exposure.e)) continue;\n deduped.set(exposure.e, exposure);\n if (deduped.size >= 10) break;\n }\n return Array.from(deduped.values()).reverse();\n}\n\nfunction buildIdentityContextCookieValue(\n visitorId: string,\n sessionId: string,\n exposures: StoredOrderExposure[],\n): string | null {\n let remaining = exposures.slice();\n while (true) {\n // Public contract for in-process commerce platforms (WooCommerce now,\n // Magento later): URL-encoded `1|visitorId|sessionId|expId:varId,...`.\n const raw = `1|${visitorId}|${sessionId}|${remaining.map((entry) => `${entry.e}:${entry.v}`).join(\",\")}`;\n const encoded = encodeURIComponent(raw);\n if (encoded.length <= IDENTITY_CONTEXT_COOKIE_MAX_ENCODED_BYTES) return encoded;\n if (remaining.length === 0) return null;\n remaining = remaining.slice(1);\n }\n}\n\nfunction generateSessionId(): string {\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nfunction getIdentityContextSessionId(): string {\n const trackerSessionId = state.tracker?.getSessionId();\n if (trackerSessionId) return trackerSessionId;\n try {\n const existing = globalThis.sessionStorage?.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n const created = generateSessionId();\n globalThis.sessionStorage?.setItem(SESSION_STORAGE_KEY, created);\n return created;\n } catch {\n return generateSessionId();\n }\n}\n\nfunction writeIdentityContextCookie(): StoredOrderExposure[] {\n if (trackingBlocked()) {\n clearIdentityContextCookie();\n return [];\n }\n if (!globalThis.document || !state.userId) return [];\n const exposures = recentIdentityContextExposures();\n try {\n const encoded = buildIdentityContextCookieValue(\n state.userId,\n getIdentityContextSessionId(),\n exposures,\n );\n if (!encoded) {\n clearIdentityContextCookie();\n return exposures;\n }\n globalThis.document.cookie =\n `${IDENTITY_CONTEXT_COOKIE_NAME}=${encoded}; Path=/; SameSite=Lax; Max-Age=${IDENTITY_CONTEXT_COOKIE_MAX_AGE_SECONDS}`;\n } catch {\n clearIdentityContextCookie();\n }\n return exposures;\n}\n\nfunction restoreRecordedExposureDedup(exposures: StoredOrderExposure[]): void {\n if (!exposures.length) return;\n const recorded = new Set(exposures.map((entry) => `${entry.e}:${entry.v}`));\n for (const assignment of state.assignments) {\n if (\n offTargetPersistedAssignments.has(assignment) &&\n recorded.has(`${assignment.experimentId}:${assignment.variationId}`)\n ) {\n state.exposedAssignmentKeys.add(exposureAssignmentKey(assignment));\n }\n }\n}\n\nfunction rememberOrderExposure(assignment: Assignment): void {\n if (!persistentStorageAllowed()) return;\n const now = Date.now();\n const exposures = readStoredOrderExposures()\n .filter((entry) => entry.e !== assignment.experimentId);\n exposures.push({ e: assignment.experimentId, v: assignment.variationId, t: now });\n writeStoredOrderExposures(exposures);\n writeIdentityContextCookie();\n}\n\nfunction mergedOrderIdentityAssignments(): Array<{ experimentId: string; variationId: string }> {\n const merged = new Map<string, { experimentId: string; variationId: string }>();\n for (const exposure of readStoredOrderExposures()) {\n merged.set(exposure.e, { experimentId: exposure.e, variationId: exposure.v });\n }\n for (const assignment of state.assignments) {\n merged.set(assignment.experimentId, {\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n });\n }\n return Array.from(merged.values()).slice(0, ORDER_EXPOSURE_MAX_ENTRIES);\n}\n\nfunction cleanOrderIdentityText(value: unknown): string | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed.slice(0, 255) : null;\n}\n\nfunction resolveOrderIdentityPlatform(): OrderIdentityPlatform {\n if (state.platform === \"shopify\" || state.platform === \"shopware\") return state.platform;\n const w = globalThis as Record<string, unknown>;\n if (w.__apexShopware) return \"shopware\";\n if (w.Shopify) return \"shopify\";\n if (w.wc || w.woocommerce_params) return \"woocommerce\";\n return \"custom\";\n}\n\nfunction detectOrderIdentity(): {\n platform: OrderIdentityPlatform;\n platformOrderId: string | null;\n orderNumber: string | null;\n} | null {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return null;\n const currentUrl = typeof location !== \"undefined\" ? location.href : \"\";\n if (state.orderIdentityDetectionUrl === currentUrl && state.orderIdentityDetection !== undefined) {\n return state.orderIdentityDetection;\n }\n const w = window as unknown as Record<string, unknown>;\n const explicit: unknown[] = [\n w.__apexOrderIdentity,\n readPath(w, \"__apexShopware.orderIdentity\"),\n readPath(w, \"__apexShopware.order\"),\n ];\n const dataLayer = Array.isArray(w.dataLayer) ? w.dataLayer : [];\n for (const item of dataLayer) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const eventName = cleanOrderIdentityText((item as Record<string, unknown>).event);\n if (eventName !== \"purchase\" && eventName !== \"transaction\" && eventName !== \"checkout_completed\") continue;\n explicit.push(readPath(item, \"ecommerce.purchase\"));\n explicit.push(readPath(item, \"ecommerce\"));\n explicit.push(item);\n }\n\n let platformOrderId: string | null = null;\n let orderNumber: string | null = null;\n let platform = resolveOrderIdentityPlatform();\n let strongSignal = false;\n for (const source of explicit) {\n if (!source || typeof source !== \"object\" || Array.isArray(source)) continue;\n strongSignal = true;\n const record = source as Record<string, unknown>;\n platformOrderId ||= cleanOrderIdentityText(\n record.platformOrderId ?? record.orderId ?? record.order_id ?? record.transaction_id,\n );\n orderNumber ||= cleanOrderIdentityText(\n record.orderNumber ?? record.order_number ?? record.number ?? record.transaction_id,\n );\n const hintedPlatform = cleanOrderIdentityText(record.platform);\n if (\n hintedPlatform === \"shopify\" ||\n hintedPlatform === \"shopware\" ||\n hintedPlatform === \"woocommerce\" ||\n hintedPlatform === \"centra\" ||\n hintedPlatform === \"custom\"\n ) {\n platform = hintedPlatform;\n }\n }\n\n if (!strongSignal) {\n const orderIdEl = document.querySelector<HTMLElement>(\"[data-apex-order-id]\");\n const orderNumberEl = document.querySelector<HTMLElement>(\"[data-apex-order-number]\");\n const domOrderId = cleanOrderIdentityText(orderIdEl?.dataset.apexOrderId);\n const domOrderNumber = cleanOrderIdentityText(orderNumberEl?.dataset.apexOrderNumber);\n if (domOrderId || domOrderNumber) {\n strongSignal = true;\n platformOrderId ||= domOrderId;\n orderNumber ||= domOrderNumber;\n }\n }\n\n if (strongSignal) {\n try {\n const params = new URLSearchParams(location.search);\n platformOrderId ||= cleanOrderIdentityText(\n params.get(\"platformOrderId\") ?? params.get(\"orderId\") ?? params.get(\"order_id\"),\n );\n orderNumber ||= cleanOrderIdentityText(\n params.get(\"orderNumber\") ?? params.get(\"order_number\") ?? params.get(\"transaction_id\"),\n );\n } catch {}\n }\n\n const result = strongSignal && (platformOrderId || orderNumber)\n ? { platform, platformOrderId, orderNumber }\n : null;\n state.orderIdentityDetectionUrl = currentUrl;\n state.orderIdentityDetection = result;\n return result;\n}\n\nfunction orderIdentityDedupeKey(identity: {\n platform: string;\n platformOrderId: string | null;\n orderNumber: string | null;\n}, assignments: Array<{ experimentId: string; variationId: string }>): string {\n return [\n \"drip:order_identity\",\n identity.platform,\n identity.platformOrderId || \"\",\n identity.orderNumber || \"\",\n assignments.map((assignment) => `${assignment.experimentId}:${assignment.variationId}`).join(\",\") || \"none\",\n ].join(\":\").slice(0, 240);\n}\n\nfunction scheduleOrderIdentityBeacon(config: InitConfig): void {\n if (state.screenshotMode || trackingBlocked()) return;\n if (!state.tracker) return;\n const endpoint = orderIdentityEndpoint(config);\n if (!endpoint || !config.shopId || !config.ingestSignature) return;\n\n window.setTimeout(() => {\n const identity = detectOrderIdentity();\n if (!identity) return;\n const assignments = mergedOrderIdentityAssignments();\n if (assignments.length === 0) return;\n const key = orderIdentityDedupeKey(identity, assignments);\n try {\n if (sessionStorage.getItem(key) === \"1\") return;\n } catch {}\n if (state.orderIdentityInFlight.has(key)) return;\n state.orderIdentityInFlight.add(key);\n\n const markDelivered = () => {\n try {\n sessionStorage.setItem(key, \"1\");\n } catch {}\n };\n const markComplete = () => {\n state.orderIdentityInFlight.delete(key);\n };\n\n const payload = {\n _shopId: config.ingestShopId ?? config.shopId,\n _signature: config.ingestSignature,\n platform: identity.platform,\n platformOrderId: identity.platformOrderId,\n orderNumber: identity.orderNumber,\n visitorId: state.userId ?? \"\",\n sessionId: state.tracker?.getSessionId() ?? \"\",\n assignments,\n url: cleanUrl(),\n };\n const body = JSON.stringify(payload);\n const sendOnPagehide = () => {\n // A queued beacon has no application-level acknowledgement. Do not set\n // the session marker: the server dedupes the stable order/event identity.\n try {\n if (typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\") {\n navigator.sendBeacon(endpoint, new Blob([body], { type: \"application/json\" }));\n }\n } catch {}\n };\n window.addEventListener(\"pagehide\", sendOnPagehide, { once: true });\n void fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n keepalive: true,\n })\n .then((response) => {\n if (response.status >= 200 && response.status < 300) {\n markDelivered();\n // Only a verified delivery retires the pagehide fallback; after a\n // failed or rejected fetch it stays armed as the last-chance send\n // when the shopper leaves the page (server idempotency absorbs\n // any duplicate).\n window.removeEventListener(\"pagehide\", sendOnPagehide);\n }\n })\n .catch(() => {})\n .finally(markComplete);\n }, 0);\n}\n\nfunction deliveryStatus(expected: number, applied: number, missed: number, isControl: boolean): DeliveryHealthStatus {\n if (expected === 0) return isControl ? \"control\" : \"no_mutations\";\n if (applied >= expected && missed === 0) return \"applied\";\n if (applied > 0) return \"partial\";\n return \"miss\";\n}\n\nfunction queueDeliveryHealthEvent(\n assignment: Assignment,\n data: {\n expectedMutations: number;\n appliedMutations: number;\n selectorMisses: number;\n applyGeneration: number;\n activationMode: ActivationMode;\n },\n): void {\n if (state.screenshotMode) return;\n const event: TrackEvent = {\n type: \"delivery_health\",\n data: {\n expected_mutations: data.expectedMutations,\n applied_mutations: data.appliedMutations,\n selector_misses: data.selectorMisses,\n apply_status: deliveryStatus(\n data.expectedMutations,\n data.appliedMutations,\n data.selectorMisses,\n assignment.isControl,\n ),\n assignment_index: assignment.index,\n is_control: assignment.isControl,\n entity_kind: assignment.kind ?? \"experiment\",\n activation_mode: data.activationMode,\n config_source: state.configSource,\n platform: state.platform,\n apply_generation: data.applyGeneration,\n delivery_state: typeof state.config?.deliveryState === \"string\" ? state.config.deliveryState : undefined,\n assignment_epoch:\n !assignment.kind || assignment.kind === \"experiment\"\n ? assignment.assignmentEpoch\n : undefined,\n },\n url: cleanUrl(),\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n };\n if (state.tracker && !trackingBlocked()) {\n state.tracker.track(event);\n return;\n }\n state.pendingDeliveryHealth.push(event);\n if (state.pendingDeliveryHealth.length > 50) {\n state.pendingDeliveryHealth.splice(0, state.pendingDeliveryHealth.length - 50);\n }\n}\n\nfunction flushPendingDeliveryHealth(): void {\n if (!state.tracker || trackingBlocked() || state.pendingDeliveryHealth.length === 0) return;\n const events = state.pendingDeliveryHealth.splice(0);\n for (const event of events) {\n state.tracker.track(event);\n }\n}\n\nfunction startAnalyticsStage(config: InitConfig, experiments: Experiment[]): void {\n if (state.analyticsStarted) return;\n if (state.pendingInitialApply) {\n // Exposure (experiment_viewed) and goal wiring must not precede the\n // gated initial apply (after_hydration / pre-init hold) — consent and\n // route paths can reach this before the gate opens. Re-enter after;\n // the analyticsStarted flag keeps queued re-entries idempotent, and a\n // config replaced while queued (cached init superseded by the network\n // fetch) must not start analytics with the stale experiment list.\n void state.pendingInitialApply.then(() => {\n if (state.config !== config) return;\n startAnalyticsStage(config, experiments);\n });\n return;\n }\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (!state.trackingPrerequisiteMet) return;\n\n const emptyProjectFastPath = config.runtimeProfile === \"empty_project\"\n && state.perfFlags.perf_empty_project_v1;\n ensureTrackerStarted(config);\n if (!emptyProjectFastPath) {\n persistActiveExperimentAssignments(experiments);\n syncActiveAssignmentToShopifyCart();\n }\n flushPendingPerf();\n flushPendingDeliveryHealth();\n const storedOrderExposures = writeIdentityContextCookie();\n if (!emptyProjectFastPath) {\n restoreRecordedExposureDedup(storedOrderExposures);\n trackViewedAssignments(config);\n setupGoalTracking(state.assignments, experiments);\n setupHeatmapTracking(state.assignments, experiments);\n setupSemanticTracking(config);\n }\n scheduleOrderIdentityBeacon(config);\n state.analyticsStarted = true;\n if (!emptyProjectFastPath) updateProjectActivationDiagnostics(config);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"track\", \"Analytics stage started\", { assignments: state.assignments.length });\n onPageEnter(analyticsTrack);\n if (state.consentRequired && !emptyProjectFastPath) {\n scheduleShopifyAssignmentSync();\n }\n}\n\nfunction scheduleAnalyticsStart(config: InitConfig, experiments: Experiment[]): void {\n clearScheduledAnalyticsStart();\n const run = () => {\n clearScheduledAnalyticsStart();\n startAnalyticsStage(config, experiments);\n };\n\n const idleTimeout = state.trackingIdleTimeoutMs;\n\n state.analyticsTimeoutId = window.setTimeout(run, idleTimeout);\n\n const w = globalThis as Record<string, unknown>;\n const requestIdle = w.requestIdleCallback;\n if (typeof requestIdle === \"function\") {\n state.analyticsIdleId = (requestIdle as (\n cb: () => void,\n opts?: { timeout?: number },\n ) => number)(run, { timeout: idleTimeout });\n }\n}\n\nfunction startAnalyticsIfReady(): void {\n if (state.tracker || !state.config) return;\n if (trackingBlocked()) return;\n if (!state.trackingPrerequisiteMet) return;\n\n const experiments = state.config.experiments ?? [];\n startAnalyticsStage(state.config, experiments);\n}\n\nfunction getConfigCacheKey(shopId: string, environmentKey?: string): string {\n const env = environmentKey || \"production\";\n return CONFIG_CACHE_KEY_PREFIX + shopId + \":\" + env;\n}\n\nfunction storageAvailable(kind: \"localStorage\" | \"sessionStorage\"): boolean {\n try {\n const storage = globalThis[kind];\n if (!storage) return false;\n const key = \"__drip_storage_probe__\";\n storage.setItem(key, \"1\");\n storage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getConfigCacheTtlMs(config: InitConfig): number {\n const ttl = config.configCacheTtlMs;\n if (typeof ttl === \"number\" && Number.isFinite(ttl) && ttl > 0) return ttl;\n return DEFAULT_CONFIG_CACHE_TTL_MS;\n}\n\nfunction readCachedExperiments(\n shopId: string,\n ttlMs: number,\n environmentKey?: string,\n): { experiments: Experiment[]; exclusionGroups?: ExclusionGroupConfig[]; profile?: InitConfig[\"profile\"]; runtime?: unknown; signals?: RuntimeSignalDefinition[]; commerce?: InitConfig[\"commerce\"]; hash: string } | null {\n try {\n const raw = localStorage.getItem(getConfigCacheKey(shopId, environmentKey));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as {\n fetchedAt?: number;\n hash?: string;\n experiments?: Experiment[];\n exclusionGroups?: ExclusionGroupConfig[];\n profile?: InitConfig[\"profile\"];\n runtime?: unknown;\n signals?: RuntimeSignalDefinition[];\n commerce?: InitConfig[\"commerce\"];\n };\n if (!parsed || typeof parsed.fetchedAt !== \"number\" || !Array.isArray(parsed.experiments)) {\n return null;\n }\n if (Date.now() - parsed.fetchedAt > ttlMs) return null;\n return {\n experiments: parsed.experiments,\n exclusionGroups: Array.isArray(parsed.exclusionGroups)\n ? parsed.exclusionGroups\n : undefined,\n profile: parsed.profile,\n runtime: parsed.runtime,\n signals: Array.isArray(parsed.signals) ? parsed.signals : undefined,\n commerce: parsed.commerce,\n hash: typeof parsed.hash === \"string\" ? parsed.hash : \"\",\n };\n } catch {\n return null;\n }\n}\n\nfunction hashConfigPayload(\n experiments: Experiment[],\n exclusionGroups?: ExclusionGroupConfig[],\n profile?: InitConfig[\"profile\"],\n runtime?: unknown,\n signals?: RuntimeSignalDefinition[],\n commerce?: InitConfig[\"commerce\"],\n): string {\n try {\n return JSON.stringify({\n experiments,\n exclusionGroups: exclusionGroups ?? [],\n profile: profile ?? null,\n runtime: runtime ?? null,\n signals: signals ?? [],\n commerce: commerce ?? null,\n });\n } catch {\n return \"\";\n }\n}\n\nfunction writeCachedExperiments(\n shopId: string,\n experiments: Experiment[],\n exclusionGroups?: ExclusionGroupConfig[],\n profile?: InitConfig[\"profile\"],\n runtime?: unknown,\n signals?: RuntimeSignalDefinition[],\n commerce?: InitConfig[\"commerce\"],\n environmentKey?: string,\n): void {\n try {\n const payload = {\n fetchedAt: Date.now(),\n hash: hashConfigPayload(\n experiments,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n ),\n experiments,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n };\n localStorage.setItem(getConfigCacheKey(shopId, environmentKey), JSON.stringify(payload));\n } catch {\n // no-op on storage failures\n }\n}\n\nfunction withRuntimeSettings(\n config: InitConfig,\n runtime: unknown,\n profile?: InitConfig[\"profile\"],\n): InitConfig {\n if (!runtime || typeof runtime !== \"object\") {\n return profile ? { ...config, profile } : config;\n }\n const r = runtime as Record<string, any>;\n const antiFlicker = r.antiFlicker && typeof r.antiFlicker === \"object\" ? r.antiFlicker : {};\n const snippet = r.snippet && typeof r.snippet === \"object\" ? r.snippet : {};\n const prerequisites = r.prerequisites && typeof r.prerequisites === \"object\" ? r.prerequisites : {};\n const debug = r.debug && typeof r.debug === \"object\" ? r.debug : undefined;\n const pageTrigger = r.pageTrigger && typeof r.pageTrigger === \"object\" ? r.pageTrigger : undefined;\n const consentMode = r.consentMode && typeof r.consentMode === \"object\" ? r.consentMode : undefined;\n const spa = r.spa && typeof r.spa === \"object\" ? r.spa : undefined;\n const externalTracking = r.externalTracking && typeof r.externalTracking === \"object\" ? r.externalTracking : undefined;\n const dataLayerTriggers = Array.isArray(r.dataLayerTriggers) ? r.dataLayerTriggers : undefined;\n const exposureDestinations = r.exposureDestinations && typeof r.exposureDestinations === \"object\" ? r.exposureDestinations : undefined;\n const projectCode = r.projectCode && typeof r.projectCode === \"object\" ? r.projectCode : undefined;\n const environments = r.environments && typeof r.environments === \"object\" ? r.environments : undefined;\n const bucketingCleanup = r.bucketingCleanup && typeof r.bucketingCleanup === \"object\" ? r.bucketingCleanup : undefined;\n const dataProtection = r.dataProtection && typeof r.dataProtection === \"object\" ? r.dataProtection : undefined;\n const semanticTracking = r.semanticTracking && typeof r.semanticTracking === \"object\" ? r.semanticTracking : undefined;\n const runtimeControl = r.runtimeControl && typeof r.runtimeControl === \"object\" ? r.runtimeControl : undefined;\n\n return {\n ...config,\n profile: profile ?? config.profile,\n antiFlickerMode: antiFlicker.mode ?? config.antiFlickerMode,\n antiFlickerTimeoutMs: antiFlicker.timeoutMs ?? config.antiFlickerTimeoutMs,\n antiFlickerCustomCss: antiFlicker.customCss ?? config.antiFlickerCustomCss,\n configCacheTtlMs: snippet.configCacheTtlMs ?? config.configCacheTtlMs,\n projectPrerequisites: {\n ...config.projectPrerequisites,\n showVariationsRule: prerequisites.showVariationsRule ?? config.projectPrerequisites?.showVariationsRule,\n startTrackingRule: prerequisites.startTrackingRule ?? config.projectPrerequisites?.startTrackingRule,\n },\n consentMode: consentMode ? { ...config.consentMode, ...consentMode } : config.consentMode,\n debug: debug ? { ...config.debug, ...debug } : config.debug,\n pageTrigger: pageTrigger ? { ...config.pageTrigger, ...pageTrigger } : config.pageTrigger,\n spa: spa ? { ...config.spa, ...spa } : config.spa,\n externalTracking: externalTracking ? { ...config.externalTracking, ...externalTracking } : config.externalTracking,\n dataLayerTriggers: dataLayerTriggers ?? config.dataLayerTriggers,\n exposureDestinations: exposureDestinations ? { ...config.exposureDestinations, ...exposureDestinations } : config.exposureDestinations,\n projectCode: projectCode ? { ...config.projectCode, ...projectCode } : config.projectCode,\n environments: environments ? { ...config.environments, ...environments } : config.environments,\n bucketingCleanup: bucketingCleanup ? { ...config.bucketingCleanup, ...bucketingCleanup } : config.bucketingCleanup,\n dataProtection: dataProtection ? { ...config.dataProtection, ...dataProtection } : config.dataProtection,\n semanticTracking: semanticTracking ? { ...config.semanticTracking, ...semanticTracking } : config.semanticTracking,\n runtimeControl: runtimeControl ? { ...config.runtimeControl, ...runtimeControl } : config.runtimeControl,\n };\n}\n\nfunction serializeForceMap(forceMap: Record<string, string> | null): string {\n if (!forceMap) return \"\";\n return Object.entries(forceMap)\n .map(([experimentId, variationId]) => `${experimentId}:${variationId}`)\n .join(\",\");\n}\n\nfunction getHashId(exp: Experiment, userId: string, attrs: Record<string, unknown>): string {\n if (exp.hashAttribute && attrs[exp.hashAttribute] != null) {\n return String(attrs[exp.hashAttribute]);\n }\n return userId;\n}\n\nfunction buildAssignment(\n experiment: Experiment,\n variation: Variation,\n index: number,\n hashValue: string,\n): Assignment {\n return {\n experimentId: experiment.id,\n experimentName: experiment.name,\n variationId: variation.id,\n index,\n mutations: variation.mutations,\n value: variation.value,\n featureFlag: experiment.featureFlag,\n personalization: experiment.personalization,\n kind: experiment.kind ?? (experiment.personalization ? \"personalization\" : experiment.featureFlag ? \"feature_flag\" : \"experiment\"),\n experimentCss: experiment.css,\n experimentJs: experiment.js,\n experimentResetJs: experiment.resetJs,\n css: variation.css,\n js: variation.js,\n resetJs: variation.resetJs,\n externalCssUrl: variation.externalCssUrl,\n externalJsUrl: variation.externalJsUrl,\n harnessSession: variation.harnessSession,\n isControl: Boolean(variation.isControl),\n hashValue,\n assignmentEpoch: __assignmentStoreInternals.assignmentEpoch(experiment),\n };\n}\n\ntype PersistedAssignmentMap = ReturnType<typeof prunePersistedAssignments>;\nconst offTargetPersistedAssignments = new WeakSet<Assignment>();\n\nfunction loadPersistedAssignments(\n experiments: Experiment[],\n): PersistedAssignmentMap | undefined {\n if (!persistentStorageAllowed() || state.qaMode || state.screenshotMode) {\n return undefined;\n }\n return prunePersistedAssignments(experiments);\n}\n\nfunction buildPersistedAssignmentResult(\n experiment: Experiment,\n persisted: NonNullable<ReturnType<typeof findPersistedVariation>>,\n hashId: string,\n gates: ActivationGateDiagnostic[],\n targetingConditions: ConditionDiagnostic[],\n reason: \"persisted_assignment\" | \"persisted_assignment_off_target\",\n): { assignment: Assignment; diagnostic: ExperimentActivationDiagnostic } {\n const assignment = buildAssignment(\n experiment,\n persisted.variation,\n persisted.index,\n hashId,\n );\n if (reason === \"persisted_assignment_off_target\") {\n offTargetPersistedAssignments.add(assignment);\n }\n gates.push(\n {\n id: \"traffic\",\n label: \"Traffic allocation\",\n status: \"skipped\",\n reason: \"persisted_assignment\",\n },\n {\n id: \"assignment\",\n label: \"Variation assignment\",\n status: \"passed\",\n reason,\n detail: {\n variationId: persisted.variation.id,\n index: persisted.index,\n epoch: persisted.record.epoch,\n },\n },\n );\n for (const gate of gates.slice(-2)) __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gate);\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Reused persisted variation ${persisted.variation.id}`, {\n experimentId: experiment.id,\n index: persisted.index,\n epoch: persisted.record.epoch,\n offTarget: reason === \"persisted_assignment_off_target\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: persisted → variation ${persisted.index}`, {\n variationId: persisted.variation.id,\n epoch: persisted.record.epoch,\n offTarget: reason === \"persisted_assignment_off_target\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: persisted → var ${persisted.index}`, {\n variationId: persisted.variation.id,\n epoch: persisted.record.epoch,\n offTarget: reason === \"persisted_assignment_off_target\",\n });\n return {\n assignment,\n diagnostic: experimentDiagnostic(\n experiment,\n gates,\n assignment,\n reason,\n false,\n targetingConditions,\n ),\n };\n}\n\nfunction withAssignmentEpochData(\n data: Record<string, unknown> | undefined,\n experimentId?: string,\n variationId?: string,\n): Record<string, unknown> | undefined {\n if (!experimentId || !variationId) return data;\n const assignment = state.assignments.find(\n (item) =>\n item.experimentId === experimentId && item.variationId === variationId,\n );\n if (!assignment?.assignmentEpoch) return data;\n if (assignment.kind && assignment.kind !== \"experiment\") return data;\n return { ...(data ?? {}), assignment_epoch: assignment.assignmentEpoch };\n}\n\nfunction usesStickyAssignmentPersistence(experiment: Experiment): boolean {\n return !experiment.kind || experiment.kind === \"experiment\";\n}\n\nfunction persistActiveExperimentAssignments(experiments: Experiment[]): void {\n if (!persistentStorageAllowed()) return;\n // QA traffic must never write to or read from a real visitor's sticky\n // bucket; screenshot mode is short-circuited earlier.\n if (state.qaMode) return;\n const byId = experimentById(experiments);\n for (const assignment of state.assignments) {\n // Off-target restores already came from this exact validated store record.\n // Rewriting them would add a redundant storage read and refresh assignedAt.\n if (offTargetPersistedAssignments.has(assignment)) continue;\n if (assignment.kind && assignment.kind !== \"experiment\") continue;\n if (state.forceMap?.[assignment.experimentId]) continue;\n const experiment = byId.get(assignment.experimentId);\n if (!experiment || !usesStickyAssignmentPersistence(experiment)) continue;\n const variationExists = experiment.variations.some(\n (variation) => variation.id === assignment.variationId,\n );\n if (!variationExists) continue;\n persistAssignmentForExperiment(experiment, assignment.variationId);\n }\n}\n\nfunction experimentDiagnostic(\n experiment: Experiment,\n gates: ActivationGateDiagnostic[],\n assignment: Assignment | null,\n reason?: string,\n forced = false,\n targetingConditions?: ConditionDiagnostic[],\n): ExperimentActivationDiagnostic {\n const failed = gates.find((gate) => gate.status === \"failed\");\n return {\n experimentId: experiment.id,\n experimentName: experiment.name,\n status: assignment ? \"passed\" : \"failed\",\n reason: reason ?? failed?.reason,\n assignedVariationId: assignment?.variationId,\n assignedVariationIndex: assignment?.index,\n forced,\n gates,\n ...(targetingConditions ? { targetingConditions } : {}),\n };\n}\n\nfunction evaluateExperimentDetailed(\n experiment: Experiment,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n userId: string;\n persistedAssignments?: PersistedAssignmentMap;\n },\n): { assignment: Assignment | null; diagnostic: ExperimentActivationDiagnostic } {\n const gates: ActivationGateDiagnostic[] = [];\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Initiated experiment ${traceName(experiment.id, experiment.name)}`, {\n kind: experiment.kind ?? \"experiment\",\n status: experiment.status ?? \"running\",\n variations: experiment.variations.length,\n });\n\n if (!experiment.variations.length) {\n gates.push({ id: \"assignment\", label: \"Variation assignment\", status: \"failed\", reason: \"no_variations\" });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (no variations)`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (no variations)`);\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, \"no_variations\") };\n }\n\n const forcedVarId = state.forceMap?.[experiment.id];\n const forcedIdx = forcedVarId\n ? experiment.variations.findIndex((v) => v.id === forcedVarId)\n : -1;\n const forcedVariation = forcedIdx >= 0 ? experiment.variations[forcedIdx] : null;\n\n const statusOk = !experiment.status || experiment.status === \"running\";\n gates.push({\n id: \"environment\",\n label: \"Experiment status\",\n status: forcedVariation ? \"skipped\" : statusOk ? \"passed\" : \"failed\",\n reason: forcedVariation ? \"forced_variation\" : statusOk ? \"running\" : `status_${experiment.status}`,\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n if (!forcedVariation && !statusOk) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (status=${experiment.status})`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (status=${experiment.status})`);\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, `status_${experiment.status}`) };\n }\n\n const hashId = getHashId(experiment, ctx.userId, ctx.attributes);\n const persisted =\n ctx.persistedAssignments && usesStickyAssignmentPersistence(experiment)\n ? findPersistedVariation(experiment, ctx.persistedAssignments)\n : null;\n\n const targeting = evaluateTargetingGatesDetailed(experiment.targeting, { url: ctx.url, attributes: ctx.attributes });\n gates.push(...targeting.gates);\n for (const gate of targeting.gates) __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gate);\n if (!targeting.matched) {\n const pageMismatch = targeting.gates.some(\n (gate) => gate.id === \"page\" && gate.status === \"failed\",\n );\n const otherwiseEligible = pageMismatch\n ? evaluateTargetingGatesDetailed(\n {\n ...experiment.targeting,\n url: [],\n pageRules: [],\n // Legacy experiments carry URL rules in `rules`; blank them too so\n // this recheck is audience-only (see normalizeRuntimeUrlRules).\n rules: [],\n } as Targeting,\n { url: ctx.url, attributes: ctx.attributes },\n ).matched\n : false;\n if (\n persisted &&\n targetingLifecycleMode(experiment) === \"persistent\" &&\n otherwiseEligible\n ) {\n return buildPersistedAssignmentResult(\n experiment,\n persisted,\n hashId,\n gates,\n targeting.conditions,\n \"persisted_assignment_off_target\",\n );\n }\n const reason = targeting.gates.find((gate) => gate.status === \"failed\")?.reason ?? \"targeting_mismatch\";\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (targeting mismatch)`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (targeting mismatch)`);\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, reason, false, targeting.conditions) };\n }\n\n if (forcedVariation) {\n const assignment = buildAssignment(experiment, forcedVariation, forcedIdx, ctx.userId);\n gates.push(\n { id: \"traffic\", label: \"Traffic allocation\", status: \"skipped\", reason: \"forced_variation\" },\n { id: \"assignment\", label: \"Variation assignment\", status: \"passed\", reason: \"forced_variation\" },\n );\n for (const gate of gates.slice(-2)) __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gate);\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Initiated variation ${forcedVarId}`, {\n experimentId: experiment.id,\n index: forcedIdx,\n forced: true,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: FORCED → variation ${forcedIdx}`, { variationId: forcedVarId });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: FORCED → var ${forcedIdx}`, { variationId: forcedVarId });\n return { assignment, diagnostic: experimentDiagnostic(experiment, gates, assignment, \"forced_variation\", true, targeting.conditions) };\n }\n if (persisted) {\n return buildPersistedAssignmentResult(\n experiment,\n persisted,\n hashId,\n gates,\n targeting.conditions,\n \"persisted_assignment\",\n );\n }\n\n const hashValue = hashToFloat(experiment.id, hashId);\n const inAllocation = inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1);\n gates.push({\n id: \"traffic\",\n label: \"Traffic allocation\",\n status: inAllocation ? \"passed\" : \"failed\",\n reason: inAllocation ? \"included\" : \"outside_allocation\",\n detail: { hashValue, allocation: experiment.trafficAllocation ?? 1 },\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n if (!inAllocation) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: skip (outside traffic allocation)`, { hashValue, allocation: experiment.trafficAllocation });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: skip (traffic allocation)`, { hashValue, allocation: experiment.trafficAllocation });\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, \"outside_allocation\", false, targeting.conditions) };\n }\n\n const allocation = experiment.trafficAllocation ?? 1;\n const variationHashValue =\n allocation >= 1 ? hashValue : variationHashToFloat(experiment.id, hashId);\n const weights = experiment.variations.map((v) => v.weight);\n const index = chooseVariation(variationHashValue, weights);\n if (index < 0 || index >= experiment.variations.length) {\n gates.push({ id: \"assignment\", label: \"Variation assignment\", status: \"failed\", reason: \"invalid_weighting\" });\n return { assignment: null, diagnostic: experimentDiagnostic(experiment, gates, null, \"invalid_weighting\", false, targeting.conditions) };\n }\n\n const variation = experiment.variations[index];\n const assignment = buildAssignment(experiment, variation, index, hashId);\n if (persistentStorageAllowed() && !state.qaMode && usesStickyAssignmentPersistence(experiment)) {\n persistAssignmentForExperiment(experiment, variation.id);\n }\n gates.push({\n id: \"assignment\",\n label: \"Variation assignment\",\n status: \"passed\",\n reason: \"assigned\",\n detail: { variationId: variation.id, index },\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceGate(experiment, gates[gates.length - 1]);\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Initiated variation ${variation.id}`, {\n experimentId: experiment.id,\n index,\n hashValue,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `${experiment.id}: assigned → variation ${index}`, { variationId: variation.id, hashValue });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"eval\", `${experiment.id}: → var ${index} (${variation.id})`, { variationId: variation.id, hashValue });\n return { assignment, diagnostic: experimentDiagnostic(experiment, gates, assignment, \"assigned\", false, targeting.conditions) };\n}\n\nfunction evaluateExperiment(\n experiment: Experiment,\n ctx: {\n url: string;\n attributes: Record<string, unknown>;\n userId: string;\n persistedAssignments?: PersistedAssignmentMap;\n },\n): Assignment | null {\n return evaluateExperimentDetailed(experiment, ctx).assignment;\n}\n\nfunction stoppedPersonalizationDiagnostic(\n diagnostic: ExperimentActivationDiagnostic,\n): ExperimentActivationDiagnostic {\n const { assignedVariationId: _assignedVariationId, assignedVariationIndex: _assignedVariationIndex, ...rest } = diagnostic;\n return {\n ...rest,\n status: \"failed\",\n reason: \"personalization_stopped_after_prior_match\",\n gates: [\n ...diagnostic.gates,\n {\n id: \"personalization_priority\",\n label: \"Personalization priority\",\n status: \"failed\",\n reason: \"stopped_after_prior_match\",\n },\n ],\n };\n}\n\nfunction enforcePersonalizationStopAfterMatch(\n assignments: Assignment[],\n diagnostics?: ExperimentActivationDiagnostic[],\n): { assignments: Assignment[]; diagnostics?: ExperimentActivationDiagnostic[] } {\n const stoppedKeys = new Set<string>();\n const suppressedExperimentIds = new Set<string>();\n const filtered: Assignment[] = [];\n\n for (const assignment of assignments) {\n const key = assignment.personalization?.key;\n if (key && stoppedKeys.has(key)) {\n suppressedExperimentIds.add(assignment.experimentId);\n continue;\n }\n filtered.push(assignment);\n if (key && assignment.personalization?.stopAfterMatch !== false) {\n stoppedKeys.add(key);\n }\n }\n\n if (!diagnostics || suppressedExperimentIds.size === 0) {\n return { assignments: filtered, diagnostics };\n }\n\n return {\n assignments: filtered,\n diagnostics: diagnostics.map((diagnostic) =>\n suppressedExperimentIds.has(diagnostic.experimentId)\n ? stoppedPersonalizationDiagnostic(diagnostic)\n : diagnostic\n ),\n };\n}\n\nfunction excludedByGroupDiagnostic(\n diagnostic: ExperimentActivationDiagnostic,\n decision: ExclusionGroupDecision,\n): ExperimentActivationDiagnostic {\n const { assignedVariationId: _assignedVariationId, assignedVariationIndex: _assignedVariationIndex, ...rest } = diagnostic;\n const reason = decision.sticky\n ? \"exclusion_group_sticky_other\"\n : \"exclusion_group_overlap_lost\";\n return {\n ...rest,\n status: \"failed\",\n reason,\n gates: [\n ...diagnostic.gates,\n {\n id: \"exclusion_group\",\n label: \"Exclusion group\",\n status: \"failed\",\n reason,\n detail: {\n groupId: decision.groupId,\n winnerExperimentId: decision.winnerExperimentId,\n },\n },\n ],\n };\n}\n\nfunction keptByGroupDiagnostic(\n diagnostic: ExperimentActivationDiagnostic,\n reason: \"exclusion_group_no_overlap\" | \"exclusion_group_overlap_winner\" | \"exclusion_group_sticky_winner\",\n detail: { groupId: string; conflictingExperimentIds: string[] },\n): ExperimentActivationDiagnostic {\n return {\n ...diagnostic,\n gates: [\n ...diagnostic.gates,\n {\n id: \"exclusion_group\",\n label: \"Exclusion group\",\n status: \"passed\",\n reason,\n detail,\n },\n ],\n };\n}\n\nfunction applyExclusionAndPersonalization(\n assignments: Assignment[],\n context: { userId: string; exclusionGroups?: ExclusionGroupConfig[] },\n diagnostics?: ExperimentActivationDiagnostic[],\n): {\n assignments: Assignment[];\n diagnostics?: ExperimentActivationDiagnostic[];\n decisions: ExclusionGroupDecision[];\n} {\n const { assignments: afterGroups, decisions } = resolveExclusionGroups(\n assignments,\n context.exclusionGroups,\n {\n userId: context.userId,\n forcedExperimentIds: state.forceMap ? Object.keys(state.forceMap) : [],\n persist: persistentStorageAllowed() && !state.qaMode,\n },\n );\n\n let nextDiagnostics = diagnostics;\n if (diagnostics && context.exclusionGroups?.length) {\n const suppressed = new Map<string, ExclusionGroupDecision>();\n const decisionsByWinner = new Map<string, ExclusionGroupDecision>();\n for (const decision of decisions) {\n if (decision.winnerExperimentId) {\n decisionsByWinner.set(decision.winnerExperimentId, decision);\n }\n for (const experimentId of decision.suppressedExperimentIds) {\n suppressed.set(experimentId, decision);\n }\n }\n const provisionalIds = new Set(assignments.map((assignment) => assignment.experimentId));\n const forcedIds = new Set(state.forceMap ? Object.keys(state.forceMap) : []);\n nextDiagnostics = diagnostics.map((diagnostic) => {\n const losingDecision = suppressed.get(diagnostic.experimentId);\n if (losingDecision) return excludedByGroupDiagnostic(diagnostic, losingDecision);\n\n const winningDecision = decisionsByWinner.get(diagnostic.experimentId);\n if (winningDecision) {\n return keptByGroupDiagnostic(\n diagnostic,\n winningDecision.sticky ? \"exclusion_group_sticky_winner\" : \"exclusion_group_overlap_winner\",\n {\n groupId: winningDecision.groupId,\n conflictingExperimentIds: winningDecision.conflictingExperimentIds,\n },\n );\n }\n\n const group = context.exclusionGroups?.find((candidate) =>\n candidate.members.some((member) => member.experimentId === diagnostic.experimentId)\n );\n if (!group || !provisionalIds.has(diagnostic.experimentId) || forcedIds.has(diagnostic.experimentId)) {\n return diagnostic;\n }\n const eligibleIds = group.members\n .map((member) => member.experimentId)\n .filter((experimentId) => provisionalIds.has(experimentId) && !forcedIds.has(experimentId));\n return eligibleIds.length === 1\n ? keptByGroupDiagnostic(diagnostic, \"exclusion_group_no_overlap\", {\n groupId: group.id,\n conflictingExperimentIds: eligibleIds,\n })\n : diagnostic;\n });\n }\n\n const personalization = enforcePersonalizationStopAfterMatch(afterGroups, nextDiagnostics);\n return {\n assignments: personalization.assignments,\n diagnostics: personalization.diagnostics ?? nextDiagnostics,\n decisions,\n };\n}\n\nexport function evaluate(\n experiments: Experiment[],\n context?: {\n url?: string;\n attributes?: Record<string, unknown>;\n userId?: string;\n persistSignals?: boolean;\n exclusionGroups?: ExclusionGroupConfig[];\n },\n): Assignment[] {\n const url = context?.url ?? location.href;\n const attributes = buildTargetingAttributes(context?.attributes ?? {}, url, {\n persistSignals: context?.persistSignals,\n });\n const userId = getUserId(context?.userId);\n const assignments: Assignment[] = [];\n const persistedAssignments = loadPersistedAssignments(experiments);\n for (const experiment of experiments) {\n const assignment = evaluateExperiment(experiment, {\n url,\n attributes,\n userId,\n persistedAssignments,\n });\n if (assignment) assignments.push(assignment);\n }\n return applyExclusionAndPersonalization(assignments, {\n userId,\n exclusionGroups: context?.exclusionGroups,\n }).assignments;\n}\n\nfunction evaluateWithDiagnostics(\n experiments: Experiment[],\n context?: {\n url?: string;\n attributes?: Record<string, unknown>;\n userId?: string;\n persistSignals?: boolean;\n exclusionGroups?: ExclusionGroupConfig[];\n persistedAssignments?: PersistedAssignmentMap | null;\n },\n): { assignments: Assignment[]; diagnostics: ExperimentActivationDiagnostic[] } {\n const url = context?.url ?? location.href;\n const attributes = buildTargetingAttributes(context?.attributes ?? {}, url, {\n persistSignals: context?.persistSignals,\n });\n const userId = getUserId(context?.userId);\n const assignments: Assignment[] = [];\n const diagnostics: ExperimentActivationDiagnostic[] = [];\n const persistedAssignments = context && \"persistedAssignments\" in context\n ? context.persistedAssignments ?? undefined\n : loadPersistedAssignments(experiments);\n for (const experiment of experiments) {\n const result = evaluateExperimentDetailed(experiment, {\n url,\n attributes,\n userId,\n persistedAssignments,\n });\n diagnostics.push(result.diagnostic);\n if (result.assignment) assignments.push(result.assignment);\n }\n const resolved = applyExclusionAndPersonalization(\n assignments,\n { userId, exclusionGroups: context?.exclusionGroups },\n diagnostics,\n );\n return {\n assignments: resolved.assignments,\n diagnostics: resolved.diagnostics ?? diagnostics,\n };\n}\n\nfunction escapeDeliveryRegex(value: string): string {\n return value.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n}\n\nfunction matchSimpleDeliveryPattern(pattern: string, url: string): boolean {\n if (!pattern) return false;\n try {\n const current = new URL(url, location.href);\n const cleanPattern = pattern.includes(\"://\")\n ? pattern\n : (pattern.startsWith(\"/\") ? pattern : \"/\" + pattern);\n const re = new RegExp(\"^\" + escapeDeliveryRegex(cleanPattern) + \"$\");\n return pattern.includes(\"://\")\n ? re.test(current.href)\n : re.test(current.pathname + current.search) || re.test(current.pathname);\n } catch {\n return false;\n }\n}\n\nfunction matchRegexDeliveryPattern(pattern: string, url: string): boolean {\n try {\n const current = new URL(url, location.href);\n const re = new RegExp(pattern);\n return re.test(current.href) || re.test(current.pathname + current.search) || re.test(current.pathname);\n } catch {\n return false;\n }\n}\n\nfunction matchesDeliveryUrlRules(rules: SnippetDeliveryUrlRule[] | undefined, url: string): boolean {\n if (!rules?.length) return true;\n let hasInclude = false;\n let includeHit = false;\n for (const rule of rules) {\n if (!rule || typeof rule.pattern !== \"string\") continue;\n const matched = rule.type === \"regex\"\n ? matchRegexDeliveryPattern(rule.pattern, url)\n : matchSimpleDeliveryPattern(rule.pattern, url);\n if (rule.include === false && matched) return false;\n if (rule.include !== false) {\n hasInclude = true;\n if (matched) includeHit = true;\n }\n }\n return !hasInclude || includeHit;\n}\n\nfunction expandCriticalMutation(raw: SnippetCriticalMutation): Mutation | null {\n const [selector, action, value] = raw;\n if (typeof selector !== \"string\" || !selector || typeof action !== \"string\") return null;\n const base = { selector, action } as Mutation;\n switch (action) {\n case \"text\":\n case \"setText\":\n return typeof value === \"string\" ? { ...base, text: value } : null;\n case \"html\":\n case \"insertBefore\":\n case \"insertAfter\":\n return typeof value === \"string\" ? { ...base, html: value } : null;\n case \"attribute\":\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n if (\"name\" in value) return { ...base, attribute: value as Mutation[\"attribute\"] };\n return { ...base, attributes: value as Record<string, string | null> };\n case \"style\":\n case \"setStyle\":\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? { ...base, styles: value as Record<string, string> }\n : null;\n case \"remove\":\n return base;\n default:\n return null;\n }\n}\n\nfunction buildCriticalPathAssignments(\n experiments: Experiment[],\n plan: SnippetCriticalMutationPlanItem[] | undefined,\n ctx: { url: string; attributes: Record<string, unknown>; userId: string },\n): {\n assignments: Assignment[];\n plannedExperimentIds: Set<string>;\n skippedDiagnostics: ExperimentActivationDiagnostic[];\n} {\n const plannedExperimentIds = new Set<string>();\n const assignments: Assignment[] = [];\n const skippedDiagnostics: ExperimentActivationDiagnostic[] = [];\n if (!plan?.length || state.forceMap) {\n return { assignments, plannedExperimentIds, skippedDiagnostics };\n }\n\n const experimentsById = new Map(experiments.map((experiment) => [experiment.id, experiment]));\n for (const item of plan) {\n if (!item?.e || !Array.isArray(item.v)) continue;\n const experiment = experimentsById.get(item.e);\n if (!experiment || experiment.status && experiment.status !== \"running\") continue;\n plannedExperimentIds.add(experiment.id);\n if (!matchesDeliveryUrlRules(item.r, ctx.url)) {\n skippedDiagnostics.push(experimentDiagnostic(\n experiment,\n [\n { id: \"page\", label: \"Page check\", status: \"failed\", reason: \"url_mismatch\" },\n // Critical-path plans only contain campaigns without non-URL\n // targeting, so the truthful audience result is \"all visitors\".\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n ],\n null,\n \"url_mismatch\",\n ));\n continue;\n }\n\n const hashId = getHashId(experiment, ctx.userId, ctx.attributes);\n const hashValue = hashToFloat(experiment.id, hashId);\n if (!inTrafficAllocation(hashValue, experiment.trafficAllocation ?? 1)) {\n skippedDiagnostics.push(experimentDiagnostic(\n experiment,\n [\n { id: \"page\", label: \"Page check\", status: \"passed\", reason: \"precompiled_delivery_match\" },\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n {\n id: \"traffic\",\n label: \"Traffic allocation\",\n status: \"failed\",\n reason: \"outside_allocation\",\n detail: { hashValue, allocation: experiment.trafficAllocation ?? 1 },\n },\n ],\n null,\n \"outside_allocation\",\n ));\n continue;\n }\n\n const allocation = experiment.trafficAllocation ?? 1;\n const variationHashValue =\n allocation >= 1 ? hashValue : variationHashToFloat(experiment.id, hashId);\n const planIndex = chooseVariation(variationHashValue, item.v.map((variation) => variation.w));\n const plannedVariation = planIndex >= 0 ? item.v[planIndex] : null;\n if (!plannedVariation) continue;\n const fullIndex = experiment.variations.findIndex((variation) => variation.id === plannedVariation.id);\n if (fullIndex < 0) continue;\n const fullVariation = experiment.variations[fullIndex];\n const mutations = plannedVariation.m\n .map(expandCriticalMutation)\n .filter((mutation): mutation is Mutation => Boolean(mutation));\n\n assignments.push({\n experimentId: experiment.id,\n experimentName: experiment.name,\n variationId: fullVariation.id,\n index: fullIndex,\n mutations,\n value: fullVariation.value,\n featureFlag: experiment.featureFlag,\n personalization: experiment.personalization,\n kind: experiment.kind ?? (experiment.personalization ? \"personalization\" : experiment.featureFlag ? \"feature_flag\" : \"experiment\"),\n experimentCss: experiment.css,\n experimentJs: experiment.js,\n experimentResetJs: experiment.resetJs,\n css: fullVariation.css,\n js: fullVariation.js,\n resetJs: fullVariation.resetJs,\n externalCssUrl: fullVariation.externalCssUrl,\n externalJsUrl: fullVariation.externalJsUrl,\n harnessSession: fullVariation.harnessSession,\n isControl: Boolean(fullVariation.isControl || plannedVariation.c),\n hashValue: hashId,\n });\n }\n return { assignments, plannedExperimentIds, skippedDiagnostics };\n}\n\nfunction runPostRevealReassert(): void {\n try {\n if (!state.config || !resolveDomPageTrigger(state.config, state.pageTriggerMode)) return;\n if (!state.assignments.length) return;\n reassertAssignmentMutations(state.assignments);\n } catch {}\n}\n\nfunction schedulePostRevealReassert(): void {\n try {\n const first = () => runPostRevealReassert();\n if (typeof window !== \"undefined\" && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(first);\n } else if (typeof window !== \"undefined\") {\n window.setTimeout(first, 0);\n } else {\n setTimeout(first, 0);\n }\n\n const debounceMs = state.config?.spa?.debounceMs ?? 250;\n if (typeof window !== \"undefined\") {\n window.setTimeout(runPostRevealReassert, debounceMs);\n } else {\n setTimeout(runPostRevealReassert, debounceMs);\n }\n } catch {}\n}\n\nfunction revealExperimentContent(options: { postRevealReassert?: boolean } = {}): void {\n const revealAt = markDripPerf(\"reveal_at\");\n markCwvReveal();\n updateLoadDiagnostics({ stage: \"revealed\", revealAt });\n revealAll();\n removeAntiFlicker();\n if (options.postRevealReassert !== false) {\n schedulePostRevealReassert();\n }\n}\n\nfunction applyAssignmentCode(\n assignment: Assignment,\n applyGeneration: number,\n appliedExperimentCode: Set<string>,\n): void {\n if (assignment.experimentCss && !appliedExperimentCode.has(assignment.experimentId)) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying experiment CSS`, {\n bytes: assignment.experimentCss.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: injecting experiment CSS`);\n injectExperimentCss(assignment.experimentCss, assignment.experimentId);\n }\n if (assignment.css) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying CSS`, {\n variationId: assignment.variationId,\n bytes: assignment.css.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: injecting CSS`);\n injectCss(assignment.css, assignment.experimentId, assignment.variationId);\n }\n\n if (\n !assignment.experimentJs &&\n !assignment.externalCssUrl &&\n !assignment.externalJsUrl &&\n !assignment.js\n ) {\n appliedExperimentCode.add(assignment.experimentId);\n return;\n }\n\n runWhenDomReady(() => {\n if (applyGeneration !== state.assignmentApplyGeneration) return;\n const label = assignment.experimentId + \"-\" + assignment.variationId;\n if (assignment.experimentJs && !appliedExperimentCode.has(assignment.experimentId)) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying experiment JS`, {\n bytes: assignment.experimentJs.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: executing experiment JS`);\n runMuted(() => execJs(assignment.experimentJs!, assignment.experimentId + \"-experiment-js\"));\n }\n appliedExperimentCode.add(assignment.experimentId);\n const cssReady = assignment.externalCssUrl\n ? injectExternalCss(assignment.externalCssUrl, assignment.experimentId, assignment.variationId)\n .then(() => {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: External CSS loaded`, {\n variationId: assignment.variationId,\n url: assignment.externalCssUrl,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: external CSS loaded`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external CSS loaded\", { url: assignment.externalCssUrl });\n })\n .catch((error) => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"apply\", error instanceof Error ? error.message : String(error));\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external CSS failed\", { url: assignment.externalCssUrl });\n })\n : Promise.resolve();\n\n cssReady.then(() => {\n if (applyGeneration !== state.assignmentApplyGeneration) return;\n const jsReady = assignment.externalJsUrl\n ? loadExternalJs(assignment.externalJsUrl, label)\n .then(() => {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: External JS loaded`, {\n variationId: assignment.variationId,\n url: assignment.externalJsUrl,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: external JS loaded`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external JS loaded\", { url: assignment.externalJsUrl });\n })\n .catch((error) => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"apply\", error instanceof Error ? error.message : String(error));\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"harness\", \"external JS failed\", { url: assignment.externalJsUrl });\n })\n : Promise.resolve();\n\n jsReady.then(() => {\n if (applyGeneration !== state.assignmentApplyGeneration) return;\n if (assignment.js) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying JS`, {\n variationId: assignment.variationId,\n bytes: assignment.js.length,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: executing JS`);\n runMuted(() => execJs(assignment.js!, label));\n }\n });\n });\n });\n}\n\nfunction applyAssignments(assignments: Assignment[], activationMode: ActivationMode): void {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Applying assignment set`, {\n assignments: assignments.length,\n activationMode,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `Applying ${assignments.length} assignment(s)`);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"apply\", `Applying ${assignments.length} assignment(s)`);\n const applyGeneration = ++state.assignmentApplyGeneration;\n const appliedExperimentCode = new Set<string>();\n const commerce = state.config?.commerce;\n const commerceActive = Boolean(commerce?.price || commerce?.shipping || commerce?.offers);\n const commerceAssignments = commerceActive\n ? withCommercePriceAssignments(assignments)\n : assignments;\n if (commerceActive) {\n configureChargeCorrectnessCartSync(commerceAssignments);\n } else {\n // No commerce planes remain, so no cart sync will run — but an earlier\n // GWP insertion may still sit on the persistent cart with its Function\n // authorization gone. The manager exits instantly without insertion\n // records, so this is free for every non-commerce shop.\n void syncGiftWithPurchase(state.config?.commerce?.offers, withCommercePriceAssignments());\n }\n\n // Offers-enforced assignments render nothing until their cart stamp is\n // authorized: a companion treatment shown before the signed envelope lands\n // could advertise an offer Shopify never charges. Identity, goal wiring,\n // and cart-sync behavior are unchanged — only DOM application (mutations,\n // CSS/JS) is withheld; the display-authorization callback re-applies.\n const offersDisplayWithheld = (assignment: Assignment): boolean =>\n !isOffersDisplayAssignmentAuthorized(assignment);\n // Count total mutations to know when all have been applied\n let pendingMutations = 0;\n for (const a of assignments) {\n if (offersDisplayWithheld(a)) continue;\n pendingMutations += a.mutations.length;\n }\n // Counts a price treatment whose activation is still PENDING (Shopify has not yet\n // published product metadata), so the reveal cannot flash the original price. The\n // anti-flicker timeout still bounds how long content may stay hidden.\n const pricePending = commerce?.price && isCommercePriceWorkPending(\n commerce.price,\n commerceAssignments,\n isPriceDisplayAssignmentAuthorized,\n ) ? 1 : 0;\n pendingMutations += pricePending;\n let priceResolved = 0;\n const mutationKey = (assignment: Assignment, index: number) => (\n `${assignment.experimentId}\\u0000${assignment.variationId}\\u0000${index}`\n );\n const deliveryTrackers = new Map<string, DeliveryHealthTracker>();\n const deliveryKey = (assignment: Assignment) => `${assignment.experimentId}\\u0000${assignment.variationId}`;\n for (const assignment of assignments) {\n if (offersDisplayWithheld(assignment)) continue;\n deliveryTrackers.set(deliveryKey(assignment), {\n assignment,\n expected: assignment.mutations.length,\n applied: new Set<number>(),\n missed: new Set<number>(),\n emitted: false,\n });\n }\n const maybeEmitDeliveryHealth = (tracker: DeliveryHealthTracker): void => {\n if (tracker.emitted) return;\n if (tracker.expected > 0 && tracker.applied.size + tracker.missed.size < tracker.expected) return;\n tracker.emitted = true;\n queueDeliveryHealthEvent(tracker.assignment, {\n expectedMutations: tracker.expected,\n appliedMutations: tracker.applied.size,\n selectorMisses: tracker.missed.size,\n applyGeneration,\n activationMode,\n });\n };\n updateLoadDiagnostics({\n stage: \"mutations_scheduled\",\n pendingMutations,\n appliedMutations: 0,\n missedMutations: 0,\n });\n\n const appliedMutationKeys = new Set<string>();\n const missedMutationKeys = new Set<string>();\n let revealed = false;\n const maybeRevealResolvedMutations = (): void => {\n if (!revealed && appliedMutationKeys.size + missedMutationKeys.size + priceResolved >= pendingMutations) {\n revealed = true;\n revealExperimentContent();\n }\n };\n const onMutationApplied = pendingMutations > 0\n ? (assignment: Assignment, mutation: Mutation, element: Element, index: number) => {\n if (activationMode === \"observer\") {\n trackAppliedMutation(\n element,\n mutation,\n { experimentId: assignment.experimentId, variationId: assignment.variationId },\n (target, appliedMutation) => applyToElement(appliedMutation, target),\n );\n }\n const key = mutationKey(assignment, index);\n if (appliedMutationKeys.has(key)) return;\n appliedMutationKeys.add(key);\n missedMutationKeys.delete(key);\n const tracker = deliveryTrackers.get(deliveryKey(assignment));\n if (tracker) {\n tracker.applied.add(index);\n tracker.missed.delete(index);\n maybeEmitDeliveryHealth(tracker);\n }\n const firstMutationAt = markDripPerf(\"first_mutation_at\");\n updateLoadDiagnostics({\n stage: \"mutation_applied\",\n firstMutationAt,\n pendingMutations,\n appliedMutations: appliedMutationKeys.size,\n missedMutations: missedMutationKeys.size,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `Mutation applied (${appliedMutationKeys.size}/${pendingMutations})`, {\n selector: mutation.selector,\n });\n maybeRevealResolvedMutations();\n }\n : null;\n const onMutationMissed = pendingMutations > 0\n ? (assignment: Assignment, mutation: Mutation, index: number) => {\n const key = mutationKey(assignment, index);\n if (appliedMutationKeys.has(key) || missedMutationKeys.has(key)) return;\n missedMutationKeys.add(key);\n const tracker = deliveryTrackers.get(deliveryKey(assignment));\n if (tracker) {\n tracker.missed.add(index);\n maybeEmitDeliveryHealth(tracker);\n }\n updateLoadDiagnostics({\n stage: \"mutation_missed\",\n pendingMutations,\n appliedMutations: appliedMutationKeys.size,\n missedMutations: missedMutationKeys.size,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"apply\", `${assignment.experimentId}: selector did not match before expiry`, {\n variationId: assignment.variationId,\n selector: mutation.selector,\n });\n maybeRevealResolvedMutations();\n }\n : null;\n\n for (const assignment of assignments) {\n if (offersDisplayWithheld(assignment)) continue;\n if (assignment.mutations.length) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`${assignment.experimentId}: Applying mutations`, {\n variationId: assignment.variationId,\n count: assignment.mutations.length,\n activationMode,\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"apply\", `${assignment.experimentId}: ${assignment.mutations.length} mutation(s)`, { activationMode });\n if (activationMode === \"manual\") {\n applyMutations(assignment.mutations, {\n onApplied: onMutationApplied\n ? (mutation, element, index) => onMutationApplied(assignment, mutation, element, index)\n : undefined,\n onMiss: onMutationMissed\n ? (mutation, index) => onMutationMissed(assignment, mutation, index)\n : undefined,\n });\n } else {\n // DOM mutations via MutationObserver-backed waitForElement\n assignment.mutations.forEach((m, i) => applyMutationWithWait(\n m,\n i,\n onMutationApplied\n ? (mutation, element, index) => onMutationApplied(assignment, mutation, element, index)\n : undefined,\n onMutationMissed\n ? (mutation, index) => onMutationMissed(assignment, mutation, index)\n : undefined,\n ));\n }\n } else {\n const tracker = deliveryTrackers.get(deliveryKey(assignment));\n if (tracker) maybeEmitDeliveryHealth(tracker);\n }\n applyAssignmentCode(assignment, applyGeneration, appliedExperimentCode);\n }\n\n if (commerce?.price) {\n try {\n applyCommercePrice(\n commerce.price,\n commerceAssignments,\n isCohortStampedOnCart,\n () => {\n priceResolved = pricePending;\n if (pricePending) maybeRevealResolvedMutations();\n },\n isPriceDisplayAssignmentAuthorized,\n );\n } catch {\n priceResolved = pricePending;\n if (pricePending) maybeRevealResolvedMutations();\n }\n }\n if (commerce?.shipping) {\n applyCommerceShipping(\n commerce.shipping,\n assignments.filter(isShippingDisplayAssignmentAuthorized),\n trackViewedAssignmentsAfterShippingEligibility,\n );\n }\n\n // If there were no mutations (or manual mode), reveal immediately.\n if (pendingMutations === 0 || activationMode === \"manual\") {\n revealExperimentContent();\n }\n\n startHarnessPolling(assignments);\n}\n\nfunction reassertAssignmentMutations(assignments: Assignment[]): void {\n const mutations = assignments.reduce<Assignment[\"mutations\"]>((all, assignment) => {\n all.push(...assignment.mutations);\n return all;\n }, []);\n if (!mutations.length) return;\n reassertNonStructuralMutations(mutations);\n}\n\nfunction spaCleanup(prevAssignments: Assignment[]): void {\n state.assignmentApplyGeneration++;\n stopHarnessPolling();\n state.stopShopifyCartMutationSync?.();\n state.stopShopifyCartMutationSync = null;\n // Run reset JS for previous assignments\n for (const a of prevAssignments) {\n if (a.resetJs) {\n execJs(a.resetJs, a.experimentId + \"-reset\");\n }\n }\n const resetExperimentIds = new Set<string>();\n for (const a of prevAssignments) {\n if (!a.experimentResetJs || resetExperimentIds.has(a.experimentId)) continue;\n resetExperimentIds.add(a.experimentId);\n execJs(a.experimentResetJs, a.experimentId + \"-experiment-reset\");\n }\n // Stop pending mutation waits before restoring the DOM they may target.\n resetWaitEntries();\n cleanupCommercePrice();\n cleanupCommerceShipping();\n resetAppliedMutations();\n // Remove all injected CSS, external JS, and anti-flicker hiding\n removeAllCss();\n removeAllExternalJs();\n cleanupGoals();\n revealExperimentContent({ postRevealReassert: false });\n}\n\nfunction generateQaSessionId(): string {\n return \"qa_\" + Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nconst SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS = [0, 250, 1000, 2500];\nlet shopifyAssignmentSyncTimers: number[] = [];\n\ntype CommerceOnlyAdoptionState = {\n applying: boolean;\n assignments: Assignment[];\n context: string | null;\n};\n\nlet commercePriceAdoptionState: CommerceOnlyAdoptionState | null = null;\n\nfunction ensureCommercePriceAdoptionState(): CommerceOnlyAdoptionState {\n return commercePriceAdoptionState ??= {\n applying: false,\n assignments: [],\n context: null,\n };\n}\n\nfunction currentCommercePriceContext(): string | null {\n return state.config && state.userId\n ? `${state.config.shopId}\\u0000${state.userId}`\n : null;\n}\n\nfunction withCommercePriceAssignments(assignments = state.assignments): Assignment[] {\n const adoption = commercePriceAdoptionState;\n if (\n !adoption?.assignments.length ||\n adoption.context !== currentCommercePriceContext()\n ) return assignments;\n const activeExperimentIds = new Set(assignments.map((assignment) => assignment.experimentId));\n const configuredPriceExperimentIds = new Set(\n state.config?.commerce?.price?.authorization?.experimentIds ?? [],\n );\n const configuredOffersExperimentIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n const experiments = new Map(\n (state.config?.experiments ?? []).map((experiment) => [experiment.id, experiment]),\n );\n const validCommerceOnly = adoption.assignments.filter((assignment) => {\n if (activeExperimentIds.has(assignment.experimentId)) return false;\n if (\n !configuredPriceExperimentIds.has(assignment.experimentId) &&\n !configuredOffersExperimentIds.has(assignment.experimentId)\n ) return false;\n const experiment = experiments.get(assignment.experimentId);\n return !!experiment &&\n __assignmentStoreInternals.assignmentEpoch(experiment) === assignment.assignmentEpoch &&\n experiment.variations.some((variation) => variation.id === assignment.variationId);\n });\n return validCommerceOnly.length ? [...assignments, ...validCommerceOnly] : assignments;\n}\n\nfunction clearShopifyAssignmentSyncTimers(): void {\n for (const timer of shopifyAssignmentSyncTimers) {\n window.clearTimeout(timer);\n }\n shopifyAssignmentSyncTimers = [];\n}\n\nfunction adoptAuthoritativePriceAssignments(assignments: CartAssignment[]): boolean {\n const config = state.config;\n const price = config?.commerce?.price;\n if (!config || !price || !state.userId) return false;\n const configuredPriceExperimentIds = new Set(\n price.authorization?.experimentIds ?? [],\n );\n if (configuredPriceExperimentIds.size === 0) return false;\n const replacements = new Map<string, Assignment>();\n const nextCommercePriceOnlyAssignments: Assignment[] = [];\n const seenAuthoritativeExperimentIds = new Set<string>();\n for (const authoritative of assignments) {\n if (\n seenAuthoritativeExperimentIds.has(authoritative.experimentId) ||\n !configuredPriceExperimentIds.has(authoritative.experimentId) ||\n !price.experiments.some(\n (experiment) => experiment.experiment_id === authoritative.experimentId,\n )\n ) return false;\n seenAuthoritativeExperimentIds.add(authoritative.experimentId);\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n const variationIndex = experiment?.variations.findIndex(\n (variation) => variation.id === authoritative.variationId,\n ) ?? -1;\n if (!experiment || variationIndex < 0) return false;\n if (\n authoritative.assignmentEpoch !==\n __assignmentStoreInternals.assignmentEpoch(experiment)\n ) return false;\n const replacement = buildAssignment(\n experiment,\n experiment.variations[variationIndex],\n variationIndex,\n state.assignments.find(\n (assignment) => assignment.experimentId === authoritative.experimentId,\n )?.hashValue ?? state.userId,\n );\n if (authoritative.commercePriceOnly) {\n nextCommercePriceOnlyAssignments.push(replacement);\n } else {\n replacements.set(authoritative.experimentId, replacement);\n }\n }\n\n const nextAssignments = state.assignments\n .filter((assignment) => !configuredPriceExperimentIds.has(assignment.experimentId));\n for (const authoritative of assignments) {\n const replacement = replacements.get(authoritative.experimentId);\n if (replacement) nextAssignments.push(replacement);\n }\n\n const previousAssignments = state.assignments;\n const adoption = ensureCommercePriceAdoptionState();\n const previousCommercePriceOnlyAssignments = adoption.assignments;\n const previousCommercePriceOnlyContext = adoption.context;\n try {\n spaCleanup(previousAssignments);\n state.assignments = nextAssignments;\n adoption.assignments = [\n ...previousCommercePriceOnlyAssignments.filter(\n (assignment) => !configuredPriceExperimentIds.has(assignment.experimentId),\n ),\n ...nextCommercePriceOnlyAssignments,\n ];\n adoption.context = currentCommercePriceContext();\n adoption.applying = true;\n applyAssignments(nextAssignments, state.activationMode);\n if (assignments.length === 0) cleanupCommercePrice();\n state.lastAssignmentSignature = assignmentSignature(nextAssignments);\n if (persistentStorageAllowed() && !state.qaMode) {\n removePersistedAssignmentsForExperiments(configuredPriceExperimentIds);\n for (const authoritative of assignments) {\n if (authoritative.commercePriceOnly) continue;\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n if (experiment) {\n persistAssignmentForExperiment(experiment, authoritative.variationId);\n }\n }\n }\n if (state.analyticsStarted && !trackingBlocked() && state.trackingPrerequisiteMet) {\n setupGoalTracking(nextAssignments, config.experiments ?? []);\n setupHeatmapTracking(nextAssignments, config.experiments ?? []);\n scheduleShopifyAssignmentSync();\n }\n notifyQaAssistantRuntimeListeners();\n return true;\n } catch {\n state.assignments = previousAssignments;\n adoption.assignments = previousCommercePriceOnlyAssignments;\n adoption.context = previousCommercePriceOnlyContext;\n return false;\n } finally {\n adoption.applying = false;\n }\n}\n\ntype OffersAdoptionPlan = {\n configuredOffersExperimentIds: Set<string>;\n replacements: Map<string, Assignment>;\n nextCommercePriceOnlyAssignments: Assignment[];\n};\n\n// Pure validation/planning — must not mutate any runtime state, because the\n// cart-sync path runs it BEFORE the cart write to prove the arm is adoptable\n// while the actual adoption is deferred until the write is confirmed.\nfunction planAuthoritativeOffersAdoption(\n assignments: CartAssignment[],\n): OffersAdoptionPlan | null {\n const config = state.config;\n const offers = config?.commerce?.offers;\n if (!config || !offers || !state.userId) return null;\n const configuredOffersExperimentIds = new Set(\n offers.authorization?.experimentIds ?? [],\n );\n if (configuredOffersExperimentIds.size === 0) return null;\n const replacements = new Map<string, Assignment>();\n const nextCommercePriceOnlyAssignments: Assignment[] = [];\n const seenAuthoritativeExperimentIds = new Set<string>();\n for (const authoritative of assignments) {\n if (\n seenAuthoritativeExperimentIds.has(authoritative.experimentId) ||\n !configuredOffersExperimentIds.has(authoritative.experimentId)\n ) return null;\n seenAuthoritativeExperimentIds.add(authoritative.experimentId);\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n const variationIndex = experiment?.variations.findIndex(\n (variation) => variation.id === authoritative.variationId,\n ) ?? -1;\n if (!experiment || variationIndex < 0) return null;\n if (\n authoritative.assignmentEpoch !==\n __assignmentStoreInternals.assignmentEpoch(experiment)\n ) return null;\n const replacement = buildAssignment(\n experiment,\n experiment.variations[variationIndex],\n variationIndex,\n state.assignments.find(\n (assignment) => assignment.experimentId === authoritative.experimentId,\n )?.hashValue ?? state.userId,\n );\n if (authoritative.commercePriceOnly) {\n nextCommercePriceOnlyAssignments.push(replacement);\n } else {\n replacements.set(authoritative.experimentId, replacement);\n }\n }\n return { configuredOffersExperimentIds, replacements, nextCommercePriceOnlyAssignments };\n}\n\nfunction canAdoptAuthoritativeOffersAssignments(assignments: CartAssignment[]): boolean {\n return planAuthoritativeOffersAdoption(assignments) !== null;\n}\n\nfunction adoptAuthoritativeOffersAssignments(assignments: CartAssignment[]): boolean {\n const config = state.config;\n const plan = planAuthoritativeOffersAdoption(assignments);\n if (!config || !plan) return false;\n const {\n configuredOffersExperimentIds,\n replacements,\n nextCommercePriceOnlyAssignments,\n } = plan;\n\n const nextAssignments = state.assignments.filter(\n (assignment) => !configuredOffersExperimentIds.has(assignment.experimentId),\n );\n for (const authoritative of assignments) {\n const replacement = replacements.get(authoritative.experimentId);\n if (replacement) nextAssignments.push(replacement);\n }\n const previousAssignments = state.assignments;\n const adoption = ensureCommercePriceAdoptionState();\n const previousCommercePriceOnlyAssignments = adoption.assignments;\n const previousCommercePriceOnlyContext = adoption.context;\n try {\n spaCleanup(previousAssignments);\n state.assignments = nextAssignments;\n adoption.assignments = [\n ...previousCommercePriceOnlyAssignments.filter(\n (assignment) => !configuredOffersExperimentIds.has(assignment.experimentId),\n ),\n ...nextCommercePriceOnlyAssignments,\n ];\n adoption.context = currentCommercePriceContext();\n adoption.applying = true;\n applyAssignments(nextAssignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(nextAssignments);\n if (persistentStorageAllowed() && !state.qaMode) {\n removePersistedAssignmentsForExperiments(configuredOffersExperimentIds);\n for (const authoritative of assignments) {\n if (authoritative.commercePriceOnly) continue;\n const experiment = config.experiments?.find(\n (candidate) => candidate.id === authoritative.experimentId,\n );\n if (experiment) persistAssignmentForExperiment(experiment, authoritative.variationId);\n }\n }\n if (state.analyticsStarted && !trackingBlocked() && state.trackingPrerequisiteMet) {\n setupGoalTracking(nextAssignments, config.experiments ?? []);\n setupHeatmapTracking(nextAssignments, config.experiments ?? []);\n scheduleShopifyAssignmentSync();\n }\n notifyQaAssistantRuntimeListeners();\n return true;\n } catch {\n state.assignments = previousAssignments;\n adoption.assignments = previousCommercePriceOnlyAssignments;\n adoption.context = previousCommercePriceOnlyContext;\n return false;\n } finally {\n adoption.applying = false;\n }\n}\n\nfunction buildActiveCartAttributeSyncInput(chargeCorrectness = false): CartAttributeSyncInput | null {\n if (!chargeCorrectness && (trackingBlocked() || !state.trackingPrerequisiteMet)) return null;\n if ((!state.assignments.length && !hasActiveCommerceAuthorizationPlane()) || !state.userId) return null;\n\n const activeCartAssignments = withCommercePriceAssignments();\n const chargeAffectingExperimentIds = getChargeAffectingCommerceExperimentIds(activeCartAssignments);\n const adoption = commercePriceAdoptionState;\n const assignments = activeCartAssignments.map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n assignmentEpoch:\n !assignment.kind || assignment.kind === \"experiment\"\n ? assignment.assignmentEpoch\n : undefined,\n ...(adoption?.context === currentCommercePriceContext() &&\n adoption.assignments.includes(assignment)\n ? { commercePriceOnly: true }\n : {}),\n }));\n const assignedExperimentIds = new Set(\n assignments.map((assignment) => assignment.experimentId),\n );\n const exclusionGroupSelections = state.config?.exclusionGroups\n ?.map((group) => {\n const winner = group.members.find((member) =>\n assignedExperimentIds.has(member.experimentId)\n );\n return winner\n ? {\n groupId: group.id,\n experimentId: winner.experimentId,\n epoch: Number.isFinite(group.epoch)\n ? Math.max(1, Math.floor(group.epoch ?? 1))\n : 1,\n }\n : null;\n })\n .filter((selection): selection is NonNullable<typeof selection> =>\n selection !== null\n );\n\n return {\n assignments,\n requiredAssignments: chargeAffectingExperimentIds.size > 0\n ? assignments.filter((assignment) =>\n chargeAffectingExperimentIds.has(assignment.experimentId))\n : undefined,\n visitorId: state.userId,\n sessionId: state.tracker?.getSessionId() ?? \"\",\n shopId: state.config?.ingestShopId ?? state.config?.shopId,\n endpoint: state.config?.endpoint,\n ingestSignature: state.config?.ingestSignature,\n url: typeof location !== \"undefined\" ? location.href : undefined,\n environment: state.config?.environments?.activeKey,\n offersAuthorizationRevision:\n state.config?.commerce?.offers?.authorization?.revision,\n offersExperimentIds:\n state.config?.commerce?.offers?.authorization?.experimentIds,\n shippingAuthorizationRevision:\n state.config?.commerce?.shipping?.authorization?.revision,\n shippingExperimentIds:\n state.config?.commerce?.shipping?.authorization?.experimentIds,\n priceAuthorizationRevision:\n state.config?.commerce?.price?.authorization?.revision,\n priceExperimentIds:\n state.config?.commerce?.price?.authorization?.experimentIds,\n ...(state.config?.commerce?.offers?.authorization?.experimentIds?.length\n ? {\n adoptOffersAssignments: adoptAuthoritativeOffersAssignments,\n canAdoptOffersAssignments: canAdoptAuthoritativeOffersAssignments,\n authorizeOffersDisplayAssignments: authorizeOffersDisplayAndRender,\n }\n : {}),\n // Every stamped cart write returns the full cart; marked GWP lines seen\n // there seed durable insertion records so a fresh device or cleared\n // storage over a persistent/customer-synced cart still reconciles gifts.\n onCartSnapshot: (cart: unknown) => {\n if (noteCartSnapshotForGifts(cart)) {\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(),\n giftSyncOptions(),\n );\n }\n },\n ...(hasActivePriceAuthorizationPlane()\n ? {\n adoptPriceAssignments: adoptAuthoritativePriceAssignments,\n authorizePriceDisplayAssignments: (authorizedAssignments: CartAssignment[]) => {\n state.authorizedPriceAssignmentKeys = new Set(\n authorizedAssignments.map(priceAssignmentAuthorizationKey),\n );\n },\n }\n : {}),\n ...(hasActiveShippingAuthorizationPlane()\n ? {\n authorizeShippingDisplayAssignments: (authorizedAssignments: CartAssignment[]) => {\n state.authorizedShippingAssignmentKeys = new Set(\n authorizedAssignments.map(priceAssignmentAuthorizationKey),\n );\n },\n }\n : {}),\n exclusionGroupSelections:\n exclusionGroupSelections?.length ? exclusionGroupSelections : undefined,\n };\n}\n\nlet shopifyCartSyncGeneration = 0;\ntype HeadlessCartAuthorizationState = {\n generation: number;\n confirmationPending: boolean;\n pending: {\n generation: number;\n cartToken: string;\n priceAssignments: CartAssignment[];\n shippingAssignments: CartAssignment[];\n offersAssignments: CartAssignment[];\n offersAdoptionAssignments: CartAssignment[] | null;\n } | null;\n};\n\nlet headlessCartAuthorizationState: HeadlessCartAuthorizationState | null = null;\n\nfunction ensureHeadlessCartAuthorizationState(): HeadlessCartAuthorizationState {\n return headlessCartAuthorizationState ??= {\n generation: 0,\n confirmationPending: false,\n pending: null,\n };\n}\n\nfunction hasChargeAffectingCommerceAssignment(assignments = state.assignments): boolean {\n return getChargeAffectingCommerceExperimentIds(assignments).size > 0;\n}\n\nfunction hasActiveAuthorizationPlane(plane: \"price\" | \"shipping\" | \"offers\"): boolean {\n const authorization = state.config?.commerce?.[plane]?.authorization;\n return authorization?.version === 1\n && Number.isSafeInteger(authorization.revision)\n && authorization.revision > 0\n && Array.isArray(authorization.experimentIds)\n && authorization.experimentIds.length > 0;\n}\n\nconst hasActivePriceAuthorizationPlane = () => hasActiveAuthorizationPlane(\"price\");\nconst hasActiveShippingAuthorizationPlane = () => hasActiveAuthorizationPlane(\"shipping\");\nconst hasActiveOffersAuthorizationPlane = () => hasActiveAuthorizationPlane(\"offers\");\n\nfunction hasActiveCommerceAuthorizationPlane(): boolean {\n if (hasActivePriceAuthorizationPlane() || hasActiveOffersAuthorizationPlane()) return true;\n const authorization = state.config?.commerce?.shipping?.authorization;\n return authorization?.version === 1\n && Number.isSafeInteger(authorization.revision)\n && authorization.revision > 0\n && Array.isArray(authorization.experimentIds)\n && authorization.experimentIds.length > 0;\n}\n\nfunction requiresCommerceCohortPin(assignments = state.assignments): boolean {\n return hasActivePriceAuthorizationPlane()\n || hasActiveOffersAuthorizationPlane()\n || hasChargeAffectingCommerceAssignment(withCommercePriceAssignments(assignments));\n}\n\nfunction getChargeAffectingCommerceExperimentIds(\n assignments = state.assignments,\n): Set<string> {\n const active = new Map(\n assignments\n .filter((assignment) => !assignment.isControl)\n .map((assignment) => [assignment.experimentId, assignment.variationId]),\n );\n const chargeAffecting = new Set<string>();\n state.config?.commerce?.price?.experiments.forEach((experiment) => {\n const variationId = active.get(experiment.experiment_id);\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n if (variationId != null\n && (experiment.assignment_epoch == null\n || experiment.assignment_epoch === assignment?.assignmentEpoch)\n && experiment.variants[variationId]?.some(\n (adjustment) => typeof adjustment.fixedPricePerUnit === \"string\",\n )) {\n chargeAffecting.add(experiment.experiment_id);\n }\n });\n\n const offerExperimentIds = new Set(\n state.config?.commerce?.offers?.authorization?.experimentIds ?? [],\n );\n for (const experimentId of offerExperimentIds) {\n if (active.has(experimentId)) chargeAffecting.add(experimentId);\n }\n\n const shipping = state.config?.commerce?.shipping;\n const enforcedExperimentIds = new Set(shipping?.authorization?.experimentIds ?? []);\n shipping?.experiments.forEach((experiment) => {\n const variationId = active.get(experiment.experiment_id);\n const assignment = assignments.find(\n (candidate) => candidate.experimentId === experiment.experiment_id,\n );\n const variant = variationId == null ? undefined : experiment.variants[variationId];\n if (enforcedExperimentIds.has(experiment.experiment_id)\n && (experiment.assignment_epoch == null\n || experiment.assignment_epoch === assignment?.assignmentEpoch)\n && variant?.treatment !== \"none\"\n && isShippingCartEligible(experiment.experiment_id)) {\n chargeAffecting.add(experiment.experiment_id);\n }\n });\n return chargeAffecting;\n}\n\nfunction isCohortStampedOnCart(): boolean | \"pending\" {\n if (headlessCartAuthorizationState?.confirmationPending) return false;\n if (state.lastShopifyCartSync?.status === \"pending\") return \"pending\";\n return state.lastShopifyCartSync?.status === \"sent\";\n}\n\nfunction syncActiveAssignmentToShopifyCart(options: {\n chargeCorrectness?: boolean;\n force?: boolean;\n} = {}): void {\n const chargeCorrectness = options.chargeCorrectness === true\n && requiresCommerceCohortPin();\n if (!chargeCorrectness && (trackingBlocked() || !state.trackingPrerequisiteMet)) return;\n const input = buildActiveCartAttributeSyncInput(chargeCorrectness);\n if (!input) return;\n const generation = ++shopifyCartSyncGeneration;\n const authorizationUnavailable = cannotRequestRequiredCommerceAuthorization(input);\n if (hasActivePriceAuthorizationPlane()) {\n state.authorizedPriceAssignmentKeys?.clear();\n }\n if (hasActiveShippingAuthorizationPlane()) {\n state.authorizedShippingAssignmentKeys?.clear();\n }\n // Offers display keys are deliberately NOT cleared at sync start: their\n // renderer is applyAssignments itself, which triggers this sync — clearing\n // here would revoke the authorization the re-apply is acting on. Applied\n // DOM cannot be un-rendered by a key clear anyway; the keys are replaced\n // wholesale by each completed authorization (exposure stays deduped).\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: authorizationUnavailable ? \"failed\" : \"pending\",\n reason: authorizationUnavailable ? \"authorization_failed\" : undefined,\n assignmentCount: state.assignments.length,\n };\n void syncShopifyCartAttributes(input, { force: options.force }).then((result) => {\n if (generation !== shopifyCartSyncGeneration) return;\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: result.status,\n reason: result.reason,\n assignmentCount: state.assignments.length,\n };\n if (result.status === \"failed\") {\n // Fail-closed: the stamp refresh failed, so the Function may already\n // refuse lines this cart still carries (e.g. the shopper dropped below\n // the GWP threshold right before the failed sync). Run privilege-\n // reducing gift cleanup — removals and normalization only, no inserts.\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(),\n giftSyncOptions({ suppressInsertion: true }),\n );\n }\n if (result.status === \"sent\") {\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(),\n giftSyncOptions(),\n );\n notifyCommerceCartStampConfirmed();\n applyCommerceShipping(\n state.config?.commerce?.shipping,\n state.assignments.filter(isShippingDisplayAssignmentAuthorized),\n trackViewedAssignmentsAfterShippingEligibility,\n );\n if (state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config);\n }\n } else if (hasActivePriceAuthorizationPlane()) {\n cleanupCommercePrice();\n }\n });\n}\n\nfunction configureChargeCorrectnessCartSync(assignments: Assignment[]): void {\n state.stopShopifyCartMutationSync?.();\n state.stopShopifyCartMutationSync = null;\n if (!requiresCommerceCohortPin(assignments)) {\n // Commerce planes exist but none is charge-affecting anymore, so the\n // sync (and its post-\"sent\" gift pass) will not run; still give the gift\n // manager its teardown-cleanup chance for an earlier insertion, and keep\n // it subscribed to cart mutations — a login/customer-account cart merge\n // can land an Apex-marked line long after the once-per-page check.\n if (state.config?.commerce?.offers) {\n state.stopShopifyCartMutationSync = onShopifyCartMutation(() => {\n void syncGiftWithPurchase(\n state.config?.commerce?.offers,\n withCommercePriceAssignments(),\n giftSyncOptions({ recheckTeardown: true }),\n );\n });\n }\n void syncGiftWithPurchase(state.config?.commerce?.offers, withCommercePriceAssignments());\n return;\n }\n\n state.stopShopifyCartMutationSync = onShopifyCartMutation(() => {\n syncActiveAssignmentToShopifyCart({ chargeCorrectness: true, force: true });\n });\n if (commercePriceAdoptionState?.applying) return;\n // This narrow consent/DNT exemption is charge-correctness, not analytics:\n // the first-party cart attribute contains only assignment ids/epoch and must\n // exist whenever a commerce treatment can change what the shopper is charged.\n syncActiveAssignmentToShopifyCart({ chargeCorrectness: true });\n}\n\n/**\n * Publish current experiment assignments to Shopify's analytics bus.\n * The Drip Web Pixel subscribes to this custom event to attribute\n * Shopify standard events (checkout, add_to_cart, etc.) to experiments.\n *\n * No-op on non-Shopify stores — guarded by the Shopify global check.\n */\nfunction publishAssignmentsToShopify(): void {\n if (trackingBlocked() || !state.trackingPrerequisiteMet) {\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"skipped\",\n reason: \"tracking_blocked\",\n assignmentCount: state.assignments.length,\n };\n return;\n }\n try {\n const publish = (window as any).Shopify?.analytics?.publish;\n if (typeof publish !== \"function\") {\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"skipped\",\n reason: \"shopify_publish_missing\",\n assignmentCount: state.assignments.length,\n };\n return;\n }\n\n publish(\"drip_assignment_sync\", {\n visitorId: state.userId,\n sessionId: state.tracker?.getSessionId() ?? \"\",\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n assignments: state.assignments.map((a) => ({\n experimentId: a.experimentId,\n variationId: a.variationId,\n assignmentEpoch:\n !a.kind || a.kind === \"experiment\" ? a.assignmentEpoch : undefined,\n })),\n flags: {\n perf_shopify_pixel_buffer_v1: state.perfFlags.perf_shopify_pixel_buffer_v1,\n },\n });\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"sent\",\n assignmentCount: state.assignments.length,\n };\n } catch (error) {\n state.lastShopifyAssignmentSync = {\n at: Date.now(),\n status: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n assignmentCount: state.assignments.length,\n };\n }\n}\n\nfunction scheduleShopifyAssignmentSync(): void {\n clearShopifyAssignmentSyncTimers();\n if (state.config?.runtimeProfile === \"empty_project\" && state.perfFlags.perf_empty_project_v1) {\n return;\n }\n for (const delay of SHOPIFY_ASSIGNMENT_SYNC_DELAYS_MS) {\n if (delay <= 0) {\n publishAssignmentsToShopify();\n continue;\n }\n shopifyAssignmentSyncTimers.push(\n window.setTimeout(publishAssignmentsToShopify, delay),\n );\n }\n}\n\nfunction variationsAllowed(config: InitConfig): boolean {\n return evaluateProjectPrerequisite(\n config.projectPrerequisites?.showVariationsRule,\n buildPrerequisiteContext(\n config,\n state.userId,\n state.consentRequired,\n state.consentGranted,\n \"show_variations\",\n ),\n true,\n );\n}\n\nfunction updateProjectActivationDiagnostics(config: InitConfig): void {\n const variationGate: ActivationGateDiagnostic = {\n id: \"environment\",\n label: \"Project variation gate\",\n status: state.variationPrerequisiteMet ? \"passed\" : \"failed\",\n reason: state.variationPrerequisiteMet ? \"show_variations_allowed\" : \"show_variations_blocked\",\n };\n const trackingGate: ActivationGateDiagnostic = {\n id: \"tracking\",\n label: \"Tracking gate\",\n status: trackingBlocked() || !state.trackingPrerequisiteMet ? \"failed\" : \"passed\",\n reason: trackingBlocked()\n ? \"consent_or_dnt_blocked\"\n : state.trackingPrerequisiteMet\n ? \"start_tracking_allowed\"\n : \"start_tracking_blocked\",\n };\n const goalsGate: ActivationGateDiagnostic = {\n id: \"goals\",\n label: \"Goal listeners\",\n status: state.analyticsStarted ? \"passed\" : \"skipped\",\n reason: state.analyticsStarted ? \"listeners_active\" : \"tracking_not_started\",\n detail: { goals: (config.experiments ?? []).reduce((count, experiment) => count + (experiment.goals?.length ?? 0), 0) },\n };\n state.activationDiagnostics.project = { gates: [variationGate, trackingGate, goalsGate] };\n}\n\nfunction trackingAllowed(config: InitConfig): boolean {\n return evaluateProjectPrerequisite(\n config.projectPrerequisites?.startTrackingRule,\n buildPrerequisiteContext(\n config,\n state.userId,\n state.consentRequired,\n state.consentGranted,\n \"start_tracking\",\n ),\n true,\n );\n}\n\nfunction experimentById(experiments: Experiment[]): Map<string, Experiment> {\n return new Map(experiments.map((experiment) => [experiment.id, experiment]));\n}\n\nfunction targetingLifecycleMode(\n experiment: Experiment | undefined,\n): \"reset\" | \"deactivate\" | \"force_reset\" | \"persistent\" {\n const mode = experiment?.targeting?.lifecycle?.mode;\n return mode === \"deactivate\" ||\n mode === \"force_reset\" ||\n mode === \"persistent\"\n ? mode\n : \"reset\";\n}\n\nfunction preservePersistentAssignments(\n previous: Assignment[],\n next: Assignment[],\n experiments: Experiment[],\n): Assignment[] {\n if (!previous.length) return next;\n const experimentsById = experimentById(experiments);\n const nextExperimentIds = new Set(next.map((assignment) => assignment.experimentId));\n const persistent = previous.filter(\n (assignment) =>\n !nextExperimentIds.has(assignment.experimentId) &&\n targetingLifecycleMode(experimentsById.get(assignment.experimentId)) === \"persistent\",\n );\n return persistent.length ? [...next, ...persistent] : next;\n}\n\nfunction stopAnalyticsStage(): void {\n clearScheduledAnalyticsStart();\n clearShopifyAssignmentSyncTimers();\n state.pendingPerf = null;\n state.pendingDeliveryHealth = [];\n cleanupGoals();\n cleanupHeatmapTracking();\n cleanupSemanticTracking();\n if (state.tracker) {\n state.tracker.stop();\n state.tracker = null;\n }\n state.analyticsStarted = false;\n state.exposedAssignmentKeys.clear();\n if (state.config && state.config.runtimeProfile !== \"empty_project\") {\n updateProjectActivationDiagnostics(state.config);\n }\n}\n\nfunction reevaluateAssignments(\n reason: \"url\" | \"dom\" | \"manual\" | \"prerequisite\",\n forceReapply = false,\n skipHoldGate = false,\n): Assignment[] {\n if (!state.config || !state.userId) return state.assignments;\n if (state.pendingInitialApply) {\n // The initial apply is gated behind hydration (after_hydration / a\n // pre-init hold). Running a recheck now — e.g. setConsent() before\n // hydration settles — would apply mutations outside the gate; queue ONE\n // coalesced recheck until the gate opens (mutation storms during a\n // multi-second hydration window must not each schedule a full scan).\n if (state.queuedRecheck) {\n state.queuedRecheck.reason = reason;\n state.queuedRecheck.forceReapply =\n state.queuedRecheck.forceReapply || forceReapply;\n } else {\n state.queuedRecheck = { reason, forceReapply };\n void state.pendingInitialApply.then(() => {\n const queued = state.queuedRecheck;\n state.queuedRecheck = null;\n if (queued) reevaluateAssignments(queued.reason, queued.forceReapply);\n });\n }\n return state.assignments;\n }\n if (!skipHoldGate && hasMutationHold()) {\n // A framework hold (drip.hold()) during an SPA route hydration defers\n // recheck applies exactly like the initial one. The gate fails open at\n // the hydration timeout; skipHoldGate prevents re-gating after that.\n const gate: Promise<void> = awaitHydration(\n state.config.spa?.hydrationTimeoutMs ?? 3_000,\n { waitForHydration: false },\n ).then(() => {\n if (state.pendingInitialApply === gate) state.pendingInitialApply = null;\n reevaluateAssignments(reason, forceReapply, true);\n });\n state.pendingInitialApply = gate;\n return state.assignments;\n }\n if (state.config.runtimeProfile === \"empty_project\" && state.perfFlags.perf_empty_project_v1) {\n state.assignments = [];\n state.variationPrerequisiteMet = true;\n state.activationDiagnostics = { project: { gates: [] }, experiments: [] };\n state.lastAssignmentSignature = \"none\";\n return state.assignments;\n }\n const exps = state.config.experiments ?? [];\n\n captureUrlSignals(state.config);\n captureDomAndGlobalSignals(state.config);\n state.variationPrerequisiteMet = variationsAllowed(state.config);\n updateProjectActivationDiagnostics(state.config);\n if (!state.variationPrerequisiteMet) {\n if (state.assignments.length > 0) {\n spaCleanup(state.assignments);\n }\n state.assignments = [];\n state.activationDiagnostics.experiments = [];\n state.lastAssignmentSignature = \"none\";\n revealAll();\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `Variations blocked by project prerequisite (${reason})`);\n notifyQaAssistantRuntimeListeners();\n return state.assignments;\n }\n\n const evaluation = evaluateWithDiagnostics(exps, {\n url: location.href,\n attributes: state.config.attributes ?? {},\n userId: state.userId,\n persistSignals: persistentStorageAllowed(),\n exclusionGroups: state.config.exclusionGroups,\n });\n const preserved = preservePersistentAssignments(\n state.assignments,\n evaluation.assignments,\n exps,\n );\n // A persistent targeting lifecycle may reintroduce a prior assignment after\n // pass two. Re-run the group plane so that cannot resurrect a group loser.\n const updated = applyExclusionAndPersonalization(preserved, {\n userId: state.userId,\n exclusionGroups: state.config.exclusionGroups,\n }).assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n const nextSignature = assignmentSignature(updated);\n const forceReset = updated.some(\n (assignment) =>\n targetingLifecycleMode(exps.find((experiment) => experiment.id === assignment.experimentId)) ===\n \"force_reset\",\n );\n const changed = nextSignature !== state.lastAssignmentSignature || forceReset;\n\n if (changed || forceReapply) {\n spaCleanup(state.assignments);\n state.assignments = updated;\n applyAssignments(updated, state.activationMode);\n state.lastAssignmentSignature = nextSignature;\n if (state.analyticsStarted && !trackingBlocked() && state.trackingPrerequisiteMet) {\n setupGoalTracking(state.assignments, exps);\n setupHeatmapTracking(state.assignments, exps);\n syncActiveAssignmentToShopifyCart();\n scheduleShopifyAssignmentSync();\n if (reason !== \"url\") {\n trackViewedAssignments(state.config);\n }\n }\n } else {\n state.assignments = updated;\n reassertAssignmentMutations(updated);\n }\n\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"eval\", `Re-evaluated assignments (${reason})`, {\n changed,\n count: state.assignments.length,\n });\n notifyQaAssistantRuntimeListeners();\n return state.assignments;\n}\n\nfunction reapplyQaAssistantForceMap(): void {\n if (!state.config || !state.userId) {\n try {\n location.reload();\n } catch {}\n return;\n }\n reevaluateAssignments(\"manual\", true);\n notifyQaAssistantRuntimeListeners();\n}\n\nexport function __getQaAssistantRuntimeSnapshot(): QaAssistantRuntimeSnapshot {\n return {\n config: state.config,\n assignments: state.assignments.slice(),\n activationDiagnostics: {\n project: { gates: state.activationDiagnostics.project.gates.slice() },\n experiments: state.activationDiagnostics.experiments.slice(),\n },\n forceMap: state.forceMap ? { ...state.forceMap } : null,\n platform: state.platform,\n qaMode: state.qaMode,\n orderIdentity: detectOrderIdentity(),\n };\n}\n\nexport function __subscribeQaAssistantRuntime(listener: () => void): () => void {\n qaAssistantRuntimeListeners.add(listener);\n return () => {\n qaAssistantRuntimeListeners.delete(listener);\n };\n}\n\nexport function __forceQaAssistantVariation(experimentId: string, variationId: string): void {\n if (!experimentId || !variationId) return;\n state.forceMap = { ...(state.forceMap ?? {}), [experimentId]: variationId };\n persistQaForce(state.forceMap);\n reapplyQaAssistantForceMap();\n}\n\nexport function __resetQaAssistantForce(experimentId?: string): void {\n if (!experimentId) {\n state.forceMap = null;\n } else if (state.forceMap) {\n const next = { ...state.forceMap };\n delete next[experimentId];\n state.forceMap = Object.keys(next).length ? next : null;\n }\n persistQaForce(state.forceMap ?? {});\n reapplyQaAssistantForceMap();\n}\n\nfunction initWithExperiments(\n config: InitConfig,\n experiments: Experiment[],\n configSource: ConfigSource = \"inline\",\n perfContext: InitPerfContext = createInitPerfContext(),\n verifiedHandover: Awaited<ReturnType<typeof readBucketingHandover>> = null,\n): Assignment[] {\n const runtimeResolveStartedAt = monotonicNow();\n const runtimeConfig = resolveRuntimeConfig(config);\n const afMode = runtimeConfig.antiFlickerMode;\n const afTimeout = runtimeConfig.antiFlickerTimeoutMs;\n const trackStart = runtimeConfig.trackingStart;\n const idleTimeout = runtimeConfig.trackingIdleTimeoutMs;\n const jsPolicy = runtimeConfig.customJsPolicy;\n const platform = resolvePlatform(config);\n const perfFlags = readPerfFlags(config);\n const emptyProjectProfileCandidate = canUseEmptyProjectProfile(config, experiments, platform);\n const activationMode = resolveActivationMode(config);\n const pageTriggerMode = resolvePageTriggerMode(config);\n const baseRouterMode = perfFlags.perf_platform_router_v1\n ? resolveRouterMode(config, platform)\n : \"history\";\n const routerMode = pageTriggerMode === \"url_change\" && baseRouterMode === \"none\"\n ? \"history\"\n : baseRouterMode;\n const manualInitialTrigger = config.spa?.reinitOnly === true || pageTriggerMode === \"manual\";\n const domPageTrigger = resolveDomPageTrigger(config, pageTriggerMode);\n const urlDiffNeeds = computeUrlDiffNeeds(experiments, config.signals);\n addInitPhase(perfContext, \"runtime_setup_ms\", runtimeResolveStartedAt);\n const assignmentStartedAt = monotonicNow();\n const initStartedAt = Date.now();\n updateLoadDiagnostics({\n stage: \"init_started\",\n startedAt: initStartedAt,\n configFetchStatus: configSource === \"network\" ? state.load.configFetchStatus : state.load.configFetchStatus ?? \"idle\",\n });\n const consentIdentityStartedAt = monotonicNow();\n const initialConsentRequired = resolveConsentRequired(config);\n const initialConsentGranted = resolveConsentGranted(config, initialConsentRequired);\n const initialTrackingDisabledByDnt = doNotTrackEnabled(config);\n const initialStorageAllowed = storageAllowed(\n initialConsentRequired,\n initialConsentGranted,\n initialTrackingDisabledByDnt,\n );\n state.consentRequired = initialConsentRequired;\n state.consentGranted = initialConsentGranted;\n state.consentModeEnabled = config.consentMode?.enabled === true;\n state.trackingDisabledByDnt = initialTrackingDisabledByDnt;\n configureIdentityStorage(initialStorageAllowed ? config.dataProtection : { ...(config.dataProtection ?? {}), storageMode: \"memory\" });\n if (!initialStorageAllowed) {\n clearConsentStorage();\n }\n const handover = emptyProjectProfileCandidate ? null : verifiedHandover;\n if (initialStorageAllowed && handover?.visitorId && !config.userId) {\n adoptUserId(handover.visitorId);\n }\n const resolvedUserId = initialStorageAllowed\n ? getUserId(config.userId)\n : getEphemeralUserId(config.userId);\n\n configureDebug(config.debug, resolvedUserId, { storageAllowed: initialStorageAllowed });\n addInitPhase(perfContext, \"consent_identity_ms\", consentIdentityStartedAt);\n\n const runtimeSetupStartedAt = monotonicNow();\n __DRIP_FEATURE_DEVTOOLS__ && debugGroup(\"init\");\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"init\", `Initializing with ${experiments.length} experiment(s)`, {\n executionMode: runtimeConfig.executionMode,\n antiFlicker: afMode,\n trackingStart: trackStart,\n platform,\n routerMode,\n activationMode,\n pageTrigger: pageTriggerMode,\n configSource,\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Initiated snippet runtime\", {\n revision: config.delivery?.revision,\n sdkVariant: config.runtimeFeatures?.sdkVariant,\n configSource,\n deliveryState: config.delivery?.deliveryState ?? config.deliveryState,\n });\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Initiated project\", {\n shopId: config.shopId,\n executionMode: runtimeConfig.executionMode,\n platform,\n routerMode,\n activationMode,\n pageTrigger: pageTriggerMode,\n });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"init\", `Init: ${experiments.length} experiment(s)`, {\n executionMode: runtimeConfig.executionMode,\n antiFlicker: afMode,\n platform,\n routerMode,\n activationMode,\n pageTrigger: pageTriggerMode,\n configSource,\n });\n\n // Apply custom JS policy\n setJsPolicy(jsPolicy);\n if (!emptyProjectProfileCandidate) applyProjectCode(config);\n\n const urlForceMap = parseForceParam({ cookieFallback: persistentStorageAllowed() });\n const handoverForceMap = handover?.forceMap && Object.keys(handover.forceMap).length > 0\n ? handover.forceMap\n : null;\n state.forceMap = handoverForceMap || urlForceMap\n ? { ...(handoverForceMap ?? {}), ...(urlForceMap ?? {}) }\n : null;\n\n // QA and screenshot sessions retain the full runtime even if the published\n // project is otherwise empty.\n state.qaMode = isQaMode({ cookieFallback: persistentStorageAllowed() });\n state.screenshotMode = isScreenshotMode();\n const emptyProjectFastPath = emptyProjectProfileCandidate\n && !state.qaMode\n && !state.screenshotMode;\n const resolvedConfig = {\n ...config,\n experiments,\n runtimeProfile: emptyProjectFastPath ? \"empty_project\" : \"full\",\n };\n // A network refresh may remove the cached price plane while its display or\n // cart authorization is still live. The empty-project/lazy path deliberately\n // skips applyCommercePrice, so teardown must happen before replacing config.\n const priorPriceSyncPending = hasActivePriceAuthorizationPlane()\n && state.lastShopifyCartSync?.status === \"pending\";\n if (\n !resolvedConfig.commerce?.price &&\n (hasCommercePriceState() || priorPriceSyncPending)\n ) {\n shopifyCartSyncGeneration += 1;\n invalidateShopifyCartAttributeSync();\n cleanupCommercePrice();\n }\n state.config = resolvedConfig;\n state.userId = resolvedUserId;\n state.trackingStart = trackStart;\n state.trackingIdleTimeoutMs = idleTimeout;\n state.consentRequired = initialConsentRequired;\n state.consentGranted = initialConsentGranted;\n state.consentModeEnabled = config.consentMode?.enabled === true;\n state.trackingDisabledByDnt = initialTrackingDisabledByDnt;\n state.variationPrerequisiteMet = emptyProjectFastPath || variationsAllowed(resolvedConfig);\n state.trackingPrerequisiteMet = emptyProjectFastPath || trackingAllowed(resolvedConfig);\n state.analyticsStarted = false;\n state.exposedAssignmentKeys.clear();\n state.authorizedPriceAssignmentKeys = null;\n state.authorizedShippingAssignmentKeys = null;\n state.authorizedOffersAssignmentKeys = null;\n if (headlessCartAuthorizationState) {\n headlessCartAuthorizationState.generation += 1;\n headlessCartAuthorizationState.confirmationPending = false;\n headlessCartAuthorizationState.pending = null;\n }\n state.platform = platform;\n state.routerMode = routerMode;\n state.activationMode = activationMode;\n state.perfFlags = perfFlags;\n state.urlDiffNeeds = urlDiffNeeds;\n state.configSource = configSource;\n state.runtimeConfig = runtimeConfig;\n state.pageTriggerMode = pageTriggerMode;\n state.initializingAssignments = true;\n const url = config.url ?? location.href;\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Initiated page\", {\n url,\n experiments: experiments.length,\n signals: resolvedConfig.signals?.length ?? 0,\n });\n\n // QA session persistence\n if (state.qaMode) {\n state.qaSessionId = getQaSessionId(generateQaSessionId, { storageAllowed: persistentStorageAllowed() });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"qa\", \"QA mode active\", { forceMap: state.forceMap, sessionId: state.qaSessionId });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"qa\", \"QA mode active\", { sessionId: state.qaSessionId });\n // Persist force map to cookie so QA sessions survive navigation\n if (state.forceMap && persistentStorageAllowed()) {\n persistQaForce(state.forceMap);\n }\n } else {\n state.qaSessionId = \"\";\n }\n if (state.screenshotMode) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"qa\", \"Screenshot mode active\");\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"qa\", \"Screenshot mode active\");\n }\n\n // Cleanup previous init\n if (state.stopObserver) {\n state.stopObserver();\n state.stopObserver = null;\n }\n if (state.stopDomObserver) {\n state.stopDomObserver();\n state.stopDomObserver = null;\n }\n if (state.stopHandover) {\n state.stopHandover();\n state.stopHandover = null;\n }\n if (state.stopSignalCaptures) {\n state.stopSignalCaptures();\n state.stopSignalCaptures = null;\n }\n if (state.stopSurfaceSignals) {\n state.stopSurfaceSignals();\n state.stopSurfaceSignals = null;\n }\n if (state.stopJsTriggerSignals) {\n state.stopJsTriggerSignals();\n state.stopJsTriggerSignals = null;\n }\n if (state.stopDataLayerTriggers) {\n state.stopDataLayerTriggers();\n state.stopDataLayerTriggers = null;\n }\n if (state.stopConsentListeners) {\n state.stopConsentListeners();\n state.stopConsentListeners = null;\n }\n state.stopShopifyCartMutationSync?.();\n state.stopShopifyCartMutationSync = null;\n clearScheduledAnalyticsStart();\n cleanupGoals();\n cleanupHeatmapTracking();\n cleanupSemanticTracking();\n if (state.tracker) {\n state.tracker.stop();\n state.tracker = null;\n }\n state.pendingDeliveryHealth = [];\n // The authorized empty-project profile has no visual treatment to measure;\n // reset any prior route measurement without constructing an observer.\n startCwvMeasurement(emptyProjectFastPath);\n\n state.stopConsentListeners = installConsentChangeListeners(resolvedConfig);\n if (!emptyProjectFastPath) {\n captureUrlSignals(resolvedConfig);\n captureDomAndGlobalSignals(resolvedConfig);\n state.stopSignalCaptures = installClickSignalCaptures(resolvedConfig);\n state.stopSurfaceSignals = experimentsUseSurfaceSignals(experiments)\n ? installSurfaceSignals(() => {\n captureDomAndGlobalSignals(resolvedConfig);\n reevaluateAssignments(\"dom\");\n })\n : null;\n state.stopJsTriggerSignals = installJsTriggerObserver(experiments, () => {\n reevaluateAssignments(\"dom\");\n });\n state.stopDataLayerTriggers = installDataLayerTriggers(resolvedConfig);\n }\n\n // Evaluate and apply. For generated snippets, use the compact critical path\n // plan first, then fall back to the general evaluator for complex/noncritical\n // experiments that were not safely precompiled.\n if (emptyProjectFastPath) {\n state.activationDiagnostics = { project: { gates: [] }, experiments: [] };\n } else {\n updateProjectActivationDiagnostics(resolvedConfig);\n for (const gate of state.activationDiagnostics.project.gates) {\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(`Project ${gate.label} is ${gate.status}`, {\n reason: gate.reason,\n ...(gate.detail && typeof gate.detail === \"object\" ? { detail: gate.detail } : {}),\n });\n }\n }\n addInitPhase(perfContext, \"runtime_setup_ms\", runtimeSetupStartedAt);\n const targetingAssignmentStartedAt = monotonicNow();\n const persistedAssignments = emptyProjectFastPath\n ? undefined\n : loadPersistedAssignments(experiments);\n if (emptyProjectFastPath) {\n state.assignments = [];\n } else if (!manualInitialTrigger && state.variationPrerequisiteMet) {\n const attributes = buildTargetingAttributes(config.attributes ?? {}, url, {\n persistSignals: persistentStorageAllowed(),\n });\n // Group resolution needs one pass across every provisional assignment, so\n // grouped configs bypass the compact precompiled lane.\n if (config.exclusionGroups?.length) {\n const evaluation = evaluateWithDiagnostics(experiments, {\n url,\n attributes,\n userId: state.userId,\n persistSignals: false,\n exclusionGroups: config.exclusionGroups,\n persistedAssignments,\n });\n state.assignments = evaluation.assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n } else {\n const critical = buildCriticalPathAssignments(\n experiments,\n config.delivery?.criticalMutationPlan,\n { url, attributes, userId: state.userId },\n );\n const fallbackExperiments = critical.plannedExperimentIds.size\n ? experiments.filter((experiment) =>\n !critical.plannedExperimentIds.has(experiment.id) ||\n (\n targetingLifecycleMode(experiment) === \"persistent\" &&\n !critical.assignments.some(\n (assignment) => assignment.experimentId === experiment.id,\n )\n ),\n )\n : experiments;\n const fallback = evaluateWithDiagnostics(fallbackExperiments, {\n url,\n attributes,\n userId: state.userId,\n persistSignals: false,\n persistedAssignments,\n });\n state.assignments = [\n ...critical.assignments,\n ...fallback.assignments,\n ];\n const fallbackDiagnosticIds = new Set(\n fallback.diagnostics.map((diagnostic) => diagnostic.experimentId),\n );\n state.activationDiagnostics.experiments = [\n ...critical.skippedDiagnostics.filter(\n (diagnostic) => !fallbackDiagnosticIds.has(diagnostic.experimentId),\n ),\n ...fallback.diagnostics,\n ];\n for (const assignment of critical.assignments) {\n const experiment = experiments.find((candidate) => candidate.id === assignment.experimentId);\n if (!experiment) continue;\n state.activationDiagnostics.experiments.unshift(experimentDiagnostic(\n experiment,\n [\n { id: \"page\", label: \"Page check\", status: \"passed\", reason: \"precompiled_delivery_match\" },\n // Critical-plan invariant: only campaigns without non-URL\n // targeting are precompiled — the truthful audience result is\n // \"all visitors\", same as the skip-path diagnostics.\n { id: \"audience\", label: \"Audience check\", status: \"skipped\", reason: \"no_audience_rules\" },\n { id: \"traffic\", label: \"Traffic allocation\", status: \"passed\", reason: \"included\" },\n { id: \"assignment\", label: \"Variation assignment\", status: \"passed\", reason: \"precompiled_assignment\" },\n ],\n assignment,\n \"precompiled_assignment\",\n ));\n }\n }\n } else {\n state.assignments = [];\n state.activationDiagnostics.experiments = manualInitialTrigger\n ? experiments.map((experiment) => experimentDiagnostic(\n experiment,\n [{ id: \"activation\", label: \"Page trigger\", status: \"skipped\", reason: \"manual_initial_trigger\" }],\n null,\n \"manual_initial_trigger\",\n ))\n : [];\n }\n if (state.assignments.length > 1) {\n const filteredInitial = enforcePersonalizationStopAfterMatch(\n state.assignments,\n state.activationDiagnostics.experiments,\n );\n state.assignments = filteredInitial.assignments;\n state.activationDiagnostics.experiments = filteredInitial.diagnostics ?? state.activationDiagnostics.experiments;\n }\n if (!emptyProjectFastPath && afMode !== \"off\") {\n const scopedSelectors = afMode === \"scoped\"\n ? collectScopedSelectors(experiments, resolvedConfig, state.assignments)\n : undefined;\n applyAntiFlicker(afMode, afTimeout, scopedSelectors, runtimeConfig.antiFlickerCustomCss);\n }\n addInitPhase(perfContext, \"targeting_assignment_ms\", targetingAssignmentStartedAt);\n const mutationFinalizeStartedAt = monotonicNow();\n let initialApplyPromise: Promise<void> | null = null;\n if (!emptyProjectFastPath) {\n const waitForHydration = resolvedConfig.spa?.applyTiming === \"after_hydration\";\n const deferForVisualWork = assignmentsHaveVisualWork(\n state.assignments,\n resolvedConfig.commerce?.price,\n );\n if ((waitForHydration || hasMutationHold()) && deferForVisualWork) {\n const scheduledConfig = resolvedConfig;\n const scheduledUrl = location.href;\n initialApplyPromise = awaitHydration(\n resolvedConfig.spa?.hydrationTimeoutMs ?? 3_000,\n { waitForHydration },\n ).then(() => {\n // A re-init (e.g. cached config superseded by the network config)\n // replaces the pending gate; a stale promise must not clear the\n // newer one and open the hydration gate early for rechecks.\n if (state.pendingInitialApply === initialApplyPromise) {\n state.pendingInitialApply = null;\n }\n if (state.config !== scheduledConfig) return;\n if (location.href !== scheduledUrl) {\n // The shopper navigated before the gate opened: applying the\n // original route's assignments would flash the previous page's\n // treatment. Re-evaluate for the current URL directly (forcing\n // apply + reveal even when nothing was queued or the signature is\n // unchanged), then run startup JS to preserve the ordering.\n reevaluateAssignments(\"url\", true, true);\n runProjectStartupCode(scheduledConfig);\n return;\n }\n applyAssignments(state.assignments, state.activationMode);\n // Preserve the immediate-mode ordering contract: project startup JS\n // runs after assignment mutations, so it can read the variant DOM.\n runProjectStartupCode(scheduledConfig);\n });\n state.pendingInitialApply = initialApplyPromise;\n } else {\n // Immediate apply supersedes any gate left by a previous init.\n state.pendingInitialApply = null;\n applyAssignments(state.assignments, state.activationMode);\n runProjectStartupCode(resolvedConfig);\n }\n if (persistentStorageAllowed() && config.bucketingCleanup?.enabled !== false) {\n cleanupBucketingStorage(experiments, {\n shopId: config.shopId,\n retentionDays: config.bucketingCleanup?.retentionDays,\n });\n }\n state.stopHandover = installBucketingHandover(config.externalTracking, () => (\n persistentStorageAllowed() && state.userId && state.assignments.length\n ? createBucketingHandoverPayload(state.userId, state.assignments, config.externalTracking)\n : null\n ), () => (\n persistentStorageAllowed() && state.userId && state.assignments.length\n ? mintBucketingHandoverPayload(config, state.userId, state.assignments)\n : Promise.resolve(null)\n ));\n } else {\n // A cached visual config can leave a hydration promise pending when the\n // authoritative network response resolves to the empty fast path. The\n // stale promise is config-guarded, so detach it immediately instead of\n // delaying install/pageview analytics until its timeout.\n state.pendingInitialApply = null;\n }\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n state.lastUrl = location.href;\n state.initializingAssignments = false;\n addInitPhase(perfContext, \"mutation_finalize_ms\", mutationFinalizeStartedAt);\n const assignmentReadyMonotonicAt = monotonicNow();\n const assignmentReadyMs = boundedPerfDuration(assignmentReadyMonotonicAt - assignmentStartedAt);\n const initTotalMs = boundedPerfDuration(assignmentReadyMonotonicAt - perfContext.startedAt);\n const assignmentReadyAt = Date.now();\n updateLoadDiagnostics({\n stage: \"assignments_ready\",\n assignmentReadyAt,\n assignmentReadyMs,\n });\n queuePerfEvent(buildPerfEvent(resolvedConfig, {\n assignmentReadyMs,\n initTotalMs,\n phases: { ...perfContext.phases },\n includesConfigFetch: perfContext.includesConfigFetch,\n blankScreenMs: getBlankScreenMs(),\n assignmentReadyAt,\n }));\n writeIdentityContextCookie();\n\n const beginTracking = () => {\n if (state.config !== resolvedConfig) return;\n if (!state.trackingPrerequisiteMet) {\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"track\", \"Tracking blocked by project prerequisite\");\n } else if (trackStart === \"idle\") {\n scheduleAnalyticsStart(resolvedConfig, experiments);\n } else {\n startAnalyticsStage(resolvedConfig, experiments);\n }\n // This callback is queued behind initialApplyPromise below, so Shopify\n // never receives assignment attribution before the treatment is visible.\n scheduleShopifyAssignmentSync();\n };\n if (initialApplyPromise) void initialApplyPromise.then(beginTracking);\n else beginTracking();\n\n if (FEATURE_AUDIT) {\n import(\"./audit\").then(({ runAuditIfRequested }) => {\n runAuditIfRequested(resolvedConfig, {\n configSource: state.configSource,\n trackerStarted: Boolean(state.tracker),\n platform: state.platform,\n });\n }).catch(() => {});\n }\n\n // Route observer (SPA fast path)\n if (!emptyProjectFastPath && pageTriggerMode !== \"manual\") {\n state.stopObserver = observeRouteChanges(state.routerMode, ({ previousUrl, nextUrl, reason }) => {\n if (!state.config || !state.userId) return;\n const routeAnalyticsGeneration = ++state.routeAnalyticsGeneration;\n // Finalize the prior route and start a fresh CLS window so SPA events\n // never reuse the first route's reveal boundary or shift totals.\n startCwvMeasurement();\n\n // Fire page_exit for the page we're leaving\n if (!state.screenshotMode && state.analyticsStarted) {\n onPageExit(analyticsTrack);\n }\n const exps = state.config.experiments ?? [];\n const routeStartedAt = Date.now();\n const shouldReevaluate = state.perfFlags.perf_spa_incremental_reapply_v1\n ? shouldReevaluateForUrlChange(previousUrl, nextUrl, state.urlDiffNeeds)\n : true;\n state.lastRouteChange = {\n previousUrl,\n nextUrl,\n reason,\n at: Date.now(),\n reEvaluated: shouldReevaluate,\n };\n\n if (shouldReevaluate) {\n reevaluateAssignments(\"url\");\n }\n if (!state.pendingInitialApply) {\n // Routes with no visual re-apply still need a route-local reveal\n // boundary; applyAssignments() marks it for gated/visual routes.\n markCwvReveal();\n }\n\n state.lastUrl = nextUrl;\n state.trackingPrerequisiteMet = trackingAllowed(state.config);\n updateProjectActivationDiagnostics(state.config);\n const assignmentReadyAt = Date.now();\n queuePerfEvent(buildPerfEvent(state.config, {\n assignmentReadyMs: assignmentReadyAt - routeStartedAt,\n blankScreenMs: 0,\n assignmentReadyAt,\n }));\n\n const runRouteAnalytics = () => {\n if (routeAnalyticsGeneration !== state.routeAnalyticsGeneration) return;\n if (!state.config) return;\n // Re-publish only after a held route recheck has refreshed assignments.\n // The pixel can load after the SDK, so rebroadcast briefly instead of\n // relying on one event.\n scheduleShopifyAssignmentSync();\n if (state.analyticsStarted && !state.trackingPrerequisiteMet) {\n stopAnalyticsStage();\n } else if (state.analyticsStarted) {\n flushPendingPerf();\n state.exposedAssignmentKeys.clear();\n trackViewedAssignments(state.config);\n setupGoalTracking(state.assignments, exps);\n setupHeatmapTracking(state.assignments, exps);\n onPageEnter(analyticsTrack);\n } else if (!state.screenshotMode && !trackingBlocked() && state.trackingPrerequisiteMet) {\n if (state.trackingStart === \"idle\") {\n scheduleAnalyticsStart(state.config, exps);\n } else {\n startAnalyticsStage(state.config, exps);\n }\n }\n };\n if (state.pendingInitialApply) {\n // The URL recheck queued behind a hold/hydration gate; running the\n // route analytics now would expose and wire goals for the previous\n // route's stale assignments. The queued recheck registered first,\n // so assignments are fresh by the time this runs.\n void state.pendingInitialApply.then(runRouteAnalytics);\n } else {\n runRouteAnalytics();\n }\n });\n }\n\n if (!emptyProjectFastPath && domPageTrigger && !manualInitialTrigger) {\n state.stopDomObserver = observeDomChanges(() => {\n reevaluateAssignments(\"dom\");\n }, config.spa?.debounceMs ?? 250);\n }\n\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"init\", `${state.assignments.length} assignment(s) active`, state.assignments.map(a => ({\n experiment: a.experimentId,\n variation: a.variationId,\n isControl: a.isControl,\n })));\n __DRIP_FEATURE_DEVTOOLS__ && traceStep(\"Execution cycle complete\", {\n assignments: state.assignments.map((assignment) => ({\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n isControl: assignment.isControl,\n })),\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugGroupEnd();\n\n // Lazy-load QA toolbar when in QA mode. Screenshot captures use QA forcing\n // without any visible Apex UI in the captured page.\n if (FEATURE_QA && state.qaMode && !state.screenshotMode) {\n // The QA Assistant replaces the legacy toolbar; if its module is stubbed\n // or fails to load, fall back to the toolbar/devtools path so QA mode\n // never goes dark.\n loadQaAssistant(() => {\n loadQaToolbar(experiments);\n loadDevtoolsIfEnabled(experiments);\n });\n }\n notifyQaAssistantRuntimeListeners();\n\n // Lazy-load devtools overlay when enabled\n if (!state.qaMode) {\n loadDevtoolsIfEnabled(experiments);\n }\n\n // Dispatch initialized event\n document.dispatchEvent(new CustomEvent(\"drip_initialized\"));\n\n return state.assignments;\n}\n\nfunction loadQaToolbar(experiments: Experiment[]): void {\n if (!FEATURE_QA) return;\n try {\n import(\"./qa-toolbar\").then(({ mountQaToolbar }) => {\n mountQaToolbar({\n experiments,\n assignments: state.assignments,\n forceMap: state.forceMap,\n qaSessionId: state.qaSessionId,\n onSwitchVariation: (experimentId: string, variationId: string) => {\n if (!state.forceMap) state.forceMap = {};\n state.forceMap[experimentId] = variationId;\n persistQaForce(state.forceMap);\n // Re-evaluate with new force map\n if (state.config) {\n const exps = state.config.experiments ?? [];\n spaCleanup(state.assignments);\n const evaluation = evaluateWithDiagnostics(exps, {\n url: location.href,\n attributes: state.config.attributes ?? {},\n userId: state.userId!,\n persistSignals: persistentStorageAllowed(),\n exclusionGroups: state.config.exclusionGroups,\n });\n state.assignments = evaluation.assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n applyAssignments(state.assignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n }\n },\n onExitQa: () => {\n exitQaMode();\n location.reload();\n },\n onReloadLatest: () => {\n const assignment = activeHarnessAssignment(state.assignments);\n if (assignment?.harnessSession?.manifestUrl) {\n pollHarnessManifest(assignment.harnessSession.manifestUrl);\n }\n },\n onExitHarness: () => {\n const url = new URL(location.href);\n url.searchParams.delete(\"drip_harness\");\n history.replaceState(null, \"\", url.toString());\n location.reload();\n },\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"qa\", \"QA toolbar mounted\");\n }).catch(() => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"qa\", \"QA toolbar module not available\");\n });\n } catch {\n // Dynamic import not supported — skip toolbar\n }\n}\n\nfunction loadQaAssistant(onUnavailable?: () => void): void {\n if (!FEATURE_QA) {\n onUnavailable?.();\n return;\n }\n try {\n import(\"./qa-assistant\")\n .then(({ mountQaAssistant }) => {\n const view = mountQaAssistant();\n if (!view) onUnavailable?.();\n })\n .catch(() => onUnavailable?.());\n } catch {\n // Dynamic import not supported — fall back to the legacy toolbar.\n onUnavailable?.();\n }\n}\n\nfunction loadDevtoolsIfEnabled(experiments: Experiment[]): void {\n if (!FEATURE_DEVTOOLS || state.screenshotMode || !persistentStorageAllowed()) return;\n try {\n import(\"./devtools\").then(({ isDevtoolsEnabled }) => {\n if (isDevtoolsEnabled()) loadDevtools(experiments);\n }).catch(() => {});\n } catch {\n // Dynamic import not supported.\n }\n}\n\nfunction loadDevtools(experiments: Experiment[]): void {\n if (!FEATURE_DEVTOOLS) return;\n try {\n import(\"./devtools\").then(({ mountDevtools }) => {\n mountDevtools({\n experiments,\n assignments: state.assignments,\n diagnostics: getDiagnostics(),\n forceMap: state.forceMap,\n onForceVariation: (experimentId: string, variationId: string) => {\n if (!state.forceMap) state.forceMap = {};\n state.forceMap[experimentId] = variationId;\n // Re-evaluate with new force map\n if (state.config) {\n const exps = state.config.experiments ?? [];\n spaCleanup(state.assignments);\n const evaluation = evaluateWithDiagnostics(exps, {\n url: location.href,\n attributes: state.config.attributes ?? {},\n userId: state.userId!,\n persistSignals: persistentStorageAllowed(),\n exclusionGroups: state.config.exclusionGroups,\n });\n state.assignments = evaluation.assignments;\n state.activationDiagnostics.experiments = evaluation.diagnostics;\n applyAssignments(state.assignments, state.activationMode);\n state.lastAssignmentSignature = assignmentSignature(state.assignments);\n // Re-mount devtools with updated state\n import(\"./devtools\").then(({ mountDevtools: remount }) => {\n remount({\n experiments: exps,\n assignments: state.assignments,\n diagnostics: getDiagnostics(),\n forceMap: state.forceMap,\n onForceVariation: () => {}, // Will be replaced on next full load\n });\n }).catch(() => {});\n }\n },\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"init\", \"Devtools overlay mounted\");\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"init\", \"Devtools overlay mounted\");\n }).catch(() => {\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"init\", \"Devtools module not available\");\n });\n } catch {\n // Dynamic import not supported — skip devtools\n }\n}\n\nexport function init(config: InitConfig): Assignment[] {\n if (typeof window !== \"undefined\" && isEditorDevicePreview(window)) {\n revealAll();\n removeAntiFlicker();\n return [];\n }\n if (interceptEditorLaunch({\n configuredBundleUrl: config.editorBundleUrl,\n scriptSrc: SDK_SCRIPT_SRC,\n pageUrl: typeof location !== \"undefined\" ? location.href : undefined,\n onBeforeLoad: () => {\n revealAll();\n removeAntiFlicker();\n },\n onFailure: () => {\n init(config);\n },\n })) {\n return [];\n }\n\n const perfContext = createInitPerfContext();\n const earlyConsentRequired = resolveConsentRequired(config);\n const earlyConsentGranted = resolveConsentGranted(config, earlyConsentRequired);\n const earlyTrackingDisabledByDnt = doNotTrackEnabled(config);\n const earlyStorageAllowed = storageAllowed(earlyConsentRequired, earlyConsentGranted, earlyTrackingDisabledByDnt);\n configureIdentityStorage(earlyStorageAllowed ? config.dataProtection : { ...(config.dataProtection ?? {}), storageMode: \"memory\" });\n const earlyUserId = config.userId ?? null;\n configureDebug(config.debug, earlyUserId, { storageAllowed: earlyStorageAllowed });\n // Guards\n if (isDuplicate()) {\n state.consentRequired = earlyConsentRequired;\n state.consentGranted = earlyConsentGranted;\n state.trackingDisabledByDnt = earlyTrackingDisabledByDnt;\n state.screenshotMode = isScreenshotMode();\n const firstInstall = readRuntimeInstallClaim();\n const attemptedInstallSurface = telemetryLabel(config.installSurface, \"direct_script\");\n if (\n firstInstall\n && firstInstall.installSurface !== attemptedInstallSurface\n && claimInstallConflictEmission()\n ) {\n sendRuntimeEventNow(config, \"sdk_install_conflict\", {\n first_install_surface: firstInstall.installSurface,\n attempted_install_surface: attemptedInstallSurface,\n }, earlyUserId);\n }\n return [];\n }\n rememberRuntimeInstallClaim(config);\n if (isBot()) { __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"guard\", \"Blocked: bot detected\"); __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"guard\", \"Blocked: bot detected\"); return []; }\n if (!config.spa?.allowIframes && isIframe()) { __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"guard\", \"Blocked: iframe detected\"); __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"guard\", \"Blocked: iframe detected\"); return []; }\n if (isOptedOut({ storageAllowed: earlyStorageAllowed })) { __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"guard\", \"Blocked: opted out\"); __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"guard\", \"Blocked: opted out\"); return []; }\n\n resetLoadDiagnostics(\"boot\");\n const runtimeConfig = resolveRuntimeConfig(config);\n addInitPhase(perfContext, \"guard_resolve_ms\", perfContext.startedAt);\n\n if (config.geo?.country) {\n setRuntimeSignal(\"geo.country\", config.geo.country, \"edge\");\n }\n\n // In edge-only mode, the client SDK should not evaluate or mutate.\n if (runtimeConfig.executionMode === \"edge\") {\n if (!edgeRuntimeActive() && typeof console !== \"undefined\") {\n console.warn(\"[drip] executionMode='edge' but no edge runtime detected; skipping client init\");\n }\n return [];\n }\n\n // If experiments are provided inline, use them directly. An empty array is a\n // valid published project state and still needs analytics for install checks.\n if (Array.isArray(config.experiments)) {\n if (config.shopId && hasBucketingHandover(config.externalTracking)) {\n void readBucketingHandover(\n config.externalTracking,\n config.shopId,\n (token) => verifyBucketingHandoverToken(config, token),\n ).then((handover) => initWithExperiments(config, config.experiments!, \"inline\", perfContext, handover));\n return [];\n }\n return initWithExperiments(config, config.experiments, \"inline\", perfContext);\n }\n\n // If shopId is provided, fetch experiments from the API\n if (config.shopId && config.endpoint) {\n state.consentRequired = earlyConsentRequired;\n state.consentGranted = earlyConsentGranted;\n state.trackingDisabledByDnt = earlyTrackingDisabledByDnt;\n const forceMap = parseForceParam({ cookieFallback: earlyStorageAllowed });\n const qaMode = isQaMode({ cookieFallback: earlyStorageAllowed });\n const screenshotMode = isScreenshotMode();\n const serializedForceMap = serializeForceMap(forceMap);\n const environmentKey = config.environments?.activeKey || \"production\";\n const configUrl = new URL(normalizeEndpoint(config.endpoint) + \"/config\");\n configUrl.searchParams.set(\"shopId\", config.shopId);\n if (environmentKey !== \"production\") {\n configUrl.searchParams.set(\"env\", environmentKey);\n }\n if ((qaMode || screenshotMode) && serializedForceMap) {\n configUrl.searchParams.set(\"drip_qa\", \"1\");\n configUrl.searchParams.set(\"drip_force\", serializedForceMap);\n const harnessToken = new URLSearchParams(location.search).get(\"drip_harness\");\n if (harnessToken) {\n configUrl.searchParams.set(\"drip_harness\", harnessToken);\n }\n }\n const useConfigCache = earlyStorageAllowed && config.configCache !== false && !((qaMode || screenshotMode) && serializedForceMap);\n const cacheTtlMs = getConfigCacheTtlMs(config);\n const cached = useConfigCache\n ? readCachedExperiments(config.shopId, cacheTtlMs, environmentKey)\n : null;\n const handoverPromise = readBucketingHandover(\n config.externalTracking,\n config.shopId,\n (token) => verifyBucketingHandoverToken(config, token),\n );\n\n if (cached) {\n updateLoadDiagnostics({\n stage: \"config_cache_hit\",\n configFetchStatus: \"idle\",\n });\n const cachedConfig = cached.runtime\n ? withRuntimeSettings(config, cached.runtime, cached.profile)\n : { ...config, profile: cached.profile ?? config.profile };\n // Cached applies used to be effectively instant, making flicker cover\n // pointless — but under after_hydration (or a pre-init hold) the apply\n // is deferred, so the configured anti-flicker must stay on or repeat\n // visitors see the original DOM until the gate resolves.\n const cachedApplyDeferred =\n cachedConfig.spa?.applyTiming === \"after_hydration\" || hasMutationHold();\n const initCachedConfig = (verifiedHandover: Awaited<ReturnType<typeof readBucketingHandover>>) => initWithExperiments(\n {\n ...cachedConfig,\n antiFlickerMode: cachedApplyDeferred ? cachedConfig.antiFlickerMode : \"off\",\n exclusionGroups: cached.exclusionGroups,\n signals: cached.signals ?? config.signals,\n commerce: cached.commerce,\n },\n cached.experiments,\n \"cache\",\n perfContext,\n verifiedHandover,\n );\n void handoverPromise.then(initCachedConfig);\n }\n\n // Always apply anti-flicker during async fetch to prevent FOUC. Forced QA\n // fetches may not have scoped selectors until the fresh config arrives, so\n // use a QA-only full-page guard instead of letting the page paint stale UI.\n const asyncFetchAntiFlickerArmed = !cached && runtimeConfig.antiFlickerMode !== \"off\";\n if (asyncFetchAntiFlickerArmed) {\n const asyncFetchAntiFlickerMode =\n runtimeConfig.antiFlickerMode === \"scoped\" && (qaMode || screenshotMode) && serializedForceMap\n ? \"full\"\n : runtimeConfig.antiFlickerMode;\n applyAntiFlicker(\n asyncFetchAntiFlickerMode,\n runtimeConfig.antiFlickerTimeoutMs,\n undefined,\n runtimeConfig.antiFlickerCustomCss,\n );\n }\n\n const configFetchStartedAt = Date.now();\n if (!cached) perfContext.includesConfigFetch = true;\n const antiFlickerFetchBudgetMs = asyncFetchAntiFlickerArmed\n ? Math.max(runtimeConfig.antiFlickerTimeoutMs, 300)\n : null;\n const hardRevealDeadline = antiFlickerFetchBudgetMs !== null\n ? configFetchStartedAt + antiFlickerFetchBudgetMs\n : null;\n updateLoadDiagnostics({\n stage: \"config_fetch_started\",\n configFetchStartedAt,\n configFetchAttempts: 0,\n configFetchStatus: \"loading\",\n });\n\n fetchWithRetry(configUrl.toString(), 2, 500, {\n timeoutMs: DEFAULT_CONFIG_FETCH_TIMEOUT_MS,\n firstAttemptTimeoutMs: antiFlickerFetchBudgetMs !== null\n ? Math.min(DEFAULT_CONFIG_FETCH_TIMEOUT_MS, antiFlickerFetchBudgetMs)\n : DEFAULT_CONFIG_FETCH_TIMEOUT_MS,\n slowMs: DEFAULT_CONFIG_FETCH_SLOW_MS,\n onAttemptStart: (attempt) => {\n updateLoadDiagnostics({\n stage: \"config_fetch_attempt\",\n configFetchStartedAt,\n configFetchAttempts: attempt,\n configFetchStatus: attempt === 1 ? \"loading\" : state.load.configFetchStatus,\n });\n },\n onSlow: ({ attempt, elapsedMs }) => {\n updateLoadDiagnostics({\n stage: \"config_fetch_slow\",\n configFetchStartedAt,\n configFetchAttempts: attempt,\n configFetchMs: Date.now() - configFetchStartedAt,\n configFetchStatus: \"slow\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"init\", `Config fetch attempt ${attempt} is slow after ${elapsedMs}ms`);\n },\n onAttemptEnd: (info) => {\n updateLoadDiagnostics({\n stage: \"config_fetch_attempt_complete\",\n configFetchStartedAt,\n configFetchAttempts: info.attempt,\n configFetchMs: Date.now() - configFetchStartedAt,\n configFetchStatus: info.timedOut ? \"timeout\" : state.load.configFetchStatus,\n configFetchStatusCode: info.status,\n configFetchError: info.error,\n });\n },\n })\n .then((res) => {\n if (!res.ok) throw new Error(\"Failed to fetch config: \" + res.status);\n return res.json();\n })\n .then(async (data: {\n experiments?: Experiment[];\n exclusionGroups?: ExclusionGroupConfig[];\n profile?: InitConfig[\"profile\"];\n runtime?: unknown;\n signals?: RuntimeSignalDefinition[];\n commerce?: InitConfig[\"commerce\"];\n geo?: { country?: string };\n }) => {\n const verifiedHandover = await handoverPromise;\n const configFetchCompletedAt = Date.now();\n updateLoadDiagnostics({\n stage: \"config_fetch_complete\",\n configFetchStartedAt,\n configFetchCompletedAt,\n configFetchMs: configFetchCompletedAt - configFetchStartedAt,\n configFetchStatus: \"ok\",\n });\n const experiments = data.experiments ?? [];\n const exclusionGroups = Array.isArray(data.exclusionGroups)\n ? data.exclusionGroups\n : undefined;\n const profile = data.profile;\n const runtime = data.runtime;\n const signals = Array.isArray(data.signals) ? data.signals : config.signals;\n // Omission is authoritative: it represents an empty commerce plane and\n // must clear any cached/active treatment rather than inherit init input.\n const commerce = data.commerce;\n const geo = data.geo;\n const countryChanged = Boolean(\n geo?.country && getStoredSignals({ markVisitorSeen: false })[\"geo.country\"] !== geo.country,\n );\n if (geo?.country) setRuntimeSignal(\"geo.country\", geo.country, \"edge\");\n const configWithRuntime = {\n ...withRuntimeSettings(config, runtime, profile),\n exclusionGroups,\n signals,\n commerce,\n };\n const runtimeConsentRequired = resolveConsentRequired(configWithRuntime);\n const runtimeStorageAllowed = storageAllowed(\n runtimeConsentRequired,\n resolveConsentGranted(configWithRuntime, runtimeConsentRequired),\n doNotTrackEnabled(configWithRuntime),\n );\n if (useConfigCache && runtimeStorageAllowed) {\n writeCachedExperiments(\n config.shopId!,\n experiments,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n environmentKey,\n );\n }\n const incomingHash = hashConfigPayload(\n experiments,\n exclusionGroups,\n profile,\n runtime,\n signals,\n commerce,\n );\n const cacheUnchanged = cached && cached.hash && cached.hash === incomingHash && !countryChanged;\n if (cacheUnchanged && !verifiedHandover) {\n // The cached apply may still be gated behind hydration; revealing\n // now would undo the anti-flicker kept for exactly that window.\n // The gated applyAssignments() reveals when it runs.\n if (!state.pendingInitialApply) removeAntiFlicker();\n return;\n }\n const lateConfigPolicy = ((qaMode || screenshotMode) && serializedForceMap)\n ? \"apply\"\n : config.lateConfigPolicy ?? \"skip\";\n const arrivedAfterReveal = hardRevealDeadline !== null && configFetchCompletedAt > hardRevealDeadline;\n if (arrivedAfterReveal && lateConfigPolicy === \"skip\") {\n const elapsedMs = configFetchCompletedAt - configFetchStartedAt;\n updateLoadDiagnostics({\n stage: \"late_config_skip\",\n configFetchStartedAt,\n configFetchCompletedAt,\n configFetchMs: elapsedMs,\n configFetchStatus: \"ok\",\n });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"init\", \"late_config_skip\", { elapsedMs });\n removeAntiFlicker();\n return;\n }\n // Remove the initial barrier before re-init. Preserve the configured\n // mode so fetched non-commerce mutations get the same scoped hiding as\n // inline mutations; commerce modules can add selectors to that scope.\n removeAntiFlicker();\n initWithExperiments(\n configWithRuntime,\n experiments,\n \"network\",\n cached ? createInitPerfContext() : perfContext,\n verifiedHandover,\n );\n })\n .catch((err) => {\n const configFetchCompletedAt = Date.now();\n const error = err instanceof Error ? err.message : String(err);\n updateLoadDiagnostics({\n stage: \"config_fetch_failed\",\n configFetchStartedAt,\n configFetchCompletedAt,\n configFetchMs: configFetchCompletedAt - configFetchStartedAt,\n configFetchStatus: state.load.configFetchStatus === \"timeout\" ? \"timeout\" : \"failed\",\n configFetchError: error,\n });\n if (typeof console !== \"undefined\") {\n console.error(\"[drip] Failed to fetch experiments:\", err);\n }\n sendRuntimePerfNow(config, {\n assignment_ready_ms: 0,\n blank_screen_ms: getBlankScreenMs(),\n platform: resolvePlatform(config),\n config_source: cached ? \"cache\" : \"none\",\n config_fetch_status: state.load.configFetchStatus,\n config_fetch_ms: state.load.configFetchMs,\n config_fetch_attempts: state.load.configFetchAttempts,\n config_fetch_error: error,\n activation_mode: resolveActivationMode(config),\n delivery_state: typeof config.deliveryState === \"string\" ? config.deliveryState : undefined,\n script_cache_source: typeof config.scriptCacheSource === \"string\" ? config.scriptCacheSource : undefined,\n }, earlyUserId);\n // A cached treatment can still be waiting behind hydration. Keep its\n // barrier on fetch failure; the gated apply reveals when it completes.\n if (!state.pendingInitialApply) removeAntiFlicker();\n });\n\n return []; // Assignments will be applied async\n }\n\n // No experiments and no shopId – just initialize tracker\n return initWithExperiments(config, [], \"none\", perfContext);\n}\n\nexport function track(\n type: string,\n data?: Record<string, unknown>,\n experimentId?: string,\n variationId?: string,\n): void {\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (state.pendingInitialApply) {\n // A held SPA route still has the previous route's assignments in state.\n // Replay every event after the gate, even when the tracker is already\n // running, so attribution and goal evaluation use the refreshed route.\n void state.pendingInitialApply.then(() => {\n track(type, data, experimentId, variationId);\n });\n return;\n }\n captureEventPropertySignals(type, data);\n startAnalyticsIfReady();\n if (!state.tracker) {\n return;\n }\n const activeAssignment = state.assignments.length > 0 ? state.assignments[0] : null;\n const resolvedExperimentId = experimentId ?? activeAssignment?.experimentId;\n const resolvedVariationId = variationId ?? activeAssignment?.variationId;\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"track\", `${type}`, { experimentId: resolvedExperimentId, variationId: resolvedVariationId, data });\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"track\", `${type}`, { experimentId: resolvedExperimentId, variationId: resolvedVariationId, ...data });\n const event: TrackEvent = {\n type,\n data: withAssignmentEpochData(data, resolvedExperimentId, resolvedVariationId),\n url: cleanUrl(),\n experimentId: resolvedExperimentId,\n variationId: resolvedVariationId,\n };\n state.tracker.track(event);\n if (type !== \"goal\" && state.config) {\n triggerGoalsForEvent(type, state.assignments, state.config.experiments ?? [], data);\n }\n}\n\nfunction funnelStepStorageKey(stepName: string): string {\n const path =\n typeof location !== \"undefined\"\n ? `${location.origin ?? \"\"}${location.pathname ?? \"\"}`\n : \"unknown\";\n return `drip:funnel_step:${path}:${stepName}`.slice(0, 240);\n}\n\nfunction shouldTrackFunnelStep(stepName: string, oncePerSession: boolean): boolean {\n if (!oncePerSession || typeof sessionStorage === \"undefined\") return true;\n const key = funnelStepStorageKey(stepName);\n try {\n if (sessionStorage.getItem(key) === \"1\") return false;\n sessionStorage.setItem(key, \"1\");\n } catch {\n return true;\n }\n return true;\n}\n\n/**\n * Track a virtual funnel step that has no reliable browser event by default,\n * such as a postcode form submit, embedded quiz step, or third-party handoff.\n */\nexport function trackStep(name: string, data?: Record<string, unknown>): void {\n const stepName = name.trim().slice(0, 160);\n if (!stepName) return;\n if (state.screenshotMode || trackingBlocked()) return;\n if (state.pendingInitialApply) {\n // Virtual funnel steps can fire from data layers before the hydration\n // gate creates the tracker. Replay after apply so the step is preserved\n // and attributed to the refreshed assignment set.\n void state.pendingInitialApply.then(() => {\n trackStep(stepName, data);\n });\n return;\n }\n if (!state.tracker) return;\n const oncePerSession = data?.oncePerSession !== false;\n if (!shouldTrackFunnelStep(stepName, oncePerSession)) return;\n const payload = { ...(data ?? {}) };\n delete payload.oncePerSession;\n track(\"funnel_step\", {\n ...payload,\n source: \"virtual_step\",\n step_name: stepName,\n path: typeof location !== \"undefined\" ? location.pathname : undefined,\n });\n}\n\nexport function trackGoal(goalId: string, data?: Record<string, unknown>): void {\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (!state.config) return;\n if (state.pendingInitialApply) {\n // Goal wiring is installed after the gated initial apply; firing now\n // would be a silent no-op. Replay once the gate opens, like track().\n void state.pendingInitialApply.then(() => {\n trackGoal(goalId, data);\n });\n return;\n }\n __DRIP_FEATURE_DEVTOOLS__ && debugLog(\"goal\", `Triggering goal: ${goalId}`, data);\n __DRIP_FEATURE_DEVTOOLS__ && dtLog(\"goal\", `Goal: ${goalId}`, data as Record<string, unknown> | undefined);\n triggerGoal(goalId, state.assignments, state.config.experiments ?? [], data);\n}\n\nexport function setConsent(granted: boolean): void {\n state.consentGranted = Boolean(granted);\n writeConsentCookie(state.consentGranted);\n if (!state.consentGranted) {\n clearConsentStorage();\n }\n\n if (!state.config) return;\n applyConsentStorageMode();\n recheckPrerequisites();\n if (state.consentGranted) {\n syncActiveAssignmentToShopifyCart();\n scheduleShopifyAssignmentSync();\n }\n}\n\nexport function hold(): number {\n return holdMutations();\n}\n\nexport function release(): number {\n return releaseMutations();\n}\n\nexport function hydrated(): void {\n signalHydrated();\n}\n\nexport function recheckPrerequisites(): void {\n if (!state.config) return;\n const experiments = state.config.experiments ?? [];\n const emptyProjectFastPath = state.config.runtimeProfile === \"empty_project\"\n && state.perfFlags.perf_empty_project_v1;\n state.trackingPrerequisiteMet = emptyProjectFastPath || trackingAllowed(state.config);\n if (!emptyProjectFastPath) updateProjectActivationDiagnostics(state.config);\n reevaluateAssignments(\"prerequisite\");\n\n if (trackingBlocked() || !state.trackingPrerequisiteMet) {\n stopAnalyticsStage();\n return;\n }\n\n if (state.trackingStart === \"idle\") {\n scheduleAnalyticsStart(state.config, experiments);\n } else {\n startAnalyticsStage(state.config, experiments);\n }\n}\n\nexport function reInit(forceReapply = false): Assignment[] {\n const assignments = reevaluateAssignments(\"manual\", forceReapply);\n state.orderIdentityDetectionUrl = \"\";\n state.orderIdentityDetection = undefined;\n if (state.config) scheduleOrderIdentityBeacon(state.config);\n return assignments;\n}\n\n/**\n * Track a revenue/purchase event. Convenience method that fires a \"purchase\" event\n * with revenue data for all active experiments.\n *\n * Usage: drip.trackRevenue(49.99) or drip.trackRevenue(49.99, { orderId: \"123\", currency: \"EUR\" })\n */\nexport type RevenueEventData = Record<string, unknown> & { currency?: string };\n\nfunction normalizeRevenueCurrency(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const currency = value.trim().toUpperCase();\n return /^[A-Z]{3}$/.test(currency) ? currency : undefined;\n}\n\nexport function trackRevenue(revenue: number, data?: RevenueEventData): void {\n if (typeof revenue !== \"number\" || !Number.isFinite(revenue) || revenue < 0) {\n if (typeof console !== \"undefined\") {\n console.warn(\"[drip] trackRevenue ignored invalid revenue; expected a finite, non-negative number\");\n }\n return;\n }\n if (state.screenshotMode) return;\n if (trackingBlocked()) return;\n if (state.pendingInitialApply) {\n // Initial and route hydration gates defer tracker creation/assignment\n // refresh. Replay purchases after the gate so early checkout data-layer\n // events are not dropped or attributed to stale assignments.\n void state.pendingInitialApply.then(() => {\n trackRevenue(revenue, data);\n });\n return;\n }\n if (!state.tracker) return;\n const eventData = { ...data, revenue };\n if (data && \"currency\" in data) {\n const currency = normalizeRevenueCurrency(data.currency);\n if (currency) {\n eventData.currency = currency;\n } else {\n delete eventData.currency;\n }\n }\n // Fire for each active experiment assignment\n for (const a of state.assignments) {\n track(\"goal\", { ...eventData, goalId: \"__revenue__\" }, a.experimentId, a.variationId);\n }\n}\n\nexport function flush(): Promise<void> {\n if (state.screenshotMode) return Promise.resolve();\n const pendingApply = state.pendingInitialApply;\n if (pendingApply) {\n // Deferred public tracking callbacks are registered before the caller's\n // flush(). Wait for the gate, then recurse so every replayed event has\n // entered the tracker queue before the returned promise resolves.\n return pendingApply.then(() => flush());\n }\n startAnalyticsIfReady();\n return state.tracker ? state.tracker.flush() : Promise.resolve();\n}\n\nexport function getAssignments(): Assignment[] {\n return state.assignments;\n}\n\nexport function getCartAttributes(): CartAttributeEntry[] {\n const input = buildActiveCartAttributeSyncInput();\n return input ? buildCartAttributeEntries(input) : [];\n}\n\nfunction normalizedHeadlessCartToken(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const withoutQuery = value.trim().split(\"?\", 1)[0] ?? \"\";\n const token = withoutQuery.startsWith(\"gid://shopify/Cart/\")\n ? withoutQuery.slice(\"gid://shopify/Cart/\".length)\n : withoutQuery;\n return token.length > 0 && token.length <= 4096 ? token : null;\n}\n\n/**\n * Build cart attributes for a headless Shopify Storefront API cart.\n *\n * Integrator contract: pass the cart's full Storefront Cart GID (including its\n * `?key=` secret), write every returned entry to that same cart, and verify the\n * Storefront API mutation succeeded with no `userErrors`. Only then call\n * {@link confirmCartAttributesWritten} with the same Cart GID. Returning signed\n * attributes does not authorize treatment display or exposure by itself. An\n * empty result is fail-closed and must not be replaced with unsigned attributes.\n * Theme storefronts use the SDK-managed `/cart/update.js` path and do not call\n * either headless API.\n */\nexport async function getSignedCartAttributes(\n cartToken?: string,\n): Promise<CartAttributeEntry[]> {\n const requiresCohortPin = requiresCommerceCohortPin();\n const input = buildActiveCartAttributeSyncInput(requiresCohortPin);\n if (!input) return [];\n const headless = ensureHeadlessCartAuthorizationState();\n const generation = ++headless.generation;\n // A public headless write takes ownership from any SDK-managed theme sync\n // that was still resolving when the integrator selected this cart.\n shopifyCartSyncGeneration += 1;\n headless.confirmationPending = requiresCohortPin;\n headless.pending = null;\n if (requiresCohortPin) {\n state.authorizedPriceAssignmentKeys?.clear();\n state.authorizedShippingAssignmentKeys?.clear();\n // A headless generation for a (possibly different) cart revokes the\n // previous cart's offer grant and retires its rendered treatment — cart\n // B was never stamped, so keeping cart A's offer DOM would show an offer\n // Shopify will not charge if B's authorization or write fails.\n revokeOffersDisplayAuthorization();\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"pending\",\n assignmentCount: state.assignments.length,\n };\n cleanupCommercePrice();\n cleanupCommerceShipping();\n }\n let priceAssignments: CartAssignment[] = [];\n let shippingAssignments: CartAssignment[] = [];\n let offersAssignments: CartAssignment[] = [];\n let offersAdoptionAssignments: CartAssignment[] | null = null;\n const entries = await buildSignedCartAttributeEntries({\n ...input,\n cartToken,\n authorizePriceDisplayAssignments: (assignments) => {\n priceAssignments = assignments;\n },\n authorizeShippingDisplayAssignments: (assignments) => {\n shippingAssignments = assignments;\n },\n authorizeOffersDisplayAssignments: (assignments) => {\n offersAssignments = assignments;\n },\n stageOffersAdoptionAssignments: (assignments) => {\n offersAdoptionAssignments = assignments;\n },\n });\n if (generation !== headless.generation) return [];\n const normalizedCartToken = normalizedHeadlessCartToken(cartToken);\n if (entries.length === 0 && requiresCohortPin) {\n headless.confirmationPending = false;\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"failed\",\n reason: \"authorization_failed\",\n assignmentCount: state.assignments.length,\n };\n applyCommercePrice(\n state.config?.commerce?.price,\n withCommercePriceAssignments(),\n isCohortStampedOnCart,\n undefined,\n isPriceDisplayAssignmentAuthorized,\n );\n applyCommerceShipping(\n state.config?.commerce?.shipping,\n state.assignments.filter(isShippingDisplayAssignmentAuthorized),\n trackViewedAssignmentsAfterShippingEligibility,\n );\n return [];\n }\n if (entries.length > 0 && requiresCohortPin && normalizedCartToken) {\n headless.pending = {\n generation,\n cartToken: normalizedCartToken,\n priceAssignments,\n shippingAssignments,\n offersAssignments,\n offersAdoptionAssignments,\n };\n // Authorization/adoption may rebuild commerce render state while the proof\n // request resolves; keep the generated-but-unacknowledged state published.\n applyCommercePrice(\n state.config?.commerce?.price,\n withCommercePriceAssignments(),\n isCohortStampedOnCart,\n undefined,\n isPriceDisplayAssignmentAuthorized,\n );\n applyCommerceShipping(\n state.config?.commerce?.shipping,\n state.assignments.filter(isShippingDisplayAssignmentAuthorized),\n trackViewedAssignmentsAfterShippingEligibility,\n );\n }\n return entries;\n}\n\n/**\n * Acknowledge that the latest signed headless cart attributes were persisted.\n *\n * Call this only after the Storefront API cart-attributes mutation succeeded\n * and returned no `userErrors`. The Cart GID must match the one passed to the\n * latest {@link getSignedCartAttributes} call. Stale-generation, mismatched,\n * or repeated acknowledgements are no-ops and cannot grant or change display\n * and exposure authorization. When a staged offer adoption can no longer\n * apply, the acknowledgement is rejected (`false`) with retryable pending\n * state and no authorization is granted.\n *\n * @returns `true` only when the latest matching acknowledgement was accepted.\n */\nexport function confirmCartAttributesWritten(cartToken?: string): boolean {\n const normalizedCartToken = normalizedHeadlessCartToken(cartToken);\n const headless = headlessCartAuthorizationState;\n const pending = headless?.pending;\n if (\n !normalizedCartToken ||\n !headless ||\n !pending ||\n pending.generation !== headless.generation ||\n pending.cartToken !== normalizedCartToken\n ) return false;\n\n // The integrator has confirmed the stamped cart write — only now may a\n // staged offers adoption reach display, persistence, and tracking. When the\n // adoption can no longer apply (config changed between generation and\n // acknowledgement), keep the pending state retryable, withhold every\n // authorization grant, and tell the integrator the acknowledgement was NOT\n // accepted so stale local assignments cannot be exposed as confirmed.\n if (\n pending.offersAdoptionAssignments &&\n !adoptAuthoritativeOffersAssignments(pending.offersAdoptionAssignments)\n ) {\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"failed\",\n reason: \"offers_adoption_failed\",\n assignmentCount: state.assignments.length,\n };\n return false;\n }\n headless.pending = null;\n headless.confirmationPending = false;\n state.authorizedPriceAssignmentKeys = new Set(\n pending.priceAssignments.map(priceAssignmentAuthorizationKey),\n );\n state.authorizedShippingAssignmentKeys = new Set(\n pending.shippingAssignments.map(priceAssignmentAuthorizationKey),\n );\n // Same render path as the theme flow: withheld offer companion DOM must\n // appear once the integrator's write is acknowledged, or exposure could\n // record a treatment whose DOM never rendered while Shopify charges it.\n authorizeOffersDisplayAndRender(pending.offersAssignments);\n state.lastShopifyCartSync = {\n at: Date.now(),\n status: \"sent\",\n assignmentCount: state.assignments.length,\n };\n applyCommercePrice(\n state.config?.commerce?.price,\n withCommercePriceAssignments(),\n isCohortStampedOnCart,\n undefined,\n isPriceDisplayAssignmentAuthorized,\n );\n applyCommerceShipping(\n state.config?.commerce?.shipping,\n state.assignments.filter(isShippingDisplayAssignmentAuthorized),\n trackViewedAssignmentsAfterShippingEligibility,\n );\n if (state.analyticsStarted && state.config && !trackingBlocked()) {\n trackViewedAssignments(state.config);\n }\n return true;\n}\n\nexport function getExperiments(): Experiment[] {\n return state.config?.experiments ?? [];\n}\n\nfunction getGoals(): Goal[] {\n const seen = new Set<string>();\n const goals: Goal[] = [];\n for (const experiment of getExperiments()) {\n for (const goal of experiment.goals ?? []) {\n if (seen.has(goal.id)) continue;\n seen.add(goal.id);\n goals.push(goal);\n }\n }\n return goals;\n}\n\nfunction getActiveExperimentIds(): Record<string, string> {\n const ids: Record<string, string> = {};\n for (const assignment of state.assignments) {\n ids[assignment.experimentId] = assignment.variationId;\n }\n return ids;\n}\n\nexport function getRuntimeValue(key: string): unknown {\n switch (key) {\n case \"tools\":\n return getRuntimeTools();\n case \"experiments\":\n return getExperiments();\n case \"goals\":\n return getGoals();\n case \"assignments\":\n return getAssignments();\n case \"activeAssignments\":\n return getAssignments();\n case \"activeExperimentIds\":\n return getActiveExperimentIds();\n case \"orderAttribution\":\n // Same consent chokepoint as the order-identity beacon: while tracking\n // is blocked, no identity or assignments leave the SDK on any surface.\n if (state.screenshotMode || trackingBlocked()) {\n return { visitorId: \"\", assignments: [] };\n }\n return {\n visitorId: state.userId ?? \"\",\n assignments: mergedOrderIdentityAssignments(),\n };\n case \"signals\":\n return getPublicSignals({ markVisitorSeen: false });\n case \"diagnostics\":\n return getDiagnostics();\n case \"data\":\n return {\n initialized: Boolean(state.config),\n shopId: state.config?.shopId ?? null,\n experimentsLoaded: state.config?.experiments?.length ?? 0,\n };\n default:\n return undefined;\n }\n}\n\nexport function getRuntimeTools(): ApexRuntimeTools {\n return createApexRuntimeTools({\n document: typeof document !== \"undefined\" ? document : undefined,\n window: typeof window !== \"undefined\" ? window : undefined,\n location: typeof location !== \"undefined\" ? location : undefined,\n track,\n trackGoal,\n signal: setPublicSignal,\n reInit,\n get: getRuntimeValue,\n });\n}\n\nfunction buildFlagContext(\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n) {\n const url = context?.url ?? (typeof location !== \"undefined\" ? location.href : \"\");\n return {\n url,\n attributes: buildTargetingAttributes(\n { ...(state.config?.attributes ?? {}), ...(context?.attributes ?? {}) },\n url,\n { persistSignals: persistentStorageAllowed() },\n ),\n userId: context?.userId ?? state.userId ?? undefined,\n };\n}\n\nexport function evaluateFlag(\n flagId: string,\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n): boolean {\n return evaluateFlagFromExperiments(flagId, getExperiments(), buildFlagContext(context));\n}\n\nexport function evaluateFlagAssignment(\n flagId: string,\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n): Assignment | null {\n return evaluateFlagAssignmentFromExperiments(\n flagId,\n getExperiments(),\n buildFlagContext(context),\n );\n}\n\nexport function evaluateFlagValue<T = unknown>(\n flagId: string,\n fallback?: T,\n context?: { url?: string; attributes?: Record<string, unknown>; userId?: string },\n): T | unknown {\n return evaluateFlagValueFromExperiments(\n flagId,\n getExperiments(),\n buildFlagContext(context),\n fallback,\n );\n}\n\nexport function getDiagnostics(): SdkDiagnostics {\n const config = state.config;\n const runtimeConfig = state.runtimeConfig;\n const storageMode = config?.dataProtection?.storageMode ?? \"localStorage\";\n const signalDiagnostics = getSignalDiagnostics({ markVisitorSeen: persistentStorageAllowed() });\n const diagnostics: SdkDiagnostics = {\n mode: \"public\",\n initialized: Boolean(config),\n shopId: config?.shopId ?? null,\n userIdPresent: Boolean(state.userId),\n assignments: state.assignments.map((assignment) => {\n const kind =\n assignment.kind ??\n (assignment.personalization\n ? \"personalization\"\n : assignment.featureFlag\n ? \"feature_flag\"\n : \"experiment\");\n return {\n experimentId: assignment.experimentId,\n variationId: assignment.variationId,\n kind,\n isControl: assignment.isControl,\n mutationCount: assignment.mutations.length,\n featureFlagKey: assignment.featureFlag?.key,\n personalizationKey: assignment.personalization?.key,\n personalizationRuleId: assignment.personalization?.ruleId,\n personalizationExperienceId: assignment.personalization?.experienceId,\n personalizationSurface: assignment.personalization?.surface,\n personalizationTemplateKey: assignment.personalization?.templateKey,\n personalizationPriority: assignment.personalization?.priority,\n personalizationStopAfterMatch: assignment.personalization?.stopAfterMatch,\n value: assignment.value,\n };\n }),\n experimentsLoaded: config?.experiments?.length ?? 0,\n analyticsStarted: state.analyticsStarted,\n trackerStarted: Boolean(state.tracker),\n activation: state.activationDiagnostics,\n qaMode: state.qaMode,\n qaSessionId: state.qaSessionId,\n screenshotMode: state.screenshotMode,\n configSource: state.configSource,\n load: { ...state.load },\n platform: state.platform,\n routerMode: state.routerMode,\n activationMode: state.activationMode,\n storage: {\n mode: storageMode,\n localStorageAvailable: storageAvailable(\"localStorage\"),\n sessionStorageAvailable: storageAvailable(\"sessionStorage\"),\n cookiesEnabled: typeof navigator !== \"undefined\" ? navigator.cookieEnabled !== false : false,\n },\n runtime: {\n antiFlickerMode: runtimeConfig?.antiFlickerMode,\n antiFlickerTimeoutMs: runtimeConfig?.antiFlickerTimeoutMs,\n trackingStart: runtimeConfig?.trackingStart,\n pageTriggerMode: state.pageTriggerMode,\n customJsPolicy: runtimeConfig?.customJsPolicy,\n externalHandoverDomains: config?.externalTracking?.domains ?? [],\n handoverQueryParam: config?.externalTracking?.handoverQueryParam ?? \"drip_bucket\",\n handoverMintTimeoutMs: config?.externalTracking?.handoverMintTimeoutMs,\n runtimeDisabled: config?.runtimeControl?.disabled === true,\n runtimeDisabledAt: config?.runtimeControl?.disabledAt,\n },\n spa: {\n lastUrl: state.lastUrl,\n lastRouteChange: state.lastRouteChange ?? undefined,\n lastDataLayerTrigger: state.lastDataLayerTrigger ?? undefined,\n lastShopifyAssignmentSync: state.lastShopifyAssignmentSync ?? undefined,\n lastShopifyCartSync: state.lastShopifyCartSync ?? undefined,\n },\n signals: {\n values: signalDiagnostics.values,\n sources: signalDiagnostics.sources,\n },\n integrations: {\n exposureDestinations: state.exposureDestinationDiagnostics,\n },\n };\n\n if (isDebugEnabled()) {\n diagnostics.mode = \"debug\";\n diagnostics.trackingBlocked = trackingBlocked();\n diagnostics.trackingDisabledByDnt = state.trackingDisabledByDnt;\n diagnostics.trackingPrerequisiteMet = state.trackingPrerequisiteMet;\n diagnostics.consentRequired = state.consentRequired;\n diagnostics.consentGranted = state.consentGranted;\n diagnostics.consentModeEnabled = state.consentModeEnabled;\n }\n\n return diagnostics;\n}\n\n// --- Command queue ---\ntype QueueCommand =\n | { type: \"trackGoal\"; goalId: string; data?: Record<string, unknown> }\n | { type: \"trackRevenue\"; revenue: number; data?: RevenueEventData }\n | { type: \"track\"; event: string; data?: Record<string, unknown> }\n | { type: \"step\"; name: string; data?: Record<string, unknown> }\n | { type: \"signal\"; key: string; value: unknown; ttlDays?: number }\n | { type: \"triggerPage\"; apiName: string; active?: unknown }\n | { type: \"rememberProduct\"; product: Parameters<typeof rememberProduct>[0]; ttlDays?: number }\n | { type: \"setCart\"; itemCount?: number; productIds?: string[]; ttlDays?: number }\n | { type: \"setSearch\"; query: string; ttlDays?: number }\n | { type: \"setConsent\"; granted: boolean }\n | { type: \"hold\" }\n | { type: \"release\" }\n | { type: \"hydrated\" }\n | { type: \"reInit\"; force?: boolean }\n | { type: \"recheckPrerequisites\" }\n | { type: \"init\"; config: InitConfig };\n\nfunction processCommand(cmd: QueueCommand): void {\n switch (cmd.type) {\n case \"init\":\n init(cmd.config);\n break;\n case \"track\":\n track(cmd.event, cmd.data);\n break;\n case \"step\":\n trackStep(cmd.name, cmd.data);\n break;\n case \"trackGoal\":\n trackGoal(cmd.goalId, cmd.data);\n break;\n case \"trackRevenue\":\n trackRevenue(cmd.revenue, cmd.data);\n break;\n case \"signal\":\n setPublicSignal(cmd.key, cmd.value, cmd.ttlDays);\n break;\n case \"triggerPage\":\n triggerPage(cmd.apiName, cmd.active);\n break;\n case \"rememberProduct\":\n rememberProduct(cmd.product, cmd.ttlDays);\n break;\n case \"setCart\":\n setCartSignals({ itemCount: cmd.itemCount, productIds: cmd.productIds }, cmd.ttlDays);\n break;\n case \"setSearch\":\n setSearchSignal(cmd.query, cmd.ttlDays);\n break;\n case \"setConsent\":\n setConsent(cmd.granted);\n break;\n case \"hold\":\n hold();\n break;\n case \"release\":\n release();\n break;\n case \"hydrated\":\n hydrated();\n break;\n case \"reInit\":\n reInit(cmd.force === true);\n break;\n case \"recheckPrerequisites\":\n recheckPrerequisites();\n break;\n }\n}\n\nfunction processQueue(): void {\n const w = globalThis as Record<string, unknown>;\n const pending = w.drip;\n if (Array.isArray(pending)) {\n for (const cmd of pending) {\n processCommand(cmd as QueueCommand);\n }\n }\n // Replace array with API object\n const api = Object.assign((command: string) => {\n if (command === \"hold\") return hold();\n if (command === \"release\") return release();\n if (command === \"hydrated\") return hydrated();\n __DRIP_FEATURE_DEVTOOLS__ && debugWarn(\"api\", `Unknown command: ${command}`);\n }, {\n init,\n track,\n step: trackStep,\n trackGoal,\n trackRevenue,\n setConsent,\n hold,\n release,\n hydrated,\n reInit,\n recheckPrerequisites,\n flush,\n evaluate,\n evaluateFlag,\n evaluateFlagAssignment,\n evaluateFlagValue,\n signal: setPublicSignal,\n triggerPage,\n rememberProduct,\n setCart: setCartSignals,\n setSearch: setSearchSignal,\n getSignals: getPublicSignals,\n getAssignments,\n getCartAttributes,\n getSignedCartAttributes,\n confirmCartAttributesWritten,\n getExperiments,\n getTools: getRuntimeTools,\n get: getRuntimeValue,\n getDiagnostics,\n getPendingGiftChoices,\n selectGiftOption,\n push(cmd: QueueCommand) {\n processCommand(cmd);\n },\n });\n w.drip = api;\n w.Apex = api;\n w.apexTools = getRuntimeTools();\n}\n\n// Auto-process on load\nprocessQueue();\n\nexport { defineExperiment, defineExperiments } from \"./define\";\nexport { defineFlagExperiment } from \"./flags\";\nexport {\n getSignals,\n rememberProduct,\n setCartSignals,\n setSearchSignal,\n setSignal,\n} from \"./signals\";\nexport { createApexRuntimeTools } from \"./runtime-tools\";\n\nexport const __test = {\n fetchWithTimeout,\n fetchWithRetry,\n getConfigCacheKey,\n installPageTriggerRule,\n normalizePageApiName,\n triggerPage,\n withRuntimeSettings,\n};\n\nexport type {\n ActivationMode,\n AntiFlickerMode,\n Assignment,\n ConfigProfile,\n ConsentModeSettings,\n CustomJsPolicy,\n ExecutionMode,\n Experiment,\n ExclusionGroupConfig,\n ExclusionGroupMemberConfig,\n Goal,\n InitConfig,\n PageTriggerMode,\n PageTriggerSettings,\n PerfFeatureFlag,\n PerfFeatureFlags,\n PlatformHint,\n RouterMode,\n TrackEvent,\n TrackingStart,\n Variation,\n DebugSettings,\n ProjectPrerequisites,\n SpaSettings,\n ExternalTrackingSettings,\n ProjectCodeSettings,\n RuntimeEnvironmentSettings,\n SdkDiagnostics,\n BucketingCleanupSettings,\n DataProtectionSettings,\n};\n\nexport type { ExperimentDefinition, VariationDefinition, GoalDefinition } from \"./define\";\nexport type { FlagDefinition, FlagContext } from \"./flags\";\nexport type { CartAttributeEntry } from \"./shopify-cart\";\nexport type {\n ApexRuntimeTools,\n DataLayerOptions,\n DomChangedOptions,\n ElementInViewOptions,\n WaitForElementOptions,\n} from \"./runtime-tools\";\n"],"mappings":"uSA2FO,SAASA,IACd,OAAOC,SAASC,OAASD,SAASE,QACpC,CAGO,SAASC,EAAYC,GAC1BC,EAAgBC,KAAKC,MACrBC,EAAiB,EAGZC,IACHC,EAzDJ,WACE,IAAMC,EAAMC,SAASF,SACrB,IAAKC,EAAK,MAAO,WACjB,IACE,IAAME,EAAO,IAAIC,IAAIH,GAAKI,SAC1B,OAAIF,IAASb,SAASe,SAAiB,aAChCF,CACT,OACE,MAAO,UACT,CACF,CA+CeG,GACXC,EArFJ,WACE,IAAMC,EAAM,WACZ,IACE,IAAMC,EAASC,eAAeC,QAAQH,GACtC,GAAIC,EAAQ,OAAOG,KAAKC,MAAMJ,EAChC,OAAS,CACT,IAAMK,EAAS,IAAIC,gBAAgBzB,SAAS0B,QACtCC,EAA+B,CAAC,EACtC,QAAWC,IAAK,CACd,aACA,aACA,eACA,WACA,eACC,CACD,IAAMC,EAAIL,EAAOM,IAAIF,GACjBC,IAAGF,EAAKC,GAAKC,EACnB,CACA,GAAIE,OAAOC,KAAKL,GAAMM,OACpB,IACEb,eAAec,QAAQhB,EAAKI,KAAKa,UAAUR,GAC7C,OAAS,CAEX,OAAOA,CACT,CA6DgBS,GACZ3B,GAAc,GAIZ4B,IACFA,IACAA,EAAgB,MAElBA,EAtDF,WACE,IAAMC,EAAU,KAEd,IAAK1B,SAAS2B,KAAM,OACpB,IAAMC,EAAYC,KAAKC,IACrB9B,SAAS2B,KAAKI,aACd/B,SAASgC,gBAAgBD,cAErBE,EAAiBC,OAAOC,YAC9B,GAAIP,GAAaK,EAEf,YADArC,EAAiB,KAGnB,IAAMwC,EAAMP,KAAKQ,OAAQH,OAAOI,QAAUL,GAAkBL,EAAa,KACrEQ,EAAMxC,IAAgBA,EAAiBwC,IAE7CF,OAAOK,iBAAiB,SAAUb,EAAS,CAAEc,SAAS,IACtD,IAAIC,EAAgC,KACpC,OAAIzC,SAAS2B,KACXD,KAEAe,EAAW,IAAMf,IACjB1B,SAASuC,iBAAiB,mBAAoBE,EAAU,CAAEC,MAAM,KAE3D,KACLR,OAAOS,oBAAoB,SAAUjB,GAGjCe,GAAUzC,SAAS2C,oBAAoB,mBAAoBF,GAEnE,CAwBkBG,GAGhB,IAAMC,EAAgC,CACpC/C,WACAgD,KAAM1D,SAASE,SACfyD,MAAO/C,SAAS+C,OAGlB,QAAY/B,EAAGC,KAAME,OAAO6B,QAAQ3C,GAC9BY,IAAG4B,EAAK7B,GAAKC,GAEnBzB,EAAQ,WAAYqD,EACtB,CAGO,SAASI,EAAWzD,GACzB,IAAKC,EAAe,OACpB,IAAMyD,EAAWrB,KAAKQ,OAAO3C,KAAKC,MAAQF,GAAiB,KAEvDgC,IACFA,IACAA,EAAgB,MAGlBjC,EAAQ,YAAa,CACnB0D,WACAC,aAAcvD,EACdkD,KAAM1D,SAASE,WAGjBG,EAAgB,EAChBG,EAAiB,CACnB,CAjJA,IAUIH,EACAG,EACA6B,EACA3B,EACAO,EACAR,EAfJuD,EAAAC,EAAA,KAUI5D,EAAgB,EAChBG,EAAiB,EACjB6B,EAAqC,KACrC3B,EAAW,GACXO,EAAoC,CAAC,EACrCR,GAAc,ICClB,SAASyD,IACP,cAAWtD,SAAa,MAAgBA,SAASgC,gBAAwB,KAClEhC,QACT,CAEA,SAASuD,IACwB,OAA3BC,IACFC,aAAaD,GACbA,EAAyB,MAEH,OAApBE,IACFD,aAAaC,GACbA,EAAkB,MAEC,OAAjBC,IACFF,aAAaE,GACbA,EAAe,KAEnB,CA4CO,SAASC,EACdC,EAAwB,SACxBC,EAAoB,KACpBC,EACAC,GAEA,IAAMC,EAAgBX,IACtB,IAAKW,EAAe,OACpB,IAAMC,EAAgBD,EAAcE,eAAeC,GAInD,GAAIF,GAAkC,OAAjBP,EAAuB,OAC5C,IAAMU,EAjDD,SACLR,EAAwB,SACxBE,EACAC,GAEA,GAAa,QAATH,EAAgB,OAAO,KAE3B,GAAa,WAATA,EACF,OAAOG,GAAaA,EAAUM,OAASN,EAAY,KAGrD,GAAa,WAATH,EAAmB,CACrB,IAAKE,GAA8C,IAA3BA,EAAgB1C,OACtC,OAAO,KAGT,IAAMkD,EAAeR,EAAgBS,KAAK,KAC1C,OACED,EAAe,uDACOA,EAAe,mGAEzC,CAEA,OAAOE,CACT,CAyBcC,CAAsBb,EAAME,EAAiBC,GACzD,IAAKK,EAAK,OACVd,IACIoB,GAA4BA,IAA6BV,GA1D/D,SAAoCA,GAClCA,EAAcjC,iBAAiB4C,UAAUC,OAAO,UAAW,kBAC3DZ,EAAcE,eAAeC,IAAWS,SACpCF,IAA6BV,IAAeU,EAA2B,KAC7E,CAuDIG,CAA2BH,GAE7BA,EAA2BV,EAE3B,IAAMc,EAAOd,EAAcjC,gBACrBgD,EAAQd,GAAiBD,EAAcgB,cAAc,SAC3DD,EAAME,GAAKd,EAEXY,EAAMG,YAAcd,EACpBU,EAAKH,UAAUC,OAAO,kBACT,SAAThB,EACFkB,EAAKH,UAAUQ,IAAI,WAEnBL,EAAKH,UAAUC,OAAO,WAGnBG,EAAMK,cAAcpB,EAAcqB,MAAQP,GAAMQ,YAAYP,GAGjE,IAAMQ,EAAgB3D,KAAKQ,MAAkB,GAAZyB,GACjCN,EAAyBiC,WAAW,KAClCjC,EAAyB,KAEzBuB,EAAKH,UAAUQ,IAAI,mBAClBI,GAGH9B,EAAkB+B,WAAW,KAC3B/B,EAAkB,KAClBgC,EAAsBzB,IACrBH,EACL,CAEA,SAAS4B,EAAsBzB,GAE7B,GADAV,KACKU,GAAejC,gBAAiB,OACrC,IAAM+C,EAAOd,EAAcjC,gBAC3B+C,EAAKH,UAAUC,OAAO,WACtBE,EAAKH,UAAUQ,IAAI,kBACnB,IAAMO,EAAK1B,EAAcE,eAAeC,GAExCT,EAAe8B,WAAW,KACxB9B,EAAe,KACfgC,GAAId,SACJE,EAAKH,UAAUC,OAAO,kBAClBF,IAA6BV,IAAeU,EAA2B,OAC1E,GACL,CAEO,SAASiB,IACdF,EAAsBf,GAA4BrB,IACpD,CAlJA,IAEMc,EAKAK,EAIFjB,EACAE,EACAC,EACAgB,EAdJkB,EAAAxC,EAAA,KAEMe,EAAW,mBAKXK,EACJ,gHAGEjB,EAA+D,KAC/DE,EAAwD,KACxDC,EAAqD,KACrDgB,EAA4C,OCGhD,SAASmB,EAAgBC,GACvB,OAAOC,OAAOC,SAASF,EAAWD,iBAC9BjE,KAAKC,IAAI,EAAGD,KAAKqE,MAAMH,EAAWD,kBAClC,CACN,CAEA,SAASK,IACP,IACE,OAAOC,WAAWC,cAAc5F,QAAQ6F,IAAgB,IAC1D,OACE,OAAO,IACT,CACF,CAUA,SAASC,IACP,IAEE,IAAMC,GADSJ,WAAWpG,UAAUyG,QAAU,IACzBD,MAAM,IAAIE,OAAO,QAAUC,EAAc,aAC9D,OAAOH,EAAQI,mBAAmBJ,EAAM,IAAM,IAChD,OACE,OAAO,IACT,CACF,CA2BA,SAASK,EAAWC,GAClB,IAAKA,EAAK,MAAO,CAAC,EAClB,IACE,IAAMC,EAASrG,KAAKC,MAAMmG,GAC1B,IAAKC,GAA4B,iBAAXA,GAAuBC,MAAMC,QAAQF,GAAS,MAAO,CAAC,EAC5E,IAAMG,EAAoB,CAAC,EAC3B,QAAYC,EAAcC,KAAUjG,OAAO6B,QAAQ+D,GAEvB,iBAAjBI,IACNH,MAAMC,QAAQG,IACK,iBAAbA,EAAM,IACO,iBAAbA,EAAM,IACO,iBAAbA,EAAM,KAIfF,EAAIC,GAAgB,CAACC,EAAM,GAAIA,EAAM,GAAIA,EAAM,KAEjD,OAAOF,CACT,OACE,MAAO,CAAC,CACV,CACF,CAEA,SAASG,EAAeC,EAAqBC,EAAa,IACxD,IAAMvE,EAAU7B,OAAO6B,QAAQsE,GAC5BE,KAAK,EAAE,CAAEC,IAAK,CAAEC,KAAOA,EAAE,GAAKD,EAAE,IAChCE,MAAM,EAAGJ,GAENK,EAAwB,CAAC,EAC/B,QAAYT,EAAcU,KAAW7E,EACnC4E,EAAQT,GAAgBU,EAE1B,OAAOnH,KAAKa,UAAUqG,EACxB,CAEO,SAASE,IACd,IAAMC,EAAU,IACXlB,EAAWN,QACXM,EAAWV,MAEVe,EAAiD,CAAC,EACxD,QAAYC,GAAea,EAAaC,EAAOC,MAAgB/G,OAAO6B,QAAQ+E,GAC5Eb,EAAIC,GAAgB,CAAEa,cAAaC,QAAOC,cAE5C,OAAOhB,CACT,CAEO,SAASiB,EACdC,GAEA,IAAML,EAAwB,CAAC,EAC/B,QAAYZ,EAAcU,KAAW1G,OAAO6B,QAAQoF,GAClDL,EAAQZ,GAAgB,CAACU,EAAOG,YAAaH,EAAOI,MAAOJ,EAAOK,aAhGtE,SAA2Bd,GACzB,IACEhB,WAAWC,cAAc/E,QAAQgF,EAAac,EAChD,OAEA,CACF,EA4FEiB,CAAkBhB,EAAeU,EAAS,KAhF5C,SAAqBX,GACnB,IACE,IAAKhB,WAAWpG,SAAU,OAC1BoG,WAAWpG,SAASyG,OAClBE,EACA,IACA2B,mBAAmBlB,GACnB,0CAGJ,OAEA,CACF,CAoEEmB,CAAYlB,EAAeU,EAAS,IACtC,CAyCO,SAASS,EACdzC,EACAiC,EACAE,EAAaxI,KAAKC,OAElB,IAAMyI,EAAUN,IACVD,EAAS,CACbG,cACAC,MAAOnC,EAAgBC,GACvBmC,cAEF,OAAAE,EAAQrC,EAAWb,IAAM2C,EACzBM,EAA0BC,GACnBP,CACT,CAEO,SAASY,EACdC,GAEA,IAAMN,EAAUN,IACZa,GAAU,EACd,QAAWxB,KAAgBuB,EACnBvB,KAAgBiB,WACfA,EAAQjB,GACfwB,GAAU,GAERA,GAASR,EAA0BC,EACzC,CAvMA,IAEM9B,EACAK,EAsMOiC,EAzMbC,EAAAxF,EAAA,KAyMauF,EAA6B,CACxCtC,YAxMIA,EAAc,sBAyMlBK,YAxMIA,EAAc,sBAyMlBb,kBACAe,aACAQ,oBCzMF,SAASyB,EAAeC,GACtB,IACE,IAAMC,EAAU5C,WAAWC,aAC3B,IAAK2C,EAAS,OAAO,KACrB,IAAMlC,EAAMkC,EAAQvI,QAAQsI,GAC5B,OAAOjC,EAAMpG,KAAKC,MAAMmG,GAAkC,IAC5D,OACE,OAAO,IACT,CACF,CAdA,IAEMmC,EACAC,EAHNC,EAAA9F,EAAA,KAEM4F,EAAY,aACZC,EAAsB,cCHrB,SAASE,EAAoBC,EAAmBC,EAAa,GAClE,QAAIA,GAAc,KACdA,GAAc,GACXD,EAAYC,EACrB,CAEO,SAASC,EAAgBF,EAAmBG,GACjD,IAAKA,EAAQnI,OAAQ,OAAO,EAC5B,IAAMoI,EAAQD,EAAQE,OAAO,CAACC,EAAKC,IAAMD,GAAOC,EAAI,EAAIA,EAAI,GAAI,GAChE,GAAIH,GAAS,EAAG,OAAO,EACvB,IAAMI,EAAIR,EAAYI,EAClBK,EAAM,EACV,QAASC,EAAI,EAAGA,EAAIP,EAAQnI,OAAQ0I,IAElC,GADAD,GAAON,EAAQO,GAAK,EAAIP,EAAQO,GAAK,EACjCF,EAAIC,EAAK,OAAOC,EAEtB,OAAOP,EAAQnI,OAAS,CAC1B,CAjBA,IAAA2I,EAAA3G,EAAA,QC0BA,SAAS4G,EAASC,GAChB,MAAO,CACLC,UAAWtI,KAAKQ,MAA0B,IAApB6H,EAAYT,OAAmB,IACrDW,iBAAkBvI,KAAKQ,MAAgC,IAA1B6H,EAAYG,aAAyB,IAEtE,CAEA,SAASC,EAAQJ,EAA0BlH,GACzC,QAAWuH,KAAYvH,EAAS,CAC9B,IAAMwH,EAAQD,EACVC,EAAMC,gBAAyC,iBAAhBD,EAAMpD,QACzC8C,EAAYT,OAASe,EAAMpD,MACE,OAAzB8C,EAAYQ,UAAqBF,EAAMG,UAAYT,EAAYQ,WACjER,EAAYG,aAAeG,EAAMpD,OAErC,CACF,CAEA,SAASwD,EAAOV,EAAcW,GAC5B,IAAKX,GAAeA,EAAYY,UAAW,OAC3CZ,EAAYY,WAAY,EACY,OAAhCZ,EAAYa,kBACdtH,aAAayG,EAAYa,iBACzBb,EAAYa,gBAAkB,MAEhC,IACET,EAAQJ,EAAaA,EAAYc,SAASC,cAC5C,OAAS,CACTf,EAAYc,SAASE,aACrB,IAAMC,EAAUlB,EAASC,GACzBkB,GAAcD,EACdjB,EAAYmB,QAAQF,GAChBN,IAAYX,IAAaW,EAAU,KACzC,CAEO,SAASS,EAAoBC,GAIlC,GAHAX,EAAOC,GACPO,GAAc,CAAEjB,UAAW,EAAGC,iBAAkB,GAE5CmB,UAAmBC,oBAAwB,IAC7CC,GAAiBC,QAAQL,QAAQ,WAGnC,IACE,IAAIA,EAEAnB,EADEyB,EAAU,IAAID,QAA4BE,IAAWP,EAAUO,IAE/DZ,EAAW,IAAIQ,oBAAqBK,IACnC3B,EAAYY,WAAWR,EAAQJ,EAAa2B,EAAKC,gBAExD5B,EAAc,CACZc,WACAN,SAAU,KACVK,gBAAiB,KACjBtB,MAAO,EACPY,YAAa,EACbsB,UACAN,UACAP,WAAW,GAEbD,EAAUX,EACVuB,GAAiBE,EAIjBX,EAASe,QAAQ,CAAEC,KAAM,eAAgBC,UAAWC,KACpDA,IAAqB,EAGrBhC,EAAYa,gBAAkBtF,WAAW,IAAMmF,EAAOV,GAAc,IACtE,OACEW,GAASG,SAASE,aAClBL,GAASQ,QAAQ,MACjBR,EAAU,KACVY,GAAiBC,QAAQL,QAAQ,KACnC,CACF,CAEO,SAASc,IACd,IAAKtB,GAAgC,OAArBA,EAAQH,SAAmB,OAC3CG,EAAQH,gBAAkB0B,YAAgB,KAA0C,mBAApBA,YAAYzM,IACxEyM,YAAYzM,MACZ,EAC4B,OAA5BkL,EAAQE,iBAA0BtH,aAAaoH,EAAQE,iBAC3D,IAAMb,EAAcW,EACpBX,EAAYa,gBAAkBtF,WAAW,IAAMmF,EAAOV,GAAc,IACtE,CAhHA,IAqBIW,EACAO,GACAK,GACAS,GAxBJG,GAAAhJ,EAAA,KAqBIwH,EAA8B,KAC9BO,GAA0B,CAAEjB,UAAW,EAAGC,iBAAkB,GAC5DqB,GAA6CC,QAAQL,QAAQ,MAC7Da,IAAqB,ICkClB,SAASI,GAAYC,EAAcnF,GAExC,OAnDK,SAA2B2B,EAAawD,EAAO,GACpD,IAAIC,EAAyB,EAAbzD,EAAI1H,OAChBoL,EAAQ1D,EAAI1H,OAASmL,EACrBE,EAAKH,EACLI,EAAK,WACLC,EAAK,UACL7C,EAAI,EAER,KAAOA,EAAI0C,GAAO,CAChB,IAAII,EACmB,IAApB9D,EAAI+D,WAAW/C,IACQ,IAAtBhB,EAAI+D,aAAa/C,KAAc,GACT,IAAtBhB,EAAI+D,aAAa/C,KAAc,IACT,IAAtBhB,EAAI+D,aAAa/C,KAAc,KACjCA,EAEF8C,EAAKhL,KAAKkL,KAAKF,EAAIF,GACnBE,EAAMA,GAAM,GAAOA,IAAO,GAC1BA,EAAKhL,KAAKkL,KAAKF,EAAID,GAEnBF,GAAMG,EACNH,EAAMA,GAAM,GAAOA,IAAO,GAC1BA,EAAK7K,KAAKkL,KAAKL,EAAI,GAAK,UAC1B,CAEA,IAAIG,EAAK,EACT,OAAQL,GACN,KAAK,EACHK,IAA+B,IAAxB9D,EAAI+D,WAAW/C,EAAI,KAAc,GAC1C,KAAK,EACH8C,IAA+B,IAAxB9D,EAAI+D,WAAW/C,EAAI,KAAc,EAC1C,KAAK,EACH8C,GAA0B,IAApB9D,EAAI+D,WAAW/C,GACrB8C,EAAKhL,KAAKkL,KAAKF,EAAIF,GACnBE,EAAMA,GAAM,GAAOA,IAAO,GAC1BA,EAAKhL,KAAKkL,KAAKF,EAAID,GACnBF,GAAMG,EAGV,OAAAH,GAAM3D,EAAI1H,OACVqL,GAAMA,IAAO,GACbA,EAAK7K,KAAKkL,KAAKL,EAAI,YACnBA,GAAMA,IAAO,GACbA,EAAK7K,KAAKkL,KAAKL,EAAI,YACnBA,GAAMA,IAAO,GAENA,IAAO,CAChB,CAGeM,CAAkBT,EAAOnF,EAAO,GAC9B,IAAS,GAC1B,CAEO,SAAS6F,GAAqB9F,EAAsBC,GACzD,OAAOkF,GAAY,GAAGnF,cAA0BC,EAClD,CAUA,SAAS8F,KACP,GAAI9G,WAAW+G,QAAU/G,WAAW+G,OAAOC,gBAAiB,CAC1D,IAAMX,EAAQ,IAAIY,WAAW,IAC7B,OAAAjH,WAAW+G,OAAOC,gBAAgBX,GAXtC,SAAoBA,GAClB,IAAIvF,EAAM,GACV,QAAS6C,EAAI,EAAGA,EAAI0C,EAAMpL,OAAQ0I,IAChC7C,GAAOuF,EAAM1C,GAAGuD,SAAS,IAAIC,SAAS,EAAG,KAE3C,OAAOrG,CACT,CAMWsG,CAAWf,EACpB,CACA,OAAO5K,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,GAAKjI,KAAKC,MAAM2N,SAAS,GACnE,CAEO,SAASI,GAAyBC,GAKvCC,GAAcD,GAAUC,aAAe,eACvCC,IAAwD,IAAlCF,GAAUE,oBAChCC,GAGF,SAA+B1G,GAC7B,IAAM2G,GAAc3G,GAAS,IAC1B9C,OACA0J,QAAQ,gBAAiB,IACzBA,QAAQ,QAAS,IACjBA,QAAQ,UAAW,IACnBA,QAAQ,QAAS,IACjBC,cACH,IAAKF,GAA6B,cAAfA,GAA8BA,EAAWG,SAAS,KAAM,MAAO,GAClF,IAAMC,EAAYJ,EAAWC,QAAQ,OAAQ,KACvCI,EAASD,EAAUH,QAAQ,MAAO,IAAIK,MAAM,KAClD,OAAOD,EAAO/M,OAAS,GAClB+M,EAAOE,MAAOC,GAAU,yCAAyCC,KAAKD,IACvEJ,EACA,EACN,CAlBiBM,CAAsBd,GAAUG,aACjD,CAmBA,SAASY,GAAkBtH,GACzB,IAAKyG,GAAqB,OAAOzG,EACjC,IACE,MAAO,OAASuH,KAAKvH,GAAO4G,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,MAAO,GACrF,OACE,OAAO5G,CACT,CACF,CAEA,SAASwH,GAAkBxH,GACzB,IAAKA,EAAO,OAAO,KACnB,IAAKA,EAAMyH,WAAW,QAAS,OAAOzH,EACtC,IACE,IAAMN,EAAMM,EAAMO,MAAM,GAAGqG,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KACtDc,EAAShI,EAAM,IAAIiI,QAAQ,EAAKjI,EAAIzF,OAAS,GAAM,GACzD,OAAO2N,KAAKF,EACd,OACE,OAAO,IACT,CACF,CAgBA,SAASG,KACP,IACE,MAAoB,mBAAhBrB,GAAyCxH,WAAW5F,gBAAkB,KACtD,iBAAhBoN,GAAuCxH,WAAWC,cAAgB,KAC/D,IACT,OACE,OAAO,IACT,CACF,CAYA,SAAS6I,GAAa9H,GACpB,GAAoB,WAAhBwG,IAIJ,GAAoB,WAAhBA,GACJ,IACEqB,MAAkB3N,QAAQ6N,GAAST,GAAkBtH,GACvD,OAEA,OAREgI,GAAehI,CASnB,CAUA,SAASmB,GAAYnB,GACnB,IAAKhB,WAAWpG,SAAU,OAC1B,IAAMqP,EAAU,IAAI3P,KAAKA,KAAKC,MAAQ,SAAa2P,cAC7CC,EAASzB,GAAe,YAAcA,GAAe,GAC3D1H,WAAWpG,SAASyG,OAClB0I,GAAU,IAAM7G,mBAAmBoG,GAAkBtH,IAAU,aAAeiI,EAAU,WAAaE,CACzG,CAEO,SAASC,GAAUC,GACxB,GAAIA,EAAU,OAAOA,EACrB,IAAMC,EAzCR,WACE,GAAoB,WAAhB9B,GAA0B,OAAOwB,GACrC,GAAoB,WAAhBxB,GAA0B,OAAO,KACrC,IACE,OAAOgB,GAAkBK,MAAkBxO,QAAQ0O,KAAY,KACjE,OACE,OAAO,IACT,CACF,CAiCmBQ,IAlBnB,WACE,IAAKvJ,WAAWpG,UAAUyG,OAAQ,OAAO,KACzC,IAAMD,EAAQJ,WAAWpG,SAASyG,OAAOD,MACvC,IAAIE,OAAO,QAAUyI,GAAU,aAEjC,OAAO3I,EAAQoI,GAAkBhI,mBAAmBJ,EAAM,KAAO,IACnE,CAYoCD,GAClC,GAAImJ,EAAU,OAAOA,EACrB,IAAME,EAAU1C,KAChB,OAAAgC,GAAaU,GACO,WAAhBhC,IAA0BrF,GAAYqH,GACnCA,CACT,CAMO,SAASC,GAAYzI,GACrBA,IACL8H,GAAa9H,GACO,WAAhBwG,IAA0BrF,GAAYnB,GAC5C,CArNA,IAAM+H,GAIFvB,GACAC,GACAC,GACAsB,GAPJU,GAAAzM,EAAA,KAAM8L,GAAU,WAIZvB,GAA2B,eAC3BC,IAAsB,EACtBC,GAAe,GACfsB,GAA8B,OCwC3B,SAASW,KACd,IAAMC,EAAQ,IAAInP,gBAAgBzB,SAAS0B,QAAQI,IAAI,mBACvD,MAAiB,MAAV8O,GAA2B,SAAVA,CAC1B,CAkBA,SAASC,GAAerP,EAAyBsP,GAC/C,QAAWC,KAAQD,EAAO,CACxB,IAAM9I,EAAQxG,EAAOM,IAAIiP,IAAO7L,OAChC,GAAI8C,EAAO,OAAOA,CACpB,CACA,OAAO,IACT,CAEA,SAASgJ,GAAiBxP,GACxB,IAAMoP,EAAQpP,EAAOM,IAAI,cACzB,GAAI8O,EAAO,CACT,IAAMK,EAAMC,GAAiBN,GAC7B,GAAIK,EAAK,OAAOA,CAClB,CAEA,IAAMlJ,EAAe8I,GAAerP,EAAQ2P,IACtCvI,EAAciI,GAAerP,EAAQ4P,IAC3C,OAAIrJ,GAAgBa,EACX,CAAE6B,CAAC1C,GAAea,GAEpB,IACT,CAUO,SAASyI,GAAgBC,GAE9B,IAAML,EAAMD,GAAiB,IAAIvP,gBAAgBzB,SAAS0B,SAC1D,GAAIuP,EAAK,OAAOA,EAGhB,IAAgC,IAA5BK,GAASC,eAA0B,CACrC,IAAMlK,EAASF,GAAW,iBAC1B,GAAIE,EAAQ,CACV,IAAM4J,EAAMC,GAAiB7J,GAC7B,GAAI4J,EAAK,OAAOA,CAClB,CACF,CAEA,OAAO,IACT,CAEA,SAASC,GAAiBlJ,GACxB,IAAMiJ,EAA8B,CAAC,EACrC,QAAWO,KAAQxJ,EAAMiH,MAAM,KAAM,CACnC,IAAOwC,EAAOC,GAASF,EAAKvC,MAAM,KAC9BwC,GAASC,IAAOT,EAAIQ,GAASC,EACnC,CACA,OAAO3P,OAAOC,KAAKiP,GAAKhP,OAASgP,EAAM,IACzC,CAUO,SAASU,GAASL,GACvB,GAAIX,KAAoB,OAAO,EAC/B,IAAMnP,EAAS,IAAIC,gBAAgBzB,SAAS0B,QAG5C,SADc,MADAF,EAAOM,IAAI,YA7C3B,SAAwBN,GACtB,MAC+B,MAA7BA,EAAOM,IAAI,eACkB,MAA7BN,EAAOM,IAAI,eACqB,MAAhCN,EAAOM,IAAI,gBAEf,CAyCM8P,CAAepQ,IAAWwP,GAAiBxP,MACf,IAA5B8P,GAASC,kBACJpK,GAAW0K,GACtB,CAMO,SAASC,GAAeC,GAC7B,IAAM/J,EAAQjG,OAAO6B,QAAQmO,GAC1Bd,IAAI,EAAErP,EAAGC,KAAO,GAAGD,KAAKC,KACxBuD,KAAK,KACR+D,GAAY0I,GAAW7J,EAAOgK,GAChC,CAEA,SAASC,GAAoBjK,GAC3B,IAAKA,EAAO,OAAO,KACnB,IAAMQ,EAAUR,EAAM9C,OACtB,MAAO,yBAAyBkK,KAAK5G,GAAWA,EAAU,IAC5D,CAgCO,SAAS0J,KACdC,GAAaN,IACb,IACEzQ,eAAegR,WAAWC,GAC5B,OAAS,CAET,IACE,IAAMC,EAAM,IAAIxR,IAAId,SAASuS,MAC7BD,EAAIE,aAAaC,OAAO,WACxBH,EAAIE,aAAaC,OAAO,cACxBH,EAAIE,aAAaC,OAAO,sBACxBH,EAAIE,aAAaC,OAAO,mBACxBH,EAAIE,aAAaC,OAAO,iBACxBH,EAAIE,aAAaC,OAAO,gBACxBH,EAAIE,aAAaC,OAAO,SACxBH,EAAIE,aAAaC,OAAO,qBACxBH,EAAIE,aAAaC,OAAO,kBACxBH,EAAIE,aAAaC,OAAO,gBACxBH,EAAIE,aAAaC,OAAO,eACxBH,EAAIE,aAAaC,OAAO,SACxBH,EAAIE,aAAaC,OAAO,mBACxBH,EAAIE,aAAaC,OAAO,gBACxBH,EAAIE,aAAaC,OAAO,cACxBH,EAAIE,aAAaC,OAAO,cACxBC,QAAQC,aAAa,KAAM,GAAIL,EAAIpE,WACrC,OAAS,CACX,CAMO,SAAS/G,GAAW4J,GACzB,IACE,IAAM3J,EAAQxG,SAASyG,OAAOD,MAAM,IAAIE,OAAO,WAAayJ,EAAO,aACnE,OAAO3J,EAAQI,mBAAmBJ,EAAM,IAAM,IAChD,OACE,OAAO,IACT,CACF,CAEO,SAAS+B,GAAY4H,EAAc/I,EAAe4K,GACvD,IACEhS,SAASyG,OAAS,GAAG0J,KAAQ7H,mBAAmBlB,qBAAyB4K,gBAC3E,OAAS,CACX,CAEO,SAAST,GAAapB,GAC3B,IACEnQ,SAASyG,OAAS,GAAG0J,kCACvB,OAAS,CACX,CAjPA,IAAM8B,GAoDA1B,GAQAC,GAqEAS,GACAQ,GACAL,GAnINc,GAAA7O,EAAA,KAAM4O,GAAS,kFAoDT1B,GAA+B,CACnC,qBACA,kBACA,gBACA,eACA,SAGIC,GAA8B,CAClC,oBACA,iBACA,eACA,cACA,SAgEIS,GAAY,gBACZQ,GAAyB,kBACzBL,GAAoB,OC3G1B,SAASe,GAAelK,GACtB,OAAOjC,OAAOC,SAASgC,GAASpG,KAAKC,IAAI,EAAGD,KAAKqE,MAAM+B,IAAoB,CAC7E,CAEA,SAASpB,GAAWC,GAClB,IAAKA,EAAK,MAAO,CAAC,EAClB,IACE,IAAMC,EAASrG,KAAKC,MAAMmG,GAC1B,OAAOC,GAA4B,iBAAXA,IAAwBC,MAAMC,QAAQF,GACzDA,EACD,CAAC,CACP,OACE,MAAO,CAAC,CACV,CACF,CAEA,SAASZ,KACP,IACE,OAAOC,WAAWC,cAAc5F,QAAQ6F,KAAgB,IAC1D,OACE,OAAO,IACT,CACF,CAEA,SAAS8L,KACP,MAAO,IACFvL,GAAWV,SACXU,GAAWN,GAAWI,KAE7B,CArDA,IAKML,GACAK,GA4DO0L,GAlEbC,GAAAjP,EAAA,KACAyM,KACA9F,IACAkI,KAEM5L,GAAc,kBACdK,GAAc,kBA4DP0L,GAA4C,CACvD,IAAAE,CAAKC,GACH,IAAM3K,EAASuK,KAAmBI,GAClC,OAAOxL,MAAMC,QAAQY,IACE,iBAAdA,EAAO,IACO,iBAAdA,EAAO,GACZ,CAAEV,aAAcU,EAAO,GAAII,MAAOJ,EAAO,IACzC,IACN,EACA,KAAA4K,CAAMD,EAASE,GACb,IAAMpL,EAAQ8K,KACd9K,EAAMkL,GAAW,CAACE,EAAUvL,aAAcgL,GAAeO,EAAUzK,QAtBvE,SAA2BX,GACzB,IAAMqL,EAAajS,KAAKa,UAAU+F,GAClC,IACElB,WAAWC,cAAc/E,QAAQgF,GAAaqM,EAChD,OAEA,CACApK,GAAY5B,GAAagM,EAvDI,QAwD/B,CAeIC,CAAkBtL,EACpB,KCjEK,SAASuL,GAAoBC,EAAcC,EAAa,GAC7D,IAAMC,EAAU,2BACVxM,EAAQwM,EAAQC,KAAKH,GAC3B,IAAKtM,GAASwM,EAAQC,KAAKH,GAAO,OAAO,KACzC,IAAMhM,EAAMN,EAAM,GACZuB,EAAUjB,EAAIkH,QAAQ,aAAc,IACpCkF,EAAYrR,KAAKC,IAAIiG,EAAQoL,YAAY,KAAMpL,EAAQoL,YAAY,MACnEC,EAAWF,EAAY,EAAI,EAAInL,EAAQ1G,OAAS6R,EAAY,EAC5DG,EAAWD,GAAYA,GAAYL,EAAaK,EAAW,EAE3DE,EAAiBD,EAAWtL,EAAQmL,GAA0B,KAE9DK,EADazM,EAAIa,MAAM,EAAG2L,EAAiBxM,EAAIqM,YAAYG,GAAkBxM,EAAIzF,QAAQmF,MAAM,iBAC1E,IAAM,GAI3BgN,EAAUF,IAA6B,MAAVC,EAAgB,IAAM,KACnDE,GAAaJ,EAAWtL,EAAQJ,MAAM,EAAGuL,GAAanL,GAASiG,QAAQ,QAAS,IAChF0F,EAAWL,EAAWtL,EAAQJ,MAAMuL,EAAY,GAAK,GACrDS,EAAQ,IAAMZ,EAEpB,MAAO,CACLa,MAFY5N,OAAOyN,GAAaE,EAAQ3N,QAAQ0N,EAAW,IAAI3E,OAAOgE,IAAapL,MAAM,EAAGoL,IAAe,GAG3Gc,WAAY,CAAEL,UAASD,QAAOF,WAAUN,cACxCe,MAAOtN,EAAMuN,MACbC,IAAKxN,EAAMuN,MAAQjN,EAAIzF,OAE3B,CAEO,SAAS4S,GAAgBL,EAAeC,GAC7C,IAAMF,EAAQ,IAAME,EAAWd,WAC3BmB,EAAQC,OAAOtS,KAAKqE,MAAM0N,EAAQD,IAClCE,EAAWN,QAAOW,EAAQA,EAAMlG,QAAQ,wBAAyB6F,EAAWN,QAChF,IAAM/G,EAAYoH,EAAQD,EACpBN,EAAWQ,EAAWR,WAAa7G,EAAYqH,EAAWd,WAAa,GAC7E,OAAOM,EACHa,EAAQL,EAAWL,QAAUW,OAAO3H,GAAWe,SAASsG,EAAWd,WAAY,KAAKpL,MAAM,EAAG0L,GAC7Fa,CACN,CApDA,IAAAE,GAAA/Q,EAAA,QC0FA,SAASgR,KACP,UAAWnS,OAAW,IAAa,OAAO,EAC1C,IAAMoS,EAAQpS,OAAyBqS,kBAAkBD,KACzD,SACGpS,OAAyBsS,UAAWxN,MAAMC,QAAQqN,GAAMG,SAASC,UAEtE,CAEA,SAASC,KACe,MAAlBC,IAAwBnR,aAAamR,IACzCA,GAAiB,IACnB,CAEA,SAASC,KACgB,MAAnBC,IAAyBrR,aAAaqR,IAC1CA,GAAkB,KAClBC,GAAqB,CACvB,CAEA,SAASC,KACgB,MAAnBF,KACuB,IAAvBC,KACFA,GAAqBrV,KAAKC,MAAQsV,IACpCH,GAAkBrP,WAAW,KAE3B,GADAqP,GAAkB,MACbjK,GAAS,OACd,IAAMqK,EAASrK,GAAQsK,wBACvB,IAAe,IAAXD,GAKJ,GAAe,YAAXA,EAAsB,CACxB,GAAIxV,KAAKC,OAASoV,GAIhB,YADAK,KAGFJ,IACF,OAXEI,MAYD,IACL,CAEA,SAASC,GACP1H,EACA2H,EACAC,EAAuD,KAAM,GAE7D,UAAWrT,OAAW,IAAa,MAAO,GAC1C,IAAM0H,EAAI1H,OACJoS,EAAO1K,EAAE2K,kBAAkBD,KACjC,IACG1K,EAAE4K,SACsB,YAAzBF,GAAMkB,MAAMC,WACXzO,MAAMC,QAAQqN,EAAKG,SAASC,UAE7B,MAAO,GACT,IAAMgB,EAAW9L,EAAE4K,QAAQkB,UAAUC,OAC/BC,EAAiB,IAAIC,IACzBvB,EAAKG,QAAQC,SACVoB,OAAQC,GAA0B,MAAdA,EAAQ7Q,IAC5BmL,IAAK0F,GAAY5B,OAAO4B,EAAQ7Q,MAE/ByQ,EAAS,GACf,QAAW5P,KAAc4H,EAASqI,YAAa,CAC7C,IAAMC,EAAaX,EAAYY,KAC5BC,GAASA,EAAKhP,eAAiBpB,EAAWqQ,eAEvCC,EAAcJ,EAChBlQ,EAAW2O,SAASuB,EAAWjO,kBAC/B,EACEsO,EAAwBD,GAAaE,KAAMC,IAC/C,IAAMC,EAAYD,EAAWE,YAAYrI,MAAM,KAAKsI,MACpD,OAAoB,MAAbF,GAAqBb,EAAegB,IAAIH,KAE3CI,EAC2B,MAA/B9Q,EAAW+Q,kBACX/Q,EAAW+Q,mBAAqBb,GAAYnQ,gBAE5CmQ,GACAV,EAAuBU,IACvBY,IACCZ,EAAWc,WACZrB,IAAa3P,EAAW2P,UACxBW,GACAC,GAEAX,EAAOqB,KAAK,CAAEjR,aAAYkQ,aAAYP,YAE1C,CACA,OAAOC,CACT,CAEA,SAASsB,GACPtJ,EACA2H,EACAC,GAEA,IAAMI,EAASN,GACb1H,EACA2H,EACAC,GAEF,OAAII,EAAOtU,OAAS,EACXsU,EAAOY,KAAK,EAAGxQ,aAAYkQ,gBAChClQ,EAAW2O,SAASuB,EAAWjO,cAAcuO,KAC1CC,GAAuD,iBAAjCA,EAAWU,oBAKjCvJ,EAASqI,YAAYO,KAAMxQ,IAChC,IAAMkQ,EAAaX,EAAYY,KAC5B/H,GACCA,EAAUhH,eAAiBpB,EAAWqQ,gBACrCjI,EAAU4I,WAEf,SACEd,GACgC,MAA/BlQ,EAAW+Q,kBACV/Q,EAAW+Q,mBAAqBb,EAAWnQ,kBAC7CC,EAAW2O,SAASuB,EAAWjO,cAAcuO,KAC1CC,GAAuD,iBAAjCA,EAAWU,qBAI1C,CAQO,SAASC,GACdxJ,EACA2H,EACAC,EAAuD,KAAM,GAE7D,QAAK5H,MACDyJ,GAAsBzJ,EAAU2H,EAAaC,KAE7ClB,MACG1G,EAASqI,YAAYO,KAAMxQ,GAChCuP,EAAYiB,KACTN,GACCA,EAAW9O,eAAiBpB,EAAWqQ,eACvCb,EAAuBU,KACtBA,EAAWc,YACoB,MAA/BhR,EAAW+Q,kBACV/Q,EAAW+Q,mBAAqBb,EAAWnQ,mBAGrD,CAEO,SAASsR,GACdzJ,EACA2H,EACAC,EAAuD,KAAM,GAE7D,IACE,SACE5H,IACA0H,GAAkB1H,EAAU2H,EAAaC,GAAwBlU,OAErE,OACE,OAAO,CACT,CACF,CAEA,SAASgW,GAAqBlJ,EAAmBtD,GAC/C,OAAO7E,OAAOmI,GAAanI,OAAO6E,EACpC,CAEA,SAASyM,GAAelQ,EAAe2L,GACrC,IAAMvM,EAAQY,EAAMZ,MAAM,uBAC1B,IAAKA,EAAO,OAAO,KACnB,IAAMkN,EAAWlN,EAAM,IAAM,GACvB+Q,EAAY7D,EAAS/L,MAAMoL,GACjC,GAAI,OAAOvE,KAAK+I,GAAY,OAAO,KACnC,IAAMC,EAAQxR,OACZQ,EAAM,IAAMkN,EAAW,IAAI3E,OAAOgE,IAAapL,MAAM,EAAGoL,IAE1D,OAAO/M,OAAOyR,cAAcD,GAASA,EAAQ,IAC/C,CAEA,SAASE,GACPtQ,EACAuQ,EACA5E,GAEA,IAAMhM,EAAS8L,GAAoBzL,EAAO2L,GAC1C,IAAKhM,EAAQ,OAAO,KACpB,IAAM6Q,EAAcD,EAAQzW,IAAI6F,EAAO6M,OACvC,OAAmB,MAAfgE,GAAuB5R,OAAO6R,MAAMD,GAAqB,KAE3DxQ,EAAMO,MAAM,EAAGZ,EAAO+M,OACtBG,GAAgB2D,EAAa7Q,EAAO8M,YACpCzM,EAAMO,MAAMZ,EAAOiN,IAEvB,CAEA,SAAS8D,GACPC,EACAC,EACAL,EACA5E,GAEA,IAAMkF,EAAWF,EAAKG,eAAeC,QAAQ,gBAC7C,IAAKF,IAAaD,EAAUI,SAASH,GAAW,OAChD,IAAM1J,EAAQ0J,EAASI,aAAa,cACpC,GAAa,MAAT9J,EAAe,OACnB,IAAMqJ,EAAcF,GAAmBnJ,EAAOoJ,EAAS5E,GACvD,GAAmB,MAAf6E,GAAuBA,IAAgBrJ,EAAO,OAClD,IAAM+J,EAAWC,GAAmBrX,IAAI+W,GACxCM,GAAmBC,IAAIP,EAAU,CAC/BQ,SACEH,GAAY/J,IAAU+J,EAASI,QAAUJ,EAASG,SAAWlK,EAC/DmK,QAASd,IAEXK,EAASU,aAAa,aAAcf,EACtC,CAEA,SAASgB,KACP,IACEC,IACF,OACEzD,IACF,CACF,CAEA,SAAS0D,GAAqB1R,GAC5B,IAEE,IAAMZ,EADO,IAAItG,IAAIkH,EAAOhI,SAASuS,MAAMrS,SACxBkH,MAAM,wBACzB,OAAOA,IAAQ,GAAKI,mBAAmBJ,EAAM,IAAIyH,cAAgB,IACnE,OACE,OAAO,IACT,CACF,CAEA,SAAS8K,KACP,IAAMzE,EAAQpS,OAAyBqS,kBAAkBD,KACnD0E,EAAiB1E,GAAMkB,MAAMyD,QAAU3E,GAAMG,SAASwE,OAC5D,GAA8B,iBAAnBD,GAA+BA,EAAe1U,OACvD,OAAO0U,EAAe1U,OAAO2J,cAE/B,IAAMiL,EAAYlZ,SAASmZ,cACzB,+BAEF,OAAOD,EAAYJ,GAAqBI,EAAUvH,MAAQ,IAC5D,CAEA,SAASyH,GACPrB,EACAsB,GAEA,IAAMC,EAAiBvB,EAAKI,QAC1B,yBAEIoB,EAAoBxB,EAAKI,QAC7B,gGAEIqB,EACJzB,EAAKG,eAAiBH,EAAKG,gBAAkBlY,SAAS2B,KAClDoW,EAAKG,cACL,KACAF,EAAYuB,GAAqBC,EACjCC,EAAiBzB,EACnBhR,MAAM0S,KACJ1B,EAAU2B,iBAAoC,0BAC9C7D,OACC3H,GACsB,MAArBoL,GAA6BpL,EAAU+J,gBAAkBF,GAE7D,GACE4B,EAAgB,IAAI/D,IACxB4D,EACGpJ,IAAKlC,GAAc2K,GAAqB3K,EAAUwD,OAClDmE,OAAQmD,GAAuC,MAAVA,IAMpCY,EACJP,IACwB,IAAvBM,EAAcE,KAAcL,EAAe,IAAM,KAAQ,MAC5D,IAAKI,EAAQ,OAAO,EACpB,IAAME,EAAejB,GAAqBe,EAAOlI,MACjD,QAAKoI,IAGmB,MAAjBV,GAAyBU,IAAiBV,EACnD,CAEA,SAASW,GACPjC,EACAsB,GAEA,OAAOtB,EAAKG,cACRkB,GAAkCrB,EAAKG,cAAemB,GACrC,MAAjBA,CACN,CA2BA,SAASR,KACP,IAAKhO,IAAWoP,GAAU,OAC1B,IAAMC,GAAcjD,GAClBpM,GAAQ8C,SACR9C,GAAQyK,YACRzK,GAAQ0K,yBAEN1K,GAAQsK,wBAEZ,IAAoB,IAAhB+E,EAAJ,CAIoB,YAAhBA,GAA2BlF,KAC/BiF,IAAW,EACX,IACE,IAAMtE,EAASN,GACbxK,GAAQ8C,SACR9C,GAAQyK,YACRzK,GAAQ0K,wBAEJb,EAAYxS,OAAyBqS,kBAAkBD,MAAMG,SAC/DC,SACJ,IAAKiB,EAAOtU,SAAW2F,MAAMC,QAAQyN,GAAW,OAChD,IAAMgB,EAAWC,EAAO,GAAID,SACtB3C,EAAaoH,GAAa3L,KAAKkH,GAAY,EAAI,EAG/C0E,EAAqBrH,EAAa,EAAI,IACtCsH,EAAY,IAAIC,IACtB,QAAWvE,KAAWrB,EAAU,CAC9B,IAAM6F,EAAQvU,OAAO+P,EAAQwE,OACX,MAAdxE,EAAQ7Q,IAAcc,OAAOyR,cAAc8C,IAAUA,GAAS,GAChEF,EAAU7B,IAAIrE,OAAO4B,EAAQ7Q,IAAKqV,EACtC,CACA,IAAMC,EAAoB,IAAIF,IAC9B,QAAWnM,KAAawH,EACtB,QAAWa,KAAcrI,EAAUpI,WAAW2O,SAC5CvG,EAAU8H,WAAWjO,aACpB,CACD,GAA4C,iBAAjCwO,EAAWU,kBAAgC,SACtD,IAAMhS,EAAKsR,EAAWE,YAAYrI,MAAM,KAAKsI,MAC7C,IAAKzR,IAAOmV,EAAUzD,IAAI1R,GAAK,SAC/B,IAAMuV,EAAWD,EAAkBtZ,IAAIgE,IAEzB,MAAZuV,GACApD,GAAqBb,EAAWU,kBAAmBuD,KAEnDD,EAAkBhC,IAAItT,EAAIsR,EAAWU,kBAEzC,CAEF,IAAMwD,EAAmB,IAAIJ,IAYvBK,EAAoB,IAAIhF,GAAQnO,KAAK,CAACoT,EAAMC,IAChDD,EAAK7U,WAAWqQ,cAAgByE,EAAM9U,WAAWqQ,eAAgB,EAAK,GAExE,QAAWjI,KAAawM,EACtB,QAAWnE,KAAcrI,EAAUpI,WAAW2O,SAC5CvG,EAAU8H,WAAWjO,aACpB,CACD,IAAM9C,EAAKsR,EAAWE,YAAYrI,MAAM,KAAKsI,MAE3CzR,GACAmV,EAAUzD,IAAI1R,IACdsR,EAAWsE,YACVJ,EAAiB9D,IAAI1R,IAEtBwV,EAAiBlC,IAAItT,EAAI,CACvB6V,QAASvE,EAAWsE,UACpB7E,WAAY9H,EAAU8H,YAG5B,CAEF,IAAM0B,EAAU,IAAI2C,IAIpB,QAAYpV,EAAIgS,KAAsBsD,EAAmB,CACvD,IAAMQ,EAASX,EAAUnZ,IAAIgE,GACvB+V,EAAyB3D,GAC7BJ,EACAnE,GAUF,GALY,MAAViI,GAC0B,MAA1BC,GACAA,EAAyBb,GAAsBY,GAG7CA,EAASZ,EAAoB,SACjC,IAAMc,EAAsBF,EAASZ,EAC/B1K,EAAWiI,EAAQzW,IAAIga,GAC7BvD,EAAQa,IACN0C,EACY,MAAZxL,GAAoBA,IAAauL,EAC7BA,EACAE,IAER,CAIA,QAAYjW,GAAM6V,cAAcL,EAAkB,CAChD,GAAqB,QAAjBK,EAAQlX,KAAgB,SAC5B,IAAMmX,EAASX,EAAUnZ,IAAIgE,GACvBkW,EAAgB9D,GAAeyD,EAAQM,OAAQtI,GAC/CuI,EACM,MAAVN,GAAkBA,EAASZ,IAAuB,EAC9CY,EAASZ,EACT,KACAmB,EACY,MAAhBD,EAAuB,KAAO3D,EAAQzW,IAAIoa,IAAiBA,GAE1C,MAAjBF,GACmB,MAAnBG,GACAH,GAAiBG,IAEjBb,EAAiB7I,OAAO3M,EAE5B,CAIA,IACGyS,EAAQmC,OACRY,EAAiBZ,MACY,OAA9B0B,GAEA,OAEF,IAAMC,EAAgB1C,KAChB2C,EAAYC,GAA0BnX,KAAK,KAC3CoX,EAAa5U,MAAM0S,KACvB1Z,SAAS2Z,iBAAiBkC,GAAyBrX,KAAK,OAEpDsX,EA9KV,SACEpH,GAEA,IAAM2E,EAAgBN,KAIhB0B,EAHczT,MAAM0S,KACxB1Z,SAAS2Z,iBAAkC,8BAC3CzD,KAAM6F,IAAU3C,GAAkC2C,EAAM1C,KAC5BF,cAG5B,mFACC/R,MACH,GAAIqT,GAAY/F,EAAS6B,KAAMR,GAAY5B,OAAO4B,EAAQ7Q,MAAQuV,GAChE,OAAOA,EACT,IAAMuB,EAAa,IAAI9b,IAAId,SAASuS,MAAMC,aAAa1Q,IAAI,WAC3D,OACE8a,GACAtH,EAAS6B,KAAMR,GAAY5B,OAAO4B,EAAQ7Q,MAAQ8W,GAE3CA,EACkB,IAApBtH,EAASrT,QAAmC,MAAnBqT,EAAS,IAAIxP,GACzCiP,OAAOO,EAAS,GAAGxP,IACnB,IACN,CAuJ8B+W,CAAiBvH,GACrCwH,EAAkBJ,EACpBpB,EAAiBxZ,IAAI4a,QACrB,EACEf,EAAUmB,GAAiBnB,QAC7BoB,EAAmD,KACvDC,GAAiBA,GAAetG,OAAQiC,GAASA,EAAK1S,aACtD,IAAMgX,EAAwB,KAC5B,QAAWtE,KAAQqE,GAAgBrE,EAAKlT,SACxCuX,GAAiB,IAEbE,EAAsB,KAC1BD,IACA,QAAYtE,EAAMwE,KAAYC,GAC5BzE,EAAK/S,MAAMuX,QAAUA,EACvBC,GAAuB,IAAIlC,KAE7B,GAAIS,EAAS,CACX,IAAM0B,EAAuB,IAAI5G,IACjC,QAAWmC,KAAa4D,EAAY,CAClC,GAAIxC,GAAkCpB,EAAWyD,GAC/C,SACF,IAAMiB,EAAQ1E,EAAUE,eAAiBF,EACzC,QAAWtI,KAAY1I,MAAM0S,KAC3BgD,EAAM/C,iBAA8B+B,IAEhChM,EAASiN,aAAa,yBACtBvD,GAAkC1J,EAAU+L,IAEhDgB,EAAqBrX,IAAIsK,EAE7B,CACA,QAAWA,KAAY+M,EAChBD,GAAqB5F,IAAIlH,IAC5B8M,GAAqBhE,IAAI9I,EAAUA,EAAS1K,MAAMuX,SACpD7M,EAAS1K,MAAMuX,QAAU,OAE3B,GAAqB,QAAjBxB,EAAQlX,KAAgB,CAC1B,IAAMwX,EAAS/D,GAAeyD,EAAQM,OAAQtI,GACxCiI,EAASc,EACXzB,EAAUnZ,IAAI4a,QACd,EAGJ,GAAc,MAAVT,GAA4B,MAAVL,EAAgB,CACpC,IAAM4B,EAAWhB,EAAW9F,OACzBkC,IACEoB,GAAkCpB,EAAWyD,IAK5CoB,EAAWhB,GAAyBrX,KAAK,KACzCsY,EAASF,EAAS9G,OACrBkC,IAAeA,EAAUmB,cAAc0D,IAE1C,QAAW7E,KAAa8E,EAAOzb,OAAS,EAAIyb,EAASF,EAAU,CAC7D,IAAI7E,EACFC,EAAUE,eAAeiB,cACvB,2BACG,KACFpB,IACHA,EAAO/X,SAASiF,cAAc,KAC9B8S,EAAKgF,QAAQC,cAAgB,OAC7BjF,EAAKkF,UAAY,kBACjBjF,EAAUE,eAAegF,aAAanF,EAAMC,GAC5CoE,GAAepF,KAAKe,IAEtB,IAAMmD,EAAsBF,EAASZ,EAC/B+C,EAAcnF,EAAU7S,aAAe,GACvCiY,EAAgBvK,GAAoBsK,EAAapK,GAWjDsK,EAPeD,GAKX,OAJNvK,GACEsK,EAAYxV,MAAM,EAAGyV,EAActJ,OACjCqJ,EAAYxV,MAAMyV,EAAcpJ,KAClCjB,GAID2E,GACCyF,EACA,IAAI7C,IAAI,CAAC,CAACY,EAAqBG,KAC/BtI,KAEDqK,EACGD,EAAYxV,MAAM,EAAGyV,EAActJ,OACnCG,GAAgBoH,EAAQ+B,EAAcvJ,YACtCsJ,EAAYxV,MAAMyV,EAAcpJ,KAChC+G,EAAQM,QACZ+B,EACEnJ,GAAgBoH,EAAQ+B,EAAcvJ,YACtCkH,EAAQM,OACVtD,EAAK5S,cAAgBkY,IAAUtF,EAAK5S,YAAckY,EACxD,CACIjB,GAAe7F,KAAMwB,GAASA,EAAK1S,eACrC8W,EAAgCD,EAAiBjG,YAE3B,IAApB2G,EAASvb,QAAcib,GAC7B,MAAOA,GACT,CAIqB,UAAjBvB,EAAQlX,OACVwY,IACIG,GAAqB1C,KAAO,IAC9BqC,EAAgCD,EAAiBjG,YAGvD,MACEqG,IAEF,QAAWtE,KAAa4D,EAAY,CAClC,GAAI5D,EAAUsF,QAAQ5B,IAAc1D,EAAUG,QAAQuD,GACpD,SACF,IACI3D,EADEwF,EAASvd,SAASwd,iBAAiBxF,EAAWyF,WAAWC,WAE/D,KAAQ3F,EAAOwF,EAAOI,YAA4B,CAEhD,GADI5F,EAAKG,eAAeC,QAAQuD,IAC5B1B,GAA2BjC,EAAM0D,GAAgB,SACrD,IAAM7D,EAAcF,GAAmBK,EAAKlV,KAAM8U,EAAS5E,GAC3D,GAAmB,MAAf6E,GAAuBA,IAAgBG,EAAKlV,KAAM,SACtDiV,GAAqBC,EAAMC,EAAWL,EAAS5E,GAC/C,IAAMuF,EAAWsF,GAAU1c,IAAI6W,GAC/B6F,GAAUpF,IAAIT,EAAM,CAClBU,SACEH,GAAYP,EAAKlV,OAASyV,EAASI,QAC/BJ,EAASG,SACTV,EAAKlV,KACX6V,QAASd,IAEXG,EAAKlV,KAAO+U,CACd,CACF,CACA5M,IAAUE,aACV2S,IAAc3S,aACdF,GAAW,IAAI8S,iBAAiBlF,IAChCgD,EAAWmC,QAAS/F,GAClBhN,GAAUe,QAAQiM,EAAW,CAC3BgG,WAAW,EACXC,eAAe,EACfC,SAAS,MAGbL,GAAe,IAAIC,iBAAkB1V,IACnC,IAAMyU,EAAWhB,GAAyBrX,KAAK,KAE7C4D,EAAQmO,KAAM1O,GACZb,MAAM0S,KAAK7R,EAAOsW,YAAY5H,KAC3BwB,GACCA,aAAgBqG,UACfrG,EAAKuF,QAAQT,MAAqB9E,EAAKoB,cAAc0D,OAI5DjE,QAES7M,QAAQ/L,SAAS2B,KAAM,CAAEqc,WAAW,EAAME,SAAS,IAChE,IAAMG,EACJlC,IAAkCX,GACpCA,GAA4BW,EACxBkC,GAAoBC,OACxB,IAAMC,EACJvX,MAAM0S,KACJ1Z,SAAS2Z,iBAAkC,8BAC3CzD,KACC6F,IAAU3C,GAAkC2C,EAAMN,KAChD,KACH+C,KAAgBD,IAClBC,IAAa7b,oBAAoB,SAAU8b,IAC3CD,IAAa7b,oBAAoB,QAAS8b,IAC1CD,GAAcD,EACdC,IAAajc,iBAAiB,SAAUkc,IACxCD,IAAajc,iBAAiB,QAASkc,IAE3C,SACExE,IAAW,CACb,CA7TA,MAFE7E,IAgUJ,CAEA,SAASsJ,GACP/Q,EACA2H,EACAH,EACAwJ,EACAC,EACArJ,EAAuD,KAAM,GAE7D,IAAM2E,GAAcjD,GAClBtJ,EACA2H,EACAC,IAEEJ,IAEJ,GAAoB,YAAhB+E,EAAJ,CA2BA,GADArF,MACoB,IAAhBqF,EAMF,OALA2E,GAAoB,KAGpBlK,UACAiK,MAGF,IAAKxH,GAAsBzJ,EAAU2H,EAAaC,GAIhD,OAAKlB,MAA6B3U,KAAKC,MAAQgf,OAC7C/J,GAAiBnP,WACf,IACEiZ,GACE/Q,EACA2H,EACAH,EACAwJ,EACAC,EACArJ,GAEJuJ,MAKJnK,KACAkK,GAAoB,UACpBD,OAGFjK,KACAkK,GAAoB,KACpBhU,GAAU,CACR8C,WACA2H,cACAH,wBACAI,0BAEF,IACEsD,IACF,OACEzD,IACF,CAEAwJ,KAjDA,KAzBA,CAIE,GAH2B,IAAvB7J,KACFA,GAAqBrV,KAAKC,MAAQsV,IAEhCvV,KAAKC,OAASoV,GAAoB,CACpCF,KACA,IAAMxJ,EAAUwT,IAAmBD,YAAcA,EAGjD,OAFIC,KAAmBA,GAAkBD,gBAAa,QACtDvT,KAEF,CACuB,MAAnByJ,KACFA,GAAkBrP,WAAW,KAC3BqP,GAAkB,KAClB4J,GACE/Q,EACA2H,EACAH,EACAwJ,EACAC,EACArJ,IAED,IAGP,CAkDF,CAEO,SAASwJ,GACdpR,EACA2H,EACAH,EAAmD,KAAM,EACzDyJ,EACArJ,EAAuD,KAAM,GAG7D,GADAH,MACKzH,EAEH,YADAiR,MAGF,IAAMD,EAAWjf,KAAKC,MAAQqf,GAC9BH,GAAoB,CAClBlR,WACA2H,cACAH,wBACAwJ,WACAC,aACArJ,0BAEFmJ,GACE/Q,EACA2H,EACAH,EACAwJ,EACAC,EACArJ,EAEJ,CA0CO,SAASH,KACdpK,IAAUE,aACVF,GAAW,KACX6S,IAAc3S,aACd2S,GAAe,KACfW,IAAa7b,oBAAoB,SAAU8b,IAC3CD,IAAa7b,oBAAoB,QAAS8b,IAC1CD,GAAc,KACd,QAAYzG,EAAM3Q,KAAUwW,GAAW7F,EAAKlV,KAAOuE,EAAMqR,SACzDmF,GAAY,IAAItD,IAChB,QAAY2E,EAAS7X,KAAUmR,GAC7B0G,EAAQtG,aAAa,aAAcvR,EAAMqR,UAC3CF,GAAqB,IAAI+B,IACzB,QAAWvC,KAAQqE,GAAgBrE,EAAKlT,SACxCuX,GAAiB,GACjB,QAAYrE,EAAMwE,KAAYC,GAC5BzE,EAAK/S,MAAMuX,QAAUA,EACvBC,GAAuB,IAAIlC,IAC3BkB,GAA4B,KAC5B3Q,GAAU,KACVgU,GAAoB,KACpB5E,IAAW,EACXtF,KACAE,IACF,CA56BA,IAKagH,GAIAF,GAgBPxB,GAEFnP,GACA6S,GACAW,GACEC,GACFb,GACArF,GAIA6D,GACAI,GACAhB,GACA8C,GACAzT,GAMAoP,GACArF,GACAE,GACAC,GACA8J,GA6BE5J,GAQA6J,GACAE,GAwzBOE,GAh5BbC,GAAA9b,EAAA,KACA+Q,KAIayH,GACX,yHAAyHxN,MACvH,KAESsN,GACX,mEAAmEtN,MAAM,KAerE8L,GACJ,sEACEnP,GAAoC,KACpC6S,GAAwC,KACxCW,GAAsC,KACpCC,GAAyB,IAAM7F,KACjCgF,GAAY,IAAItD,IAChB/B,GAAqB,IAAI+B,IAIzB8B,GAAgC,GAChCI,GAAuB,IAAIlC,IAC3BkB,GAA+C,KAE/C3Q,GAKO,KACPoP,IAAW,EACXrF,GAAuD,KACvDE,GAAwD,KACxDC,GAAqB,EACrB8J,GAOO,KAsBL5J,GAA2B,IAQ3B6J,GAAyB,GACzBE,GAAuB,IAwzBhBE,GAAoCE,IAC/Cd,GAAkBc,KC93BpB,SAASC,GAAsBC,GAC7B,IAAM5N,EAZR,SAAoB4N,GAClB,IACE,IAAMlY,EAAyB,iBAAVkY,GAAsBA,aAAiBpf,IACxDiU,OAAOmL,GACPA,EAAM5N,IACV,OAAO,IAAIxR,IAAIkH,EAAOhI,SAASuS,KACjC,OACE,OAAO,IACT,CACF,CAGc4N,CAAWD,GACvB,IAAK5N,GAAOA,EAAIrS,SAAWD,SAASC,OAAQ,OAAO,EACnD,IAAMmgB,EAAkBtd,OAErBsS,SAASiL,QAAQ1a,KAChBA,EAAO,GACX,GAA8B,iBAAnBya,EACT,IACE,IAAMzY,EAAS,IAAI7G,IAAIsf,EAAgBpgB,SAASC,QAC5C0H,EAAO1H,SAAWD,SAASC,SAAW0H,EAAOjG,SAAWiG,EAAO2Y,OACjE3a,EAAOgC,EAAOzH,SAAS0O,QAAQ,MAAO,IAE1C,OACEjJ,EAAO,EACT,CAEF,IAAMjC,EAAO4O,EAAIpS,SAAS0O,QAAQ,MAAO,IACzC,MAAO,CAAC,MAAO,SAAU,SAAU,SAASuI,KACzCoJ,GAAW7c,IAAS,GAAGiC,UAAa4a,KAAY7c,IAAS,GAAGiC,UAAa4a,OAE9E,CAEA,SAASC,KACP,QAAWle,KAAWme,GACpB,IACEne,GACF,OAEA,CAEJ,CAEA,SAASoe,GAAiBC,GACxB,IAAMhE,EAAOgE,EAAMC,SACbjE,aAAgBkE,mBAAqBZ,GAAsBtD,EAAK4D,SACtEO,eAAeN,GACjB,CAiCO,SAASO,GAAsBze,GACpC,OAAAme,GAASza,IAAI1D,GAhCf,WACE,GAAI0e,IAAyC,mBAAjBle,OAAOme,MAAsB,OAEzD,IAAMC,GADNF,GAAgBle,OAAOme,OACWE,KAAKre,QACvCse,GAAe,YAAYC,GACzB,IAAMC,EAAyC,IAA1BC,IAA+BtB,GAAsBoB,EAAK,IACzEG,EAASN,KAAeG,GAC9B,OAAIC,GACFE,EAAOC,KAAMC,IACPA,EAASC,IAAInB,MAChB,QAIEgB,CACT,EACA1e,OAAOme,MAAQG,GACfxgB,SAASuC,iBAAiB,SAAUud,IAAkB,GACtDkB,IAAwB,CAC1B,CAcEC,GACO,KACLpB,GAAShO,OAAOnQ,GACM,IAAlBme,GAAS/F,OAdXkH,KACFhhB,SAAS2C,oBAAoB,SAAUmd,IAAkB,GACzDkB,IAAwB,GAEtBZ,IAAiBle,OAAOme,QAAUG,KAActe,OAAOme,MAAQD,IACnEI,GAAe,KACfJ,GAAgB,MAUlB,CAMO,SAASc,MACXT,GAEHE,IAAyB,EACzB,IAIE,OAH4C,mBAAjBze,OAAOme,MAC9Bne,OAAOme,MACPja,WAAWia,OACIc,KAAKjf,UAAWue,EACrC,SACEE,IAAyB,CAC3B,CACF,CAlHA,IAEMd,GACFO,GACAI,GACAG,GACAK,GANJI,GAAA/d,EAAA,KAEMwc,GAAW,IAAIhK,IACjBuK,GAA4C,KAC5CI,GAA2C,KAC3CG,GAAwB,EACxBK,IAAwB,ICqB5B,SAASrhB,KACP,OAAOD,KAAKC,KACd,CAEA,SAAS0hB,GAAMC,GACb,OAA2B,MAApBzf,KAAKC,IAAI,EAAGwf,GAAgB,GACrC,CAEA,SAASC,KACP,IAAKC,KAAqB,OAAO,EACjC,IACE,UAAWnb,aAAiB,IAAa,OAAO,EAChD,IAAM0C,EAAM,uBACZ,OAAA1C,aAAa/E,QAAQyH,EAAK,KAC1B1C,aAAamL,WAAWzI,IACjB,CACT,OACE,OAAO,CACT,CACF,CAEA,SAASyY,KACP,IACE,OAAsC,IAA/BC,IACT,OACE,OAAO,CACT,CACF,CAMA,SAASC,KACP,IAAKH,KAAsB,MAAO,CAAC,EACnC,IACE,IAAMxa,EAASrG,KAAKC,MAAM0F,aAAa5F,QAAQkhB,KAAc,MAC7D,OAAO5a,GAA4B,iBAAXA,EAAsBA,EAAS,CAAC,CAC1D,OACE,MAAO,CAAC,CACV,CACF,CAEA,SAAS6a,GAAWta,GAClB,GAAKia,KACL,IACElb,aAAa/E,QAAQqgB,GAAWjhB,KAAKa,UAAU+F,GACjD,OAAS,CACX,CAEA,SAASua,GAAeza,GACtB,GAAc,OAAVA,EAAgB,OAAO,KAC3B,GAAqB,iBAAVA,EAAoB,OAAOA,EAAMO,MAAM,EAAG,KACrD,GAAqB,iBAAVP,EAAoB,OAAOpB,OAAOC,SAASmB,GAASA,OAAQ,EACvE,GAAqB,kBAAVA,EAAqB,OAAOA,EACvC,GAAIJ,MAAMC,QAAQG,GAChB,OAAOA,EACJiJ,IAAK8F,GAAShC,OAAOgC,GAAM7R,QAC3BwR,OAAOgM,SACPna,MAAM,EAAG,IAEd,GAAIP,GAA0B,iBAAVA,EAClB,IACE,IAAM2a,EAAOrhB,KAAKa,UAAU6F,GAC5B,OAAI2a,EAAK1gB,OAAS,UAAiB,EAC5BX,KAAKC,MAAMohB,EACpB,OACE,MACF,CAGJ,CAEA,SAASC,GAAa1a,GACpB,IAAM2a,EAAKtiB,KACLuiB,EAAqC,CAAC,EAC5C,QAAYnZ,EAAKyB,KAAUrJ,OAAO6B,QAAQsE,IACnCkD,GAA0B,iBAAVA,GACjBA,EAAM2X,WAAa3X,EAAM2X,WAAaF,IAC1CC,EAAKnZ,GAAOyB,GAEd,OAAO0X,CACT,CAEO,SAASE,GAAUrZ,EAAa3B,EAAgBib,EAAU,GAAkBrH,EAAS,UAC1F,IAAKwG,KAAqB,OAC1B,IAAMzT,EAAa8T,GAAeza,GAClC,QAAmB,IAAf2G,EAA0B,OAC9B,IAAMzG,EAAQ0a,GAAaN,MAC3Bpa,EAAMyB,GAAO,CACX3B,MAAO2G,EACPuU,UAAW3iB,KACXwiB,UAAWxiB,KAAQ0hB,GAAMgB,IAE3BT,GAAWta,GACXib,GAAcxZ,GAAOiS,CACvB,CAEO,SAASwH,GAAW9R,EAAyC,CAAC,GACnE,IAAMpJ,EAAQ0a,GAAaN,OACK,IAA5BhR,EAAQ+R,iBAA2Bb,GAAWta,GAClD,IAAMob,EAAuC,CAAC,EAC9C,QAAY3Z,EAAKyB,KAAUrJ,OAAO6B,QAAQsE,GACxCob,EAAQ3Z,GAAOyB,EAAMpD,MAIvB,GAFAjG,OAAOwhB,OAAOD,EAASE,KAES,IAA5BlS,EAAQ+R,iBAA6BjB,KACvC,IACE,IAAMqB,EAAkD,MAA3Cxc,aAAa5F,QAAQqiB,IAClCJ,EAAQ,qBAAuBG,EAC/Bxc,aAAa/E,QAAQwhB,GAAkB,IACzC,OAAS,CAGX,OAAOJ,CACT,CASO,SAASK,GAAiBha,EAAa3B,EAAgB4T,EAAS,WACrE,IAAMjN,EAAa8T,GAAeza,QACf,IAAf2G,IACJ6U,GAAe7Z,GAAOgF,EACtBwU,GAAcxZ,GAAOiS,EACvB,CAEO,SAASgI,GAAmBja,UAC1B6Z,GAAe7Z,UACfwZ,GAAcxZ,EACvB,CAUA,SAASka,GAAcC,EAAkBhB,GACvC,IAAMiB,EAAQjB,EAAK5d,OACnB,OAAK6e,EACE,CAACA,KAAUD,EAAOpN,OAAQ1O,GAAUA,IAAU+b,IAAQxb,MAAM,EAAG,IADnDub,CAErB,CAEA,SAASE,GAAgBra,GACvB,IAAM3B,EAAQob,GAAW,CAAEC,iBAAiB,IAAS1Z,GACrD,OAAO/B,MAAMC,QAAQG,GAASA,EAAMiJ,IAAK8F,GAAShC,OAAOgC,IAAS,EACpE,CAEO,SAASkN,GAAgB5O,EAA6B4N,EAAU,IACrE,IAAMnd,EAAmB,MAAduP,EAAQvP,GAAa,GAAKiP,OAAOM,EAAQvP,IAC9C+T,EAASxE,EAAQwE,OAAS9E,OAAOM,EAAQwE,QAAU,GACnDqK,EAAc7O,EAAQzI,KAAOmI,OAAOM,EAAQzI,MAAQ,GAe1D,GAbI9G,GACFkd,GAAU,8BAA+Ba,GAAcG,GAAgB,+BAAgCle,GAAKmd,GAE1GpJ,GACFmJ,GAAU,kCAAmCa,GAAcG,GAAgB,mCAAoCnK,GAASoJ,GAEtHiB,GACFlB,GACE,gCACAa,GAAcG,GAAgB,iCAAkCE,GAChEjB,GAGA5N,EAAQ8O,MAAMliB,OAAQ,CACxB,IAAMqO,EAAW0T,GAAgB,gCAEjChB,GAAU,+BADG3N,EAAQ8O,KAAK7Z,OAAO,CAACI,EAAK0Z,IAAQP,GAAcnZ,EAAKqK,OAAOqP,IAAO9T,GAChC2S,EAClD,CACAD,GAAU,+BAAgC,CACxCld,GAAIA,QAAM,EACV+T,OAAQA,QAAU,EAClBlW,MAAO0R,EAAQ1R,YAAS,EACxBiJ,KAAMsX,QAAe,EACrBG,OAAQhP,EAAQgP,aAAU,EAC1BlJ,MAAO9F,EAAQ8F,YAAS,GACvB8H,EACL,CAEO,SAASqB,GAAejD,EAAqD4B,EAAU,IAC9D,iBAAnB5B,EAAKkD,WAAwBvB,GAAU,kBAAmB3B,EAAKkD,UAAWtB,GACjF5B,EAAKmD,YAAYxB,GAAU,mBAAoB3B,EAAKmD,WAAYvB,EACtE,CAEO,SAASwB,GAAgBC,EAAezB,EAAU,GACvD,IAAMza,EAAUkc,EAAMxf,OACjBsD,GACLwa,GAAU,oBAAqBxa,EAASya,EAC1C,CAjOA,IAkBMV,GACAmB,GAIAF,GACAL,GACFd,GAzBJsC,GAAA1gB,EAAA,KAkBMse,GAAY,kBACZmB,GAAmB,uBAInBF,GAA8C,CAAC,EAC/CL,GAAwC,CAAC,EAC3Cd,GAA0C,KAAM,ICE7C,SAASuC,GACdjf,EAAmB/E,UAEnB,UAAWA,SAAa,IAAa,OAAO,KAC5C,QAAW6c,KAAYoH,GAAuB,CAC5C,IAAMhF,EAAUla,EAAKoU,cAAc0D,GACnC,GAAIoC,EAAS,OAAOA,CACtB,CACA,OAAO,IACT,CAEA,SAASiF,GAAYjF,GACnB,IAAM7X,EAAQ6X,EAAQ5G,aAAa,SACnC,MAAwB,iBAAVjR,EAAqBA,EAAQ,EAC7C,CAEA,SAAS+c,GAAYlF,GACnB,IAAMmF,EAAUF,GAAYjF,GACtBoF,EAAQpF,EAAQ5G,aAAa,eAAiB,GACpD,OACE4G,EAAQtC,aAAa,SACmB,UAAxCsC,EAAQ5G,aAAa,gBACqB,SAA1C4G,EAAQ5G,aAAa,kBACrB,wCAAwC7J,KAAK6V,IAC7C,qDAAqD7V,KAAK4V,EAE9D,CAEA,SAASE,GAAmBrF,GAC1B,IAAMmF,EAAUF,GAAYjF,GAC5B,OACEA,EAAQtC,aAAa,WACmB,SAAxCsC,EAAQ5G,aAAa,gBACkB,WAAvC4G,EAAQ5G,aAAa,eACrB,qCAAqC7J,KAAK4V,EAE9C,CAEA,SAASG,GAAWtF,GAClB,UAAW/c,OAAW,IAAa,OAAO,EAC1C,IAAM6V,EAAOkH,EACPja,EAAQ9C,OAAOsiB,iBAAmBtiB,OAAOsiB,iBAAiBzM,GAAQ,KACxE,GACE/S,IACmB,SAAlBA,EAAMuX,SACgB,WAArBvX,EAAMyf,YACY,MAAlBzf,EAAM0f,SACkB,SAAxB1f,EAAM2f,eAER,OAAO,EAET,IAAMC,EAAO7M,EAAK8M,0BAClB,SAAeD,GAAQA,EAAKE,MAAQ,GAAKF,EAAKG,OAAS,EACzD,CAEO,SAASC,GAAqBjgB,EAAmB/E,UACtD,UAAWA,SAAa,IAAa,OAAO,EAC5C,IAAMilB,EAAcjlB,SAAS2B,KAAOuiB,GAAYlkB,SAAS2B,MAAQ,GACjE,GAAIujB,GAAkB1W,KAAKyW,GAAc,OAAO,EAEhD,QAAWpI,KAAYoH,GAAuB,CAC5C,IAAMkB,EAAane,MAAM0S,KAAK3U,EAAK4U,iBAAiBkD,IACpD,QAAWoC,KAAWkG,EACpB,IAAIb,GAAmBrF,IAClBkF,GAAYlF,IACbsF,GAAWtF,GAAU,OAAO,CAEpC,CAEA,OAAO,CACT,CAEO,SAASmG,GACdC,GAEA,UACSrlB,SAAa,YACbkC,OAAW,YACX4b,iBAAqB,MAC3B9d,SAASgC,gBAEV,MAAO,OAGT,IAAI6I,EAAUma,KAEVM,EAA2B,KACzBC,EAAQ,KACZD,EAAY,KACZ,IAAMpD,EAAO8C,KACT9C,IAASrX,IACbA,EAAUqX,EACVmD,EAASnD,KAELsD,EAAW,KACG,OAAdF,IACJA,EAAYpjB,OAAOuD,WAAW8f,EAAO,MAGjCva,EAAW,IAAI8S,iBAAiB0H,GACtC,OAAAxa,EAASe,QAAQ/L,SAASgC,gBAAiB,CACzCyjB,YAAY,EACZC,gBAAiB,CACf,gBACA,cACA,QACA,aACA,SACA,OACA,SAEF1H,WAAW,EACXE,SAAS,IAGXle,SAASuC,iBAAiB,QAASijB,GAAU,GAC7CxlB,SAASuC,iBAAiB,QAASijB,GAAU,GAEtC,KACLxa,EAASE,aACTlL,SAAS2C,oBAAoB,QAAS6iB,GAAU,GAChDxlB,SAAS2C,oBAAoB,QAAS6iB,GAAU,GAC9B,OAAdF,GAAoBpjB,OAAOuB,aAAa6hB,GAEhD,CAvJA,IAEaK,GAEPT,GAGOjB,GAPb2B,GAAAviB,EAAA,KAAA0gB,KAEa4B,GAA0B,2BAEjCT,GACJ,gLAEWjB,GAAwB,CACnC,cACA,YACA,YACA,qBACA,0BACA,mBACA,mBACA,uCACA,oCACA,4DACA,sDACA,2BACA,yBACA,yBACA,wBACA,sBACA,yBCMF,SAAS4B,KACP5G,IAASpa,SACToa,GAAU,IACZ,CAyBO,SAAS6G,GACdpR,EACAqC,EACAgP,GAMA,IAAMC,EAAQ,CAAEC,YAAa,GAAgBC,YAAa,IACpDC,EAAUhY,IACbA,GAAW6R,QAAQiG,YAAY5kB,QAAU,GAAK,IAC9C8M,GAAW6R,QAAQkG,YAAY7kB,QAAU,GAAK,EAC3C+kB,EAASjY,GACA,MAAbA,GACwB,SAAxBA,EAAUkY,YACe,OAAxBlY,EAAUmY,WAA8C,gBAAxBnY,EAAUkY,WACvCE,EAAaplB,OAAO+hB,OAAOxO,GAAUoB,OACxC3H,GAAsC,SAAxBA,EAAUkY,WAE3B,OAAKtP,EAQE,CACLyP,kBAF2BD,EAAWhQ,KAAMpI,IAAegY,EAAOhY,IAG9D6X,EACAO,EAAW7c,OACT,CAACsW,EAAQ7R,MACP8X,YAAa,IAAIjG,EAAOiG,eAAiB9X,EAAU6R,QAAQiG,aAAe,IAC1EC,YAAa,IAAIlG,EAAOkG,eAAiB/X,EAAU6R,QAAQkG,aAAe,MAE5EF,GAENS,iBAAkBF,EAAWhQ,KAAK4P,GAClCO,gBAAiBH,EAAWllB,OAAS,GAAKklB,EAAWjY,MAAM8X,IAlBpD,CACLI,kBAAmBT,GAAY/F,QAAUgG,EACzCS,iBAAkBN,EAAOJ,GACzBW,gBAAiBN,EAAML,GAiB7B,CA2BA,SAASY,GAAevf,EAAe2L,GACrC,IAEMvM,EAAQ,IAAIE,OAAO,UADR,IAAfqM,EAAmB,GAAK,gBAAgBA,YACaE,KAAK7L,GAC5D,IAAKZ,EAAO,OAAO,KACnB,IAAMoN,EAAQ5N,OAAOQ,EAAM,IAAMA,EAAM,IAAM,IAAIogB,OAAO7T,EAAY,MACpE,OAAO/M,OAAOyR,cAAc7D,IAAUA,EAAQ,EAAIA,EAAQ,IAC5D,CAoFA,SAASiT,GAAMjT,EAAe8B,EAAkB3C,GAC9C,OAAO,IAAI+T,KAAKC,kBAAa,EAAW,CACtC/hB,MAAO,WACP0Q,aACCsR,OAAOpT,EAAQ,IAAMb,EAC1B,CAsBA,SAASkU,GAAOC,EAAkBvR,GAChCkQ,KACA,IAAMsB,EACsB,OAA1BxR,EAAOgR,gBAA2BO,GAAYvR,EAAOgR,eACjDS,EAxBR,SACEC,EACAH,EACAvR,GAEA,OAAO0R,EACJhZ,MAAM,eACN7J,KACCqiB,GACEhlB,KAAKC,IAAI,GAAI6T,EAAOgR,gBAAkB,GAAKO,GAC3CvR,EAAOD,SACPC,EAAO5C,aAGV1E,MAAM,eACN7J,KACCqiB,GAAMlR,EAAOgR,gBAAkB,EAAGhR,EAAOD,SAAUC,EAAO5C,YAEhE,CAMeuU,CACe,OAA1B3R,EAAOgR,eACHhR,EAAOI,QAAQwR,WACfJ,EACExR,EAAOI,QAAQyR,YACf7R,EAAOI,QAAQ0R,aACrBP,EACAvR,GAEF,IAAKyR,EAAK9iB,OAAQ,OAAO,EAEzB,IAAMojB,EAAU1nB,SAASiF,cAAc,OACvCyiB,EAAQ3K,QAAQ4K,aAAe,GAC/BD,EAAQ/O,aAAa,OAAQ,UAC7B+O,EAAQ/O,aAAa,YAAa,UAClC+O,EAAQ/O,aAAa,cAAe,QACpC+O,EAAQ1iB,MAAM4iB,QACZ,qIACF,IAAMC,EAAO7nB,SAASiF,cAAc,OAGpC,GAFA4iB,EAAK1iB,YAAciiB,EACnBM,EAAQniB,YAAYsiB,GAEW,iBAA7BlS,EAAOI,QAAQsQ,WACW,OAA1B1Q,EAAOgR,eACP,CACA,IAAMmB,EAAQ9nB,SAASiF,cAAc,OAC/B8iB,EAAWlmB,KAAKmmB,IACpB,IACAnmB,KAAKC,IAAI,EAAIolB,EAAWvR,EAAOgR,eAAkB,MAEnDmB,EAAMnP,aAAa,OAAQ,eAC3BmP,EAAMnP,aAAa,aAAc,0BACjCmP,EAAMnP,aAAa,gBAAiB,KACpCmP,EAAMnP,aAAa,gBAAiB,OACpCmP,EAAMnP,aAAa,gBAAiBxE,OAAOtS,KAAKQ,MAAM0lB,KACtDD,EAAM9iB,MAAM4iB,QACV,mFACF,IAAMK,EAAOjoB,SAASiF,cAAc,OACpCgjB,EAAKjjB,MAAM4iB,QAAU,qBAAqBG,8CAC1CD,EAAMviB,YAAY0iB,GAClBP,EAAQniB,YAAYuiB,EACtB,CACA,IAAMI,EAASlE,KACf,OAAIkE,EACFA,EAAOC,QAAQT,IAEfA,EAAQ1iB,MAAMojB,SAAW,QACzBV,EAAQ1iB,MAAMqjB,MAAQ,WACtBroB,SAAS2B,KAAKwmB,QAAQT,IAExBzI,GAAUyI,GACH,CACT,CA6BAY,eAAeC,GACb5S,EACA6S,GAEA,IAAMC,IAAaC,GACnBC,IAAqBC,QACrB,IAAMC,EACuB,mBAApBC,gBAAiC,IAAIA,gBAAoB,KAClEH,GAAsBE,EACtB,IAAME,EAAUF,EACZ3mB,OAAOuD,WAAW,IAAMojB,EAAWD,QAAS,KAC5C,KACJI,GAAe,KACf/J,IAASpa,SACToa,GAAU,KACV,IACE,IAAM6B,QAAiB5e,OAAOme,MAlMzB,GAhBT,WACE,IAAMtb,EAAQ7C,OAAyBsS,SAASiL,QAAQ1a,KACxD,GAAoB,iBAATA,EAAmB,MAAO,IACrC,IACE,IAAMgC,EAAS,IAAI7G,IAAI6E,EAAM3F,SAASC,QACtC,OAAI0H,EAAO1H,SAAWD,SAASC,QAAU0H,EAAOjG,QAAUiG,EAAO2Y,KACxD,IACF3Y,EAAOzH,SAAS2pB,SAAS,KAC5BliB,EAAOzH,SACP,GAAGyH,EAAOzH,WAChB,OACE,MAAO,GACT,CACF,CAGY4pB,YAkMiD,CACvDC,QAAS,CAAEC,OAAQ,uBACfP,EAAa,CAAEQ,OAAQR,EAAWQ,QAAW,CAAC,IAEpD,IAAKvI,EAASC,GAAI,OAClB,IAAMuI,QAAcxI,EAASiB,OAKvBmF,EAAWoC,EAAKC,qBAChBC,EAtDV,SACEC,EACAzJ,GAEA,GAAkC,IAA9BA,EAAOiG,YAAY5kB,QAA8C,IAA9B2e,EAAOkG,YAAY7kB,OACxD,OAAO,EACT,IAAK2F,MAAMC,QAAQwiB,GAAQ,OAAO,EAClC,IAAMC,EAAW,IAAI7T,IAAImK,EAAOiG,aAC1BvR,EAAW,IAAImB,IAAImK,EAAOkG,aAChC,OAAOuD,EAAMlT,KAAMJ,IACjB,IAAKA,GAAwB,iBAATA,EAAmB,OAAO,EAC9C,IAAM0R,EAAO1R,EACP1B,EACuB,iBAApBoT,EAAK8B,YAAsD,iBAApB9B,EAAK8B,WAC/C,yBAAyB9B,EAAK8B,aAC9B,KACA5T,EACuB,iBAApB8R,EAAK+B,YAAsD,iBAApB/B,EAAK+B,WAC/C,gCAAgC/B,EAAK+B,aACrC,KACN,OACe,OAAZnV,GAAoBiV,EAAS9S,IAAInC,IACrB,OAAZsB,GAAoBrB,EAASkC,IAAIb,IAGxC,CA6B2B8T,CACrBP,EAAKG,MACL9T,EAAO6Q,mBAET,GAAIiC,IAAaC,IAAmB7d,KAAY8K,EAAQ,OACxD,IAAMmU,EAAmBR,EAAK5T,WAAaC,EAAOD,SAMlD,GALAqU,GAAgBvR,IAAI7C,EAAOxO,aAAcqiB,GAAkBM,KACtDN,IAAmBM,KACtBd,GAAe,KACfnD,OAGCiE,GACmB,iBAAb5C,IACNlhB,OAAOyR,cAAcyP,IACtBA,EAAW,IACVsC,EAED,OACFR,GAAe9B,EACfsB,MACI7S,EAAOqU,eAAe/C,GAAOC,EAAUvR,EAC7C,OAEA,SACkB,OAAZoT,GAAkB7mB,OAAOuB,aAAaslB,GACtCJ,KAAwBE,IAAYF,GAAsB,KAChE,CACF,CAyBO,SAASsB,GACdtc,EACA2H,EACAkT,GAGA,GADA0B,MACKvc,EAAU,OACf,IAAMgI,EAtQR,SACEhI,EACA2H,GAEA,UAAWpT,OAAW,IAAa,OAAO,KAC1C,IAAMioB,EAAWjoB,OAAyBsS,QAC1C,IAAK2V,EAAS,OAAO,KACrB,IAAMzU,EAAWyU,EAAQzU,UAAUC,OACnC,GAAwB,iBAAbD,IAA0B,aAAalH,KAAKkH,GAAW,OAAO,KACzE,IAAM3C,EAvDR,SAA4B2C,GAC1B,IACE,IAAM8B,EAAQ,IAAIsP,KAAKC,aAAa,KAAM,CACxC/hB,MAAO,WACP0Q,aACC0U,kBAAkBC,sBACrB,MAAwB,iBAAV7S,GACZxR,OAAOskB,UAAU9S,IACjBA,GAAS,GAETA,GAAS,EACPA,EACA,IACN,OACE,OAAO,IACT,CACF,CAuCqB+S,CAAmB7U,GACtC,GAAmB,OAAf3C,EAAqB,OAAO,KAChC,IAAMoS,EAA+B,GACrC,QAAWpf,KAAc4H,EAASqI,YAAa,CAC7C,IAAMC,EAAaX,EAAYY,KAC5BC,GAASA,EAAKhP,eAAiBpB,EAAWqQ,eAEvCL,EAAUE,EACZlQ,EAAW2O,SAASuB,EAAWjO,kBAC/B,EACEwiB,EAAW1E,GACf/f,EAAW2O,WACHuB,GAAYc,UACpBhB,GAEIyQ,EAAoBgE,EAAShE,kBAE7BE,GADuB8D,EAAS/D,iBACd+D,EAAS9D,iBACjC,IACG3Q,GAC+B,MAA/BhQ,EAAW+Q,kBACV/Q,EAAW+Q,mBAAqBb,GAAYnQ,iBAC7C4gB,GAAmBhR,IAAa3P,EAAW2P,UAIrB,SAAtBK,EAAQsQ,YAAyBpQ,GAAYc,UAE9C,SAEF,IAAMuP,EACkB,OAAtBvQ,EAAQuQ,UACJ,KACAK,GAAe5Q,EAAQuQ,UAAWvT,GACd,OAAtBgD,EAAQuQ,WAAoC,OAAdA,IAGlCyD,GAAgBvR,IACdzS,EAAWqQ,eACX,GAEF+O,EAAWnO,KAAK,CACd7P,aAAcpB,EAAWqQ,cACzBV,WACAK,UACAyQ,oBACAwD,eAAgB/T,GAAYc,WAAmC,SAAtBhB,EAAQsQ,UACjDM,eAAgBL,EAChBvT,eAEJ,CACA,OAA6B,IAAtBoS,EAAW9jB,OAAe8jB,EAAW,GAAK,IACnD,CAyMiBsF,CAAe9c,EAAU2H,GACnCK,IACL9K,GAAU8K,EACV+U,GAA2BvK,GAAsB,KAC3CtV,KAAY8K,GAAa4S,GAAY5S,EAAQ6S,KAlCrD,SAAkC7S,IAChCgV,GAAoB,IAAI7M,iBAAiB,KACX,OAAxB8M,KACJA,GAAsB1oB,OAAOuD,WAAW,KAEtC,GADAmlB,GAAsB,KAEpB/f,KAAY8K,GACK,OAAjBqT,KAC6C,IAA7Ce,GAAgB7oB,IAAIyU,EAAOxO,cAE3B,OACF,IAAM0jB,EAAS7G,MAA6BhkB,SAAS2B,OAChDsd,IAAS5Z,aAAe4Z,GAAQ/G,gBAAkB2S,IACrD5D,GAAO+B,GAAcrT,IAEtB,QAEa5J,QAAQ/L,SAASgC,gBAAiB,CAClDgc,WAAW,EACXE,SAAS,GAEb,CAeE4M,CAAyBnV,GACzBoV,GAAqB3F,GAA+B4F,IAC9CA,GAAWzC,GAAY5S,EAAQ6S,KAEhCD,GAAY5S,EAAQ6S,GAC3B,CAEO,SAAS0B,KACdxB,IAAmB,EACnBC,IAAqBC,QACrBD,GAAsB,KACtB9d,GAAU,KACVkf,GAAgBkB,QAChBjC,GAAe,KACf/J,IAASpa,SACToa,GAAU,KACV8L,OACAA,GAAqB,KACrBJ,IAAmBzf,aACnByf,GAAoB,KACQ,OAAxBC,IAA8B1oB,OAAOuB,aAAamnB,IACtDA,GAAsB,KACtBF,OACAA,GAA2B,IAC7B,CA9bA,IAwBI7f,GACA6f,GACAK,GACAJ,GACAC,GAMA3L,GACA+J,GACAN,GACAC,GACEoB,GCtCAmB,GACAC,GDDNC,GAAA/nB,EAAA,KACA+d,KACAwE,KAsBI/a,GAAiC,KACjC6f,GAAgD,KAChDK,GAA0C,KAC1CJ,GAA6C,KAC7CC,GAAqC,KAMrC3L,GAA8B,KAC9B+J,GAA8B,KAC9BN,GAAkB,EAClBC,GAA8C,KAC5CoB,GAAkB,IAAIzP,MCtC5B+Q,GAAAhoB,EAAA,KAAM6nB,GAAY,WACZC,GAAiB,kBCyBvB,SAASG,GAAUnJ,GACjB,IAAKA,EAAW,OAAO,EACvB,IAAMoJ,EAAY7rB,KAAKiB,MAAMwhB,GAC7B,OAAOnc,OAAOC,SAASslB,IAAcA,GAAa7rB,KAAKC,KACzD,CAEO,SAAS6rB,GACd7d,EACA8d,EACA/a,GAEA,IAAMgb,GAA6C,IAA5Bhb,GAASgb,eAKhC,GAJAC,GAAaD,EACR/d,GAAY,CAAEie,SAAS,EAAOC,aAAc,OAC7C,IAAMle,GAAY,CAAEie,SAAS,EAAOC,aAAc,OAAUC,SAAS,GACzEF,IAAU,GACLD,GAAWC,SAAuC,QAA5BD,GAAWE,cAA0BP,GAAUK,GAAWxJ,WAAY,CAC/F,GAAIuJ,EACF,IACErlB,aAAamL,WAAW,aAC1B,OAAS,CAEX,OAAO,CACT,CAEA,IAA0B,IAAtBma,GAAWhW,QAA+C,WAA5BgW,GAAWE,aAC3CD,IAAU,UAC2B,aAA5BD,GAAWE,aACpBD,MAAkBH,IAAUE,GAAWI,gBAAgB7d,SAASud,QAC3D,CACL,IACMrkB,EA7CV,SAAuB4I,GACrB,IACE,OAAO,IAAInP,gBAAgBzB,SAAS0B,QAAQI,IAAI8O,EAClD,OACE,OAAO,IACT,CACF,CAuCkBgc,CADKL,GAAWM,YAAc,cAE5C,GAAc,MAAV7kB,GAA2B,UAAVA,EAAmB,CACtC,GAAIskB,EACF,IACErlB,aAAamL,WAAW,aAC1B,OAAS,CAEXoa,IAAU,CACZ,MACEA,GA9CN,SAAsBxkB,EAAsB8kB,GAC1C,QAAK9kB,IACA8kB,EACE9kB,IAAU8kB,EADY,MAAV9kB,GAA2B,SAAVA,EAEtC,CA0CgB+kB,CAAa/kB,EAAOukB,GAAWO,MAE7C,CAEA,GAAIP,GAAWG,SAAWJ,EACxB,IACME,GAASvlB,aAAa/E,QAAQ,aAAc,KACA,MAAvC+E,aAAa5F,QAAQ,gBAAuBmrB,IAAU,EACjE,OAAS,CAGX,OAAOA,EACT,CAEO,SAASQ,KACd,GAAIR,GAAS,OAAO,EACpB,GAAIN,GAAUK,GAAWxJ,WAAY,OAAO,EAC5C,IACEyJ,IAAiC,IAAvBD,GAAWC,UACO,IAAvBD,GAAWG,SAC4B,MAAvCzlB,aAAa5F,QAAQ,aAC5B,OACEmrB,IAAU,CACZ,CACA,OAAOA,EACT,CAMO,SAASS,GAASC,EAAkBC,EAAiB1pB,GAE1D,IADKupB,aACMI,QAAY,IAAa,OAEpC,IAAMjB,GAAY,IAAI7rB,MAAO+sB,cAAc9kB,MAAM,GAAI,SACxC,IAAT9E,EACF2pB,QAAQE,IAAI,GAAGC,QAAYpB,QAAgBe,MAAaC,IAAWK,GAAOC,GAAQ,GAAIhqB,GAEtF2pB,QAAQE,IAAI,GAAGC,QAAYpB,QAAgBe,MAAaC,IAAWK,GAAOC,GAAQ,GAEtF,CAEO,SAASC,GAAUR,EAAkBC,EAAiB1pB,GAE3D,IADKupB,aACMI,QAAY,IAAa,OAEpC,IAAMjB,GAAY,IAAI7rB,MAAO+sB,cAAc9kB,MAAM,GAAI,SACxC,IAAT9E,EACF2pB,QAAQO,KAAK,GAAGJ,QAAYpB,QAAgBe,MAAaC,IAAWK,GAAOC,GAAQ,GAAIhqB,GAEvF2pB,QAAQO,KAAK,GAAGJ,QAAYpB,QAAgBe,MAAaC,IAAWK,GAAOC,GAAQ,GAEvF,CAvHA,IASIjB,GACAD,GAmFEgB,GACAC,GACAC,GA/FNG,GAAA3pB,EAAA,KASIuoB,IAAU,EACVD,GAA4B,CAAEC,SAAS,EAAOC,aAAc,OAmF1Dc,GAAS,WACTC,GAAQ,qCACRC,GAAS,oBC5FR,SAASI,GACdjiB,EACAkiB,GAEAC,GAAU3U,IAAIxN,EAAUkiB,EAC1B,CAEO,SAASE,GAAwBpiB,GACtCmiB,GAAUtb,OAAO7G,EACnB,CAEO,SAASqiB,GAAYC,GAC1B,GAAkB,IAAdC,GAIF,QAAYviB,EAAUkiB,KAAaC,GACjC,IACE,IAAMK,EAAUxiB,EAASC,cACrBuiB,EAAQnsB,QAAU6rB,GAAUA,EAASM,EAASxiB,EACpD,OAEA,CAGJuiB,IAAa,EACb,IACE,OAAOD,GACT,SAEE,GAAkB,IADlBC,IAAa,GAEX,QAAWviB,KAAYmiB,GAAU/rB,OAC/B,IACE4J,EAASC,aACX,OAEA,CAGN,CACF,CA3CA,IAAMkiB,GACFI,GADJE,GAAApqB,EAAA,KAAM8pB,GAAY,IAAI7S,IAClBiT,GAAY,ICMhB,SAASG,GAAW3V,GAClB,OAAMA,aAAgBqG,WACXrG,EAAKM,aAAa,OAAS,IAC5BxJ,WAAW,UAAkD,MAAtCkJ,EAAKI,UAAUwV,IAClD,CAXA,IAIMC,GACAD,GALNE,GAAAxqB,EAAA,KAAAoqB,KAIMG,GAA6B,IAAM,CAAC,OAAQ,KAAM,YAAa,QAAQppB,KAAK,KAC5EmpB,GAAqB,CAAC,mBAAoBC,GAA4B,uBAAuBppB,KAAK,OCLxG,SAASspB,GAAc1mB,GACrB,IAAKA,GAA0B,iBAAVA,GAAsBJ,MAAMC,QAAQG,GAAQ,OAAO,EACxE,IAAM2mB,EAAY5sB,OAAO6sB,eAAe5mB,GACxC,OAAO2mB,IAAc5sB,OAAO4sB,WAA2B,OAAdA,CAC3C,CAEO,SAASE,GACd9X,GAEA,IAAKA,GAAwB,iBAATA,GAAqBnP,MAAMC,QAAQkP,GAAO,OAAO,KAErE,IAAMtO,EAASsO,EACf,MAA4B,iBAAjBtO,EAAOkY,MACT5J,EAGS,UAAdtO,EAAO,IAAuC,iBAAdA,EAAO,GAAwB,KAG5D,IADQimB,GAAcjmB,EAAO,IAAMA,EAAO,GAAK,CAAC,EACnCkY,MAAOlY,EAAO,GACpC,CApBA,IAAAqmB,GAAA7qB,EAAA,QCAA,IAAa8qB,GACAC,GACAC,GACPC,GAoBFC,GAvBJC,GAAAnrB,EAAA,KAAa8qB,GAAsB,cACtBC,GAAyB,YACzBC,GAA2B,6BAClCC,GAAmB,qBAoBrBC,GAA8C,SCblD,SAASE,GAAWzb,EAAiB0b,GACnC,IAAKC,GAAW/X,IAAI5D,IAAY2b,GAAW7U,MAAQ,IAAmB,CACpE,IAAM8U,EAASD,GAAWvtB,OAAO8gB,OAAO9a,MACpCwnB,GAAQD,GAAW9c,OAAO+c,EAChC,CACAD,GAAWnW,IAAIxF,EAAS0b,EAC1B,CAEO,SAASG,GAAc7b,EAAiBsM,GAC7C,IAAKtM,GAAWA,EAAQ3R,OAAS,KAAoB,OAAO,EAE5D,GAAIstB,GAAW/X,IAAI5D,GAAU,CAC3B,IAAM8b,EAASH,GAAWztB,IAAI8R,GAC9B,QAAO8b,GAASA,EAAOtgB,KAAK8Q,EAC9B,CAEA,IACE,IAAMoP,EAAW,IAAIhoB,OAAOsM,GAC5B,OAAAyb,GAAWzb,EAAS0b,GACbA,EAASlgB,KAAK8Q,EACvB,OACE,OAAAmP,GAAWzb,EAAS,OACb,CACT,CACF,CAlCA,IAQM2b,GARNI,GAAA1rB,EAAA,KAQMsrB,GAAa,IAAIrU,MCEhB,SAAS0U,GAAiBjmB,GAC/B,OAAOA,EACJiF,QAAQ,qBAAsB,SAC9BC,cACAI,MAAM,cACNkI,KAAM2V,GAAU+C,GAAerY,IAAIsV,GACxC,CAhBA,IAAM+C,GAANC,GAAA7rB,EAAA,KAAM4rB,GAAiB,IAAIpZ,IAAI,CAC7B,QAAS,OAAQ,QAAS,MAAO,SAAU,MAC3C,UAAW,SAAU,MAAO,SAAU,WACtC,YAAa,WAAY,WAAY,UAAW,WAAY,OAC5D,QAAS,WAAY,YAAa,MAAO,SACzC,MAAO,MAAO,OAAQ,MAAO,OAAQ,MAAO,MAC5C,WAAY,SAAU,SAAU,QAAS,OAAQ,UACjD,KAAM,WAAY,YAAa,MAAO,MAAO,UCExC,SAASsZ,KACd,MAAwB,WAAjBC,EACT,CAEO,SAASC,GAAOC,EAAcC,GACnC,GAAIJ,YACS3C,QAAY,KACrBA,QAAQO,KAAK,kDAAoDwC,GAAe,iBAKpF,IAEE,IAAIC,SAASF,GADEC,EAAc,wBAA0BA,EAAc,MAAQ,IAC7E,EACF,OAASE,UACIjD,QAAY,KACrBA,QAAQkD,MAAM,uBAAyBH,GAAe,WAAa,IAAKE,EAE5E,CACF,CA7BA,IAEIL,GACEO,GAHNC,GAAAvsB,EAAA,KAEI+rB,GAA+B,SAC7BO,GAAoB,qBCa1B,SAASE,KACP,IACE,OAAOnvB,KAAKC,MAAM0F,aAAa5F,QAAQ6F,KAAgB,KACzD,OACE,MAAO,CAAC,CACV,CACF,CAmBA,SAASwpB,GACPC,EACA9Z,EACApT,GAEIktB,EAAKC,WAVX,SAAsBC,EAAgBjoB,GAEpC,OADc6nB,KACAI,IAAW,IAAI/hB,SAASlG,EACxC,CAOwBkoB,CAAaH,EAAK7qB,GAAI+Q,EAAWjO,eACnD+nB,EAAKC,WAvBX,SAAmBC,EAAgBjoB,GACjC,IAAMmoB,EAAQN,KACRhkB,EAAOskB,EAAMF,IAAW,GAC9B,IAAKpkB,EAAKqC,SAASlG,GAAc,CAC/B6D,EAAKmL,KAAKhP,GACVmoB,EAAMF,GAAUpkB,EAChB,IACExF,aAAa/E,QAAQgF,GAAa5F,KAAKa,UAAU4uB,GACnD,OAAS,CACX,CACF,CAasBC,CAAUL,EAAK7qB,GAAI+Q,EAAWjO,aAC9CqoB,IAAQA,GAAON,EAAK7qB,GAAI+Q,EAAYpT,GAC1C,CAMA,SAASytB,GACP3qB,EACA4qB,GAEA,IAAKA,GAASlvB,OAAQ,MAAO,CAAC,EAC9B,IAAMwB,EAAgC,CAAC,EACvC,QAAW2tB,KAAQD,EACjB,IAAIpB,QAAuBH,GAAiBwB,EAAKC,WAC5CD,EAAKE,WAAa1B,GAAiBwB,EAAKE,YAC7C,GAAoB,cAAhBF,EAAKxV,QAA0BwV,EAAKE,UACtC7tB,EAAK2tB,EAAKC,UAAY9qB,EAAG0S,aAAamY,EAAKE,gBAAS,GAC3B,gBAAhBF,EAAKxV,OACdnY,EAAK2tB,EAAKC,WAAa9qB,EAAGR,aAAe,IAAIb,OAAOqD,MAAM,EAAG,UAAG,GACvC,YAAhB6oB,EAAKxV,QAAwBwV,EAAKE,UAAW,CAEtD,IAAM3nB,EAAMynB,EAAKE,UACd1iB,QAAQ,SAAU,IAClBA,QAAQ,YAAa,CAAC2iB,EAAGC,IAAcA,EAAEC,eAC5ChuB,EAAK2tB,EAAKC,UAAa9qB,EAAmBoX,UAAUhU,IAAQ,IAC9D,CAEF,OAAOlG,CACT,CAEA,SAASiuB,GAAYnrB,EAAamN,GAChC,OAAQnN,EAAGR,aAAe,IACvBb,OACA2J,cACAC,SAAS4E,EAAKxO,OAAO2J,cAC1B,CAEA,SAAS8iB,GAAWjd,EAAgBhB,GAClC,IAAInN,EAAqBmO,EACnBkd,EAASle,EAAKxO,OAAO2J,cAC3B,KAAOtI,GAAMA,IAAO3F,SAASgC,iBAAiB,CAC5C,IAAK2D,EAAGR,aAAe,IAAIb,OAAO2J,cAAcC,SAAS8iB,GAAS,OAAOrrB,EACzEA,EAAKA,EAAGuS,aACV,CACA,OAAO,IACT,CAEA,SAAS+Y,GAAYxB,GACnB,IAAMzP,EAASyP,EAAEzP,OACjB,GAAKA,GAAQ7H,QACb,QAAW3N,KAAS0mB,GAAkB,CACpC,IAAQrU,WAAUsU,aAAc3mB,EAAMulB,KACtC,IAAKlT,IAAasU,EAAW,SAE7B,IAAIC,EAA0B,KAE9B,GAAIvU,GAIF,GAHAuU,EAAUpR,EAAO7H,QAAQ0E,IACpBuU,GAEDD,IAAcL,GAAYM,EAASD,GAAY,iBAC1CA,IAETC,EAAUL,GAAW/Q,EAAQmR,IACxBC,GAAS,SAGhB,IAAMC,EAAWf,GAAsBc,EAAU5mB,EAAMulB,KAAKQ,SAC5DT,GAAStlB,EAAMulB,KAAMvlB,EAAMyL,WAAYob,EACzC,CACF,CA0EO,SAASC,KACdJ,GAAmB,GACfK,KACFvxB,SAAS2C,oBAAoB,QAAS4uB,IAAe,GACrDA,GAAgB,KAEpB,CAvMA,IAWMjrB,GACF+pB,GACAkB,GACAL,GAdJM,GAAAnuB,EAAA,KACA0rB,KACAG,KACAU,KAQMtpB,GAAc,aAChB+pB,GAA8B,KAC9BkB,GAA6C,KAC7CL,GAA6D,KCJjE,SAASO,GAAU9jB,GACjB,OAAOA,GAAU+jB,oBAAsB,aACzC,CAEA,SAASC,GAAWhkB,GAClB,IAAMikB,EAAM5rB,OAAO2H,GAAUkkB,oBAAsB,KACnD,OAAO7rB,OAAOC,SAAS2rB,GAAO/vB,KAAKC,IAAI,GAAID,KAAKmmB,IAAI,IAAKnmB,KAAKqE,MAAM0rB,KAAS,GAC/E,CAEO,SAASE,GAAsBnkB,GACpC,IAAMob,EAAU/iB,OAAO2H,GAAUmkB,uBAAyB,KAC1D,OAAO9rB,OAAOC,SAAS8iB,GAAWlnB,KAAKC,IAAI,GAAID,KAAKmmB,IAAI,IAAMnmB,KAAKqE,MAAM6iB,KAAa,GACxF,CAEA,SAASgJ,GAAepkB,GACtB,OAAQA,GAAUqkB,SAAW,IAC1B3hB,IAAKd,GAAWA,EAAOjL,OAAO0J,QAAQ,gBAAiB,IAAIA,QAAQ,QAAS,IAAIC,eAChF6H,OAAOgM,QACZ,CAkDA,SAASmQ,GAAY9xB,EAAkB6xB,GACrC,IAAMjkB,EAAa5N,EAAS8N,cAC5B,OAAO+jB,EAAQzb,KAAMhH,GAAWxB,IAAewB,GAAUxB,EAAWkb,SAAS,IAAI1Z,KACnF,CAoDA+Y,eAAsB4J,GACpBvkB,EACAwkB,EACAC,GAEA,IAAKhsB,WAAWhH,WAAa2yB,GAAepkB,GAAUtM,SAAW8wB,EAAQ,OAAO,KAChF,IAAM/qB,EAAQ,IAAIlH,IAAIkG,WAAWhH,SAASuS,MAAMC,aAAa1Q,IAAIuwB,GAAU9jB,IAC3E,IAAKvG,EAAO,OAAO,KACnB,IACE,IAAMirB,QAAiBD,EAAYhrB,GACnC,OAAOirB,GAAgC,iBAAbA,EA1G9B,SAA+BtrB,EAAiCorB,GAC9D,IACE,IAAMG,EAA4B,iBAAfvrB,EAAOurB,IAAmBvrB,EAAOurB,IAAM,EAC1D,IAAKA,GAAOzwB,KAAKqE,MAAMxG,KAAKC,MAAQ,KAAQ2yB,GAAOvrB,EAAOwrB,OAASJ,EAAQ,OAAO,KAClF,IAAMK,EAAwC,iBAArBzrB,EAAOyrB,UAAyBzrB,EAAOyrB,eAAY,EACtEC,EAAoC,iBAAf1rB,EAAO2rB,IAAmB3rB,EAAO2rB,SAAM,EAC5DvhB,EAAmC,CAAC,EACpCmE,EAActO,MAAMC,QAAQF,EAAOuO,aACrCvO,EAAOuO,YACPtO,MAAMC,QAAQF,EAAO4rB,KACnB5rB,EAAO4rB,IACP,GACN,GAAI3rB,MAAMC,QAAQqO,GAChB,QAAWa,KAAQb,EAAa,CAC9B,IAAKa,GAAwB,iBAATA,EAAmB,SACvC,IAAMtO,EAASsO,EACoB,iBAAxBtO,EAAOV,cAA2D,iBAAvBU,EAAOG,YAC3DmJ,EAAStJ,EAAOV,cAAgBU,EAAOG,YACV,iBAAbH,EAAO4nB,GAAsC,iBAAb5nB,EAAO+qB,IACvDzhB,EAAStJ,EAAO4nB,GAAK5nB,EAAO+qB,EAEhC,CAEF,MAAO,CAAEJ,UAAWC,GAAeD,EAAWrhB,WAChD,OACE,OAAO,IACT,CACF,CAgFQ0hB,CAAsBR,EAAqCF,GAC3D,IACN,OACE,OAAO,IACT,CACF,CArJA,IAAAW,GAAAzvB,EAAA,QCiBO,SAAS0vB,KACd,IAAMptB,EAAK3F,SAASmE,eAAeC,IAC/BuB,GAAIA,EAAGd,QACb,CApBA,IAcMT,GAdN4uB,GAAA3vB,EAAA,KAcMe,GAAW,cCdjB6uB,GAAA5vB,EAAA,QCmCA,SAAS6vB,GAAoB1oB,GAC3B,GAA8B,SAA1BA,EAAM2oB,SAASxT,OACjBnV,EAAM4oB,aAAepsB,MAAM0S,KAAKlP,EAAM7E,GAAG0tB,iBAAU,GAChB,UAA1B7oB,EAAM2oB,SAASxT,QAAgD,aAA1BnV,EAAM2oB,SAASxT,OAAuB,CACpF,IAAM3a,EAASwF,EAAM7E,GAAmBX,MACxCwF,EAAM8oB,cAAgBnyB,OAAOC,KAAKoJ,EAAM2oB,SAASI,QAAU,CAAC,GAAGljB,IAAKF,GAAS,CAC3EA,EAAOqjB,GAAyBrjB,GAChCnL,EAAMyuB,iBAAiBtjB,IAE3B,CACF,CAEA,SAASujB,GAAuBlpB,EAAcmpB,GAI5C,SAHmBnpB,EAAM4oB,cAAgB,IAAI7c,KAC1CwB,GAASA,EAAK1S,aAAemF,EAAM7E,GAAGyS,SAASL,MAG9CrY,KAAKC,MAAQ6K,EAAMopB,UAAYC,KAC9BF,ICwRA,SAA0C1U,EAAkBpU,GACjE,QAAWZ,KAAY6pB,GACrB,GACoB,YAAlB7pB,EAAS8pB,MACT9pB,EAASgV,UAAYA,GACC,cAAtBhV,EAASwmB,UACiB,iBAAnBxmB,EAAS7C,OAEZ6C,EAAS7C,QAAUyD,EAAS,OAAO,EAG3C,OAAO,CACT,CDjSUmpB,CAAiCxpB,EAAM7E,GAAI6E,EAAM7E,GAAGsuB,WAC9D,CAOA,SAASC,KACP,UAAWhyB,OAAW,IAAa,OAAO,KAC1C,IAAM8d,EAAS9d,OACf,OAAO8d,EAAOmU,WAAanU,EAAOmU,YAAc,CAAC,CACnD,CAEA,SAAS7W,GAAQ9S,EAAc3C,GAC7B,IAAK2C,EAAM7E,GAAGN,YAAa,OAAO,EAClC,IAAMsa,EAASnV,EAAM2oB,SAASxT,OAC9B,GAAe,UAAXA,GAAiC,aAAXA,EAAuB,CAC/C,GAAoB,eAAhB9X,EAAOmE,MAAyBnE,EAAOmY,SAAWxV,EAAM7E,IAA+B,UAAzBkC,EAAOusB,cAA2B,OAAO,EAC3G,IAAMpvB,EAASwF,EAAM7E,GAAmBX,MACxC,OAAOwF,EAAM8oB,cAAe/c,KAC1B,EAAEpG,EAAM/I,KAAWpC,EAAMyuB,iBAAiBtjB,KAAU/I,EAExD,CACA,GAAe,cAAXuY,EAAwB,CAC1B,GAAoB,eAAhB9X,EAAOmE,MAAyBnE,EAAOmY,SAAWxV,EAAM7E,KAAOkC,EAAOusB,cAAe,OAAO,EAChG,IAAMC,EAAWxsB,EAAOusB,gBAAkB5pB,EAAM2oB,SAASzC,WAAWvgB,KAChE3F,EAAM2oB,SAASzC,UAAUtpB,MACzBoD,EAAM2oB,SAAS1N,aAAa5d,EAAOusB,eACvC,YAAoB,IAAbC,GAA0B7pB,EAAM7E,GAAG0S,aAAaxQ,EAAOusB,iBAAmBC,CACnF,CACA,MAAe,SAAX1U,GACmB,eAAhB9X,EAAOmE,MAAyBxB,EAAM7E,GAAGR,cAAgBqF,EAAM2oB,SAASrgB,IACjF,CAEA,SAASwhB,GAAY9pB,GACnBgjB,GAAQpoB,IAAIoF,GACkB,SAA1BA,EAAM2oB,SAASxT,QAAmB4U,GAAWnvB,IAAIoF,EACvD,CA9FA,IAiCMqpB,GA0BArG,GACA+G,GACAC,GACFC,GA9DJC,GAAArxB,EAAA,KACAsxB,KACAlH,KA+BMoG,GAA4B,IA0B5BrG,GAAU,IAAI3X,IACd0e,GAAa,IAAI1e,IACjB2e,GAAQ,IAAIla,IACdma,GAAuB,OCCpB,SAASG,GAAwBzkB,EAAc/I,GACpD,IAAMytB,EAAiB1kB,EAAK7L,OAAO2J,cACnC,IAAK4mB,GAAkBA,EAAehmB,WAAW,OAA4B,WAAnBgmB,EACxD,OAAO,EAET,GAAc,OAAVztB,IAAmB0tB,GAAele,IAAIie,GAAiB,OAAO,EAClE,IAAME,EAAkB3tB,EAAM4G,QAAQ,oBAAqB,IAAIC,cAC/D,GAAI8mB,EAAgBlmB,WAAW,eAAgB,OAAO,EACtD,IAAKkmB,EAAgBlmB,WAAW,SAAU,OAAO,EACjD,IAAMmmB,EAAYD,EAAgBptB,MAAM,GAAG0G,MAAM,OAAQ,GAAG,GAC5D,OAAO4mB,GAA0Bre,IAAIoe,EACvC,CAEA,SAASE,GAAqBC,GAC5B,IAAMC,EFzED,SAAsBD,GAC3B,IAAME,GAAM,IAAIC,WAAYC,gBAAgBJ,EAAM,aAGlD,QAAWK,KAAUxuB,MAAM0S,KAAK2b,EAAI1b,iBAAiB,WACnD6b,EAAO3wB,SAIT,QAAWc,KAAMqB,MAAM0S,KAAK2b,EAAI1zB,KAAKgY,iBAAiB,MACpD,QAAW8b,KAAQzuB,MAAM0S,KAAK/T,EAAG8f,aAE3BgQ,EAAKtlB,KAAKlC,cAAcY,WAAW,OAMtB,CAAC,OAAQ,MAAO,SAAU,aAAc,cAC5CX,SAASunB,EAAKtlB,KAAKlC,gBAChBwnB,EAAKruB,MAAM4G,QAAQ,OAAQ,IAAIC,cACnCY,WAAW,iBARrBlJ,EAAG+vB,gBAAgBD,EAAKtlB,MAe9B,OAAOklB,EAAI1zB,KAAKsyB,SAClB,CE4CoB0B,CAAaR,GAC/B,IAAKhG,KAAoB,OAAOiG,EAChC,IAAM/N,EAAWrnB,SAASiF,cAAc,YACxCoiB,EAAS4M,UAAYmB,EACrB,QAAWnW,KAAWjY,MAAM0S,KAAK2N,EAASuO,QAAQjc,iBAAiB,MACjE,QAAW+W,KAAa1pB,MAAM0S,KAAKuF,EAAQwG,YACpCmP,GAAwBlE,EAAUvgB,KAAMugB,EAAUtpB,QACrD6X,EAAQyW,gBAAgBhF,EAAUvgB,MAIxC,OAAOkX,EAAS4M,SAClB,CAEO,SAAST,GAAyBrjB,GAOvC,IAFKA,GACDA,EAAKtB,WAAW,OAChBsB,EAAKjC,SAAS,KAAM,OAAOiC,EAE/B,IAAIjJ,EAAMiJ,EAAKnC,QAAQ,SAAW6nB,GAAM,IAAMA,EAAE5nB,eAEhD,OAAI/G,EAAI2H,WAAW,SAAQ3H,EAAM,IAAMA,GAChCA,CACT,CAEO,SAAS4uB,GAAe3C,EAAoBpf,GACjD,OACEof,EAASxT,OACT,IACA5L,EACA,KACCof,EAAStW,UAAY,IACtB,KACCsW,EAASgC,MAAQhC,EAASrgB,MAAQ,GAEvC,CAEO,SAASijB,GAAepW,GAC7B,MAAkB,iBAAXA,GAAwC,gBAAXA,CACtC,CAmEA,SAASqW,GAAgB/rB,GACvB,OAAQA,EAAS8pB,MACf,IAAK,UACuB,cAAtB9pB,EAASwmB,SACXxmB,EAASgV,QAAQgV,UAAYhqB,EAAS7C,OAAS,GAE/C6C,EAASgV,QAAQ9Z,YAAc8E,EAAS7C,MAE1C,MACF,IAAK,YACH,QAAa+I,OAAM/I,WAAW6C,EAASiZ,OACvB,OAAV9b,EAAgB6C,EAASgV,QAAQyW,gBAAgBvlB,GAChDlG,EAASgV,QAAQtG,aAAaxI,EAAM/I,GAE3C,MACF,IAAK,QACH,QAAa+I,OAAM/I,QAAO6uB,cAAchsB,EAASiZ,OAC3C9b,EAAO6C,EAASgV,QAAQja,MAAMkxB,YAAY/lB,EAAM/I,EAAO6uB,GACtDhsB,EAASgV,QAAQja,MAAMmxB,eAAehmB,GAE7C,MACF,IAAK,SACH,IAAKlG,EAAS4gB,QAAU5gB,EAASgV,QAAQmX,WAAY,OACrD,IACEnsB,EAAS4gB,OAAO3N,aAAajT,EAASgV,QAAShV,EAASosB,YAC1D,OACEpsB,EAAS4gB,OAAOtlB,YAAY0E,EAASgV,QACvC,CACA,MACF,IAAK,SACH,QAAWlH,KAAQ9N,EAASqsB,MAAOve,EAAKqe,YAAYG,YAAYxe,GAGtE,CAEO,SAASye,GAAerD,EAAoBlU,GACjD,OAAQkU,EAASxT,QACf,IAAK,OAC0B,iBAAlBwT,EAASgC,OAAmBlW,EAAQgV,UAAYiB,GAAqB/B,EAASgC,OACzF,MACF,IAAK,OACL,IAAK,UAC0B,iBAAlBhC,EAASrgB,OAAmBmM,EAAQ9Z,YAAcguB,EAASrgB,MACtE,MACF,IAAK,YAWH,GAVIqgB,EAASzC,aACNvB,MACDyF,GAAwBzB,EAASzC,UAAUvgB,KAAMgjB,EAASzC,UAAUtpB,UACrC,OAA7B+rB,EAASzC,UAAUtpB,MACrB6X,EAAQyW,gBAAgBvC,EAASzC,UAAUvgB,MAE3C8O,EAAQtG,aAAawa,EAASzC,UAAUvgB,KAAMgjB,EAASzC,UAAUtpB,QAInE+rB,EAAS1N,WACX,QAAYtV,EAAM/I,KAAUjG,OAAO6B,QAAQmwB,EAAS1N,YAC9C0J,OAAuByF,GAAwBzkB,EAAM/I,KAC3C,OAAVA,EAAgB6X,EAAQyW,gBAAgBvlB,GACvC8O,EAAQtG,aAAaxI,EAAM/I,IAGpC,MACF,IAAK,QACL,IAAK,WACH,GAAI+rB,EAASI,OACX,QAAYpjB,EAAM/I,KAAUjG,OAAO6B,QAAQmwB,EAASI,QACjDtU,EAAwBja,MAAMkxB,YAC7B1C,GAAyBrjB,GACzB/I,GAIN,MACF,IAAK,SACH6X,EAAQpa,SACR,MACF,IAAK,eAC0B,iBAAlBsuB,EAASgC,MAClBlW,EAAQwX,mBAAmB,cAAevB,GAAqB/B,EAASgC,OAE1E,MACF,IAAK,cAC0B,iBAAlBhC,EAASgC,MAClBlW,EAAQwX,mBAAmB,WAAYvB,GAAqB/B,EAASgC,OAI7E,CAEO,SAASuB,GAAkBzX,EAAkBlW,GAClD,IAAM8hB,EAAS5L,EAAQ/G,cACvB,QAAK2S,GACE7jB,MAAM0S,KAAKmR,EAAOlR,iBAAiB,IAAMgd,GAAc,MAAMpgB,KACjEpI,GAAcA,EAAUkK,aAAase,MAAiB5tB,EAE3D,CAMA,SAAS6tB,GACPzD,EACAlU,EACA4X,EACA9tB,GAEA,OAAOskB,GAAS,KACd,GAAI0I,GAAe5C,EAASxT,QAAS,CACnC,IAAMkL,EAAS5L,EAAQmX,WACvB,IAAKvL,GAAmC,iBAAlBsI,EAASgC,KAAmB,OAAO,KACzD,IAAM2B,EAAkB7X,EAAQ6X,gBAC1BT,EAAcpX,EAAQoX,YAC5BG,GAAerD,EAAUlU,GACzB,IAAM8X,EAAwB,GAC1BlsB,EAA8B,iBAApBsoB,EAASxT,OAClBmX,EAAkBA,EAAgBT,YAAcxL,EAAOmM,WACxD/X,EAAQoX,YACNY,EAA+B,iBAApB9D,EAASxT,OAA4BV,EAAUoX,EAChE,KAAOxrB,GAAWA,IAAYosB,GAC5BF,EAAc/f,KAAKnM,GACnBA,EAAUA,EAAQwrB,YAEpB,IAAMa,EAAmBH,EAAcjhB,OACpCiC,GAA0BA,aAAgBqG,SAE7C,OAAIrV,GAAKmuB,EAAiBnZ,QAASoZ,GA7BlC,SAAsBxxB,EAAaoD,GACvCpD,EAAmBgT,aAAage,GAAa5tB,EAChD,CA2BsDquB,CAAaD,EAAUpuB,IACnEguB,EAAc11B,QAAQw1B,EAAU7f,KAAK,CAAE+c,KAAM,SAAUuC,MAAOS,IAC3DG,EAAiB,IAAM,IAChC,CACA,OApMJ,SACE/D,EACAlU,EACA4X,EAAgC/C,IAEhC,OAAQX,EAASxT,QACf,IAAK,OACHkX,EAAU7f,KAAK,CACb+c,KAAM,UACN9U,UACAwR,SAAU,YACVrpB,MAAO6X,EAAQgV,YAEjB,MACF,IAAK,OACL,IAAK,UACH4C,EAAU7f,KAAK,CACb+c,KAAM,UACN9U,UACAwR,SAAU,cACVrpB,MAAO6X,EAAQ9Z,cAEjB,MACF,IAAK,YAAa,CAChB,IAAM+K,EAAQ,IAAI2F,IACdsd,EAASzC,WAAWxgB,EAAM9K,IAAI+tB,EAASzC,UAAUvgB,MACjDgjB,EAAS1N,YACXtkB,OAAOC,KAAK+xB,EAAS1N,YAAY1H,QAAS5N,GAASD,EAAM9K,IAAI+K,IAE/D0mB,EAAU7f,KAAK,CACb+c,KAAM,YACN9U,UACAiE,OAAQlc,MAAM0S,KAAKxJ,GAAOG,IAAKF,KAC7BA,OACA/I,MAAO6X,EAAQ5G,aAAalI,QAGhC,KACF,CACA,IAAK,QACL,IAAK,WAAY,CACf,IAAMnL,EAASia,EAAwBja,MACjCkL,EAAQ/O,OAAOC,KAAK+xB,EAASI,QAAU,CAAC,GAAGljB,IAAImjB,IACrDqD,EAAU7f,KAAK,CACb+c,KAAM,QACN9U,QAASA,EACTiE,OAAQhT,EAAMG,IAAKF,KACjBA,OACA/I,MAAOpC,EAAMyuB,iBAAiBtjB,GAC9B8lB,SAAUjxB,EAAMqyB,oBAAoBlnB,QAGxC,KACF,CACA,IAAK,SACH0mB,EAAU7f,KAAK,CACb+c,KAAM,SACN9U,UACA4L,OAAQ5L,EAAQmX,WAChBC,YAAapX,EAAQoX,cAI7B,CAqIIiB,CAAiBnE,EAAUlU,EAAS4X,GACpCL,GAAerD,EAAUlU,GAClB,MAEX,CAEO,SAASsY,GAAqBpE,EAAoBlU,EAAkBlW,GACzE,OAAO6tB,GAAkCzD,EAAUlU,EAAS6U,GAAmB/qB,EACjF,CAqDO,SAASyuB,GAAeC,EAAuB/mB,EAAwB,CAAC,IAhC/E,SACE+mB,EACA/mB,EACAmmB,GAEA,IAAM9xB,EAAO2L,EAAQ3L,MAAQ/E,SAC7By3B,EAAU1Z,QAAQ,CAACoV,EAAUpf,KAC3B,IAAI2jB,EACJ,IACEA,EAAW3yB,EAAK4U,iBAAiBwZ,EAAStW,SAC5C,OAEE,YADAnM,EAAQinB,SAASxE,EAAUpf,EAE7B,CACwB,IAApB2jB,EAASr2B,OAIbq2B,EAAS3Z,QAASkB,IAChB,IAAMlW,EAAM+sB,GAAe3C,EAAUpf,GACrC,GAAIgiB,GAAe5C,EAASxT,QAAS,CACnC,GAAI+W,GAAkBzX,EAASlW,GAAM,OAGrC,OAFA6tB,GAAkCzD,EAAUlU,EAAS4X,EAAW9tB,QAChE2H,EAAQknB,YAAYzE,EAAUlU,EAASlL,EAEzC,CACA6iB,GAAkCzD,EAAUlU,EAAS4X,EAAW9tB,GAChE2H,EAAQknB,YAAYzE,EAAUlU,EAASlL,KAZvCrD,EAAQinB,SAASxE,EAAUpf,IAejC,CAGE8jB,CAA4BJ,EAAW/mB,EAASojB,GAClD,CA7XA,IAYM6C,GAwCA7C,GAEAgB,GACAG,GAvDNN,GAAAtxB,EAAA,KACA4vB,KACAxF,KACAiH,KACA9E,KAQM+G,GAAc,qBAwCd7C,GAAwC,GAExCgB,GAAiB,IAAIjf,IAAI,CAAC,OAAQ,MAAO,SAAU,aAAc,eACjEof,GAA4B,IAAIpf,IAAI,CACxC,YACA,aACA,YACA,aACA,iBC9CK,SAASiiB,KACd,UAAW51B,OAAW,YAAsBlC,SAAa,IAAa,OAAO,KAC7E,IAAM+3B,EAAU71B,OAChB,YAAyB,IAArB61B,EAAQC,UAA0Bh4B,SAASmZ,cAAc,WAAmB,YAEpD,IAA1B4e,EAAQE,oBACa,IAArBF,EAAQG,UACRl4B,SAASmZ,cAAc,YACvBnZ,SAASmZ,cAAc,iCAChB,OACFnZ,SAASmZ,cAAc,0BAA4B,kBAAoB,IAChF,CAYO,SAASgf,KACd,OAAOC,GAAQ,CACjB,CAEO,SAASC,KACdC,KAAe54B,KAAKC,MACpB+iB,GAAQ3E,QAASsL,GAAWA,IAC9B,CAEO,SAASkP,GACdz0B,EACA4M,EAA0C,CAAC,GAE3C,IAAM8nB,EAAU94B,KAAKC,MACf84B,EAAmBzyB,OAAOC,SAASnC,GACrCjC,KAAKC,IAAI,EAAGD,KAAKmmB,IAAI,IAAQlkB,IAC7B,IACJ,GACE20B,EAAmB,IACU,IAA7B/nB,EAAQgoB,mBACPJ,WACMt4B,SAAa,KACI,YAAxBA,SAAS24B,YACgB,OAAzBb,KAOA,OAAO,IAAIpsB,QAASL,IAClB,IAAIutB,GAAU,EACRC,EAAU,KACVD,IACJA,GAAU,EACVn1B,aAAaq1B,GACb94B,SAAS2C,oBAAoB,mBAAoBk2B,GACjDnW,GAAQ7Q,OAAOgnB,GAEVN,GADa12B,KAAKC,IAAI,EAAG22B,GAAoB/4B,KAAKC,MAAQ64B,IAChC9nB,GAASmQ,KAAKxV,KAE/CrL,SAASuC,iBAAiB,mBAAoBs2B,EAAS,CAAEn2B,MAAM,IAI/DggB,GAAQtd,IAAIyzB,GACZ,IAAMC,EAAWrzB,WAAWozB,EAASJ,KAGzC,IAAMM,EAA6C,OAAzBjB,KACpBkB,GAAqD,IAA7BtoB,EAAQgoB,iBAChCO,GACyB,IAA7BvoB,EAAQgoB,mBACPJ,KACAU,GAAyBD,GAC5B,OAAKE,GAAmBb,GAEjB,IAAI1sB,QAASL,IAClB,IAAI6tB,GAAiBD,EACjBL,GAAU,EACV5tB,EAAoC,KACpCypB,EAAQ,EACR0E,EAAc,EACdC,EAAe15B,KAAKC,MAElBiL,EAAS,CAACyuB,GAAW,KACzB,GAAIT,EAAS,OACbA,GAAU,EACV,IAAMU,EAAmBD,IAAaH,EAChCK,EAAcF,GAAYjB,GAAQ,EACpCkB,IAAkBhB,GAAa54B,KAAKC,OACpC45B,IACFnB,GAAQ,EACR5L,QAAQO,KAAK,uDAEf,IAAM5hB,EAxGZ,WACE,UAAWjJ,OAAW,IAAa,OAAO,KAC1C,IAAM8d,EAAS9d,OACf,OAAO8d,EAAOmU,WAAanU,EAAOmU,YAAc,CAAC,CACnD,CAoGsBD,GACZ/oB,KACE8tB,GAAkBX,MAAYntB,EAAQquB,sBAAwBlB,IAAc54B,KAAKC,OACrFwL,EAAQsuB,iBAAmB53B,KAAKC,IAAI,EAAGpC,KAAKC,MAAQ64B,GAChDc,IAAkBnuB,EAAQuuB,mBAAoB,GAC9CH,IAAapuB,EAAQwuB,cAAe,IAE1CjX,GAAQ7Q,OAAO0T,GACf9hB,aAAam2B,GACTnF,GAAOoF,qBAAqBpF,GAC5BzpB,IACFA,EAASE,aACTkiB,GAAwBpiB,IAE1BK,KAGF,SAASka,IACH+S,KAAYY,GAAgB,GAC5BA,IAAkBd,IAAOxtB,GAC/B,CAEA,IAAMkvB,EAAU,KACdX,EAAcz5B,KAAKC,MAAQy5B,GAAgB,GAAKD,EAAc,EAAI,EAC9C,IAAhBA,GACFb,GAAa54B,KAAKC,MAClBu5B,GAAgB,EAChB3T,KACUqT,IAASnE,EAAQsF,sBAAsBD,KAG/CE,EAAa,KACjB,IAAKf,GAAkBC,GAAiBN,EAAS,OACjD,UAAW9a,iBAAqB,MAAgB9d,SAASgC,gBAGvD,OAFAk3B,GAAgB,OAChB3T,IAGF,IAAM0U,EAA8B,KAClCb,EAAe15B,KAAKC,MACpBw5B,EAAc,GAEhBnuB,EAAW,IAAI8S,iBAAiBmc,GAChChN,GAAsBjiB,EAAUivB,GAChCjvB,EAASe,QAAQ/L,SAASgC,gBAAiB,CAAEyjB,YAAY,EAAMxH,eAAe,EAAMD,WAAW,EAAME,SAAS,IAC9GuW,EAAQsF,sBAAsBD,IAGhCpX,GAAQtd,IAAImgB,GACZ,IAAMqU,EAAQn0B,WAAW,IAAMmF,GAAO,GAAO6tB,GACzCQ,GAAkBF,IACQ,YAAxB/4B,SAAS24B,WAA0B34B,SAASuC,iBAAiB,mBAAoBy3B,EAAY,CAAEt3B,MAAM,IACpGs3B,KAEPzU,MA1EoC7Z,QAAQL,SA4EhD,CAxKA,IAII+sB,GACAE,GACE5V,GANNwX,GAAA72B,EAAA,KAAAoqB,KACAtO,KAGIiZ,GAAQ,EACRE,GAAa,EACX5V,GAAU,IAAI7M,WAkMT7V,SAAa,KAAoD,mBAA9BA,SAASuC,kBACrDvC,SAASuC,iBAAiB,gBAAiB81B,MC/L7C,SAAS8B,GACPC,EACAC,EACArvB,GAEA,IAAMkX,EAAO9iB,SAASuS,KACtB,GAAIuQ,IAASkY,EAAWhzB,MAAO,OAC/B,IAAMkR,EAAW8hB,EAAWhzB,MAC5BgzB,EAAWhzB,MAAQ8a,EACnBlX,EAAS,CAAEsvB,YAAahiB,EAAUiiB,QAASrY,EAAMmY,UACnD,CApBA,IAAAG,GAAAn3B,EAAA,QCoCA,SAASwe,GAAeza,GACtB,GAAqC,MAAVA,EAC3B,IAAqB,kBAAVA,EAAqB,OAAOA,EACvC,GAAqB,iBAAVA,EAAoB,OAAOpB,OAAOC,SAASmB,GAASA,OAAQ,EACvE,GAAqB,iBAAVA,EAAoB,CAC7B,IAAMQ,EAAUR,EAAM9C,OACtB,OAAOsD,EAAUA,EAAQD,MAAM,EAAG8yB,SAAoB,CACxD,EAEF,CAEA,SAASC,GAAyB3xB,GAChC,OAAOA,EAAIkF,cAAcD,QAAQ,cAAe,KAAKA,QAAQ,WAAY,GAC3E,CAEA,SAAS2sB,GAA0B5xB,GACjC,IAAKA,EAAK,OAAO,EACjB,QAAW6xB,KAAcC,GACvB,GAAI9xB,IAAQ6xB,GAAc7xB,EAAI8F,WAAW,GAAG+rB,MAAgB,OAAO,EAErE,OAAO,CACT,CAEA,SAASE,GAA0B/xB,GACjC,IAAMgF,EAAahF,EAAIzE,OAAO2J,cAE9B,SADI8sB,GAAqBnkB,IAAI7I,KACzBitB,GAAyBzkB,KAAM0kB,GAAWltB,EAAWc,WAAWosB,MAG7DjM,GAAiBjmB,EAC1B,CAlEA,IAKMmyB,GASAL,GACAM,GACAC,GACAX,GACAM,GAMAC,GAxBNK,GAAAh4B,EAAA,KACA6rB,KAIMgM,GAA4D,CAChE,CAAC,iBAAkB,kBACnB,CAAC,oBAAqB,qBACtB,CAAC,oBAAqB,aACtB,CAAC,uBAAwB,gBACzB,CAAC,kBAAmB,mBACpB,CAAC,qBAAsB,aAGnBL,GAAuB,IAAIhlB,IAAIqlB,GAAiB7qB,IAAI,EAAE,CAAEirB,KAAYA,IACpEH,GAAW,GACXC,GAAiB,IACjBX,GAAmB,IACnBM,GAAuB,IAAIllB,IAAI,CACnC,eACA,WACA,oBACA,yBAEImlB,GAA2B,CAC/B,OACA,OACA,UACA,OACA,sBCVF,SAASO,GAAaC,GACpB,MAAO,CACLt6B,IAAI6H,GACU,2BAARA,GACMyyB,EAAQC,iBAAmBD,EAAQE,eAEjC,mBAAR3yB,EAAiCyyB,EAAQE,eACjC,QAAR3yB,EAAsByyB,EAAQ9pB,IACtB,WAAR3I,EAAyByyB,EAAQ/P,OAb3C,SAAwB1iB,GACtB,IAAMa,EAAIxD,WACV,OAAOwD,EAAEb,IAASa,EAAE+xB,SAAiD5yB,EACvE,CAWa6yB,CAAe7yB,GAExByyB,UAEJ,CAwBO,SAASK,GACdrL,EACAgL,EACA1C,GAEA,IAAMxJ,GAAQkB,GAAQ,IAAIlsB,OAC1B,IAAKgrB,EAAM,OAAOwJ,EAClB,IAAMgD,EAzBR,SAA2BxM,EAAckM,GACvC,IAAMztB,EALR,SAA6BuhB,GAC3B,OAAOA,EAAKhrB,OAAO0J,QAAQ,OAAQ,KAAKA,QAAQ,MAAO,GACzD,CAGqB+tB,CAAoBzM,GACvC,GAAmB,gBAAfvhB,EAA8B,OAAO,EACzC,GAAmB,iBAAfA,EAA+B,OAAO,EAC1C,GAAmB,kCAAfA,EAAgD,OAAOytB,EAAQE,eACnE,GAAmB,8DAAf3tB,EACF,OAAQytB,EAAQC,iBAAmBD,EAAQE,eAG7C,IAAMM,EAAcjuB,EAAWvH,MAAM,8DACrC,OAAIw1B,GAEiC,IADvBT,GAAaC,GACdt6B,IAAI86B,EAAY,IAGtB,IACT,CASsBC,CAAkB3M,EAAMkM,GAC5C,GAAmB,MAAfM,EAAqB,OAAOA,EAChC,IACE,IAAMI,EAAMX,GAAaC,GAGzB,OAAkB,IAFP,IAAIhM,SAAS,UAAW,OAAQ,OAAQF,GACjCnO,KAAK/a,WAAYo1B,EAASU,EAAKA,EAEnD,OAASC,GACP,OAA6BrP,GAAU,eAAgB,GAAG0O,EAAQxvB,mCAAoC,CACpG0jB,MAAOyM,aAAeC,MAAQD,EAAI5P,QAAUpY,OAAOgoB,MAE9C,CACT,CACF,CAEO,SAASE,GACdC,EACA7Q,EACAgQ,EACAC,EACA1vB,GAEA,MAAO,CACLA,OACA0F,IAAK4qB,EAAO5qB,KAAOtS,SAASuS,KAC5B8T,WAAY6W,EAAO7W,YAAc,CAAC,EAClCgG,SACAgQ,kBACAC,iBAEJ,CA7FA,IAAAa,GAAAl5B,EAAA,KAAA2pB,OCwEA,SAASwP,KACP,OAAOC,KAAqC,CAC1CliB,MAAO,IAAID,IACXoiB,SAAU,IAAIpiB,IACdqiB,OAAQ,IAAIriB,IAEhB,CAEA,SAASsiB,GAA8Btd,GACrC,QAASA,EAAMud,qBAAqBx7B,QACM,MAArCie,EAAMwd,6BACiC,MAAvCxd,EAAMyd,+BAC8B,MAApCzd,EAAM0d,0BACb,CAEA,SAASC,GAAiC3d,GACxC,OAA2C,MAApCA,EAAM0d,8BAAwC1d,EAAM4d,oBAAoB77B,MACjF,CAEA,SAAS87B,GAAkC7d,GACzC,OAA4C,MAArCA,EAAMwd,+BAAyCxd,EAAM8d,qBAAqB/7B,MACnF,CAEA,SAAS+7B,GAAoB9d,GAC3B,OAAO,IAAIzJ,IAAIyJ,EAAM8d,qBAAuB,GAC9C,CAEA,SAASC,GAAsB/d,GAC7B,GAAIA,EAAM+d,uBAAuBh8B,OAAQ,OAAO,IAAIwU,IAAIyJ,EAAM+d,uBAC9D,IAAMH,EAAqB,IAAIrnB,IAAIyJ,EAAM4d,oBAAsB,IAC/D,OAAO,IAAIrnB,IACTyJ,EAAMud,qBACF/mB,OAAQG,IAAgBinB,EAAmBtmB,IAAIX,EAAW9O,eAC3DkJ,IAAK4F,GAAeA,EAAW9O,eAAiB,GAEvD,CAEA,SAASm2B,GAAoChe,GAC3C,OAA8C,MAAvCA,EAAMyd,+BAAyCM,GAAsB/d,GAAOxF,KAAO,CAC5F,CAIA,SAASyjB,GAAiCje,GACxC,OAA2C,MAApCA,EAAM0d,6BAC6B,MAAvC1d,EAAMyd,+BACgC,MAArCzd,EAAMwd,+BACPxd,EAAMud,qBAAqBx7B,MAChC,CAEO,SAASm8B,GACdle,GAEA,SACIA,EAAMhK,YAAY,IACmB,MAAvCgK,EAAMyd,+BAC+B,MAArCzd,EAAMwd,6BACNG,GAAiC3d,KAE9Bsd,GAA8Btd,MAC5BA,EAAM6S,SAAW7S,EAAMme,WAAane,EAAMoe,gBACnD,CAEO,SAASC,KACd,cAAcz7B,OAAW,OAAkBA,OAA4CsS,OACzF,CAkBA,SAASopB,GAAsBx2B,GAC7B,GAAqB,iBAAVA,EAAoB,OAAO,KACtC,IAAMQ,EAAUR,EAAM9C,OACtB,IAAKsD,EAAS,OAAO,KACrB,IAIE,OAAO,IAAI1H,IAAI0H,EAAS,aAAa+J,IACvC,OAGE,OAAO/J,CACT,CACF,CAEA,SAASi2B,GAAcve,GACrB,OAAO5e,KAAKa,UAAU,CACpB+T,YAAagK,EAAMhK,YAChBjF,IAAK4F,GAAe,CACnBA,EAAW9O,aACX8O,EAAWjO,YACXiO,EAAWnQ,iBAAmB,OAE/B0B,KAAK,CAACC,EAAGC,IAAMhH,KAAKa,UAAUkG,GAAGq2B,cAAcp9B,KAAKa,UAAUmG,KACjEm1B,oBAAqBvd,EAAMud,qBACvBxsB,IAAK4F,GAAe,CACpBA,EAAW9O,aACX8O,EAAWjO,YACXiO,EAAWnQ,iBAAmB,OAE/B0B,KAAK,CAACC,EAAGC,IAAMhH,KAAKa,UAAUkG,GAAGq2B,cAAcp9B,KAAKa,UAAUmG,KACjE8qB,UAAWlT,EAAMkT,UACjBuL,UAAWze,EAAMye,UACjBrsB,IAAKkrB,GAA8Btd,GAC/Bse,GAAsBte,EAAM5N,UAC5B,EACJssB,UAAWC,GAAmB3e,EAAM0e,cACK,MAArC1e,EAAMwd,6BAAuCxd,EAAM8d,qBAAqB/7B,OACxE,CACEy7B,4BAA6Bxd,EAAMwd,6BAA+B,KAClEM,oBAAqB9d,EAAM8d,qBAAqBz1B,QAAQH,QAE1D,CAAC,EACLu1B,8BAA+Bzd,EAAMyd,+BAAiC,KACtEM,sBAAuB/d,EAAM+d,uBAAuB11B,QAAQH,OAC5Dw1B,2BAA4B1d,EAAM0d,4BAA8B,KAChEkB,yBAA0B5e,EAAM4e,0BAC5B7tB,IAAKqC,GAAc,CACnBA,EAAUF,QACVE,EAAUvL,aACVuL,EAAUzK,QAEXT,KAAK,CAACC,EAAGC,IAAMhH,KAAKa,UAAUkG,GAAGq2B,cAAcp9B,KAAKa,UAAUmG,MAErE,CAGO,SAASy2B,KACd,IAAM3e,EAAkBtd,OAErBsS,SAASiL,QAAQ1a,KACpB,GAA8B,iBAAnBya,EAA6B,MAAO,IAC/C,IACE,IAAM4e,EAAmBl8B,OAAO9C,UAAUC,OAC1C,IAAK++B,EAAkB,MAAO,IAC9B,IAAMr3B,EAAS,IAAI7G,IAAIsf,EAAgB4e,GACvC,OAAIr3B,EAAO1H,SAAW++B,GAAoBr3B,EAAOjG,QAAUiG,EAAO2Y,KAAa,IACxE3Y,EAAOzH,SAAS2pB,SAAS,KAAOliB,EAAOzH,SAAW,GAAGyH,EAAOzH,WACrE,OACE,MAAO,GACT,CACF,CAEO,SAAS++B,KACd,MAAO,GAAGF,aACZ,CAEA,SAASF,GAAmB72B,GAC1B,GAAqB,iBAAVA,EAAoB,OAAO,KACtC,IAAMk3B,EAAel3B,EAAM9C,OAAO+J,MAAM,IAAK,GAAG,IAAM,GAChD6d,EAAQoS,EAAazvB,WAAW,uBAClCyvB,EAAa32B,MAAM,IACnB22B,EACJ,OAAOpS,EAAM7qB,OAAS,GAAK6qB,EAAM7qB,QAAU,KAAO6qB,EAAQ,IAC5D,CAEA,SAASqS,GAAwBn3B,GAC/B,MAAwB,iBAAVA,GAAsB62B,GAAmB72B,GAASA,EAAM9C,OAAS,IACjF,CAyBO,SAASk6B,GACdlf,EACA5O,EAAoC,CAAC,GAErC,IACE,IAAKitB,KAAuB,OAAOjyB,QAAQL,QAAQ,CAAE6J,OAAQ,UAAWmlB,OAAQ,gBAChF,GAAqB,mBAAVha,MAAsB,OAAO3U,QAAQL,QAAQ,CAAE6J,OAAQ,UAAWmlB,OAAQ,kBACrF,IAAK/a,EAAMhK,YAAY,KAAOsnB,GAA8Btd,GAC1D,OAAO5T,QAAQL,QAAQ,CAAE6J,OAAQ,UAAWmlB,OAAQ,mBAEtD,GAAImD,GAA2Cle,GAC7C,OAAO5T,QAAQL,QAAQ,CAAE6J,OAAQ,SAAUmlB,OAAQ,yBAGrD,IAAMoE,EAAYZ,GAAcve,GAC1Bof,EAAmBC,GAAoBz9B,IAAIu9B,GACjD,GAAIC,EACF,OAAKhuB,EAAQkuB,OAIbC,IAAwB,EACjBH,EAAiB7d,KAAK,IAAM2d,GAA0Blf,EAAO5O,KALzCguB,EAO7B,IAAMI,IAAeD,GACfE,EAAiCnC,GAA8Btd,GACrE,IACG5O,EAAQkuB,OA7Jf,WACE,IACE,OAAOp+B,eAAeC,QAAQu+B,GAChC,OACE,OAAO,IACT,CACF,CAwJMC,KAA2BR,KACzBM,GAAkCG,GAAiCtoB,IAAI6nB,IAEzE,OAAIxB,GAAiC3d,IACnCA,EAAM6f,mCACJ1C,IAAkCliB,MAAMrZ,IAAIu9B,IAAc,IAG1DnB,GAAoChe,IACtCA,EAAM8f,sCACJ3C,IAAkCC,SAASx7B,IAAIu9B,IAAc,IAG7DtB,GAAkC7d,IACpCA,EAAM+f,oCACJ5C,IAAkCE,OAAOz7B,IAAIu9B,IAAc,IAGxD/yB,QAAQL,QAAQ,CAAE6J,OAAQ,OAAQmlB,OAAQ,oBAG/C0E,GAAgCG,GAAiCrtB,OAAO4sB,GAC5E,IAAIa,EAAsBb,EACpBjR,EAAU+R,GAA6BjgB,EAAOwf,GACjDje,KAAKyH,OACJkX,YACAC,mBACAvT,QACA5W,cACAoqB,gCAUA,IAAKD,GAAoBX,IAAeD,GACtC,MAAO,CACL/d,SAAU,KACV6e,wBAAwB,EACxBL,sBACAM,2BAA4B,GAC5BC,8BAA+B,GAC/BC,4BAA6B,IAGjC,IAAMC,EAAkB,IAAKzgB,EAAOhK,eACpCgqB,EAAsBzB,GAAckC,GACpC,IAAMH,EAA6B3C,GAAiC3d,GAChE0gB,GACE9T,EACA,IAAIrW,IAAIyJ,EAAM4d,oBAAsB,MACjC,GACL,GACE2C,EAAgCvC,GAAoChe,GACtE2gB,GACE/T,EACAmR,GAAsB/d,KACnB,GACL,GACEwgB,EAA8B3C,GAAkC7d,GAClE4gB,GACEhU,EACAkR,GAAoB9d,KACjB,GACL,GACEmG,EAAatkB,OAAOg/B,YACxBC,GAA0BL,EAAiB7T,GAAO7b,IAAK7F,GAAU,CAACA,EAAMzB,IAAKyB,EAAMpD,SAQrF,MAAO,CACL0Z,eAPqBI,GAA4C,kBAAmB,CACpFmf,OAAQ,OACRlX,QAAS,CAAE,eAAgB,oBAC3BxnB,KAAMjB,KAAKa,UAAU,CAAEkkB,eACvB6a,WAAW,IAIXX,uBAAwBH,EACxBF,sBACAM,6BACAC,gCACAC,8BACAJ,+BAGH7e,KAAK,EACJC,WACA6e,yBACAL,oBAAqBiB,EACrBX,6BACAC,gCACAC,8BACAJ,gCAEA,IAAKC,EACH,MAAO,CAAEzqB,OAAQ,SAAUmlB,OAAQ,wBAErC,IAAKvZ,EACH,MAAO,CAAE5L,OAAQ,SAAUmlB,OAAQ,uBAErC,IAAKvZ,EAASC,GACZ,MAAO,CAAE7L,OAAQ,SAAUmlB,OAAQ,eAAevZ,EAAS5L,UAE7D,GAAI4pB,IAAeD,GAAsB,CAIvC,GACEa,IACCpgB,EAAMkhB,yBAAyBd,GAEhC,MAAO,CAAExqB,OAAQ,SAAUmlB,OAAQ,0BAmBrC,GAjBI/a,EAAMmhB,gBAQH3f,EAAS4f,QAAQ3e,OACnBlB,KAAMyI,GAAShK,EAAMmhB,iBAAiBnX,IACtCqX,MAAM,QApRrB,SAA+BlC,GAC7B,IACEj+B,eAAec,QAAQ09B,GAAyBP,EAClD,OAEA,CACF,CAgRUmC,CAAsBL,GAClBxB,IACFG,GAAiCjU,QACjCiU,GAAiC95B,IAAIm7B,IAEnCtD,GAAiC3d,GAAQ,CAC3C,IAAMuhB,EAAQrE,KAAkCjiB,MAChDsmB,EAAM5V,QACN4V,EAAMroB,IACJ+nB,EACAX,GAEFtgB,EAAM6f,mCAAmCS,EAC3C,CACA,GAAItC,GAAoChe,GAAQ,CAC9C,IAAMuhB,EAAQrE,KAAkCE,SAChDmE,EAAM5V,QACN4V,EAAMroB,IACJ+nB,EACAV,GAEFvgB,EAAM8f,sCAAsCS,EAC9C,CACA,GAAI1C,GAAkC7d,GAAQ,CAC5C,IAAMuhB,EAAQrE,KAAkCG,OAChDkE,EAAM5V,QACN4V,EAAMroB,IACJ+nB,EACAT,GAEFxgB,EAAM+f,oCAAoCS,EAC5C,CACF,CACA,MAAO,CAAE5qB,OAAQ,UAElByrB,MAAOjR,KACNxa,OAAQ,SACRmlB,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,MAEzDoR,QAAQ,KACHnC,GAAoBz9B,IAAIu9B,KAAejR,GACzCmR,GAAoB9sB,OAAO4sB,KAGjC,OAAAE,GAAoBnmB,IAAIimB,EAAWjR,GAC5BA,CACT,OAEE,OAAO9hB,QAAQL,QAAQ,CAAE6J,OAAQ,SAAUmlB,OAAQ,kBACrD,CACF,CAEA/R,eAAeiX,GACbjgB,EACAwf,GASA,IAAMiC,EAA0B9D,GAAiC3d,GAC3D0hB,EAA2B7D,GAAkC7d,GAC7D2hB,EAAgC7D,GAAoB9d,GACpD4hB,EAA+D,MAArC5hB,EAAMwd,4BAClCqE,EAA4BD,EAC5B5hB,EAAMud,qBAAqB/mB,OAAQG,GACjCgrB,EAA8BrqB,IAAIX,EAAW9O,gBAC1C,GACL,GACEi6B,EAAkC/D,GAAsB/d,GAGxD+hB,EAFmE,MAAvC/hB,EAAMyd,gCACnCzd,EAAM+d,uBAAuBh8B,QAAU47B,GAAiC3d,IAEzEA,EAAMud,qBAAqB/mB,OAAQG,GACjCmrB,EAAgCxqB,IAAIX,EAAW9O,gBAC5C,GACL,GACAm6B,GAA6B,EACjC,IACGhiB,EAAMhK,YAAY,IACoB,MAAvCgK,EAAMyd,+BAC+B,MAArCzd,EAAMwd,8BACLG,GAAiC3d,GAElC,MAAO,CACLkgB,WAAW,EACXC,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,IAAKgK,EAAM6S,SAAW7S,EAAMme,WAAane,EAAMoe,gBAC7C,MAAO,CACL8B,WAAY5C,GAA8Btd,GAC1CmgB,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,IAAMmoB,EAAWne,EAAMme,SAASzvB,QAAQ,OAAQ,IAAIA,QAAQ,YAAa,IACzE,IACE,IAAMgwB,QA3RV1V,eACEhJ,GAEA,IAAMiiB,EAAWhD,GAAwBjf,EAAM0e,WAC/C,GAAIuD,EAAU,OAAOA,EAKrB,GAHsC,MAApCjiB,EAAM0d,4BAC+B,MAArC1d,EAAMwd,8BAEHa,KAAuB,OAAO,KACnC,IACE,IAAM7c,QAAiBI,GAA4Cmd,KAAmB,CACpFgC,OAAQ,MACRlX,QAAS,CAAEC,OAAQ,oBACnByX,MAAO,aAET,OAAK/f,EAASC,GACPwd,UAAgCzd,EAASiB,QAAgCmK,OADvD,IAE3B,OACE,OAAO,IACT,CACF,CAsQ4BsV,CAAoCliB,GAC5D,IACuC,MAApCA,EAAM0d,4BACgC,MAArC1d,EAAMwd,+BACPkB,EAED,MAAO,CACLwB,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,IAAMmsB,EAAyB,IAAI,IAAI5rB,IAAI,IACtCyJ,EAAMhK,YAAYjF,IAAK4F,GAAeA,EAAW9O,iBAChD81B,GAAiC3d,GAASA,EAAM4d,oBAAsB,GAAK,MAC3EC,GAAkC7d,GAASA,EAAM8d,qBAAuB,GAAK,MAE7Etc,QAAiBT,MAAM,GAAGod,cAAsB,CACpD4C,OAAQ,OACRlX,QAAS,CACP,eAAgB,mBAChB,cAAe7J,EAAM6S,OACrB,mBAAoB7S,EAAMoe,iBAE5B/7B,KAAMjB,KAAKa,UAAU,CACnBmgC,QAASpiB,EAAM6S,OACfwP,QAASriB,EAAMkT,UACf9gB,IAAK4N,EAAM5N,IACXkwB,YAAatiB,EAAMsiB,eACf5D,EAAY,CAAE6D,WAAY7D,GAAc,CAAC,EAC7ChoB,YAAayrB,EACbK,2BAA4BxiB,EAAM4e,0BAA0B7tB,IAAKqC,KAC/DqvB,SAAUrvB,EAAUF,QACpB4D,cAAe1D,EAAUvL,aACzBc,MAAOyK,EAAUzK,WAGrBq4B,WAAW,IAEb,IAAKxf,EAASC,GACZ,MAAO,CACLye,WAAY5C,GAA8Btd,GAC1CmgB,kBAAmBsB,IAA4BC,IAC5CzD,GAAiCje,GACpC4M,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,IAAM0sB,QAAiBlhB,EAASiB,OAI1BmK,EACsC,iBAAnC8V,EAAQC,wBACfD,EAAQC,uBACJD,EAAQC,uBACR,KACN,IACG3iB,EAAMhK,YAAY,IACnBioB,GAAiCje,KAKhCA,EAAM8d,qBAAqB/7B,UAC1B2F,MAAMC,QAAQ+6B,EAAQ1sB,cAA+C,IAA/B0sB,EAAQ1sB,YAAYjU,QAE5D,MAAO,CACLm+B,WAAW,EACXC,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,IAmMIoqB,EAnMAwC,EAAwB5iB,EAAMhK,YAC9BunB,EAAsBvd,EAAMud,oBAC5BsF,EAEA,KACAC,EAEA,KACJ,GAAwC,MAApC9iB,EAAM0d,2BAAoC,CAC5C,IAAME,EAAqB,IAAIrnB,IAAIyJ,EAAM4d,oBAAsB,IACzDmF,EA8XZ,SACEnW,EACAoW,GAEA,IAAMC,EAAkB,IAAM,IAAI1sB,IAAIysB,GACtC,IAAKpW,EAAO,OAAOqW,IACnB,IACE,IAAMC,EAAW9hC,KAAKC,MAAMurB,GAI5B,IAHKsW,GAAgC,iBAAbA,GAAwC,IAAfA,EAASvhC,IAGrDE,OAAO4sB,UAAU0U,eAAethB,KAAKqhB,EAAU,KAIlD,OAAOD,IAET,IAAKv7B,MAAMC,QAAQu7B,EAAS/S,GAAI,OAAO,KACvC,IAAMiT,EAAY,IAAI7sB,IACtB,QAAW1O,KAAgBq7B,EAAS/S,EAAG,CACrC,GAC0B,iBAAjBtoB,IACNA,IACAm7B,EAA6B1rB,IAAIzP,IAClCu7B,EAAU9rB,IAAIzP,GACd,OAAO,KACTu7B,EAAUt9B,IAAI+B,EAChB,CACA,OAAOu7B,CACT,OACE,OAAOH,GACT,CACF,CA9Z0CI,CAClCzW,EACAgR,GAEF,IAAKmF,EACH,MAAO,CACL7C,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,GAAI4nB,EAAmBpjB,KAAO,EAAG,CAM/B,GALAqoB,EAA2BS,GACzBZ,EAAQ1sB,YACRgK,EAAMhK,YACN+sB,IAEGF,EACH,MAAO,CACL3C,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB4sB,EAAwBC,EAAyB7sB,YACjDunB,EAAsBvd,EAAMud,qBAAqBgG,QAASC,IACxD,IAAK5F,EAAmBtmB,IAAIksB,EAAS37B,cAAe,MAAO,CAAC27B,GAK5D,IAAKT,EAA4BzrB,IAAIksB,EAAS37B,cAAe,MAAO,GACpE,IAAM47B,EAAgBZ,GAA0Ba,iBAAiB9sB,KAC9DD,GAAeA,EAAW9O,eAAiB27B,EAAS37B,cAEvD,OAAO47B,EAAgB,CAACA,GAAiB,IAE7C,CACA,IAAME,EAA2BpG,GAAqB/mB,OAAQG,GAC5DinB,EAAmBtmB,IAAIX,EAAW9O,gBAC/B,GACC+7B,EAA6BrG,GAAqBtmB,KAAMN,IAC3DinB,EAAmBtmB,IAAIX,EAAW9O,eAE/Bg8B,EAAaC,GAA6BlX,GAahD,GAZAoV,EACwD,IAAtDa,GAA0Ba,iBAAiB3hC,OAiLnD,SAAkD6qB,GAChD,IAAKA,EAAO,OAAO,EACnB,IACE,IAAMsW,EAAW9hC,KAAKC,MAAMurB,GAC5B,IACGsW,GACmB,iBAAbA,GACQ,IAAfA,EAASvhC,IACRuhC,EAASa,GACY,iBAAfb,EAASa,EAChB,OAAO,EACT,IAAM9oB,EAASioB,EAASa,EAA8B9oB,MACtD,IAAKA,GAA0B,iBAAVA,EAAoB,OAAO,EAChD,IAAM+oB,EAAQ/oB,EACd,OAAmB,IAAZ+oB,EAAMriC,GACX+E,OAAOyR,cAAc6rB,EAAMC,IAAOD,EAAMC,EAAe,GACpC,iBAAZD,EAAM1S,GAAkB,iBAAiBpiB,KAAK80B,EAAM1S,IACxC,iBAAZ0S,EAAM1Q,GAAkB,sBAAsBpkB,KAAK80B,EAAM1Q,IAChE5rB,MAAMC,QAAQq8B,EAAM77B,IAAyB,IAAnB67B,EAAM77B,EAAEpG,QACR,iBAAnBiiC,EAAME,UAAyB,iBAAiBh1B,KAAK80B,EAAME,WAC/C,iBAAZF,EAAMG,GAAkB,iBAAiBj1B,KAAK80B,EAAMG,EAC/D,OACE,OAAO,CACT,CACF,CAxMYC,CAAyCxX,KACvCiX,GAAcQ,GACdR,EAAW17B,EACX06B,GAA0Ba,kBAAoB,IAQnDjC,IAA4BO,GAC5B2B,EAAyB5hC,OAAS,KAC/B8hC,IAAeQ,GAAyBR,EAAW17B,EAAGw7B,KACzDd,GAA0ByB,mBACxBtC,IACDpV,GAASgX,EAEX,MAAO,CACL1D,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,YAGzB,SAAWsnB,GAA8Btd,KAAW4M,KAEhDqR,GAAiCje,KACjCtY,MAAMC,QAAQ+6B,EAAQ1sB,eACnBgK,EAAMhK,YAAY,IAAqC,IAA/B0sB,EAAQ1sB,YAAYjU,QAE/C,MAAO,CACLm+B,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,aAMzB,GAAI4rB,GAA2BD,EAA8BnnB,KAAO,EAAG,CAMrE,GALAsoB,EAsaN,SACEyB,EACAC,EACA7C,GAMA,IAAM8C,EAAoBC,GACxBH,EACA5C,GAEF,IAAK8C,EAAmB,OAAO,KAC/B,IAAME,EAAWrB,GACfiB,EACAC,EACA7C,GAEF,OAAOgD,GAAY,CACjB3uB,YAAa2uB,EAAS3uB,YACtByuB,oBACAH,iBAAkBK,EAASL,iBAE/B,CA9bkCM,CAC1BlC,EAAQ1sB,YACR4sB,EACAjB,IAEGmB,EACH,MAAO,CACL5C,WAAW,EACXC,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB4sB,EAAwBE,EAA0B9sB,YAClD6rB,EAA4BiB,EAA0B2B,kBACtDlH,EAAsBA,GAAqBgG,QAASC,IAClD,IAAK7B,EAA8BrqB,IAAIksB,EAAS37B,cAAe,MAAO,CAAC27B,GACvE,IAAMC,EAAgBX,GAA2B2B,kBAAkB7tB,KAChED,GAAeA,EAAW9O,eAAiB27B,EAAS37B,cAEvD,OAAO47B,EAAgB,CAACA,GAAiB,IAE7C,CACA,GAAI5B,EAA0B9/B,OAAS,EAAG,CACxC,IAAM8iC,EAAcC,GAAwBlY,EAAO,UAKnD,IAJyBiY,IAAeR,GACtCQ,EAAY18B,EACZ05B,GAEmB,CACnB,IAAKJ,IAA4BO,EAC/B,MAAO,CACL9B,WAAW,EACXC,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,IAAMgtB,EAA+B,IAAIzsB,IAAIyJ,EAAM4d,oBAAsB,IACzEgF,EAAwBA,EAAsBpsB,OAAQG,IACnDgrB,EAA8BrqB,IAAIX,EAAW9O,eAC9Cm7B,EAA6B1rB,IAAIX,EAAW9O,cAEhD,CACF,CACA,GAAIk6B,EAA4BhgC,OAAS,EAAG,CAC1C,IAAMgjC,EAAgBD,GAAwBlY,EAAO,YAKrD,IAJ2BmY,IAAiBV,GAC1CU,EAAc58B,EACd45B,GAEqB,CACrB,IAAKN,IAA4BO,EAC/B,MAAO,CACL9B,WAAW,EACXC,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAMvB,IAAMgtB,EAA+B,IAAIzsB,IAAIyJ,EAAM4d,oBAAsB,IACzEgF,EAAwBA,EAAsBpsB,OAAQG,IACnDmrB,EAAgCxqB,IAAIX,EAAW9O,eAChDm7B,EAA6B1rB,IAAIX,EAAW9O,cAEhD,CACF,CACA,IAiaJ,SACE08B,EACAhH,GAEA,OAAKA,GAAqBx7B,UACrB2F,MAAMC,QAAQ48B,IAEZhH,EAAoBvuB,MAAOw0B,MAC3B98B,OAAOskB,UAAUwY,EAASh9B,mBAAqBg9B,EAASh9B,iBAAmB,GAAK,IAG9E+9B,EAAoBttB,KAAMpI,IAC/B,IAAKA,GAAkC,iBAAdA,EAAwB,OAAO,EACxD,IAAM8H,EAAa9H,EACnB,OAAO8H,EAAWG,gBAAkB0sB,EAAS37B,cACxC8O,EAAWquB,eAAiBxB,EAAS96B,aACrCiO,EAAWa,mBAAqBgsB,EAASh9B,kBAGpD,CApbSy+B,CAA2BvC,EAAQ1sB,YAAaunB,GACnD,MAAO,CACL2C,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,aAGvB,GACE6sB,GAA0ByB,wBACT,IAAf9E,GAA4BA,IAAeD,KAC1Cvf,EAAMklB,wBACLtC,EAAsBpsB,OAAQG,GAC5BqJ,EAAM4d,oBAAoBhvB,SAAS+H,EAAW9O,iBAIpD,MAAO,CACLq4B,WAAW,EACXC,kBAAmBsB,IAA4BC,EAC/C9U,MAAO,KACP5W,YAAagK,EAAMhK,aAIvB,GAAI8sB,GAA2BwB,iBAAkB,CAC/C,IAAMa,EAAYvC,EAAsBpsB,OAAQG,GAC9CgrB,EAA8BrqB,IAAIX,EAAW9O,eAM/C,QACkB,IAAf23B,GAA4BA,IAAeD,KAC3Cvf,EAAMolB,4BAA4BD,GAEnC,MAAO,CACLjF,WAAW,EACXC,kBAAkB,EAClBvT,MAAO,KACP5W,YAAagK,EAAMhK,aAGvBoqB,EAA4B+E,CAC9B,CACA,MAAO,CACLjF,WAAW,EACXC,kBAAkB,EAClBvT,QACA5W,YAAa4sB,EACbxC,4BAEJ,OACE,MAAO,CACLF,WAAY5C,GAA8Btd,GAC1CmgB,kBAAmBsB,IAA4BC,IAC5CzD,GAAiCje,GACpC4M,MAAO,KACP5W,YAAagK,EAAMhK,YAEvB,CACF,CA4BA,SAAS8tB,GACPlX,GAEA,IAAKA,EAAO,OAAO,KACnB,IACE,IAAM/d,EAAYzN,KAAKC,MAAMurB,GAC7B,IAAK/d,GAAkC,iBAAdA,EAAwB,OAAO,KACxD,GACkB,IAAhBA,EAAUlN,GACoB,iBAAvBkN,EAAUq1B,UACjBr1B,EAAUq1B,SAEV,OAAOr1B,EAET,GAAoB,IAAhBA,EAAUlN,IAAYkN,EAAUk1B,GAA4B,iBAAhBl1B,EAAUk1B,EAAgB,OAAO,KACjF,IAAM9oB,EAASpM,EAAUk1B,EAA8B9oB,MACvD,OAAOA,GAA0B,iBAAVA,EACnBA,EACA,IACN,OACE,OAAO,IACT,CACF,CAEA,SAAS6pB,GACPlY,EACAoX,GAEA,IAAKpX,EAAO,OAAO,KACnB,IACE,IAAM/d,EAAYzN,KAAKC,MAAMurB,GAC7B,GAAqB,IAAjB/d,GAAWlN,IAAYkN,EAAUk1B,GAA4B,iBAAhBl1B,EAAUk1B,EAAgB,OAAO,KAClF,IAAMj8B,EAAS+G,EAAUk1B,EAA8BC,GACvD,OAAOl8B,GAA0B,iBAAVA,EACnBA,EACA,IACN,OACE,OAAO,IACT,CACF,CAEA,SAAS44B,GACP9T,EACAoW,GAEA,IAAMa,EAAaC,GAA6BlX,GAChD,IAAKiX,IAAen8B,MAAMC,QAAQk8B,EAAW17B,GAAI,OAAO,KACxD,IAAM6N,EAAgC,GAChCuN,EAAO,IAAIhN,IACjB,QAAW1H,KAAag1B,EAAW17B,EAAG,CACpC,IAAK0G,GAAkC,iBAAdA,EAAwB,OAAO,KACxD,IAAM8H,EAAa9H,EACnB,GAC0B,iBAAjB8H,EAAWwZ,IACjB6S,EAA6B1rB,IAAIX,EAAWwZ,IAC7C5M,EAAKjM,IAAIX,EAAWwZ,IACI,iBAAjBxZ,EAAWhV,IACjBgV,EAAWhV,IACX+E,OAAOyR,cAAcxB,EAAW0uB,KAChC1uB,EAAW0uB,GAAgB,EAC5B,OAAO,KACT9hB,EAAKzd,IAAI6Q,EAAWwZ,GACpBna,EAAY0B,KAAK,CACf7P,aAAc8O,EAAWwZ,EACzBznB,YAAaiO,EAAWhV,EACxB6E,gBAAiBmQ,EAAW0uB,IAEhC,CACA,OAAOrvB,CACT,CAEA,SAAS2qB,GACP/T,EACAkV,GAEA,IAAMiD,EAAgBD,GAAwBlY,EAAO,YACrD,IAAKmY,IAAkBr9B,MAAMC,QAAQo9B,EAAc58B,GAAI,OAAO,KAC9D,IAAM6N,EAAgC,GAChCuN,EAAO,IAAIhN,IACjB,QAAW1H,KAAak2B,EAAc58B,EAAG,CACvC,IAAK0G,GAAkC,iBAAdA,EAAwB,OAAO,KACxD,IAAM8H,EAAa9H,EACnB,GAC0B,iBAAjB8H,EAAWwZ,IACjB2R,EAAgCxqB,IAAIX,EAAWwZ,IAChD5M,EAAKjM,IAAIX,EAAWwZ,IACI,iBAAjBxZ,EAAWhV,IACjBgV,EAAWhV,IACX+E,OAAOyR,cAAcxB,EAAW0uB,KAChC1uB,EAAW0uB,GAAgB,EAC5B,OAAO,KACT9hB,EAAKzd,IAAI6Q,EAAWwZ,GACpBna,EAAY0B,KAAK,CACf7P,aAAc8O,EAAWwZ,EACzBznB,YAAaiO,EAAWhV,EACxB6E,gBAAiBmQ,EAAW0uB,IAEhC,CACA,OAAOrvB,CACT,CAEA,SAAS4qB,GACPhU,EACA+U,GAEA,IAAMkD,EAAcC,GAAwBlY,EAAO,UACnD,IAAKiY,IAAgBn9B,MAAMC,QAAQk9B,EAAY18B,GAAI,OAAO,KAC1D,IAAM6N,EAAgC,GAChCuN,EAAO,IAAIhN,IACjB,QAAW1H,KAAag2B,EAAY18B,EAAG,CACrC,IAAK0G,GAAkC,iBAAdA,EAAwB,OAAO,KACxD,IAAM8H,EAAa9H,EACnB,GAC0B,iBAAjB8H,EAAWwZ,IACjBwR,EAA8BrqB,IAAIX,EAAWwZ,IAC9C5M,EAAKjM,IAAIX,EAAWwZ,IACI,iBAAjBxZ,EAAWhV,IACjBgV,EAAWhV,IACX+E,OAAOyR,cAAcxB,EAAW0uB,KAChC1uB,EAAW0uB,GAAgB,EAC5B,OAAO,KACT9hB,EAAKzd,IAAI6Q,EAAWwZ,GACpBna,EAAY0B,KAAK,CACf7P,aAAc8O,EAAWwZ,EACzBznB,YAAaiO,EAAWhV,EACxB6E,gBAAiBmQ,EAAW0uB,IAEhC,CACA,OAAOrvB,CACT,CAoCA,SAASquB,GACPiB,EACA/H,GAEA,QAAK71B,MAAMC,QAAQ29B,IACZ/H,EAAoBvuB,MAAOw0B,GAChC8B,EAAkBruB,KAAMpI,IACtB,IAAKA,GAAkC,iBAAdA,EAAwB,OAAO,EACxD,IAAM8H,EAAa9H,EACnB,OAAO8H,EAAWwZ,IAAMqT,EAAS37B,cAC/B8O,EAAWhV,IAAM6hC,EAAS96B,aAC1BiO,EAAW0uB,KAAO7B,EAASh9B,kBAGnC,CAEA,SAASk+B,GACPH,EACA3G,GAEA,IAAKl2B,MAAMC,QAAQ48B,GAAsB,OAAO,KAChD,IAAMvuB,EAAgC,GAChCuN,EAAO,IAAIhN,IACjB,QAAW1H,KAAa01B,EAAqB,CAC3C,IAAK11B,GAAkC,iBAAdA,EAAwB,SACjD,IAAM8H,EAAa9H,EACnB,GACsC,iBAA7B8H,EAAWG,eACjB8mB,EAAmBtmB,IAAIX,EAAWG,eAIrC,IACEyM,EAAKjM,IAAIX,EAAWG,gBACe,iBAA5BH,EAAWquB,eACjBruB,EAAWquB,eACXt+B,OAAOyR,cAAcxB,EAAWa,mBAChCb,EAAWa,iBAA8B,EAC1C,OAAO,KACT+L,EAAKzd,IAAI6Q,EAAWG,eACpBd,EAAY0B,KAAK,CACf7P,aAAc8O,EAAWG,cACzBpO,YAAaiO,EAAWquB,aACxBx+B,gBAAiBmQ,EAAWa,qBACW,IAAnCb,EAAW4uB,oBAA+B,CAAEC,mBAAmB,GAAS,CAAC,GAC9E,CACH,CACA,OAAOxvB,CACT,CAEA,SAASstB,GACPiB,EACAC,EACAzB,GAMA,IAAMW,EAAmBgB,GACvBH,EACAxB,GAEF,IAAKW,EAAkB,OAAO,KAC9B,IAAM+B,EAAwBjB,EAAiBhuB,OAAQG,GACrDosB,EAA4BzrB,IAAIX,EAAW9O,eAEvC69B,EAA8B,IAAI1qB,IACtC0oB,EAAiB3yB,IAAK4F,GAAe,CAACA,EAAW9O,aAAc8O,KAE3D2tB,EAAmBmB,EAAsBxuB,KAC5CN,IAAgB+uB,EAA4BpuB,IAAIX,EAAW9O,gBACzD67B,EAAiBzsB,KAAMN,IAC1B,IAAMgvB,EAAQF,EAAsB7uB,KACjC/H,GAAcA,EAAUhH,eAAiB8O,EAAW9O,cAEvD,OAAO89B,GAAOj9B,cAAgBiO,EAAWjO,aACvCi9B,EAAMn/B,kBAAoBmQ,EAAWnQ,iBACrCm/B,EAAMH,oBAAsB7uB,EAAW6uB,oBAErCI,EAA4B,IAAI5qB,IAAI0qB,GACpC1vB,EAAcwuB,EAAiBzzB,IAAK4F,IACxC,IAAKosB,EAA4BzrB,IAAIX,EAAW9O,cAAe,OAAO8O,EACtE,IAAM8sB,EAAgBmC,EAA0BhkC,IAAI+U,EAAW9O,cAC/D,OAAK47B,GACLmC,EAA0BrzB,OAAOoE,EAAW9O,cACrC47B,GAFoB,OAG1BjtB,OAAQG,GAA4D,OAAfA,GACxD,QAAWA,KAAc+sB,EACnBkC,EAA0BtuB,IAAIX,EAAW9O,gBAC3CmO,EAAY0B,KAAKf,GACjBivB,EAA0BrzB,OAAOoE,EAAW9O,eAGhD,MAAO,CAAEmO,cAAa0tB,mBAAkBY,mBAC1C,CAwFO,SAASxD,GACd9gB,EACA6lB,EAAuC,MAEvC,IAAMC,EAAoB9lB,EAAMhK,YAAY,GACtCtS,EAAgC,CACpC,CACE+F,IAAK,mBACL3B,MAAO1G,KAAKa,UACV+d,EAAMhK,YAAYjF,IAAK4F,KACrBwZ,EAAGxZ,EAAW9O,aACdlG,EAAGgV,EAAWjO,YACd28B,GAAI1uB,EAAWnQ,qBAIrB,CACEiD,IAAK,gCACL3B,MAAO+9B,GAAyB,KAGpC,OAAKC,EAUE,IACFpiC,EACH,CAAE+F,IAAK,qBAAsB3B,MAAOg+B,EAAkBj+B,cACtD,CAAE4B,IAAK,oBAAqB3B,MAAOg+B,EAAkBp9B,aACrD,CACEe,IAAK,wBACL3B,MAAO+M,OAAOixB,EAAkBt/B,iBAAmB,KAErD,CAAEiD,IAAK,kBAAmB3B,MAAOkY,EAAMkT,WACvC,CAAEzpB,IAAK,kBAAmB3B,MAAOkY,EAAMye,YAlBhC,IACF/6B,EACH,CAAE+F,IAAK,qBAAsB3B,MAAO,IACpC,CAAE2B,IAAK,oBAAqB3B,MAAO,IACnC,CAAE2B,IAAK,wBAAyB3B,MAAO,IACvC,CAAE2B,IAAK,kBAAmB3B,MAAOkY,EAAMkT,WACvC,CAAEzpB,IAAK,kBAAmB3B,MAAOkY,EAAMye,WAc7C,CAvuCA,IAEMiB,GAwDAL,GACAO,GACFzC,GAKAoC,GAjEJwG,GAAAhiC,EAAA,KAAA+d,KAEM4d,GAA0B,iBAwD1BL,GAAsB,IAAIrkB,IAC1B4kB,GAAmC,IAAIrpB,IACzC4mB,GAIO,KACPoC,GAAuB,ICA3B,SAASyG,GAAUvvB,GACjB,IAAMjP,EAAME,MAAMC,QAAQ8O,EAAQwvB,QAAUxvB,EAAQwvB,MAAMlkC,OAAS,EAC/D0U,EAAQwvB,MACR,CAAC,CAAEjf,UAAWvQ,EAAQuQ,UAAWkf,iBAAkBzvB,EAAQyvB,mBACzDD,EAAoB,GAC1B,QAAWpvB,KAAQrP,EAAK,CACtB,IAAKqP,GAAwB,iBAATA,GAAqBnP,MAAMC,QAAQkP,GAAO,OAAO,KACrE,IAAMsvB,EAAOtvB,EACb,GAA8B,iBAAnBsvB,EAAKnf,YAA2B,QAAQ9X,KAAKi3B,EAAKnf,YAC1B,iBAA1Bmf,EAAKD,kBAIgC,OAA5CE,GAAiBD,EAAKD,kBAA4B,OAAO,KAC3D,IAAMG,EAAUF,EAAKG,yBACrB,QAAgB,IAAZD,KAA2B3+B,MAAMC,QAAQ0+B,IAAYA,EAAQtkC,OAAS,GAAKskC,EAAQtkC,OAAS,IAC7FskC,EAAQr3B,MAAOu3B,GAAuB,iBAARA,GAA8C,OAA1BH,GAAiBG,KAAiB,OAAO,KAC9FN,EAAMvuB,KAAK,CAAEsP,UAAWmf,EAAKnf,UAAWkf,iBAAkBC,EAAKD,oBACzDG,EAAU,CAAEC,yBAA0BD,GAAwB,CAAC,GACvE,CACA,OAAIJ,EAAMlkC,OAAS,GAAKkkC,EAAMlkC,OAAS,GAAKkkC,EAAMhvB,KAAK,CAACkvB,EAAM1xB,KAC3D/N,OAAOyR,cAAczR,OAAOy/B,EAAKnf,aACjCvS,EAAQ,GAAK/N,OAAOy/B,EAAKnf,YAActgB,OAAOu/B,EAAMxxB,EAAQ,GAAGuS,YAAqB,KAChFif,CACT,CAEA,SAASO,GAAS3+B,GAChB,IAAM,MAAsE,MAA/D3G,eAAeC,QAAQ,GAAGslC,KAAiB5+B,IAAyB,OAAU,OAAO,CAAO,CAC3G,CAEA,SAAS6+B,GAAc7+B,GACrB,IAAM3G,eAAec,QAAQ,GAAGykC,KAAiB5+B,IAAgB,IAAM,OAA4B,CACrG,CAYA,SAAS8+B,GAAgB9+B,GACvB,IACE,OAAOd,aAAa5F,QAAQ,GAAGylC,KAAkB/+B,MAC5Cg/B,GAAoBjlC,IAAIiG,IAAiB,IAChD,OAAU,OAAOg/B,GAAoBjlC,IAAIiG,IAAiB,IAAM,CAClE,CAMA,SAASi/B,GAAiBv+B,GACxB,IAAKA,EAAOgH,WAAW,KAAM,OAAO,KACpC,IACE,IAAM9H,EAASrG,KAAKC,MAAMkH,GAC1B,MAAoC,iBAAtBd,EAAOs/B,WAA0Bt/B,EAAOs/B,WAAa,IACrE,OAAU,OAAO,IAAM,CACzB,CACA,SAASC,GAAoBz+B,GAC3B,IAAKA,EAAOgH,WAAW,KAAM,OAAO,KACpC,IACE,IAAM9H,EAASrG,KAAKC,MAAMkH,GAC1B,MAAuC,iBAAzBd,EAAOw/B,cAA6Bx/B,EAAOw/B,cAAgB,IAC3E,OAAU,OAAO,IAAM,CACzB,CACA,SAASC,GAAqB3+B,EAAgBm2B,GAC5C,IAAM9R,EAnBR,SAAoBrkB,GAClB,IAAKA,EAAOgH,WAAW,KAAM,OAAOhH,EACpC,IAAM,IAAMd,EAASrG,KAAKC,MAAMkH,GAA+B,MAA8B,iBAAhBd,EAAOuiB,KAAoBviB,EAAOuiB,KAAOzhB,CAAQ,OAAU,OAAOA,CAAQ,CACzJ,CAgBgB4+B,CAAW5+B,GACzB,OAAOqkB,IAAUwa,IAAyB,MAAb1I,GAAqB9R,IAAU8R,CAC9D,CAEA,SAAS2I,GAAex/B,EAAsB62B,EAA0BqI,EAAqBE,GAC3F,IAAMra,EAAQ8R,GAAa0I,GACrBt/B,EAAQi/B,GAAcE,EAAgB7lC,KAAKa,UAAU,CAAE+nB,KAAM4C,EAAOma,aAAYE,kBAAmBra,EACzGia,GAAoB3tB,IAAIrR,EAAcC,GACtC,IAAMf,aAAa/E,QAAQ,GAAG4kC,KAAkB/+B,IAAgBC,EAAQ,OAA4B,CAIpG,IAAMsL,EAAYk0B,GAAoB1lC,IAAIiG,GACtCuL,GAAW8a,SAAW9a,EAAUmzB,MAAQQ,GAC1CO,GAAoBpuB,IAAIrR,EAAc,CACpC0+B,IAAKnzB,EAAUmzB,IACfU,cAAe7zB,EAAU6zB,eAG/B,CAEA,SAASM,GAAc1/B,GACrBg/B,GAAoBt0B,OAAO1K,GAC3B,IAAMd,aAAamL,WAAW,GAAG00B,KAAkB/+B,IAAiB,OAA4B,CAClG,CAEA,SAAS2/B,GAAuB3/B,GAC9B4/B,GAAkBhpB,QAAShV,IACrBA,EAAI8F,WAAW,GAAG1H,OAAkB4/B,GAAkBl1B,OAAO9I,IAErE,CAEA,SAASi+B,KACP,IAAMC,EAAM,IAAIpxB,IAAYswB,GAAoB/kC,QAChD,IACE,QAAS2I,EAAI,EAAGA,EAAI1D,aAAahF,OAAQ0I,GAAK,EAAG,CAC/C,IAAMhB,EAAM1C,aAAa0C,IAAIgB,GACzBhB,GAAK8F,WAAWq3B,KAAkBe,EAAI7hC,IAAI2D,EAAIpB,MAAMu+B,GAAgB7kC,QAC1E,CACF,OAA6B,CAC7B,MAAO,IAAI4lC,EACb,CAgBA,SAASvB,GAAiBG,GACxB,IAAMr/B,EAAQ,2CAA2CyM,KAAK4yB,GAC9D,IAAKr/B,EAAO,OAAO,KACnB,IAAMtB,EAAKc,OAAOQ,EAAM,IACxB,OAAOR,OAAOyR,cAAcvS,IAAOA,EAAK,EAAIA,EAAK,IACnD,CAEA,SAASgiC,GAAOrf,GACd,IAAKA,EAAKsf,YAAyC,iBAApBtf,EAAKsf,YAA2BngC,MAAMC,QAAQ4gB,EAAKsf,YAAa,OAAO,KACtG,IAAM//B,EAASygB,EAAKsf,WAAuCC,IAC3D,MAAwB,iBAAVhgC,EAAqBA,EAAQ,IAC7C,CAEA,SAASigC,GAAcxf,GACrB,MAA+B,iBAApBA,EAAK+B,YAA2B5jB,OAAOyR,cAAcoQ,EAAK+B,YAAoBzV,OAAO0T,EAAK+B,YACtE,iBAApB/B,EAAK+B,YAA2B,QAAQpb,KAAKqZ,EAAK+B,YAAoB/B,EAAK+B,WAC/E,IACT,CAEA,SAAS0d,GAAWzf,GAKlB,IAAMzgB,EAAQygB,EAAK0f,WACnB,MAAwB,iBAAVngC,GAAsBpB,OAAOyR,cAAcrQ,IAAUA,GAAS,EAAIA,EAAQ,IAC1F,CAEAkhB,eAAekf,GAAO1kC,EAAcnB,GAIlC,IAME,aALuBuf,GAA4Cpe,EAAM,CACvEu9B,OAAQ,OACRlX,QAAS,CAAE,eAAgB,oBAC3BxnB,KAAMjB,KAAKa,UAAUI,MAEPof,EAClB,OACE,OAAO,CACT,CACF,CAGAuH,eAAemf,GACb95B,EACA2H,EACA5E,EACAouB,GAEA,IAAKnB,MAA0C,mBAAVtd,MAAsB,OAAO,EAClE,IAAIS,EACJ,IACEA,QAAiBI,GAA4Cmd,KAAmB,CAC9EgC,OAAQ,MAAOlX,QAAS,CAAEC,OAAQ,oBAAsByX,MAAO,YAEnE,OAAU,OAAO,CAAO,CACxB,IAAK/f,EAASC,GAAI,OAAO,EACzB,IAAMuI,QAAaxI,EAASiB,OAC5B,IAAK/a,MAAMC,QAAQqiB,EAAKG,QAAmC,iBAAlBH,EAAK5T,SAAuB,OAAO,EAC5E,IAAIgyB,GAAc,EACZC,EAAQre,EAAKG,MAAM3T,OAAQK,KAA6BA,GAAwB,iBAATA,GACvE6nB,EAAkC,iBAAf1U,EAAK4C,OAAsB5C,EAAK4C,MAAQ5C,EAAK4C,MAAQ,KACxE0b,EAAW,IAAIttB,IAAIhF,EAAYjF,IAAK8F,GAAS,CAACA,EAAKhP,aAAcgP,EAAKnO,eAKtE6/B,EAA0B,IAAIhyB,IAClCP,EAAYQ,OAAQK,GAASA,EAAK2uB,mBAAmBz0B,IAAK8F,GAASA,EAAKhP,eAEpE6O,EAAcrI,GAAUqI,aAAe,GAIvC8xB,EAA+B,IAAIjyB,IACvClI,GAAUo6B,eAAer/B,eAAiB,IAEtC3D,EAAOo5B,KACP6J,EAAa,GAAGjjC,kBAKhBkjC,EAA4B,IAAIpyB,IAKhCqyB,EAAkB,IAAIryB,IACtBsyB,EAAa7f,WACO,iBAAbT,EAAK9e,YACJy+B,GAAOQ,EAAY,CAAE9iC,GAAI2iB,EAAK9e,IAAKq/B,SAAU,MACzDF,EAAgB9iC,IAAIyiB,EAAK9e,KACzB2+B,GAAc,EACP,IAEHW,EAAexgB,GACC,iBAAbA,EAAK9e,MAAoBm/B,EAAgBtxB,IAAIiR,EAAK9e,KASrDu/B,EAAwB,IAAIzyB,IAChCG,EACGF,OAAQ/P,IACP,IAAMiC,EAAc4/B,EAAS1mC,IAAI6E,EAAWqQ,eACtCL,EAAU/N,EAAcjC,EAAW2O,SAAS1M,QAAe,EACjE,IAAK+N,GAA8B,iBAAZA,EAAsB,OAAO,EAIpD,GAAIrF,GAAS63B,YAAa,CACxB,IAAMtyB,EAAaX,EAAYY,KAC5B/H,GAAcA,EAAUhH,eAAiBpB,EAAWqQ,eAEvD,IAAKH,IAAevF,EAAQ63B,YAAYtyB,GAAa,OAAO,CAC9D,CACA,MAAI,YAAaF,IAA+B,IAApBA,EAAQyyB,SAC7B,eAAgBzyB,GAAkC,kBAAvBA,EAAQ0yB,YACa,OAAlDnD,GAAUvvB,KAEhB1F,IAAKtK,GAAeA,EAAWqQ,gBAEpC,QAAWyR,KAAQ8f,EAAO,CACxB,IAAMe,EAAOxB,GAAOrf,GACR,MAAR6gB,GAAgBJ,EAAsB1xB,IAAI8xB,KAI9C/B,GAAe+B,EAAM1K,SACXmK,EAAWtgB,IAAOgf,GAAc6B,GAC5C,CAKA,QAAWvhC,KAAgB6/B,KACrBsB,EAAsB1xB,IAAIzP,IAC1BwgC,EAAMpxB,KAAMsR,GAASqf,GAAOrf,KAAU1gB,GAAgBkhC,EAAYxgB,KACtEgf,GAAc1/B,GAIZwG,GAAmC,IAAvBqI,EAAY3U,SAxJ5BsnC,IAAkB,GA0JlB,QAAW5iC,KAAciQ,EAAa,CAKpC4yB,GAAiB/2B,OAAO9L,EAAWqQ,eACnC,IAAMpO,EAAc4/B,EAAS1mC,IAAI6E,EAAWqQ,eAC5C,IAAKpO,EAAa,SAClB,IAAM+N,EAAUhQ,EAAW2O,SAAS1M,GACpC,IAAK+N,GAA8B,iBAAZA,EAAsB,SAI7C,IAAM8yB,EAAe,IAAMlB,EAAM7xB,OAC9B+R,GAASqf,GAAOrf,KAAU9hB,EAAWqQ,eAAiBiyB,EAAYxgB,IAK/DihB,EAAmBxgB,UACvB,IAAIygB,GAAa,EACjB,QAAWlhB,KAAQghB,IACO,iBAAbhhB,EAAK9e,YACJo/B,EAAWtgB,KACrBkhB,GAAa,EAKbrB,GAAc,IAGlB,OAAOqB,GAET,GAAI,YAAahzB,IAA+B,IAApBA,EAAQyyB,QAAkB,OAC1CM,KAAoBjC,GAAc9gC,EAAWqQ,eACvD,QACF,CACA,KAAM,eAAgBL,IAAmC,kBAAvBA,EAAQ0yB,WAAgC,SAC1E,IAAMlD,EAAQD,GAAUvvB,GACxB,IAAKwvB,EAAO,SACZ,GAAIjc,EAAK5T,SAASmb,gBAAkB9qB,EAAW2P,SAASmb,cAAe,OAK3DiY,KAAoBjC,GAAc9gC,EAAWqQ,eACvD,QACF,CACA,IAAM4yB,EAAa,IAAInzB,IAAI0vB,EAAM1C,QAAS4C,GAASA,EAAKG,0BAA4B,CAACH,EAAKD,mBACvFn1B,IAAIq1B,IAAkB5vB,OAAQ5Q,GAA4B,OAAPA,GAAamL,IAAI8D,SACnE+S,EAAW,EACX+hB,GAAQ,EACZ,QAAWphB,KAAQ8f,EAAO,CACxB,IAAKU,EAAYxgB,IAASmhB,EAAWpyB,IAAIywB,GAAcxf,IAAS,IAAK,SACrE,IAAMxM,EAASisB,GAAWzf,GAC1B,GAAc,MAAVxM,IAAmBrV,OAAOyR,cAAcyP,EAAW7L,GAAS,CAAE4tB,GAAQ,EAAO,KAAO,CACxF/hB,GAAY7L,CACd,CACA,IAAM6tB,EAAiBD,EAAQ1D,EAAM77B,OAAwB,CAACy/B,EAAQ1D,KACpE,IAAMnf,EAAYtgB,OAAOy/B,EAAKnf,WAC9B,OAAOtgB,OAAOyR,cAAc6O,IAAcA,GAAa,GAAKY,GAAYZ,EAAYmf,EAAO0D,GAC1F,MAAQ,KACX,IAAKF,GAAS1D,EAAMhvB,KAAMkvB,IAAUz/B,OAAOyR,cAAczR,OAAOy/B,EAAKnf,aAAc,CAKjF,QAAWuB,KAAQghB,IACO,iBAAbhhB,EAAK9e,WACVo/B,EAAWtgB,GAEnB,QACF,CACA,IAAKqhB,EAAgB,CACnBpC,GAAuB/gC,EAAWqQ,eAClCwyB,GAAiB/2B,OAAO9L,EAAWqQ,qBACzB0yB,KAAoBjC,GAAc9gC,EAAWqQ,eACvD,QACF,CACA,IAAMgzB,EAAaF,EAAetD,yBAIlC,GAAI9G,IAAeuK,GAAsB,CACvC,IAAMC,EAAaF,EACf,GAAGrjC,EAAWqQ,iBAAiB8yB,EAAe5iB,aAAa8iB,EAAW5kC,KAAK,OAC3E,KACJuiC,GAAkBhpB,QAAShV,IACrBA,EAAI8F,WAAW,GAAG9I,EAAWqQ,mBAAqBrN,IAAQugC,GAC5DvC,GAAkBl1B,OAAO9I,IAG/B,CACA,IAAMwgC,EAAuB,KAC3B,GACEH,IACC14B,GAAS84B,mBACV1B,EAA6BlxB,IAAI7Q,EAAWqQ,iBAC3C0vB,GAAS//B,EAAWqQ,eACrB,CACA,IAAMH,EAAaX,EAAYY,KAC5B/H,GAAcA,EAAUhH,eAAiBpB,EAAWqQ,iBAGnD1F,GAAS63B,aAAgBtyB,GAAcvF,EAAQ63B,YAAYtyB,KAC7D6oB,IAAeuK,IAEfT,GAAiBpwB,IAAIzS,EAAWqQ,cAAe8yB,EAAe5iB,UAElE,GAEImjB,EAAiBziC,MAAMC,QAAS8O,EAAoCwvB,OACpEmE,EAAkBzD,GAAgBlgC,EAAWqQ,eAC7CuzB,EAAeD,GAAmBlD,GAAqBkD,EAAiB1L,GAC1EoI,GAAiBsD,GACjB,KAQEE,EAAgC/D,GAC7B,MAAPA,OACI,EACAN,EAAMrvB,KAAMuvB,GAASA,EAAKG,0BAA0B13B,SAAS23B,KAAOvf,UACpEujB,EACgB,OAApBH,EAA2B,KAAOpD,GAAoBoD,GAClDI,EAA2BjE,GAC/B+D,EAA6B/D,KAASqD,EAAe5iB,UAIjDyjB,EAAoBnD,GAAoB1lC,IAAI6E,EAAWqQ,eACzD4zB,EAAcD,GAAmBxD,gBAAkB2C,EAAe5iB,UAClEyjB,EAAkBlE,SAClB,EACEoE,EAAuBb,GAAYlzB,KAAM2vB,IAC7C,IAAMpvB,EAAYivB,GAAiBG,GACnC,OAAqB,OAAdpvB,GAAsBkxB,EAAMpxB,KAAMsR,GACvCwgB,EAAYxgB,IAASqf,GAAOrf,KAAU9hB,EAAWqQ,eACjDixB,GAAcxf,KAAU1T,OAAOsC,MAE7ByzB,EAAmD,OAApBR,IAClCG,IAA2BX,EAAe5iB,WACb,OAA3BujB,GACCC,EAAwBH,GAAgBM,IAO9C,GAAIF,GAAqBC,EAAa,CACpC,IAAMG,EACJD,GAAgCd,GAAYl7B,SAASy7B,GAAgB,IACjEA,EACA,KACFI,EAAkBvc,SAAW2c,IAA4BH,EAC3DpD,GAAoBpuB,IAAIzS,EAAWqQ,cAAe,CAChDyvB,IAAKkE,EAAkBlE,IACvBU,cAAewD,EAAkBxD,iBAGlCwD,EAAkBvc,SACnB2c,GACAA,IAA4BH,IAE5BpD,GAAoB/0B,OAAO9L,EAAWqQ,eACtC4zB,OAAc,EAElB,CACA,IAAMI,EAAchB,GAAYl7B,SAAS87B,GAAe,IACpDA,EACAE,GAAgCd,GAAYl7B,SAASy7B,GAAgB,IAAMA,EACzEO,EAA+BD,OAAuB,EAC5D,GAAIG,EAAa,CACf,IAAMC,EACJzD,GAAoB1lC,IAAI6E,EAAWqQ,gBAAgByvB,MAAQuE,IACI,IAA/DxD,GAAoB1lC,IAAI6E,EAAWqQ,gBAAgBoX,QACrDoZ,GAAoBpuB,IAAIzS,EAAWqQ,cAAe,CAChDyvB,IAAKuE,EACL7D,cAAe2C,EAAe5iB,aAC1B+jB,EAAe,CAAE7c,SAAS,GAAS,CAAC,GAE5C,CACA,IASI8c,EATEC,EAAanB,EAAagB,EAAclB,EAAe1D,iBACvDgF,EAASD,EAAa7E,GAAiB6E,GAAc,KACrDE,EAAoB,IAAI50B,KAAKuzB,GAAc,CAACF,EAAe1D,mBAC9Dn1B,IAAIq1B,IAAkB5vB,OAAQ5Q,GAA4B,OAAPA,GAAamL,IAAI8D,SAOnEu2B,GAAqB,EACrBC,GAA4B,EAChC,QAAW9iB,KAAQghB,IACZyB,GAAsB,OAAXE,GAAmBnD,GAAcxf,KAAU1T,OAAOq2B,GAI1C,iBAAb3iB,EAAK9e,YACNo/B,EAAWtgB,GAAO8iB,GAA4B,EACnDD,GAAqB,GALxBJ,EAAUziB,EAWd,GADI6iB,IAAoBhD,GAAc,GAClCgD,IAAuBJ,EAAS,SAOpC,IANKA,GAAWK,GAId9D,GAAc9gC,EAAWqQ,eAEvBk0B,GAAW3C,EAAMpxB,KAAMsR,GACzBA,IAASyiB,GAAWjC,EAAYxgB,IAASqf,GAAOrf,KAAU9hB,EAAWqQ,eACrEq0B,EAAkB7zB,IAAIywB,GAAcxf,IAAS,KAAM,CAKxB,iBAAhByiB,EAAQvhC,WAA0Bo/B,EAAWmC,GACtDzD,GAAc9gC,EAAWqQ,eAEzBsxB,GAAc,EAEhB,QACF,CACA,IAAK6C,GAAyB,OAAXC,EAAiB,CAGlC,GAFA3D,GAAc9gC,EAAWqQ,eACzBmzB,KACK74B,GAAS84B,mBAAqB1B,EAA6BlxB,IAAI7Q,EAAWqQ,iBAAmB0vB,GAAS//B,EAAWqQ,eAAgB,CACpI,IAAMH,EAAaX,EAAYY,KAAM/H,GAAcA,EAAUhH,eAAiBpB,EAAWqQ,eACzF,IAAK1F,GAAS63B,aAAgBtyB,GAAcvF,EAAQ63B,YAAYtyB,GAAc,CAC5E,IAAM20B,EAAW,GAAG7kC,EAAWqQ,iBAAiB8yB,EAAe5iB,aAAa8iB,EAAY5kC,KAAK,OAIzFs6B,IAAeuK,KACZtC,GAAkBnwB,IAAIg0B,WAAoB1oC,OAAW,MACxD6kC,GAAkB3hC,IAAIwlC,GAItBC,GAAiB,CAAE1jC,aAAcpB,EAAWqQ,cAAekQ,UAAW4iB,EAAe5iB,UAAW5V,QAAS,IAAI04B,KAGnH,CACF,CACA,QACF,CACA,GAAIkB,EAAS,CAEX,GADAf,IACI74B,GAAS84B,kBAAmB,CAK9B,IAAM3hC,EAASo+B,GAAgBlgC,EAAWqQ,eAC1C,IAAKvO,IAAW2+B,GAAqB3+B,EAAQm2B,GAAY,OAC7C8K,KAAoBjC,GAAc9gC,EAAWqQ,eACvD,QACF,CACF,MAKEuwB,GAAe5gC,EAAWqQ,cAAe4nB,EAAWyL,EAAiBc,OAAa,EAAWd,EAAiBP,EAAe5iB,eAAY,GAKlH,iBAAhBgkB,EAAQvhC,KACa,iBAArBuhC,EAAQlC,UACM,IAArBkC,EAAQlC,WAKRV,GAAc,QACRF,GAAOQ,EAAY,CAAE9iC,GAAIolC,EAAQvhC,IAAKq/B,SAAU,KAExD,QACF,CAGA,GAAIP,EAAwBjxB,IAAI7Q,EAAWqQ,eAAgB,CAMV,MAA7C6vB,GAAgBlgC,EAAWqQ,gBAC3BuxB,EAAMpxB,KACHsR,IAAUwgB,EAAYxgB,IAAS4iB,EAAkB7zB,IAAIywB,GAAcxf,IAAS,MAG/Egf,GAAc9gC,EAAWqQ,eAE3B,QACF,CAOA,IAAM00B,EAAiBnD,EAAMzxB,KAC1B2R,GAASwgB,EAAYxgB,IAAS4iB,EAAkB7zB,IAAIywB,GAAcxf,IAAS,KAExEkjB,EAAoB,IAAI9C,GAA2B/xB,KAAMhR,GAAOulC,EAAkB7zB,IAAI1R,IAC5F,GAAI4lC,GAAkBC,EAAmB,CAOvC,GANAxB,IAOEwB,GACCD,GAA4C,MAA1B5D,GAAO4D,GAC1B,CACA,IAAME,EAAgBF,EAClB1B,GAAYlzB,KAAM2vB,GAAQ1xB,OAAOuxB,GAAiBG,MAAUwB,GAAcyD,IAC1E1B,GAAYlzB,KAAM2vB,GAAQ1xB,OAAOuxB,GAAiBG,MAAUkF,GAChEpE,GAAe5gC,EAAWqQ,cAAe4nB,EAAWyL,EAAiBuB,GAAiBT,OAAa,EAAWd,EAAiBP,EAAe5iB,eAAY,EAC5J,CACA,QACF,CACA,IAAMze,EAASo+B,GAAgBlgC,EAAWqQ,eAC1C,GAAc,MAAVvO,IACFg/B,GAAc9gC,EAAWqQ,gBAMEuxB,EAAMpxB,KAC9BsR,IAAUwgB,EAAYxgB,IAASwf,GAAcxf,KAAU1T,OAAOq2B,KAEtChE,GAAqB3+B,EAAQm2B,IAAY,CAClEgI,GAAcjgC,EAAWqQ,eACzB,QACF,CAIF,GAFI0vB,GAAS//B,EAAWqQ,gBACpB1F,GAAS84B,oBACR1B,EAA6BlxB,IAAI7Q,EAAWqQ,eAAgB,SACjE,GAAI1F,GAAS63B,YAAa,CACxB,IAAM0C,EAAkB31B,EAAYY,KACjC/H,GAAcA,EAAUhH,eAAiBpB,EAAWqQ,eAEvD,IAAK60B,IAAoBv6B,EAAQ63B,YAAY0C,GAAkB,QACjE,CACA,IAAMC,QAAoBhqB,GAA4C,GAAGnc,eAAmB,CAC1Fs7B,OAAQ,OACRlX,QAAS,CAAE,eAAgB,oBAC3BxnB,KAAMjB,KAAKa,UAAU,CACnBkoB,MAAO,CAAC,CAAEvkB,GAAIslC,EAAQpC,SAAU,EAAGjB,WAAY,CAAEgE,CAAC/D,IAASrhC,EAAWqQ,qBAEvEuqB,MAAM,IAAM,MACf,IAAKuK,GAAanqB,GAAI,CAMpB,IAAMqqB,EAAkBxE,GAAoB1lC,IAAI6E,EAAWqQ,eAC3D,GAAIgzB,GAAcgC,GAAiBvF,MAAQ0E,IACzC3D,GAAoB/0B,OAAO9L,EAAWqQ,eACtC0wB,GAAuB/gC,EAAWqQ,eAMlCmzB,IACIzK,IAAeuK,WAA+BnnC,OAAW,KAAa,CACxE,IAAMmpC,EAAW,GAAGtlC,EAAWqQ,iBAAiB8yB,EAAe5iB,aAAa8iB,EAAW5kC,KAAK,OACvFuiC,GAAkBnwB,IAAIy0B,KACzBtE,GAAkB3hC,IAAIimC,GACtBR,GAAiB,CAAE1jC,aAAcpB,EAAWqQ,cAAekQ,UAAW4iB,EAAe5iB,UAAW5V,QAAS,IAAI04B,KAEjH,CAEF,QACF,CACA,GAAI8B,GAAanqB,GAAI,CACnB2mB,GAAc,EACdf,GAAe5gC,EAAWqQ,cAAe4nB,EAAWyL,EAAiBc,OAAa,EAAWd,EAAiBP,EAAe5iB,eAAY,GACzI2hB,EAA0B7iC,IAAI+O,OAAOq2B,IAIrC,IACE,IAAM7oC,QAAaupC,EAAYnpB,OACzBupB,EAAYtkC,MAAMC,QAAQtF,EAAK8nB,OACjC9nB,EAAK8nB,MAAMvT,KAAMC,KACbA,GAAwB,iBAATA,GACjB+wB,GAAO/wB,KAAsBpQ,EAAWqQ,oBAC1C,EAEFk1B,GAAsC,iBAAlBA,EAAUviC,KACA,iBAAvBuiC,EAAUlD,UAAyBkD,EAAUlD,SAAW,IAK/DV,GAAc,QACRF,GAAOQ,EAAY,CAAE9iC,GAAIomC,EAAUviC,IAAKq/B,SAAU,IAE5D,OAA4B,CAC9B,CACF,CACA,OAAOV,CACT,CAmCO,SAAS6D,GACd59B,EACA2H,EACA5E,GAEA86B,GAAa,CAAE79B,WAAU2H,cAAa5E,WA0HlC+6B,WAAyCvpC,OAAW,MACxDupC,IAAiC,EACjCvpC,OAAOK,iBAAiB,0BAA2B,KAC7CmpC,KAAUC,IAAwB,GACtCC,KAAwB7tB,QAAQ8sB,OAvHlC,IAAMgB,EADNxC,IAAwB,EAIxB,GAFAT,GAAiB3d,QACbva,GAASo7B,kBAAiBnD,IAAkB,IAC3Ch7B,GAAUqI,YAAY3U,UA5nBpB2lC,KAAuB3lC,OAAS,MAkoBhCsM,GAAYg7B,IAAiB,OAAOj9B,QAAQL,UAEnD,GAAIqgC,GAIF,OAAAK,GAAa,CAAEp+B,WAAU2H,cAAa5E,UAASouB,WAAY+M,GACpDH,GAMT,IAAMM,EAAgB1jB,MACpB2jB,EACAC,EACAC,EAIArN,KAEA,IAAIsN,GAAa,EACjB,QAASC,EAAO,EAAGA,EAAO,EAAGA,GAAQ,EAAG,CACtC,IAAMC,QAAgB7E,GAAIwE,EAAcC,EAAiBC,EAAarN,GAAY6B,MAAM,KAAM,GAE9F,GADI2L,IAASF,GAAa,IACrBE,EAAS,KAChB,CACA,GAAIF,UAAqBlqC,OAAW,IAMlC,IACEA,OAAOqqC,cACL,IAAIC,YAAY,oBAAqB,CAAEC,OAAQ,CAAEzxB,OAAQ,cAE7D,OAA4B,GAG1BwS,aAEJ,UADMwe,EAAcr+B,EAAU2H,EAAa5E,EAASm7B,GAC7CE,IAAY,CACjB,IAAM7pB,EAAO6pB,GACbA,GAAa,WACPC,EAAc9pB,EAAKvU,SAAUuU,EAAK5M,YAAa4M,EAAKxR,QAASwR,EAAK4c,WAC1E,CACI6M,IAAuBC,KAAwB7tB,QAAQ8sB,IAC3Dc,IAAwB,CAC1B,EATMne,GASDsT,QAAQ,KAEX,GADI4K,KAAale,IAASke,GAAW,OAChCA,IAAYK,GAAY,CAC3B,IAAM7pB,EAAO6pB,GACbA,GAAa,KACRR,GAAqBrpB,EAAKvU,SAAUuU,EAAK5M,YAAa4M,EAAKxR,QAClE,IAEF,OAAAg7B,GAAWle,EACJA,CACT,CAIO,SAASkf,GAAiBvlC,EAAsBk/B,GACrD,IAAKmF,IAA+C,OAAjC9F,GAAiBW,GAAsB,OAAO36B,QAAQL,UACzE,IAAMtF,EAAaylC,GAAW79B,UAAUqI,YAAYE,KAAMC,GAASA,EAAKC,gBAAkBjP,GACpFa,EAAcwjC,GAAWl2B,YAAYY,KAAMC,GAASA,EAAKhP,eAAiBA,IAAea,YACzF+N,EAAU/N,EAAcjC,GAAY2O,SAAS1M,QAAe,EAClE,IAAK+N,GAA8B,iBAAZA,EAAsB,OAAOrK,QAAQL,UAE5D,IAAMshC,EADQrH,GAAUvvB,IACOD,OAAQ2vB,GACrCA,EAAKG,0BAA0B13B,SAASm4B,KAAgB,GAKpDuG,EAAsBhE,GAAiB1nC,IAAIiG,GAI3C0lC,EAAaF,EAAgBz2B,KAChCuvB,GAASA,EAAKnf,YAAcsmB,GAE/B,OAAKC,GACLjG,GAAoBpuB,IAAIrR,EAAc,CACpC0+B,IAAKQ,EACLE,cAAesG,EAAWvmB,UAC1BkH,SAAS,IAEXsZ,GAAuB3/B,GAChBokC,GAAqBC,GAAW79B,SAAU69B,GAAWl2B,YAAak2B,GAAW96B,UAP5DhF,QAAQL,SAQlC,CAEA,SAASw/B,GAAiB4B,GACxBF,cAAc,IAAIC,YAAY,kBAAmB,CAAEC,WACrD,CAsBO,SAASb,GAAsBzkC,GACpC,IAAKqkC,GAAY,MAAO,GACxB,IAAMsB,EAA+B,GACrC,QAAYC,EAAoBzmB,KAAcsiB,GAAkB,CAG9D,QAFqB,IAAjBzhC,GAA8B4lC,IAAuB5lC,GACxCy/B,GAAoB1lC,IAAI6rC,IAC3BxG,gBAAkBjgB,EAAW,SAC3C,IAAMvgB,EAAaylC,GAAW79B,UAAUqI,YAAYE,KACjDC,GAASA,EAAKC,gBAAkB22B,GAE7B/kC,EAAcwjC,GAAWl2B,YAAYY,KACxCC,GAASA,EAAKhP,eAAiB4lC,IAC/B/kC,YACG+N,EAAU/N,EAAcjC,GAAY2O,SAAS1M,QAAe,EAClE,IAAK+N,GAA8B,iBAAZA,EAAsB,SAC7C,IAAM0vB,EAAOH,GAAUvvB,IAAqCG,KACzD/H,GAAcA,EAAUmY,YAAcA,GAEpCmf,GAAMG,0BACXkH,EAAQ91B,KAAK,CACX7P,aAAc4lC,EACdzmB,YACA5V,QAAS,IAAI+0B,EAAKG,2BAEtB,CACA,OAAOkH,CACT,CAr8BA,IASM1F,GACArB,GACAG,GAaAQ,GAgBFgF,GACAK,GAOE5F,GACAS,GACAG,GAGA6B,GAGFS,GACAmC,GAiIA7C,GAkuBA8C,GACAE,GA75BJqB,GAAA3pC,EAAA,KAAA+d,KACAikB,KAQM+B,GAAS,YACTrB,GAAiB,qBACjBG,GAAkB,qBAalBQ,GAAW,IAgBbgF,GAAiC,KACjCK,GAKO,KAEL5F,GAAsB,IAAI7rB,IAC1BssB,GAAsB,IAAItsB,IAC1BysB,GAAoB,IAAIlxB,IAGxB+yB,GAAmB,IAAItuB,IAGzB+uB,GAAuB,EACvBmC,GAAgI,KAiIhI7C,IAAkB,EAkuBlB8C,IAAiC,EACjCE,IAAwB,ICp4B5B,SAASsB,GAAc7lC,GACrB,SAAeA,GAA0B,iBAAVA,IAAuBJ,MAAMC,QAAQG,IAAUjG,OAAOC,KAAKgG,GAAO/F,OAAS,EAC5G,CAoDA,SAAS6rC,KAEP,IAAMC,EADI/mC,WACIgnC,WACd,SAAeD,GAAuC,mBAAzBA,EAAI5qC,iBACnC,CAiCO,SAAS8qC,GAAgB/Q,GAC9B,GAAIA,EAAOgR,cAAwC,SAAxBhR,EAAOgR,aAChC,OAAOhR,EAAOgR,aAEhB,IAAMC,EAAkBjR,EAAOkR,SAASC,SACxC,OAAIF,GAAuC,SAApBA,EACdA,EArCX,WAEE,IAAMpjB,EADI/jB,WACQoO,QAClB,SAAe2V,GAASujB,WAAkD,mBAA9BvjB,EAAQujB,UAAUC,QAChE,CAqBMC,GAA4B,UAnBlC,WACE,IAAMhkC,EAAIxD,WAEV,SADIwD,EAAEikC,gBACFjkC,EAAEkkC,kBACK9tC,SAAa,MAEtBA,SAASmZ,cAAc,kFAE3B,CAYM40B,GAA6B,oBATtB/tC,SAAa,MAEtBA,SAASmE,eAAe,YACrBnE,SAASmZ,cAAc,wFAOL+zB,KAA2B,MAC3C,MAYT,CAUO,SAASc,GAAsB1R,GAEpC,MAAkB,YADAA,EAAO2R,KAAKC,gBAAkB5R,EAAO4R,gBAAkB,QACtC,SAC5B,UACT,CAEO,SAASC,GAAc7R,GAC5B,IAAMp1B,EAAM,IAAKknC,IACXziB,EAAa2Q,EAAO+R,WAAa,CAAC,EACxC,QAAWtlC,KAAO5H,OAAOC,KAAK8F,GACG,kBAApBykB,EAAW5iB,KAAoB7B,EAAI6B,GAAO4iB,EAAW5iB,IAElE,OAAO7B,CACT,CAEA,SAASonC,GAAc58B,GACrB,IACE,OAAO,IAAIxR,IAAIwR,EAAK,YACtB,OACE,OAAO,IACT,CACF,CAEA,SAAS68B,GAAmB3tC,GAC1B,IAAMsY,EAAYtY,EAAOM,IAAI,eAAiB,GAC9C,GAAIgY,EAAW,OAAOA,EACtB,IAAM/R,EACJvG,EAAOM,IAAI,uBACXN,EAAOM,IAAI,oBACXN,EAAOM,IAAI,kBACXN,EAAOM,IAAI,iBACXN,EAAOM,IAAI,UACX,GACI8G,EACJpH,EAAOM,IAAI,sBACXN,EAAOM,IAAI,mBACXN,EAAOM,IAAI,iBACXN,EAAOM,IAAI,gBACXN,EAAOM,IAAI,UACX,GACF,OAAOiG,GAAgBa,EAAc,GAAGb,KAAgBa,IAAgB,EAC1E,CAEA,SAASwmC,GACPC,EACAz7B,EACAhH,GAEA,GAAa,UAATA,EAIF,OAHAyiC,EAAK3rC,MAAO,EACZ2rC,EAAK3tC,QAAS,OACd2tC,EAAK/uB,MAAO,GAGd+uB,EAAK3rC,MAAO,EACRkQ,EAAQ9E,SAAS,OAAMugC,EAAK3tC,QAAS,GACrCkS,EAAQ9E,SAAS,OAAMugC,EAAK/uB,MAAO,EACzC,CAoDO,SAASgvB,GAAoBp5B,GAClC,OAAKA,EAAYjU,OACViU,EACJjF,IAAK8F,GAASA,EAAKhP,aAAe,IAAMgP,EAAKnO,aAC7CR,OACAhD,KAAK,KAJwB,MAKlC,CAEO,SAASmqC,KACd,IACE,UAAWviC,YAAgB,IAAa,OAAO,EAC/C,IAAMwiC,EAASxiC,YAAYwiC,OAC3B,GAAIA,GAAUA,EAAOC,gBAAkB,GAAKD,EAAOE,2BAA6B,EAC9E,OAAOjtC,KAAKC,IAAI,EAAG8sC,EAAOE,2BAA6BF,EAAOC,iBAEhE,IAAM1B,EAAM/gC,YAAY2iC,mBAAmB,gBAAgB,GAC3D,GAAI5B,GAAiD,iBAAnCA,EAAI2B,2BACpB,OAAOjtC,KAAKC,IAAI,EAAGD,KAAKQ,MAAM8qC,EAAI2B,4BAEtC,OAEA,CACA,OAAO,CACT,CA3QA,IAkBMV,GAlBNY,GAAA3rC,EAAA,KAkBM+qC,GAAoC,CACxCa,yBAAyB,EACzBC,8BAA8B,EAC9BC,iCAAiC,EACjCC,uBAAuB,KCuDzB,SAASC,GAAaC,GACpB,OAAOA,EAAItvC,kBAAoBA,SAAa,IAAcA,cAAW,EACvE,CAEA,SAASuvC,GACPD,GAEA,OAAOA,EAAIptC,gBAAkBA,OAAW,IAAcA,YAAS,EACjE,CAMA,SAASstC,GAAgBtiB,EAA8B9lB,GACrD,IACE8lB,EAAS9lB,EACX,OAAS,CACX,CAEA,SAASqoC,GAAUroC,GACjB,cAAcgX,QAAY,KAAehX,aAAiBgX,OAC5D,CAEA,SAASsxB,GAAWtoC,GAClB,cAAcuoC,SAAa,KAAevoC,aAAiBuoC,QAC7D,CA8CO,SAASC,GACdN,EAA+B,CAAC,GAEhC,IAAMO,EAA0B,CAC9B,cAAAC,CACEjzB,EACAqQ,EACAxc,EAAiC,CAAC,GAElC,IAAM2kB,EAAMga,GAAaC,GACzB,IAAKja,IAAQxY,EAASvY,OAAQ,MArF3B,OAsFH,IAAMS,EAAO2L,EAAQ3L,MAAQswB,EACvBxS,EAAO,IAAIktB,QACbp6B,GAAS,EACT3K,EAAoC,KACpCsa,EAA2B,KAEzB0qB,EAAO,KACXr6B,GAAS,EACT3K,GAAUE,aACVF,EAAW,KACO,OAAdsa,IACFiqB,GAAWD,IAAM7rC,aAAa6hB,GAC9BA,EAAY,OAIVrM,EAAUyD,IACd,GAAK/G,EACL,QAAWsJ,KAzEnB,SAAwBla,EAAkB8X,GACxC,IAAMS,EAAqB,GACvBmyB,GAAU1qC,IAASA,EAAKuY,QAAQT,IAClCS,EAAQtG,KAAKjS,GAEf,IACEA,EAAK4U,iBAAiBkD,GAAUkB,QAASkB,GAAY3B,EAAQtG,KAAKiI,GACpE,OAAS,CACT,OAAO3B,CACT,CAgE8B2yB,CAAevzB,EAAOG,GAC1C,IAAIgG,EAAKjM,IAAIqI,KACb4D,EAAKzd,IAAI6Z,GACTuwB,GAAatiB,EAAUjO,IACF,IAAjBvO,EAAQhO,MAEV,YADAstC,KAON,GADA/2B,EAAOlU,IACF4Q,UAAiBmI,iBAAqB,IAAa,OAAOkyB,EAE/D,IAAME,EA5EZ,SAAwBnrC,EAAkBswB,GACxC,OAAIqa,GAAW3qC,GACNA,EAAK/C,iBAAmB+C,EAAKpD,KAElC8tC,GAAU1qC,GAAcA,EACrBswB,EAAIrzB,iBAAmBqzB,EAAI1zB,IACpC,CAsE4BwuC,CAAeprC,EAAMswB,GAC3C,OAAK6a,IACLllC,EAAW,IAAI8S,iBAAkB2Z,IAC/B,QAAWtE,KAAYsE,EACrBtE,EAAShV,WAAWJ,QAAShG,IACvB03B,GAAU13B,IAAOkB,EAAOlB,OAIlC/M,EAASe,QAAQmkC,EAAe,CAAElyB,WAAW,EAAME,SAAS,IAExDxN,EAAQ5M,WAAa4M,EAAQ5M,UAAY,IAC3CwhB,EAAYiqB,GAAWD,IAAM7pC,WAAWuqC,EAAMt/B,EAAQ5M,YAAc,OAE/DksC,CACT,EAEA,eAAAI,CACEvzB,EACAqQ,EACAmjB,GAEA,IAAMhb,EAAMga,GAAaC,GACnBgB,EAAMf,GAAWD,GACvB,IAAKja,IAAQib,IAAQzzB,EAASvY,OAAQ,MA9InC,OA+IH,IAAMoM,EA7FZ,SACEA,GAEA,MAAuB,kBAAZA,EAA8B,CAAEhO,MAAOgO,GAC3CA,GAAW,CAAC,CACrB,CAwFsB6/B,CAAuBF,GACjC3tC,GAAwB,IAAjBgO,EAAQhO,KACf8tC,EAAW,IAAIT,QACfU,EAAsB,GACxBzlC,EAAwC,KAQ5C,cAAW0lC,qBAAyB,IAC3Bb,EAAMC,eACXjzB,EACCoC,IACC,IAAM2F,EAAO3F,EAAQ4F,wBAEnBD,EAAKE,MAAQ,GACbF,EAAKG,OAAS,GACdH,EAAK+rB,QAAU,GACf/rB,EAAK/J,OAAS,GACd+J,EAAKgsB,KAAON,EAAInuC,aAChByiB,EAAKhK,MAAQ01B,EAAIO,YACPrB,GAAatiB,EAAUjO,IAErC,CAAEvc,OAAMoB,UAAW4M,EAAQ5M,aAI/BkH,EAAW,IAAI0lC,qBACZ1tC,IACC,QAAWwH,KAASxH,EACbwH,EAAMsmC,iBACXtB,GAAatiB,EAAU1iB,EAAMwV,QACzBtd,GAAMsI,GAAU+lC,UAAUvmC,EAAMwV,UAGxC,CACEjb,KAAM2qC,GAAWh/B,EAAQ3L,MAAQ,KAAQ2L,EAAQ3L,MAAQ,KACzDisC,WAAYtgC,EAAQsgC,WACpB1qB,UAAW5V,EAAQ4V,WAAa,IAIpCmqB,EAASz5B,KACP64B,EAAMC,eACJjzB,EACCoC,IACKuxB,EAAS55B,IAAIqI,KACjBuxB,EAASprC,IAAI6Z,GACbjU,GAAUe,QAAQkT,KAEpB,CAAEvc,MAAM,EAAOoB,UAAW4M,EAAQ5M,aA/CzB,KACXkH,GAAUE,aACVF,EAAW,KACXylC,EAASQ,OAAO,GAAGlzB,QAASmzB,GAAYA,MAgD5C,EAEA,UAAAC,CACEjkB,EACAxc,EAA6B,CAAC,GAE9B,IAAM2kB,EAAMga,GAAaC,GACnBgB,EAAMf,GAAWD,GACvB,IAAKja,UAAcvX,iBAAqB,IAAa,MAhNlD,OAiNH,IAAM/Y,EAAO2L,EAAQ3L,MAAQswB,EAAIrzB,iBAAmBqzB,EAAI1zB,KACxD,IAAKoD,EAAM,MAlNR,OAmNH,IAAMqsC,EAAavvC,KAAKC,IAAI,EAAG4O,EAAQ0gC,YAAc,IACjD5jB,EAA4B,GAC5BlI,EAA2B,KACzB+rB,EAAQ,KACZ/rB,EAAY,KACZ,IAAMmS,EAAYjK,EAClBA,EAAU,GACVgiB,GAAatiB,EAAUuK,IAEnBzsB,EAAW,IAAI8S,iBAAkB2Z,IACrCjK,EAAQxW,QAAQygB,GACG,IAAf2Z,EAIc,OAAd9rB,IACJA,EAAYgrB,GAAK7qC,WAAW4rC,EAAOD,IAAe,MAJhDC,MAMJ,OAAArmC,EAASe,QAAQhH,EAAM,CAAEiZ,WAAW,EAAME,SAA6B,IAApBxN,EAAQwN,UACpD,KACLlT,EAASE,aACS,OAAdoa,GAAoBgrB,GAAK7sC,aAAa6hB,GAE9C,EAEA,SAAAgsB,CAAUpkB,GACR,IAAMmI,EAAMga,GAAaC,GACzB,IAAKja,GAA0B,YAAnBA,EAAIsD,WACd,OAAA6W,GAAatiB,OAAU,GA/OtB,OAkPH,IAAMxrB,EAAU,IAAM8tC,GAAatiB,OAAU,GAC7C,OAAAmI,EAAI9yB,iBAAiB,mBAAoBb,EAAS,CAAEgB,MAAM,IACnD,IAAM2yB,EAAI1yB,oBAAoB,mBAAoBjB,EAC3D,EAEA,gBAAA6vC,CACEC,EACAtkB,EACAxc,EAA4B,CAAC,GAE7B,IAAM4/B,EAAMf,GAAWD,GACvB,IAAKgB,EAAK,MA7PP,OA8PH,IAAMmB,EAAY/gC,EAAQ+gC,WAAa,YACjCC,EAAYpB,EACZqB,EAAQ3qC,MAAMC,QAAQyqC,EAAUD,IACjCC,EAAUD,GACX,GACJC,EAAUD,GAAaE,EACvB,IAAMC,EAAeD,EAAM36B,KACvBrB,GAAS,EACT2P,EAA2B,KAEzBusB,EAAWrnC,IACf,IAAKmL,EAAQ,OACb,IAAM5H,EAAakgB,GAAwBzjB,GACrCsnC,EAAYtnC,GAA0B,iBAAVA,IAAuBxD,MAAMC,QAAQuD,GACnEA,EACA,KACE2D,EAAYJ,IAChB+jC,GAAqC,iBAAjBA,EAAU,GAAkBA,EAAY,OAEzD3jC,IApNb,SACE3D,EACAgnC,GAEA,IAAKhnC,GAA0B,iBAAVA,GAAsBxD,MAAMC,QAAQuD,GAAQ,OAAO,EACxE,IAAM3C,EAAS2C,EACf,OAVF,SAA0BgnC,GACxB,OAAOxqC,MAAMC,QAAQuqC,GAAWA,EAAUrwC,OAAO6B,QAAQwuC,EAC3D,CAQSO,CAAiBP,GAASljC,MAAM,EAAEvF,EAAKsrB,KACxCA,aAAoB3tB,OACf2tB,EAAS7lB,KAAK2F,OAAOtM,EAAOkB,IAAQ,KAEtClB,EAAOkB,KAASsrB,EAE3B,CAwM2B2d,CAAsB7jC,EAAWqjC,KACpDhC,GAAatiB,EAAU/e,IACF,IAAjBuC,EAAQhO,MAAgBwuC,MAExBA,EAAU,KACdv7B,GAAS,EACLg8B,EAAM36B,OAASi7B,IAAaN,EAAM36B,KAAO46B,GAC3B,OAAdtsB,IACFgrB,EAAI7sC,aAAa6hB,GACjBA,EAAY,OAGV2sB,EAAc,YAAaxoB,GAC/B,IAAM7I,EAASgxB,EAAaM,MAAMP,EAAOloB,GACzC,OAAAA,EAAM1L,QAAQ8zB,GACPjxB,CACT,EAEA,OAAA+wB,EAAMhqC,MAAM9F,KAAKC,IAAI,EAAG6vC,EAAMtwC,OAAS,KAAK0c,QAAQ8zB,GAChDl8B,IAAQg8B,EAAM36B,KAAOi7B,GACrBvhC,EAAQ5M,WAAa4M,EAAQ5M,UAAY,IAC3CwhB,EAAYgrB,EAAI7qC,WAAWyrC,EAASxgC,EAAQ5M,YAEvCotC,CACT,EAEA,KAAAppB,CAAM9b,EAAcnJ,GAClBysC,EAAIxnB,QAAQ9b,EAAMnJ,EACpB,EAEA,SAAAsvC,CAAUliB,EAAgBptB,GACxBysC,EAAI6C,YAAYliB,EAAQptB,EAC1B,EAEA,MAAAwmB,CAAOtgB,EAAa3B,EAAgBib,GAClCitB,EAAIjmB,SAAStgB,EAAK3B,EAAOib,EAC3B,EAEA,QAAA+vB,CAASpyB,GACP,IAAMqyB,EA3SZ,SAAsB/C,GACpB,OAAOA,EAAIlwC,kBAAoBA,SAAa,IAAcA,cAAW,EACvE,CAySkBkzC,CAAahD,IACpB+C,IAAQryB,EAAO1b,QACpB+tC,EAAI1vB,OAAO,IAAIziB,IAAI8f,EAAQqyB,EAAI1gC,MAAMrE,WACvC,EAEAilC,OAAOC,GACElD,EAAIiD,SAASC,GAGtBtxC,IAAI6H,GACU,UAARA,EAAwB8mC,EACrBP,EAAIpuC,MAAM6H,IAIrB,OAAO8mC,CACT,CAlZA,IAAA4C,GAAApvC,EAAA,KAAA6qB,OCwBA,SAASwkB,GAAgBliB,GACvB,OAAOA,EAAKmiB,WAAaniB,EAAKoiB,YAAcpiB,EAAKxkB,IACnD,CA4DA,SAAS6mC,GAAuBriB,GAC9B,IAAMsiB,EAAQ,KACRtiB,EAAKuiB,cAAgB,IAAI1iC,IAAK8F,KAIhC68B,SAA0B,IAAjB78B,EAAK68B,QACdL,UAAWD,GAAgBv8B,GAC3BnD,QAASmD,EAAKnD,eAEZwd,EAAKyiB,cAAgB,IAAI5iC,IAAK8F,KAChC68B,SAAS,EACTL,UAAWD,GAAgBv8B,GAC3BnD,QAASmD,EAAKnD,YAGlB,OAAOtS,KAAKa,UAAUuxC,EACxB,CAEA,SAASI,GAAe1iB,GACtB,IAAM2iB,EAAe3iB,EAAK4iB,mBAAmB9jB,MAAMhrB,OACnD,GAAI6uC,EAAc,MAAO,CAAEn4B,OAAQm4B,EAAcE,WAAY,MAC7D,IAAMC,EAAY9iB,EAAK+iB,SAASD,WAAWhvC,OAC3C,OAAIgvC,EAAkB,CAAEt4B,OAAQs4B,EAAWD,WAAY,MAChD,CAAEr4B,OAAQ63B,GAAuBriB,GAAO6iB,WAAY,YAC7D,CAEA,SAASG,GACPhjB,EACAijB,GAEA,GAAIjjB,EAAKjlB,SAAU,MAAO,CAAE6lB,SAAS,EAAOiJ,OAAQ,sBACpD,GAAI7J,EAAK+iB,SAAShoC,SAAU,MAAO,CAAE6lB,SAAS,EAAOiJ,OAAQ,yBAE7D,IAAM0Y,EAAeviB,EAAKuiB,cAAgB,GACpCE,GAAgBziB,EAAKyiB,cAAgB,IAAI5iC,IAAK8F,QAAeA,EAAM68B,SAAS,KAElF,IADmBU,GAAcD,EAAI/hC,IAAK,IAAIqhC,KAAiBE,IAC9C,MAAO,CAAE7hB,SAAS,EAAOiJ,OAAQ,gBAClD,IAAKsZ,GAAyBnjB,EAAMijB,GAAM,MAAO,CAAEriB,SAAS,EAAOiJ,OAAQ,2BAC3E,IAAMuZ,EAAWC,GAAoCrjB,EAAMijB,GAC3D,OAAKG,EAASxiB,QACP,CAAEA,SAAS,GADYwiB,CAEhC,CAEA,SAASE,GACPtjB,EACAzc,EACAmB,EACAmlB,EACA0Z,GAEA,IAAMf,GAA2B,IAAjBxiB,EAAKwiB,QACfgB,KAAsBxjB,EAAKuiB,cAAc1xC,SAAUmvB,EAAKyiB,cAAc5xC,QACtE2Z,EAASk4B,GAAe1iB,GAC9B,MAAO,CACLtrB,GAAI,QAAQsrB,EAAKtrB,IAAM6O,IACvBxF,MAAOiiB,EAAKrgB,OAAS6iC,EAAU,oBAAsB,qBACrD99B,SACAmlB,SACA4Z,SAAUjB,EAAU,UAAY,UAIhC3e,SAAgC,OAAtBrZ,EAAOq4B,YAAuBW,EAAcnB,GAAuBriB,QAAQ,EACrFujB,YACG/4B,EAEP,CAuEA,SAASk5B,GACP1jB,EACA2jB,EACApgC,EACAmB,EACAmlB,EACA0Z,EACA1f,GAEA,IAAM+f,EAASD,EAAUE,IAAI/kB,MAAMhrB,OACnC,MAAO,CACLY,GAAI,WAAWsrB,EAAKtrB,IAAM,UAAU6O,IACpCxF,MAAOiiB,EAAKrgB,KAAO,GAAGqgB,EAAKrgB,SAASgkC,EAAU9qB,SAAW,sBAAsB8qB,EAAU9qB,SACzFnU,SACAmlB,SACA4Z,SAAUE,EAAUF,SACpB5qB,OAAQ8qB,EAAU9qB,OAClBgL,WACA0f,SACA/4B,OAAQo5B,GAAU5jB,EAAKtrB,GACvBmuC,WAAYe,EAAS,KAAO,UAEhC,CASA,SAASE,GAA6B9jB,EAA4B6J,GAEhE,OATF,SAAyC7J,GACvC,IAAM+jB,EAASvtC,MAAMC,QAAQupB,EAAKsiB,OAAOyB,QACrC/jB,EAAKsiB,MAAMyB,OAAOz+B,OAAQvC,GAAUvM,MAAMC,QAAQsM,IAAUA,EAAMlS,OAAS,GAC3E,GACJ,OAAOkzC,EAAOlzC,OAASkzC,EAAOC,OAAShkB,EAAKsiB,OAAO2B,YAAc,EACnE,CAGqBC,CAAgClkB,GACjCngB,IAAI,CAAC8jC,EAAWpgC,IAChCmgC,GACE1jB,EACA2jB,EACApgC,EACA,UACAsmB,OACA,EACAsa,GAA8BR,IAGpC,CAEA,SAASS,GACPpkB,EACA2jB,EACApgC,EACA0/B,GAEA,IAAMxP,EA5ER,SACEkQ,EACAV,GAEA,GAAyB,iBAArBU,EAAU9qB,QAAkD,cAArB8qB,EAAU9qB,OACnD,MAAO,CACL0qB,OAAQc,GAA4BV,EAAWV,GAC/Cpf,SAAUsgB,GAA8BR,IAG5C,GAAIA,EAAUE,GAAI,CAChB,IAAMzzB,EAASk0B,GAAwBX,EAAWV,GAClD,MAAO,CACLM,OAAQnzB,EAAOmzB,OACf1f,SAAUsgB,GAA8BR,GACxCY,SAAUn0B,EAAOyZ,OAErB,CACA,MAAO,CACL0Z,OAAQc,GAA4BV,EAAWV,GAC/Cpf,SAAUsgB,GAA8BR,GAE5C,CAsDmBa,CAAsCb,EAAWV,GAC5DriB,EAAU6jB,GAA4Bd,EAAWlQ,EAAS8P,OAAQ9P,EAAS5P,UACjF,MAAO,CACLjD,UACA8jB,WAAYhB,GACV1jB,EACA2jB,EACApgC,EACAqd,EAAU,SAAW,SACrBA,OAAU,EAAY6S,EAAS8Q,UAAY,mBAC3C9Q,EAAS8P,OACT9P,EAAS5P,UAGf,CAEA,SAAS8gB,GACP3kB,EACAijB,GAEA,IAAM2B,EAAqC,GACrCb,EAASvtC,MAAMC,QAAQupB,EAAKsiB,OAAOyB,QACrC/jB,EAAKsiB,MAAMyB,OAAOz+B,OAAQvC,GAAUvM,MAAMC,QAAQsM,IAAUA,EAAMlS,OAAS,GAC3E,GAEJ,GAAIkzC,EAAOlzC,OAAQ,CACjB,IAAIg0C,EAAY,EAChB,QAASC,EAAc,EAAGA,EAAcf,EAAOlzC,OAAQi0C,GAAe,EAAG,CACvE,IAAM/hC,EAAQghC,EAAOe,GACjBC,GAAe,EACnB,QAASC,EAAa,EAAGA,EAAajiC,EAAMlS,OAAQm0C,GAAc,EAAG,CACnE,IAAMrB,EAAY5gC,EAAMiiC,GACxB,GAAID,EAAc,CAChBH,EAAYp+B,KAAKk9B,GACf1jB,EACA2jB,EACAkB,EACA,UACA,6BACA,EACAV,GAA8BR,KAEhCkB,GAAa,EACb,QACF,CACA,IAAMz0B,EAASg0B,GAAyBpkB,EAAM2jB,EAAWkB,EAAW5B,GACpE2B,EAAYp+B,KAAK4J,EAAOs0B,YACxBK,EAAe30B,EAAOwQ,QACtBikB,GAAa,CACf,CACA,IAAKE,EAAc,CACjB,QAAWE,KAAkBlB,EAAO5sC,MAAM2tC,EAAc,GACtD,QAAWnB,KAAasB,EACtBL,EAAYp+B,KAAKk9B,GACf1jB,EACA2jB,EACAkB,EACA,UACA,4BACA,EACAV,GAA8BR,KAEhCkB,GAAa,EAGjB,MAAO,CAAEjkB,SAAS,EAAOqjB,WAAYW,EACvC,CACF,CACA,MAAO,CAAEhkB,SAAS,EAAMqjB,WAAYW,EACtC,CAEA,IAAMX,EAAajkB,EAAKsiB,OAAO2B,YAAc,GAC7C,IAAKA,EAAWpzC,OAAQ,MAAO,CAAE+vB,SAAS,EAAMqjB,WAAYW,GAC5D,GAA4B,OAAxB5kB,EAAKsiB,MAAMmB,SAAmB,CAChC,IAAI7iB,GAAU,EACd,QAASrd,EAAQ,EAAGA,EAAQ0gC,EAAWpzC,OAAQ0S,GAAS,EAAG,CACzD,IAAMogC,EAAYM,EAAW1gC,GAC7B,GAAIqd,EAAS,CACXgkB,EAAYp+B,KAAKk9B,GACf1jB,EACA2jB,EACApgC,EACA,UACA,0BACA,EACA4gC,GAA8BR,KAEhC,QACF,CACA,IAAMvzB,EAASg0B,GAAyBpkB,EAAM2jB,EAAWpgC,EAAO0/B,GAChE2B,EAAYp+B,KAAK4J,EAAOs0B,YACxB9jB,EAAUxQ,EAAOwQ,OACnB,CACA,MAAO,CAAEA,UAASqjB,WAAYW,EAChC,CAEA,IAAIhkB,GAAU,EACd,QAASrd,EAAQ,EAAGA,EAAQ0gC,EAAWpzC,OAAQ0S,GAAS,EAAG,CACzD,IAAMogC,EAAYM,EAAW1gC,GAC7B,IAAKqd,EAAS,CACZgkB,EAAYp+B,KAAKk9B,GACf1jB,EACA2jB,EACApgC,EACA,UACA,0BACA,EACA4gC,GAA8BR,KAEhC,QACF,CACA,IAAMvzB,EAASg0B,GAAyBpkB,EAAM2jB,EAAWpgC,EAAO0/B,GAChE2B,EAAYp+B,KAAK4J,EAAOs0B,YACxB9jB,EAAUxQ,EAAOwQ,OACnB,CACA,MAAO,CAAEA,UAASqjB,WAAYW,EAChC,CAEA,SAASM,GACPllB,EACAzc,EACAmB,EACAmlB,EACA0Z,GAEA,MAAO,CACL7uC,GAAI,aAAasrB,EAAKE,aAAa3c,IACnCxF,MAAO,mBAAmBiiB,EAAKE,YAC/Bxb,SACAmlB,SACA4Z,SAAUzjB,EAAKyjB,SACf5qB,OAAQmH,EAAKE,UACb2D,SAAU7D,EAAKppB,MACf2sC,SACA/4B,OAAQwV,EAAKE,UACb2iB,WAAY,YAEhB,CA7ZA,IAAAsC,GAAAtyC,EAAA,KAWAuyC,OC8CO,SAASC,GAAYnkC,EAAa8e,GACvC,IACE,IAAMzpB,EAAS,IAAI7G,IAAIwR,EAAK,aAE5B,GAAkB,cADA8e,EAAKmiB,WAAaniB,EAAKoiB,YACX,CAC5B,IAAMmB,EAAShtC,EAAO4K,KAAK1D,cACrB+E,EAAUwd,EAAKxd,QAAQ/E,cAC7B,OAAO8lC,EAAO7lC,SAAS8E,IAAY+gC,EAAO7lC,SAXhD,SAA8B9G,GAC5B,OAAOA,EAAM4G,QAAQ,4BAA6B,KACpD,CASyD8nC,CAAqB9iC,GAC1E,CACA,GAAkB,UAAdwd,EAAKxkB,KAAkB,CACzB,IAAM+pC,EAAUvlB,EAAKxd,QAAQhF,QAAQ,aAAc,SACnD,OAAO6gB,GAAcknB,EAAShvC,EAAO4K,OAASkd,GAAcknB,EAAShvC,EAAO4K,KAAKqkC,UAAUjvC,EAAO1H,OAAOgC,QAC3G,CACA,OArCJ,SAA6B0yC,EAAa/gC,GACxC,IACE,IAAMqhB,EAAW,IAAIn0B,IACnB8S,EAAQhF,QAAQ,gBAAiB,eAAeA,QAAQ,MAAO,SAC/D,iBAEIioC,EAA0C,CAC9C,CAAClC,EAAO9zC,KAAMo0B,EAASp0B,MAAM,GAC7B,CAAC8zC,EAAOz0C,SAAU+0B,EAAS/0B,UAAU,IAEvC,OAAI+0B,EAAS3U,MAAMu2B,EAAMj/B,KAAK,CAAC+8B,EAAOr0B,KAAM2U,EAAS3U,MAAM,IAC3D2U,EAASziB,aAAamM,QAAQ,CAAC9c,EAAGD,KAChCi1C,EAAMj/B,KAAK,CAAC+8B,EAAOniC,aAAa1Q,IAAIF,IAAM,GAAIC,GAAG,OAE3Cg1C,EAAM1/B,KAAM1T,IA7BxB,SAA2BkxC,EAAgB/gC,EAAiBkjC,GAC1D,IACE,IAAIH,EAAU/iC,EACXhF,QAAQ,sBAAuB,QAC/BA,QAAQ,SAAU,MACrB,OAAIkoC,IACFH,EAAU,OAASA,EAAQ/nC,QAAQ,aAAc,IAAM,QAE3C,IAAItH,OAAO,IAAMqvC,EAAU,IAAK,KACjCvnC,KAAKulC,EACpB,OACE,OAAO,CACT,CACF,CAgBkCoC,CAAkBtzC,EAAK,GAAIA,EAAK,GAAIA,EAAK,IACzE,OACE,OAAO,CACT,CACF,CAmBWuzC,CAAoBrvC,EAAQypB,EAAKxd,QAC1C,OACE,OAAO,CACT,CACF,CAEA,SAASqjC,GAAwBjvC,GAC/B,GAAqB,iBAAVA,EAAoB,CAC7B,IAAM4L,EAAU5L,EAAM9C,OACtB,OAAO0O,EAAU,CAAEhH,KAAM,SAAUgH,UAASggC,SAAS,GAAS,IAChE,CACA,IAAK5rC,GAA0B,iBAAVA,GAAsBJ,MAAMC,QAAQG,GAAQ,OAAO,KAExE,IAAMN,EAAMM,EACNkvC,EAAaxvC,EAAIkM,SAAWlM,EAAIM,OAASN,EAAI4K,KAAO5K,EAAIhE,KACxDkQ,EAAgC,iBAAfsjC,EAA0BA,EAAWhyC,OAAS,GACrE,IAAK0O,EAAS,OAAO,KAErB,IAAMggC,EAAiC,kBAAhBlsC,EAAIksC,SAAwBlsC,EAAIksC,QACjDL,EACc,UAAlB7rC,EAAI6rC,WACc,aAAlB7rC,EAAI6rC,WACc,aAAlB7rC,EAAI6rC,WACc,UAAlB7rC,EAAI6rC,UACA7rC,EAAI6rC,UACe,UAAnB7rC,EAAI8rC,YACiB,aAAnB9rC,EAAI8rC,YACe,aAAnB9rC,EAAI8rC,YACe,UAAnB9rC,EAAI8rC,WACJ9rC,EAAI8rC,WACS,iBAAb9rC,EAAIkF,KACF,gBACA,EAEV,MAAiB,iBAAblF,EAAIkF,KACC,CAAEA,KAAM,SAAUgH,UAASggC,UAASL,UAAW,YAEjD,CACL3mC,KAAmB,UAAblF,EAAIkF,MAAiC,cAAblF,EAAIkF,KAAuB,QAAU,SACnEgH,UACAggC,aACIL,EAAY,CAAEA,aAAc,CAAC,EAErC,CAEO,SAAS4D,GAAyBC,GACvC,IAAM1vC,EAAM0vC,EACZ,IAAK1vC,GAAsB,iBAARA,EAAkB,MAAO,GAE5C,IAAM2vC,EAAYzvC,MAAMC,QAAQH,EAAI4K,KAChC5K,EAAI4K,SACQ,IAAZ5K,EAAI4K,KAAiC,OAAZ5K,EAAI4K,IAC3B,GACA,CAAC5K,EAAI4K,KACLglC,EAAc1vC,MAAMC,QAAQH,EAAIgsC,OAAShsC,EAAIgsC,MAAQ,GAE3D,OAAO2D,EACJE,OAAOD,GACPrmC,IAAIgmC,IACJvgC,OAAQ0a,KAAkCA,EAC/C,CAEO,SAASkjB,GAAchiC,EAAaohC,GACzC,IAAKA,EAAMzxC,OAAQ,OAAO,EAC1B,IAAIu1C,GAAa,EACbC,GAAW,EACf,QAAWrmB,KAAQsiB,EAAO,CACxB,IAAMtsC,EAAQqvC,GAAYnkC,EAAK8e,GAC/B,IAAqB,IAAjBA,EAAKwiB,SACP,GAAIxsC,EAAO,OAAO,OAElBowC,GAAa,EACTpwC,IAAOqwC,GAAW,EAE1B,CACA,OAAOA,IAAaD,CACtB,CAMA,SAASE,GAAcpnB,GACrB,IAAMnD,EALR,SAAsBmD,GACpB,OAAOA,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,EACzD,CAGkBqnB,CAAarnB,GAC7B,OAAOnD,EAAU,aAAaA,IAAY,UAC5C,CAQO,SAASsnB,GACdrjB,EACAijB,GAEA,IAAMnkB,EAAOkB,EAAK4iB,mBAAmB9jB,MAAMhrB,OAC3C,IAAKgrB,EAAM,MAAO,CAAE8B,SAAS,GAC7B,IACE,IAAM1f,EAAM,IAAIxR,IACduzC,EAAI/hC,WACGtS,SAAa,IAAcA,SAASC,OAAS,aAYhD+xB,IAVK,IAAI5B,SACb,UACA,iMAMgC,6BAA6BhhB,KAAK8gB,GAAQA,EAAO,WAAWA,yBARnF,CAUgB,CACzB7J,WAAYguB,EAAIhuB,WAChBzlB,gBAAiBA,SAAa,IAAcA,cAAW,EACvDZ,gBAAiBA,SAAa,IAAcA,cAAW,EACvDsS,MACAxP,cAAeA,OAAW,IAAcA,YAAS,IAEnD,MAAO,CAAEkvB,UAASiJ,OAAQjJ,OAAU,EAAY,WAClD,OAAS1B,GACP,MAAO,CAAE0B,SAAS,EAAOiJ,OAAQyc,GAAcpnB,GAAQA,QACzD,CACF,CAmBO,SAASikB,GACdnjB,EACAijB,GAEA,IAAM5vC,EAAO2sB,EAAK+iB,SAAS1vC,KAC3B,GAAa,oBAATA,GAAuC,eAATA,EAAuB,OAAO,EAChE,IAAMwlB,EAASmH,EAAK+iB,SAASlqB,OAC7B,QAAKA,IAC6B,IAA3BoqB,EAAIhuB,WAAW4D,EACxB,CAEA,SAAS2tB,GACPxmB,EACAijB,GAEA,GAAIjjB,EAAKjlB,UAAYilB,EAAK+iB,SAAShoC,SAAU,OAAO,EACpD,IAAMwnC,EAAeviB,EAAKuiB,cAAgB,GACpCE,GAAgBziB,EAAKyiB,cAAgB,IAAI5iC,IAAK8F,QAAeA,EAAM68B,SAAS,KAElF,OADmBU,GAAcD,EAAI/hC,IAAK,IAAIqhC,KAAiBE,KAC1CU,GAAyBnjB,EAAMijB,IApCtD,SACEjjB,EACAijB,GAEA,IAAM7yB,EAASizB,GAAoCrjB,EAAMijB,GACzD,IAAK7yB,EAAOwQ,SAAWxQ,EAAOyZ,QAAQxrB,WAAW,YAC/C,IACE2d,QAAQO,KAAK,oCAAqC,CAChDkqB,OAAQzmB,EAAKtrB,GACbgyC,SAAU1mB,EAAKrgB,KACfuf,MAAO9O,EAAO8O,OAElB,OAAS,CAEX,OAAO9O,EAAOwQ,OAChB,CAqB8D+lB,CAA8B3mB,EAAMijB,EAClG,CAuBO,SAAS2D,GACdC,EACA7mB,GAEA,IAAMppB,EAAQiwC,EAAM7mB,EAAKE,WACzB,OAAQF,EAAKyjB,UACX,IAAK,SACH,OAAwC,MAAV7sC,EAChC,IAAK,SACH,OAAOA,IAAUopB,EAAKppB,MACxB,IAAK,WACH,MAAwB,iBAAVA,GAA4C,iBAAfopB,EAAKppB,OAC5CA,EAAM8G,SAASsiB,EAAKppB,OAE1B,IAAK,KACH,QAAOJ,MAAMC,QAAQupB,EAAKppB,QAASopB,EAAKppB,MAAM8G,SAASiG,OAAO/M,IAChE,QACE,OAAO,EAEb,CA+BA,SAASkwC,KACP,cAAcC,UAAc,SAAc,EAAYA,SACxD,CAEA,SAASC,GAAMpwC,GACb,MAAwB,iBAAVA,EAAqBA,EAAM6G,cAAgB,EAC3D,CAEA,SAASwpC,GAAiBrwC,GACxB,GAAqB,iBAAVA,EAAoB,MAAO,GACtC,IAAMZ,EAAQY,EAAMZ,MAAM,mBAC1B,OAAOA,EAAQA,EAAM,GAAGwH,QAAQ,KAAM,KAAO,EAC/C,CAEA,SAAS0pC,GAAkBC,EAAYC,GACrC,QAAW5kC,KAAW4kC,EAAU,CAC9B,IAAMpxC,EAAQmxC,EAAGnxC,MAAMwM,GACjB6kC,EAAUJ,GAAiBjxC,IAAQ,IACzC,GAAIqxC,EAAS,OAAOA,CACtB,CACA,MAAO,EACT,CAEA,SAASC,KACP,OAAOR,MAAoBS,WAAa,EAC1C,CAEA,SAASC,KACP,IAAM7K,EAAMmK,KACZ,OAAOnK,GAAK8K,eAAexK,UAAYN,GAAKM,UAAY,EAC1D,CA0CA,SAASyK,GAAsBC,GAC7B,IAAKnxC,MAAMC,QAAQkxC,GAAS,OAAOC,GAEnC,QAAWjiC,KAAQgiC,EAAQ,CACzB,IAAKhiC,GAAwB,iBAATA,EAAmB,SACvC,IAAMtO,EAASsO,EACTkiC,EAAQb,GAAM3vC,EAAOwwC,OACrBR,EAAUJ,GAAiB5vC,EAAOgwC,SACxC,GAAKQ,IAASA,EAAMnqC,SAAS,SAAUmqC,EAAMnqC,SAAS,SACtD,IAAImqC,EAAMnqC,SAAS,QAAS,MAAO,CAAEiC,KAAM,OAAQ0nC,WACnD,GAAIQ,EAAMnqC,SAAS,WAAamqC,EAAMnqC,SAAS,YAAa,MAAO,CAAEiC,KAAM,SAAU0nC,WACrF,GAAIQ,EAAMnqC,SAAS,WAAY,MAAO,CAAEiC,KAAM,UAAW0nC,WACzD,GAAIQ,EAAMnqC,SAAS,UAAW,MAAO,CAAEiC,KAAM,SAAU0nC,UAAQ,CACjE,CAEA,OAAOO,EACT,CA4BA,SAASE,GAA2BnoC,EAAcooC,EAAmBC,GACnE,MAAO,CACLroC,OACA0nC,QAASW,EAAOroC,OAASA,GAAQqoC,EAAOX,QAAUW,EAAOX,QAAUU,GAAaC,EAAOX,QAE3F,CA0DA,SAASY,GAAsBrxC,GAC7B,IACE,OAAOR,mBAAmBQ,EAAM4G,QAAQ,MAAO,KACjD,OACE,OAAO5G,CACT,CACF,CAgBA,SAASsxC,GAAgBtxC,GACvB,IAAMN,EAAMqN,OAAO/M,GAAS,IAAI9C,OAC1ByP,EAAQjN,EAAI6xC,QAAQ,KAC1B,OAAI5kC,EAAQ,EAAU,CAAE5D,KAAMrJ,EAAKutB,SAAU,IACtC,CACLlkB,KAAMrJ,EAAIa,MAAM,EAAGoM,GAAOzP,OAC1B+vB,SAAUvtB,EAAIa,MAAMoM,EAAQ,GAEhC,CAEA,SAAS6kC,GAAqB7vC,GAC5B,IAEE,IAAM8vC,EADS,IAAIh4C,gBAAgBzB,SAAS0B,QACtBI,IAAI6H,GAC1B,GAAI8vC,EAAQ,OAAOA,CACrB,OAAS,CACT,IACE,IAAMt4C,EAASC,eAAeC,QAAQ,YACtC,IAAKF,EAAQ,MAAO,GACpB,IAAMwG,EAASrG,KAAKC,MAAMJ,GAC1B,MAA8B,iBAAhBwG,EAAOgC,GAAoBhC,EAAOgC,GAAO,EACzD,OACE,MAAO,EACT,CACF,CA6BA,SAAS+vC,GAAkBzvB,GACzB,UAAWnnB,OAAW,IAAa,OACnC,IAAM6C,EAAQ7C,OAAeqS,kBAAkBD,MAASpS,OAAesS,SAASk5B,WAAWp5B,KAC3F,GAAKvP,GAAwB,iBAATA,EAEpB,IAAe,sBAAXskB,EACF,OAAOtkB,EAAKyQ,MAAMC,UAAY1Q,EAAKyQ,MAAMujC,WAAah0C,EAAK0Q,SAE7D,GAAe,yBAAX4T,EACF,OAAOtkB,EAAK0P,SAASzI,MAAQjH,EAAK0P,SAASukC,aAE7C,GAAe,wBAAX3vB,EACF,OAAOtkB,EAAK0P,SAAS8O,KAEvB,GAAe,yBAAX8F,EACF,OAAOtkB,EAAKk0C,UAAU11B,IAAA,CAG1B,CAEO,SAAS21B,GACdC,EAA0C,CAAC,EAC3CC,EACA1oC,EAAwC,CAAC,GAEzC,IAAM2mC,EAAiC,IAAK8B,GACtCxnC,EAAOynC,WAAsBh6C,SAAa,IAAcA,SAASuS,KAAO,IACxE0nC,GAA4C,IAA3B3oC,EAAQ2oC,eAE/B,IACE,IAAMtyC,EAAS,IAAI7G,IAAIyR,SAAavS,SAAa,IAAcA,SAASC,OAAS,aACjFg4C,EAAM,cAAgBtwC,EAAO4K,KAC7B0lC,EAAM,cAAgBtwC,EAAOzH,SAC7B+3C,EAAM,eAAiBtwC,EAAOjG,MAChC,OAAS,CAETu2C,EAAM,gBAAkB8B,EAAeG,YAAcV,GAAqB,cAC1EvB,EAAM,gBAAkB8B,EAAeI,YAAcX,GAAqB,cAC1EvB,EAAM,kBAAoB8B,EAAeK,cAAgBZ,GAAqB,gBAC9EvB,EAAMv3C,WAlER,WACE,UAAWE,SAAa,IAAa,MAAO,GAC5C,IAAMF,EAAWE,SAASF,SAC1B,IAAKA,EAAU,MAAO,WACtB,IACE,IAAMG,EAAO,IAAIC,IAAIJ,GAAUK,SAC/B,OAAOF,IAASb,SAASe,SAAW,aAAeF,CACrD,OACE,MAAO,UACT,CACF,CAwDqBw5C,GACnBpC,EAAM,iBAAmB8B,EAAeO,QA5O1C,WAEE,IAAmC,IADvBpC,MACHW,eAAe0B,OAAiB,MAAO,SAEhD,IAAMC,EA9BR,SAAoCjC,EAAYlK,GAC9C,IAAMoM,EAAelC,EAAG1pC,cAClB6rC,EAAqBrM,EAASx/B,cACpC,OAAK4rC,GAAiBC,EAGpB,WAAWtrC,KAAKqrC,IACQ,aAAvBC,UACQvC,UAAc,KACrBvxC,OAAQuxC,UAAwBwC,gBAAkB,GAAK,GAC7C,6DAA6DvrC,KAAKmpC,GACvE,SAEL,sEAAsEnpC,KAAKmpC,GACtE,SAEL,WAAWnpC,KAAKmpC,IAGhB,WAAWnpC,KAAKsrC,GAA4B,SAC5C,6CAA6CtrC,KAAKmpC,IAAOmC,EACpD,UAEF,GApB0C,EAqBnD,CAMiBE,CAA2BlC,KAAgBE,MAC1D,GAAI4B,EAAQ,OAAOA,EAEnB,UAAW13C,OAAW,IAAa,MAAO,GAC1C,IAAM4iB,EAAQ5iB,OAAO2uC,YAAc,EACnC,OAAI/rB,EAAQ,GAAKA,EAAQ,IAAY,SACjCA,GAAS,KAAOA,EAAQ,KAAa,SAClC,SACT,CAgOoDm1B,GAClD,IAAMC,EA5KR,WACE,IAAM1B,EAjBR,WACE,IAAMP,EAAgBX,MAAoBW,cACpCkC,EAAkBjC,GAAsBD,GAAemC,iBAC7D,OAAID,EAAgBhqC,KAAagqC,EAC7BE,IAAwBlqC,KAAakqC,IArB3C,WACE,IAAMpC,EAAgBX,MAAoBW,cAC1C,GAAKA,GAAeqC,uBAAwBC,GAC5C,CAAAA,IAAkC,EAClC,IACEtC,EACGqC,qBAAqB,CAAC,SAAU,oBAChCz5B,KAAMqC,IACL,IAAKA,GAA4B,iBAAXA,EAAqB,OAC3C,IAAMrb,EAASqb,EACTs3B,EAAOtC,GAAsBrwC,EAAOuyC,iBAAmBvyC,EAAOswC,QAChEqC,EAAKrqC,OAAMkqC,GAAyBG,KAEzC7Z,MAAM,OACX,OAAS,EACX,CAOE8Z,GACOvC,GAAsBD,GAAeE,QAC9C,CAUiBuC,GACT/C,EAAKG,KACX,OAAKH,EAED,QAAQnpC,KAAKmpC,GACRW,GAA2B,OAAQZ,GAAkBC,EAAI,CAAC,kBAAmBa,GAElF,YAAYhqC,KAAKmpC,GACZW,GAA2B,UAAWZ,GAAkBC,EAAI,CAAC,sBAAuBa,GAEzF,UAAUhqC,KAAKmpC,GACVW,GAA2B,SAAUZ,GAAkBC,EAAI,CAAC,oBAAqBa,GAEtF,WAAWhqC,KAAKmpC,KAAQ,uBAAuBnpC,KAAKmpC,GAC/CW,GAA2B,SAAUZ,GAAkBC,EAAI,CAAC,qBAAsBa,GAEvF,4BAA4BhqC,KAAKmpC,KAAQ,2BAA2BnpC,KAAKmpC,GACpEW,GAA2B,SAAUZ,GAAkBC,EAAI,CAAC,sBAAuBa,GAGrFA,EAlBSA,CAmBlB,CAsJkBmC,GAChBtD,EAAM,oBAAsB6C,EAAQ/pC,KACpCknC,EAAM,4BAA8B6C,EAAQrC,QAC5C,IAAM+C,EAvJR,WACE,IAAMjD,EAAKG,KACLrK,EAAWuK,KACXjqC,EAAa,GAAG4pC,KAAMlK,IAAWx/B,cACvC,OAAKF,EAAWzJ,OAEZ,mBAAmBkK,KAAKT,IAA6B,aAAb0/B,UAAkC8J,UAAc,KAAevxC,OAAOuxC,UAAUwC,gBAAkB,GAAK,EAC1I,CAAE5pC,KAAM,MAAO0nC,QAASH,GAAkBC,EAAI,CAAC,iBAEpD,UAAUnpC,KAAKT,GACV,CAAEoC,KAAM,UAAW0nC,QAASH,GAAkBC,EAAI,CAAC,sBAExD,UAAUnpC,KAAKT,GACV,CAAEoC,KAAM,UAAW0nC,QAASH,GAAkBC,EAAI,CAAC,yBAExD,8BAA8BnpC,KAAKT,GAC9B,CAAEoC,KAAM,QAAS0nC,QAASH,GAAkBC,EAAI,CAAC,uBAEtD,YAAYnpC,KAAKT,GACZ,CAAEoC,KAAM,QAAS0nC,QAAS,IAG5BgD,GAlBwBA,EAmBjC,CAgIaC,GACXzD,EAAM,eAAiBuD,EAAGzqC,KAC1BknC,EAAM,uBAAyBuD,EAAG/C,QAClCR,EAAM,wBAjIR,WACE,IAAM0D,EAAczD,MAAoB0D,SACxC,MAA2B,iBAAhBD,GAA4BA,EAAYz2C,OAAey2C,SACvD/6C,SAAa,KAAoBA,SAASgC,gBAAgBi5C,MAAQ,EAE/E,CA4HkCC,GAChC7D,EAAM,oBA/DR,SAAgC8D,EAAoBr7C,GAClD,IAAMkb,EAA8B,iBAAdmgC,EAAyBA,EAAUltC,cAAgB,GACnElO,EAA0B,iBAAbD,EAAwBA,EAASmO,cAAgB,GACpE,OAAI+M,EAAO9M,SAAS,aAAe8M,EAAO9M,SAAS,cAAgB8M,EAAO9M,SAAS,SAAW8M,EAAO9M,SAAS,UACrG,cAEL8M,EAAO9M,SAAS,WAAa8M,EAAO9M,SAAS,SAAWnO,EAAImO,SAAS,WAAanO,EAAImO,SAAS,QAC1F,SAEL8M,EAAO9M,SAAS,UAAY8M,EAAO9M,SAAS,cAAsB,QAClE8M,IACAjb,GAAe,aAARA,GAA8B,eAARA,EAA6B,WACvD,SACT,CAkD8Bq7C,CAAuB/D,EAAM,cAAeA,EAAMv3C,UAE9E,QAAWupB,IAAU,CACnB,oBACA,uBACA,sBACA,wBAEAguB,EAAMhuB,KAAYyvB,GAAkBzvB,GAGtC,GAAIgwB,EAAgB,CAClB,IAAMgC,EAsEV,WACE,UAAWn5C,OAAW,IAAa,OAAO,KAE1C,IAAMuS,GADQvS,OAAeqS,kBAAkBD,MAASpS,OAAesS,SAASk5B,WAAWp5B,OACrEG,QACtB,IAAKA,GAA8B,iBAAZA,EAAsB,OAAO,KACpD,IAAMvP,EAAKuP,EAAQvP,IAAMuP,EAAQoxB,KAAOpxB,EAAQkV,WAChD,OAAKzkB,GAAOuP,EAAQwE,OACb,CACL/T,KACA+T,OAAQxE,EAAQwE,OAChBlW,MAAO0R,EAAQ1R,MACfiJ,KAAMyI,EAAQzI,MAAQyI,EAAQukC,aAC9Bv1B,OAAQhP,EAAQgP,OAChBF,KAAMvc,MAAMC,QAAQwN,EAAQ8O,MAAQ9O,EAAQ8O,UAAO,EACnDhJ,MAAO9F,EAAQ8F,OARkB,IAUrC,CAtFwB+gC,GAChBD,GAAah4B,GAAgBg4B,EACnC,CAEA,QAAYhyB,EAAQjiB,KAAUjG,OAAO6B,QAAQwf,GAAW,CAAEC,gBAAiB42B,KACzEhC,EAAMhuB,KAAYjiB,EAGpB,OAAOiwC,CACT,CAaO,SAASxC,GACdV,EACAV,GAEA,GAAyB,iBAArBU,EAAU9qB,OAA2B,CACvC,IAAQlZ,QAASuoC,GAAgBvE,EAAU/sC,OAC3C,OA3JJ,SAAwB+I,GACtB,UAAWnQ,SAAa,IAAa,OACrC,IAAMgxB,EAAS7gB,EAAK7L,OACpB,IAAK0sB,EAAQ,OACb,IAAMuqB,EAAQv7C,SAASyG,OAASzG,SAASyG,OAAO4H,MAAM,KAAO,GAC7D,QAAWuC,KAAQ2qC,EAAO,CACxB,IAAMxnC,EAAQnD,EAAK+nC,QAAQ,KAE3B,GAAIF,IADa1kC,GAAS,EAAInD,EAAKjJ,MAAM,EAAGoM,GAASnD,GAAMtM,UACpB0sB,EACvC,OAAOynB,GAAsB1kC,GAAS,EAAInD,EAAKjJ,MAAMoM,EAAQ,GAAK,GACpE,CAEF,CA+IWynC,CAAerrC,EACxB,CACA,MAAyB,cAArBgkC,EAAU9qB,OACRoyB,GAA0BtH,GA8BlC,SAAwBziC,GACtB,IAEE,OADe,IAAIxR,IAAIwR,SAAYtS,SAAa,IAAcA,SAASC,OAAS,aAClEyB,QAAU,EAC1B,OACE,MAAO,EACT,CACF,CApCa46C,CAAejI,EAAI/hC,KArBhC,SAA8BA,EAAaiqC,GACzC,IAAQxrC,QAASuoC,GAAgBiD,GACjC,GAAKxrC,EACL,IAEE,OADe,IAAIjQ,IAAIwR,SAAYtS,SAAa,IAAcA,SAASC,OAAS,aAClEuS,aAAa1Q,IAAIiP,SAAS,CAC1C,OACE,MACF,CACF,CAcWyrC,CAAqBnI,EAAI/hC,IAAKyiC,EAAU/sC,OAE1C+sC,EAAUE,GAmFnB,SACEF,EACAV,GAEA,OAAOqB,GAAwBX,EAAWV,GAAKM,MACjD,CAvFM8H,CAAkB1H,EAAWV,GAC7BqI,GAAmBrI,EAAIhuB,WAAYguB,EAAI/hC,IAAKyiC,EAAU9qB,OAC5D,CAEO,SAASsrB,GAA8BR,GAG5C,MAFyB,iBAArBA,EAAU9qB,QAAkD,cAArB8qB,EAAU9qB,QAC1B,WAAvB8qB,EAAUF,UAAgD,aAAvBE,EAAUF,UACxB,cAArBE,EAAU9qB,QAA0BoyB,GAA0BtH,GACzDA,EAAU/sC,MAEZsxC,GAAgBvE,EAAU/sC,OAAOitB,QAC1C,CAQA,SAASonB,GAA0BtH,GACjC,QAAK4H,GAA2BnlC,IAAIzC,OAAOggC,EAAUF,aAC7C9/B,OAAOggC,EAAU/sC,OAAS,IAAI8G,SAAS,IACjD,CA6BA,SAAS4tC,GACPzE,EACA3lC,EACA2X,GAEA,QAAsB,IAAlBguB,EAAMhuB,GAAuB,OAAOguB,EAAMhuB,GAE9C,IACE,IAAMtiB,EAAS,IAAI7G,IAAIwR,EAAK,aAC5B,GAAe,aAAX2X,EAAuB,OAAOtiB,EAAO4K,KACzC,GAAe,aAAX0X,EAAuB,OAAOtiB,EAAOzH,SACzC,GAAe,cAAX+pB,EAAwB,OAAOtiB,EAAOjG,MAC5C,OAAS,CAGX,CAuBO,SAASg0C,GACdX,EACAV,GAEA,IAAMnkB,EAAO6kB,EAAUE,IAAI/kB,MAAMhrB,OACjC,IAAKgrB,GAAQA,EAAKjuB,OAAS,IAAM,MAAO,CAAE0yC,YAAQ,GAClD,GApBF,SAA6BI,GAC3B,IAAM7kB,EAAO6kB,EAAUE,IAAI/kB,MAAQ,GACnC,MAA8B,aAAvB6kB,EAAUE,IAAIxwC,MACnB,kBAAkB2K,KAAK8gB,IACvB,iBAAiB9gB,KAAK8gB,EAC1B,CAeM0sB,CAAoB7H,GACtB,MAAO,CAAEJ,OAAQ+H,GAAmBrI,EAAIhuB,WAAYguB,EAAI/hC,IAAKyiC,EAAU9qB,SAGzE,IACE,IAAM3X,EAAM,IAAIxR,IACduzC,EAAI/hC,WACGtS,SAAa,IAAcA,SAASC,OAAS,aAGhDm8B,EAAU,CACdygB,UAFgBrM,KAGhBnqB,WAAYguB,EAAIhuB,WAChBzlB,gBAAiBA,SAAa,IAAcA,cAAW,EACvDZ,gBAAiBA,SAAa,IAAcA,cAAW,EACvDiqB,OAAQ8qB,EAAU9qB,OAClB3X,MACAtK,MAAO+sC,EAAU/sC,MACjBlF,cAAeA,OAAW,IAAcA,YAAS,GAe7C6xC,IAbK,IAAIvkB,SACb,UACA,yRAjDN,SAA8BF,GAC5B,IAAM1nB,EAAU0nB,EAAKhrB,OACrB,OAAKsD,EACD,aAAa4G,KAAK5G,GAAiBA,EAChC,WAAWA,MAFG,eAGvB,CAqDsCs0C,CAAqB5sB,sBAX5C,CAaekM,GAC1B,MAAO,CAAEuY,SAAQ1Z,OAAQ0Z,OAAS,EAAY,WAChD,OAASrkB,GACP,MAAO,CAAEqkB,QAAQ,EAAO1Z,OAAQyc,GAAcpnB,GAChD,CACF,CAEA,SAASysB,GAAa/0C,GACpB,OAAIJ,MAAMC,QAAQG,GACTA,EACJiJ,IAAK8F,GAAShC,OAAOgC,GAAM7R,QAC3BwR,OAAOgM,SAEyB,MAAV1a,EAAuB,GAC3C,CAAC+M,OAAO/M,GACjB,CAEA,SAASg1C,GAAmBh1C,GAC1B,OAAqC,MAAVA,IACvBJ,MAAMC,QAAQG,GAAeA,EAAM/F,OAAS,EAC3B,iBAAV+F,GAA2BA,EAAM9C,OAAOjD,OAAS,EAE9D,CAEA,SAASg7C,GAActI,EAAiB1f,EAAmBioB,GACzD,IAAMC,EAAev2C,OAAOgB,MAAMC,QAAQ8sC,GAAUA,EAAO,GAAKA,GAC1DyI,EAAiBx2C,OAAOgB,MAAMC,QAAQotB,GAAYA,EAAS,GAAKA,GACtE,OAAOruB,OAAOC,SAASs2C,IACrBv2C,OAAOC,SAASu2C,IAChBF,EAAUC,EAAcC,EAC5B,CAEA,SAASC,GACPtI,EACAV,GAIA,OAAOwB,GAA4Bd,EAFpBU,GAA4BV,EAAWV,GACrCkB,GAA8BR,GAEjD,CAEO,SAASc,GACdd,EACAJ,EACA1f,GAEA,IAAMqoB,EAAeP,GAAapI,GAC5B4I,EAAiBR,GAAa9nB,GAC9BuoB,EAAgBD,EAAe,IAAM,GAE3C,OAAQxI,EAAUF,UAChB,IAAK,SACH,OAAOyI,EAAanmC,KAAMnP,GAAUA,IAAU+M,OAAOkgB,GAAY,KACnE,IAAK,aACH,OAAQqoB,EAAanmC,KAAMnP,GAAUA,IAAU+M,OAAOkgB,GAAY,KACpE,IAAK,WACH,OAAOqoB,EAAanmC,KAAMnP,GACxBu1C,EAAet7C,OAAS,EACpBs7C,EAAezuC,SAAS9G,GACxBA,EAAM8G,SAAS0uC,IAEvB,IAAK,eACH,OAAQF,EAAanmC,KAAMnP,GACzBu1C,EAAet7C,OAAS,EACpBs7C,EAAezuC,SAAS9G,GACxBA,EAAM8G,SAAS0uC,IAEvB,IAAK,cACH,OAAOF,EAAanmC,KAAMnP,GAAUA,EAAMyH,WAAW+tC,IACvD,IAAK,YACH,OAAOF,EAAanmC,KAAMnP,GAAUA,EAAM6hB,SAAS2zB,IACrD,IAAK,SACH,OAAOR,GAAmBrI,GAC5B,IAAK,WACH,OAAQqI,GAAmBrI,GAC7B,IAAK,KACH,OAAO2I,EAAanmC,KAAMnP,GAAUu1C,EAAezuC,SAAS9G,IAC9D,IAAK,SACH,OAAQs1C,EAAanmC,KAAMnP,GAAUu1C,EAAezuC,SAAS9G,IAC/D,IAAK,mBACH,OAAOs1C,EAAanmC,KAAMnP,GAAUynB,GA5kB1C,SAAyB7b,GACvB,MAAO,IAAIA,EAAQhF,QAAQ,qBAAsB,QAAQA,QAAQ,MAAO,QAC1E,CA0kBwD6uC,CAAgBD,GAAgBx1C,IACpF,IAAK,gBACH,OAAOs1C,EAAanmC,KAAMnP,GAAUynB,GAAc+tB,EAAex1C,IACnE,IAAK,eACH,OAAOi1C,GAActI,EAAQ1f,EAAU,CAAC5sB,EAAGC,IAAMD,EAAIC,GACvD,IAAK,wBACH,OAAO20C,GAActI,EAAQ1f,EAAU,CAAC5sB,EAAGC,IAAMD,GAAKC,GACxD,IAAK,YACH,OAAO20C,GAActI,EAAQ1f,EAAU,CAAC5sB,EAAGC,IAAMD,EAAIC,GACvD,IAAK,qBACH,OAAO20C,GAActI,EAAQ1f,EAAU,CAAC5sB,EAAGC,IAAMD,GAAKC,GACxD,QACE,OAAO,EAEb,CAEA,SAASo1C,GACPtsB,EACAijB,GAEA,IAAMc,EAASvtC,MAAMC,QAAQupB,EAAKsiB,OAAOyB,QACrC/jB,EAAKsiB,MAAMyB,OAAOz+B,OAAQvC,GAAUvM,MAAMC,QAAQsM,IAAUA,EAAMlS,OAAS,GAC3E,GACJ,GAAIkzC,EAAOlzC,OACT,OAAOkzC,EAAOjmC,MAAOiF,GACnBA,EAAMgD,KAAM49B,GAAcsI,GAAsBtI,EAAWV,KAI/D,IAAMgB,EAAajkB,EAAKsiB,OAAO2B,YAAc,GAC7C,OAAKA,EAAWpzC,SACY,OAAxBmvB,EAAKsiB,MAAMmB,SACNQ,EAAWl+B,KAAM49B,GAAcsI,GAAsBtI,EAAWV,IAElEgB,EAAWnmC,MAAO6lC,GAAcsI,GAAsBtI,EAAWV,IAC1E,CAuBO,SAASsJ,GACdvG,EACA/C,GAEA,OA4BK,SACL+C,EACA/C,GAEA,IAAMuJ,EAAoC,GAC1C,IAAKxG,EACH,MAAO,CACLplB,SAAS,EACT4rB,MAAO,CACL,CAAE93C,GAAI,OAAQqJ,MAAO,aAAc2G,OAAQ,UAAWmlB,OAAQ,iBAC9D,CAAEn1B,GAAI,WAAYqJ,MAAO,iBAAkB2G,OAAQ,UAAWmlB,OAAQ,uBAK5E,IAAM4iB,EAAW1G,GAAyBC,GACpC0G,EAAY1G,EAAU0G,WAAa,GACnCC,EAAeF,EAAS57C,OAAS,GAAK67C,EAAU77C,OAAS,EACzD+7C,GAAcD,GAChBzJ,GAAcD,EAAI/hC,IAAKurC,IAnuB7B,SACEnK,EACAW,GAEA,IAAKX,EAAMzxC,OAAQ,OAAO,EAC1B,IAAIu1C,GAAa,EACbC,GAAW,EAEf,QAAWrmB,KAAQsiB,EAAO,CACxB,IAAM1hB,EAAU4lB,GAAuBxmB,EAAMijB,GAC7C,IAAqB,IAAjBjjB,EAAKwiB,SACP,GAAI5hB,EAAS,OAAO,OAEpBwlB,GAAa,EACTxlB,IAASylB,GAAW,EAE5B,CAEA,OAAOA,IAAaD,CACtB,CAgtB0CyG,CAAeH,EAAWzJ,GAUlE,GARAuJ,EAAMhmC,KAAK,CACT9R,GAAI,OACJqJ,MAAO,aACP2G,OAAQioC,EAAgBC,EAAc,SAAW,SAAY,UAC7D/iB,OAAQ8iB,EAAgBC,EAAc,cAAgB,eAAkB,gBACxE3Q,OAAQ0Q,EAAe,CAAEzrC,IAAK+hC,EAAI/hC,IAAKohC,MAAOmK,EAAS57C,OAAQ67C,UAAWA,EAAU77C,aAAW,KAG5F+7C,EACH,OAAAJ,EAAMhmC,KAAK,CACT9R,GAAI,WACJqJ,MAAO,iBACP2G,OAAQ,UACRmlB,OAAQ,gBACRoS,OAAQ,CAAE6Q,SAAS,KAEd,CAAElsB,SAAS,EAAO4rB,SAG3B,IAAIO,GAAoB,EAClBC,EAAiBhH,EAAU/wB,YAAc,GAC/C,QAAW+K,KAAQgtB,EACjB,IAAKpG,GAAmB3D,EAAIhuB,WAAY+K,GAAO,CAC7C+sB,GAAoB,EACpB,KACF,CAGF,IAAME,EAAejH,EAAUiH,cAAgB,GACzCC,EAvGR,SACE5K,EACAW,GAEA,IAAKX,EAAMzxC,OAAQ,OAAO,EAC1B,IAAIu1C,GAAa,EACbC,GAAW,EAEf,QAAWrmB,KAAQsiB,EAAO,CACxB,IAAM1hB,EAAU0rB,GAAiBtsB,EAAMijB,GACvC,IAAqB,IAAjBjjB,EAAKwiB,SACP,GAAI5hB,EAAS,OAAO,OAEpBwlB,GAAa,EACTxlB,IAASylB,GAAW,EAE5B,CAEA,OAAOA,IAAaD,CACtB,CAoF8B+G,CAAkBF,EAAchK,GACtDmK,EAAmBJ,EAAen8C,OAAS,GAAKo8C,EAAap8C,OAAS,EACtEw8C,EAAkBN,GAAqBG,EAC7C,OAAAV,EAAMhmC,KAAK,CACT9R,GAAI,WACJqJ,MAAO,iBACP2G,OAAQ0oC,EAAoBC,EAAkB,SAAW,SAAY,UACrExjB,OAAQujB,EACHC,EAAkB,mBAAsBN,EAA2C,mBAAvB,qBAC7D,oBACJ9Q,OAAQmR,EAAmB,CAAEJ,eAAgBA,EAAen8C,OAAQo8C,aAAcA,EAAap8C,aAAW,IAGrG,CACL+vB,QAASgsB,GAAeS,EACxBb,QAEJ,CA/FSc,CAAuBtH,EAAW/C,GAAKriB,OAChD,CAgBO,SAAS2sB,GACdvH,EACA/C,GAMA,OD1dK,SACL+C,EACA/C,GAEA,IAAMgB,EAAoC,GAC1C,IAAK+B,EACH,MAAO,CACLplB,SAAS,EACT4rB,MAAO,CACL,CAAE93C,GAAI,OAAQqJ,MAAO,aAAc2G,OAAQ,UAAWmlB,OAAQ,iBAC9D,CAAEn1B,GAAI,WAAYqJ,MAAO,iBAAkB2G,OAAQ,UAAWmlB,OAAQ,sBAExEoa,cAIJ,IAAMuI,EAAoC,GACpCC,EAAW1G,GAAyBC,GACpC0G,EAAY1G,EAAU0G,WAAa,GACnCC,EAAeF,EAAS57C,OAAS,GAAK67C,EAAU77C,OAAS,EACzDqQ,EAvdR,SACEA,EACAohC,GAEA,IAAM2B,EAAoC,GAC1C,IAAK3B,EAAMzxC,OAAQ,MAAO,CAAE+vB,SAAS,EAAMqjB,cAE3C,IAAImC,GAAa,EACbC,GAAW,EACXmH,GAAU,EACd,QAASjqC,EAAQ,EAAGA,EAAQ++B,EAAMzxC,OAAQ0S,GAAS,EAAG,CACpD,IAAMyc,EAAOsiB,EAAM/+B,GACnB,GAAIiqC,EAAS,CACXvJ,EAAWz9B,KAAK,CACd9R,GAAI,OAAO6O,IACXxF,OAAwB,IAAjBiiB,EAAKwiB,QAAoB,mBAAqB,mBACrD99B,OAAQ,UACRmlB,OAAQ,sBACR4Z,SAAUvB,GAAgBliB,GAC1B6D,SAAU7D,EAAKxd,QACf+gC,OAAQriC,EACRsJ,OAAQwV,EAAKxd,QACbqgC,WAAY,QAEd,QACF,CAEA,IAAM4K,EAAapI,GAAYnkC,EAAK8e,GAC9B0tB,GAA0B,IAAjB1tB,EAAKwiB,SAAqBiL,EAAaA,EACtDxJ,EAAWz9B,KAAK,CACd9R,GAAI,OAAO6O,IACXxF,OAAwB,IAAjBiiB,EAAKwiB,QAAoB,mBAAqB,mBACrD99B,OAAQgpC,EAAS,SAAW,SAC5B7jB,OAAQ6jB,EAAS,cAAgB,eACjCjK,SAAUvB,GAAgBliB,GAC1B6D,SAAU7D,EAAKxd,QACf+gC,OAAQriC,EACRsJ,OAAQwV,EAAKxd,QACbqgC,WAAY,SAGO,IAAjB7iB,EAAKwiB,QACHiL,IAAYD,GAAU,IAE1BpH,GAAa,EACTqH,IAAYpH,GAAW,GAE/B,CAEA,MAAO,CAAEzlB,SAAS4sB,IAAkBnH,IAAaD,GAAYnC,aAC/D,CAqac0J,CAAiB1K,EAAI/hC,IAAKurC,GACtCxI,EAAWz9B,QAAQtF,EAAI+iC,YAEvB,IAAI2J,GAAmB,EACvB,GAAI1sC,EAAI0f,QAAS,CACf,IAAM5b,EA7VV,SACEs9B,EACAW,GAEA,IAAMgB,EAAoC,GAC1C,IAAK3B,EAAMzxC,OAAQ,MAAO,CAAE+vB,SAAS,EAAMqjB,cAE3C,IAAImC,GAAa,EACbC,GAAW,EACXmH,GAAU,EACd,QAASjqC,EAAQ,EAAGA,EAAQ++B,EAAMzxC,OAAQ0S,GAAS,EAAG,CACpD,IAAMyc,EAAOsiB,EAAM/+B,GACnB,GAAIiqC,EAAS,CACXvJ,EAAWz9B,KAAK88B,GAAkBtjB,EAAMzc,EAAO,UAAW,8BAC1D,QACF,CAEA,IAAM6M,EAAS4yB,GAA+BhjB,EAAMijB,GAC9CT,GAA2B,IAAjBxiB,EAAKwiB,QACfkL,EAASlL,EAAUpyB,EAAOwQ,SAAWxQ,EAAOwQ,QAClDqjB,EAAWz9B,KAAK88B,GACdtjB,EACAzc,EACAmqC,EAAS,SAAW,SACpBA,OAAS,EAAYlL,EAAUpyB,EAAOyZ,QAAU,qBAAuB,4BACnC,cAApC6Y,GAAe1iB,GAAM6iB,WACjB,GAAGI,EAAI/hC,SAASwsC,EAAS,SAAW,WACpCt9B,EAAOwQ,WAGQ,IAAjBZ,EAAKwiB,QACHpyB,EAAOwQ,UAAS4sB,GAAU,IAE9BpH,GAAa,EACTh2B,EAAOwQ,UAASylB,GAAW,GAEnC,CAEA,MAAO,CAAEzlB,SAAS4sB,IAAkBnH,IAAaD,GAAYnC,aAC/D,CAsTiB4J,CAAkBnB,EAAWzJ,GAC1C2K,EAAmB5oC,EAAK4b,QACxBqjB,EAAWz9B,QAAQxB,EAAKi/B,WAC1B,MACE2J,GAAmB,EACnB3J,EAAWz9B,QAzTf,SAAmC87B,GACjC,OAAOA,EAAMziC,IAAI,CAACmgB,EAAMzc,IAAU+/B,GAAkBtjB,EAAMzc,EAAO,UAwTP,gBAvT5D,CAuTuBuqC,CAA0BpB,IAG/C,IAAME,GAAcD,GAAezrC,EAAI0f,SAAWgtB,EAClDpB,EAAMhmC,KAAK,CACT9R,GAAI,OACJqJ,MAAO,aACP2G,OAAQioC,EAAgBC,EAAc,SAAW,SAAY,UAC7D/iB,OAAQ8iB,EAAgBC,EAAc,cAAgB,eAAkB,gBACxE3Q,OAAQ0Q,EAAe,CAAEzrC,IAAK+hC,EAAI/hC,IAAKohC,MAAOmK,EAAS57C,OAAQ67C,UAAWA,EAAU77C,aAAW,IAGjG,IAAMm8C,EAAiBhH,EAAU/wB,YAAc,GACzCg4B,EAAejH,EAAUiH,cAAgB,GAC/C,IAAKL,EACH,OAAA3I,EAAWz9B,QAnFf,SAAoC87B,GAClC,OAAOA,EAAMziC,IAAI,CAACmgB,EAAMzc,IACtB2hC,GAAmBllB,EAAMzc,EAAO,UAiF8B,qBAjFX,GAEvD,CA+EuBwqC,CAA2Bf,IAC9C/I,EAAWz9B,QAlDf,SAAkC87B,GAChC,OAAOA,EAAMjQ,QAASrS,GAAS8jB,GAA6B9jB,EAiDA,iBAhD9D,CAgDuBguB,CAAyBf,IAC5CT,EAAMhmC,KAAK,CACT9R,GAAI,WACJqJ,MAAO,iBACP2G,OAAQ,UACRmlB,OAAQ,gBACRoS,OAAQ,CAAE6Q,SAAS,KAEd,CAAElsB,SAAS,EAAO4rB,QAAOvI,cAGlC,IAAMhvB,EAzHR,SACEqtB,EACAuE,GAEA,IAAM5C,EAAoC,GACtCrjB,GAAU,EACd,QAASrd,EAAQ,EAAGA,EAAQ++B,EAAMzxC,OAAQ0S,GAAS,EAAG,CACpD,IAAMyc,EAAOsiB,EAAM/+B,GACbggC,EAASsD,EAAM7mB,EAAKE,WAC1B,IAAKU,EAAS,CACZqjB,EAAWz9B,KAAK0+B,GAAmBllB,EAAMzc,EAAO,UAAW,qBAAsBggC,IACjF,QACF,CACA,IAAM0K,EAAcrH,GAAmBC,EAAO7mB,GAC9CikB,EAAWz9B,KAAK0+B,GACdllB,EACAzc,EACA0qC,EAAc,SAAW,SACzBA,OAAc,EAAY,qBAC1B1K,IAEF3iB,EAAUqtB,CACZ,CACA,MAAO,CAAErtB,UAASqjB,aACpB,CAiGqBiK,CAAuBlB,EAAgB/J,EAAIhuB,YAC9DgvB,EAAWz9B,QAAQyO,EAAWgvB,YAE9B,IAAMkK,EA5FR,SACE7L,EACAW,GAEA,IAAMgB,EAAoC,GAC1C,IAAK3B,EAAMzxC,OAAQ,MAAO,CAAE+vB,SAAS,EAAMqjB,cAE3C,IAAImC,GAAa,EACbC,GAAW,EACXmH,GAAU,EACd,QAAWxtB,KAAQsiB,EAAO,CACxB,GAAIkL,EAAS,CACXvJ,EAAWz9B,QAAQs9B,GAA6B9jB,EAAM,4BACtD,QACF,CACA,IAAM5P,EAASu0B,GAAoB3kB,EAAMijB,GACzCgB,EAAWz9B,QAAQ4J,EAAO6zB,aACL,IAAjBjkB,EAAKwiB,QACHpyB,EAAOwQ,UAAS4sB,GAAU,IAE9BpH,GAAa,EACTh2B,EAAOwQ,UAASylB,GAAW,GAEnC,CAEA,MAAO,CAAEzlB,SAAS4sB,IAAkBnH,IAAaD,GAAYnC,aAC/D,CAkEmBmK,CAAqBnB,EAAchK,GACpDgB,EAAWz9B,QAAQ2nC,EAASlK,YAE5B,IAAMmJ,EAAmBJ,EAAen8C,OAAS,GAAKo8C,EAAap8C,OAAS,EACtEw8C,EAAkBp4B,EAAW2L,SAAWutB,EAASvtB,QACvD,OAAA4rB,EAAMhmC,KAAK,CACT9R,GAAI,WACJqJ,MAAO,iBACP2G,OAAQ0oC,EAAoBC,EAAkB,SAAW,SAAY,UACrExjB,OAAQujB,EACHC,EAAkB,mBAAsBp4B,EAAW2L,QAAiC,mBAAvB,qBAC9D,oBACJqb,OAAQmR,EAAmB,CAAEJ,eAAgBA,EAAen8C,OAAQo8C,aAAcA,EAAap8C,aAAW,IAGrG,CACL+vB,QAASgsB,GAAeS,EACxBb,QACAvI,aAEJ,CC0YSoK,CAA+CrI,EAAW/C,EACnE,CA17BA,IA8SM2E,GACAyC,GACFR,GACAE,GAkXEwB,GAnqBNnG,GAAAvyC,EAAA,KAWAovC,KACA1jB,KACAhL,KACA4xB,KAgSMyC,GAAkC,CAAEjoC,KAAM,GAAI0nC,QAAS,IACvDgD,GAAwB,CAAE1qC,KAAM,GAAI0nC,QAAS,IAC/CwC,GAA6C,KAC7CE,IAAkC,EAkXhCwB,GAA6B,IAAIlmC,IAAI,CAAC,WAAY,eAAgB,cAAe,gBCllBvF,SAASipC,KACP,IAAMC,EAAY34C,WAAW+G,OAC7B,MAAqC,mBAA1B4xC,GAAWC,WACbD,EAAUC,aAEZ,CACLt/C,KAAKC,MAAM2N,SAAS,IACpBzL,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,GACjC9F,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,IACjCnD,KAAK,IACT,CA3FA,IAwBMy6C,GACAC,GAoEOC,GA7FbC,GAAA/7C,EAAA,KAAAD,IACA0M,KAuBMmvC,GAAe,cACfC,GAAuB,2BAoEhBC,GAAN,MA+BL,WAAAE,CAAY3uC,GArBZ4uC,KAAQC,MAAsB,GAC9BD,KAAQE,YAAmC,KAC3CF,KAAQ1lB,MAAuB,KAC/B0lB,KAAQG,eAAgB,EACxBH,KAAQI,aAAqC,KAC7CJ,KAAQK,YAAc,EACtBL,KAAQM,UAAY,EACpBN,KAAiBO,aAAe,IAMhCP,KAAQQ,gBAAkE,KAC1ER,KAAQS,oBAA2C,KACnDT,KAAQU,gBAAuC,KAC/CV,KAAQW,uBAAwC,KAChDX,KAAQY,kBAAyC,KACjDZ,KAAQa,sBAAuB,EAC/Bb,KAAQc,qBAAsB,EAG5Bd,KAAK7hB,SAAW/sB,EAAQ+sB,SACxB6hB,KAAKntB,OAASzhB,EAAQyhB,QAAU,GAChCmtB,KAAKe,aAAe3vC,EAAQ2vC,cAAgB3vC,EAAQyhB,QAAU,GAC9DmtB,KAAK5hB,gBAAkBhtB,EAAQgtB,iBAAmB,GAClD4hB,KAAK9sB,UAAY9hB,EAAQ8hB,WAAa,GACtC8sB,KAAKvhB,UAAYuhB,KAAKgB,uBACtBhB,KAAKiB,gBAhGT,SAA6BxiB,GAC3B,IAIE,IAAMz2B,ElCiGH,WACL,GAAoB,iBAAhBsG,GAAgC,OAAO,KAC3C,IACE,OAAOxH,WAAWC,cAAgB,IACpC,OACE,OAAO,IACT,CACF,CkCxGkBm6C,GACd,IAAKl5C,EAAO,OACZ,IACI/G,EADEuG,EAAMQ,EAAM7G,QAAQy+C,IAE1B,IACE3+C,EAASG,KAAKC,MAAMmG,GAAO,IAC7B,OAEA,CACA,IAAM25C,EAAelgD,GAAQmgD,iBACvBC,EAAapgD,GAAQqgD,cACrBC,EAAmB75C,MAAMC,QAAQw5C,GAClCA,EAA2B3qC,OACzB5Q,GAAmC,iBAAPA,GAET,iBAAfy7C,EACL,CAACA,GACD,GACAG,EAAcvgD,GAAQwgD,MACtBA,EACJ/6C,OAAOskB,UAAUw2B,IAAgB96C,OAAO86C,GAAe,GAAKD,EAAOx/C,OAAS,EACxE2E,OAAO86C,GACP,EACN,GAAIC,GAASF,EAAO3yC,SAAS6vB,GAAY,OAAOgjB,EAChD,IAAM7+B,EAAO6+B,EAAQ,EACrB,OAAAz5C,EAAMhG,QACJ49C,GACAx+C,KAAKa,UAAU,CACbw/C,MAAO7+B,EACPw+B,iBAAkB,CAAC3iB,KAAc8iB,GAAQl5C,MAAM,EApCnB,MA0CzBua,CACT,OACE,MACF,CACF,CAoD2B8+B,CAAoB1B,KAAKvhB,WAChDuhB,KAAK2B,gBAAkBvwC,EAAQuwC,iBAAmB,IAClD3B,KAAK4B,aAAexwC,EAAQwwC,cAAgB,GAC5C5B,KAAK6B,oBAAsBzwC,EAAQywC,qBAAuB,KAC1D7B,KAAK8B,oBAAsB1wC,EAAQ0wC,qBAAuB,KAC1D9B,KAAK+B,OAAS3wC,EAAQ2wC,SAAU,EAChC/B,KAAKgC,YAAc5wC,EAAQ4wC,aAAe,GAC1ChC,KAAK1d,YAAclxB,EAAQkxB,aAAe,YAC5C,CAEQ,oBAAA0e,GACN,IAAMv3C,EAAM,WACZ,IACE,IAAM2G,EAAWlP,eAAeC,QAAQsI,GACxC,GAAI2G,EAAU,OAAOA,EACrB,IAAMxK,EAAKrD,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,GAAKjI,KAAKC,MAAM2N,SAAS,IACrE,OAAA9M,eAAec,QAAQyH,EAAK7D,GACrBA,CACT,OACE,OAAOrD,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,GAAKjI,KAAKC,MAAM2N,SAAS,GACnE,CACF,CAGA,YAAAi0C,GACE,OAAOjC,KAAKvhB,SACd,CAEA,KAAAjqB,GACqB,OAAfwrC,KAAK1lB,QACT0lB,KAAKkC,gBACLlC,KAAK1lB,MAAQ13B,OAAOu/C,YAAY,IAAMnC,KAAKjO,QAASiO,KAAK2B,iBACzD3B,KAAKoC,eACP,CAEA,IAAA1R,GACqB,OAAfsP,KAAK1lB,QACP13B,OAAOy/C,cAAcrC,KAAK1lB,OAC1B0lB,KAAK1lB,MAAQ,MAEX0lB,KAAKQ,iBAAiB59C,OAAOS,oBAAoB,WAAY28C,KAAKQ,iBAClER,KAAKS,qBAAqB79C,OAAOS,oBAAoB,eAAgB28C,KAAKS,qBAC1ET,KAAKU,iBAAiB99C,OAAOS,oBAAoB,WAAY28C,KAAKU,iBAClC,OAAhCV,KAAKW,wBAAiC/9C,OAAOuB,aAAa67C,KAAKW,wBACnEX,KAAKQ,gBAAkB,KACvBR,KAAKS,oBAAsB,KAC3BT,KAAKU,gBAAkB,KACvBV,KAAKW,uBAAyB,KAC1BX,KAAKY,0BAA4BlgD,SAAa,MAChDA,SAAS2C,oBAAoB,mBAAoB28C,KAAKY,mBACtDZ,KAAKY,kBAAoB,KAE7B,CAEA,KAAAp4B,CAAM/H,GACJ,IAAM6hC,EAAWtC,KAAKuC,YAAY9hC,GAClCu/B,KAAKC,MAAMvoC,KAAK4qC,GAEZtC,KAAKC,MAAMl+C,OAASi+C,KAAKO,cAC3BP,KAAKC,MAAMtO,OAAO,EAAGqO,KAAKC,MAAMl+C,OAASi+C,KAAKO,cAE5CP,KAAKC,MAAMl+C,QAAUi+C,KAAK4B,cACvB5B,KAAKjO,OAEd,CAEQ,WAAAwQ,CAAY9hC,GAClB,IAAM6hC,EAAuB,IACxB7hC,EACH+hC,SAC4B,iBAAnB/hC,EAAM+hC,UAAyB/hC,EAAM+hC,SAASx9C,OACjDyb,EAAM+hC,SACNhD,KACN3sB,OAAQpS,EAAMoS,QAAUmtB,KAAKntB,OAC7BK,UAAWzS,EAAMyS,WAAa8sB,KAAK9sB,UACnCuL,UAAWhe,EAAMge,WAAauhB,KAAKvhB,UACnCrsB,IAAKqO,EAAMrO,aAAetS,SAAa,IAAcA,SAASuS,KAAO,IACrEsQ,GAAIlC,EAAMkC,IAAMviB,KAAKC,MACrBiiC,YAAa0d,KAAK1d,aAEpB,OACE0d,KAAKiB,kBAzLqBv0C,EA0LH+T,EAAM/T,KAzL1B,0EAA0EwC,KAAKxC,OA0LhF,qBAAuB+T,EAAMld,MAAQ,CAAC,MAExC++C,EAAS/+C,KAAO,IAAKkd,EAAMld,KAAMk/C,iBAAkBzC,KAAKiB,kBAEtDjB,KAAK+B,SACPO,EAASI,SAAU,EACf1C,KAAKgC,cAAaM,EAASK,cAAgB3C,KAAKgC,cAE/CM,EAnMX,IAAgC51C,CAoM9B,CAEQ,eAAAk2C,CAAgBC,GACtB,IAAMC,EAASvgD,KAAKqE,MAAsB,IAAhBrE,KAAK4L,UAC/B6xC,KAAKM,UAAY/9C,KAAKC,IAAIw9C,KAAKM,UAAWuC,GAC1C7C,KAAKK,YAAcjgD,KAAKC,MAAQ2/C,KAAKM,UAAYwC,CACnD,CAEQ,YAAAC,GACN/C,KAAKM,UAAY,EACjBN,KAAKK,YAAc,CACrB,CAEQ,sBAAA2C,CAAuBl7C,GAC7B,IAAKA,EAAO,OAAO,KACnB,IAAMyC,EAAI7D,OAAOu8C,SAASn7C,EAAO,IACjC,OAAIpB,OAAOC,SAAS4D,IAAMA,EAAI,EAAUA,EACjC,IACT,CAEA,WAAMwnC,GACJ,GAAIiO,KAAKI,aAAc,OAAOJ,KAAKI,aAEnC,IADKJ,KAAKC,MAAMl+C,SAAWi+C,KAAK7hB,UAC5B6hB,KAAKK,aAAejgD,KAAKC,MAAQ2/C,KAAKK,YAAa,OAEvD,IAAMD,EAAeJ,KAAKkD,aAC1BlD,KAAKI,aAAeA,EACpB,UACQA,CACR,SACMJ,KAAKI,eAAiBA,IACxBJ,KAAKI,aAAe,KAExB,CACF,CAEA,gBAAc8C,GACZ,IAEE,IADAlD,KAAKG,eAAgB,EACdH,KAAKC,MAAMl+C,QAAUi+C,KAAK7hB,UAAU,CACzC,GAAI6hB,KAAKK,aAAejgD,KAAKC,MAAQ2/C,KAAKK,YAAa,OAGvD,IAAM8C,EAAQnD,KAAKC,MAAMtO,OAAO,EAAGqO,KAAK4B,cAExC,GADA5B,KAAKE,YAAciD,GACdA,EAAMphD,OAAQ,OACnB,IAAMqhD,QAAYriC,MAAMi/B,KAAK7hB,SAAU,CACrC4C,OAAQ,OACRlX,QAASm2B,KAAKqD,eACdhhD,KAAM29C,KAAKsD,aAAaH,GACxBniB,WAAW,IAEb,IAAIoiB,EAAI3hC,GAAR,CAYA,GAJAu+B,KAAKC,MAAMsD,WAAWJ,GACtBnD,KAAKE,YAAc,KACfF,KAAKc,qBAAqBd,KAAKwD,aAAaL,GAE7B,MAAfC,EAAIxtC,OAAgB,CACtB,IAAM6tC,EAAazD,KAAKgD,uBAAuBI,EAAIv5B,QAAQjoB,IAAI,gBACzD8hD,EAASD,EAA0B,IAAbA,EAAoB,IAEhD,YADAzD,KAAK4C,gBAAgBc,EAEvB,CAEA,GAAmB,MAAfN,EAAIxtC,QAAiC,MAAfwtC,EAAIxtC,OAG5B,YADAoqC,KAAK4C,gBAAgB,KAIvB,GAAIQ,EAAIxtC,QAAU,IAAK,CAErB,IAAMgN,EAAOo9B,KAAKM,UAAY/9C,KAAKmmB,IAAI,IAAyB,EAAjBs3B,KAAKM,WAAiB,IAErE,YADAN,KAAK4C,gBAAgBhgC,EAEvB,CAIA,YADAo9B,KAAK4C,gBAAgB,IA5BrB,CAJE5C,KAAK2D,eAAeR,GACpBnD,KAAKE,YAAc,KACnBF,KAAK+C,cAgCT,CACF,OAEM/C,KAAKE,aAAan+C,SACpBi+C,KAAKC,MAAMsD,WAAWvD,KAAKE,aACvBF,KAAKc,qBAAqBd,KAAKwD,aAAaxD,KAAKE,aACrDF,KAAKE,YAAc,MAErB,IAAMt9B,EAAOo9B,KAAKM,UAAY/9C,KAAKmmB,IAAI,IAAyB,EAAjBs3B,KAAKM,WAAiB,IACrEN,KAAK4C,gBAAgBhgC,EACvB,SACEo9B,KAAKG,eAAgB,CACvB,CACF,CAEQ,YAAAmD,CAAaH,GACnB,IAAM9gD,EAAgC,CAAEuhD,OAAQT,GAEhD,OAAInD,KAAKe,eAAc1+C,EAAKwhD,QAAU7D,KAAKe,cACvCf,KAAK5hB,kBAAiB/7B,EAAKyhD,WAAa9D,KAAK5hB,iBAC1Ch9B,KAAKa,UAAUI,EACxB,CAEQ,YAAAghD,GACN,IAAMx5B,EAAkC,CAAE,eAAgB,oBAC1D,OAAIm2B,KAAKe,eAAcl3B,EAAQ,eAAiBm2B,KAAKe,cACjDf,KAAK5hB,kBAAiBvU,EAAQ,oBAAsBm2B,KAAK5hB,iBACtDvU,CACT,CAEQ,gBAAAk6B,CAAiBtjC,GACvB,IAAMujC,EAAoC,iBAAnBvjC,EAAM+hC,SAAwB/hC,EAAM+hC,SAASx9C,OAAS,GAC7E,OAAKg/C,EACE5iD,KAAKa,UAAU,CACpB+hD,EACAvjC,EAAM/T,KACN+T,EAAM5Y,cAAgB,KACtB4Y,EAAM/X,aAAe,KACrB+X,EAAM6hB,aAAe,eANF,IAQvB,CAEQ,YAAA2hB,GACN,IACE,IAAMz8C,EAAMtG,eAAeC,QAAQw+C,IACnC,IAAKn4C,EAAK,MAAO,GACjB,IAAMC,EAASrG,KAAKC,MAAMmG,GAC1B,OAAOE,MAAMC,QAAQF,GAAUA,EAAyB,EAC1D,OACE,MAAO,EACT,CACF,CAEQ,YAAA+7C,CAAaI,GACnB,IAAKA,EAAO7hD,OAAQ,OACpB,IAAMmiD,EAAS,IAAIlE,KAAKiE,kBAAmBL,GACrCO,EAAQ,IAAInpC,IACZopC,EAAwB,GAC9B,QAAW3jC,KAASyjC,EAAQ,CAC1B,IAAMz6C,EAAMu2C,KAAK+D,iBAAiBtjC,GAC9BhX,EAAK06C,EAAMjrC,IAAIzP,EAAKgX,GACnB2jC,EAAQ1sC,KAAK+I,EACpB,CACA,IAAM4jC,EAAU,IAAIF,EAAMvgC,YAAawgC,GAAS/7C,OAAO23C,KAAKO,cAC5D,IACEr/C,eAAec,QAAQ29C,GAAcv+C,KAAKa,UAAUoiD,GACtD,OAAS,CACX,CAEQ,cAAAV,CAAeC,GACrB,IAAMU,EAAgB,IAAI/tC,IACxBqtC,EACG7yC,IAAK0P,GAAUu/B,KAAK+D,iBAAiBtjC,IACrCjK,OAAQ/M,GAA+B,OAARA,IAEpC,GAA2B,IAAvB66C,EAAc9pC,KAClB,IACE,IAAM+pC,EAAYvE,KAAKiE,eAAeztC,OAAQiK,IAC5C,IAAMhX,EAAMu2C,KAAK+D,iBAAiBtjC,GAClC,OAAe,OAARhX,IAAiB66C,EAAchtC,IAAI7N,KAExC86C,EAAUxiD,OAAQb,eAAec,QAAQ29C,GAAcv+C,KAAKa,UAAUsiD,IACrErjD,eAAegR,WAAWytC,GACjC,OAAS,CACX,CAEQ,mBAAA6E,GACN,IAAM7tC,EAAaqpC,KAAK6B,yBAA2B,KACnDl+C,EAAW,CAAC+I,EAAMnJ,KAChB,IAAMqgD,EAAS5D,KAAK8B,oBAChB9B,KAAK8B,oBAAoBp1C,EAAMnJ,GAC/B,CAAC,CACCmJ,OACAnJ,OACAsE,aAAc8O,GAAY9O,aAC1Ba,YAAaiO,GAAYjO,YACzB0J,IAAKvS,MAEXmgD,KAAKC,MAAMvoC,QAAQksC,EAAO7yC,IAAK0P,GAAUu/B,KAAKuC,YAAY9hC,MAE9D,CAEQ,qBAAAgkC,CAAsBC,GAAW,GACvC,IAAMC,EAAiB3E,KAAKa,qBAE5B,GADI6D,IAAU1E,KAAKc,qBAAsB,GACrC6D,KAAoBD,GAAkC,IAAtB1E,KAAKC,MAAMl+C,QAAe,OACzD4iD,IACH3E,KAAKa,sBAAuB,EAC5Bb,KAAKwE,uBAMP,IAAMI,EAAkB5E,KAAKC,MAAMtO,OAAO,GAC1C,GAAKiT,EAAgB7iD,OACrB,KAAKi+C,KAAK7hB,SAER,YADA6hB,KAAKwD,aAAaoB,GAIpB,KAAOA,EAAgB7iD,QAAQ,CAC7B,IAAMohD,EAAQyB,EAAgBjT,OAAO,EAAGqO,KAAK4B,cACvClf,EAAUsd,KAAKsD,aAAaH,GAC9B0B,GAAS,EAEb,IACE,IAAMhX,SAAaoK,UAAc,IAAcA,eAAY,EAC5B,mBAApBpK,GAAKiX,aACdD,EAAShX,EAAIiX,WACX9E,KAAK7hB,SACL,IAAI4mB,KAAK,CAACriB,GAAU,CAAEh2B,KAAM,gBAGlC,OACEm4C,GAAS,CACX,CAEA,IAAIA,EAEJ,IACO9jC,MAAMi/B,KAAK7hB,SAAU,CACxB4C,OAAQ,OACRlX,QAASm2B,KAAKqD,eACdhhD,KAAMqgC,EACN1B,WAAW,IAEVzf,KAAMC,IACAA,EAASC,IAAIu+B,KAAKwD,aAAaL,KAErC9hB,MAAM,KACL2e,KAAKwD,aAAaL,IAExB,OACEnD,KAAKwD,aAAaL,EACpB,CACF,EACF,CAEQ,aAAAjB,GACN,IACE,IAAM0B,EAAS5D,KAAKiE,eAAelzC,IAAK0P,QACnCA,EACH6hB,YAAa7hB,EAAM6hB,aAAe0d,KAAK1d,eAErCshB,EAAO7hD,SACTb,eAAegR,WAAWytC,IAC1BK,KAAKC,MAAMsD,WAAWK,GAE1B,OAAS,CACX,CAEQ,kBAAAoB,GACNhF,KAAKa,sBAAuB,EAC5Bb,KAAKc,qBAAsB,EAC3Bd,KAAKW,uBAAyB,IAChC,CAEQ,YAAAyB,GACN,GAAIpC,KAAKQ,gBAAiB,OAC1B,IAAMyE,EAAcxkC,IAClBu/B,KAAKyE,uBAA2C,IAArBhkC,GAAOykC,YAE9BC,EAAiB,KACrBnF,KAAKyE,uBAAsB,GAIS,OAAhCzE,KAAKW,wBAAgE,mBAAtB/9C,OAAOuD,aACxD65C,KAAKW,uBAAyB/9C,OAAOuD,WAAW,IAAM65C,KAAKgF,qBAAsB,KAG/EI,EAAa,IAAMpF,KAAKgF,qBAO9B,GANAhF,KAAKQ,gBAAkByE,EACvBjF,KAAKS,oBAAsB0E,EAC3BnF,KAAKU,gBAAkB0E,EACvBxiD,OAAOK,iBAAiB,WAAYgiD,GACpCriD,OAAOK,iBAAiB,eAAgBkiD,GACxCviD,OAAOK,iBAAiB,WAAYmiD,UACzB1kD,SAAa,IAAa,CACnC,IAAM2kD,EAAqB,KACQ,WAA7B3kD,SAAS4kD,gBAA8BtF,KAAKyE,wBAC3CzE,KAAKgF,sBAEZhF,KAAKY,kBAAoByE,EACzB3kD,SAASuC,iBAAiB,mBAAoBoiD,EAChD,CACF,KCjWK,SAASE,GAAiBC,GAC/B,IAAMC,EAtER,SAAkBD,GAChB,IAAMC,EAAmB,GAYzB,GAVKD,EAAIE,MAA4B,iBAAbF,EAAIE,MAEhB,+BAA+Bx2C,KAAKs2C,EAAIE,OAASF,EAAIE,KAAK3jD,OAAS,GAC7E0jD,EAAO/tC,KAAK,4EAFZ+tC,EAAO/tC,KAAK,qDAKT8tC,EAAI30C,MAA4B,iBAAb20C,EAAI30C,OAC1B40C,EAAO/tC,KAAK,qBAGThQ,MAAMC,QAAQ69C,EAAIG,aAAeH,EAAIG,WAAW5jD,OAAS,EAC5D0jD,EAAO/tC,KAAK,0CACP,CACL,IAAMkuC,EAAWJ,EAAIG,WAAWnvC,OAAQ7U,GAAMA,EAAE8V,WACxB,IAApBmuC,EAAS7jD,OACX0jD,EAAO/tC,KAAK,qEACHkuC,EAAS7jD,OAAS,GAC3B0jD,EAAO/tC,KAAK,yCAGd,IAAMmuC,EAAcL,EAAIG,WAAWv7C,OAAO,CAACC,EAAK1I,IAAM0I,EAAM1I,EAAEmkD,OAAQ,GAClEvjD,KAAKwjD,IAAIF,EAAc,GAAK,KAC9BJ,EAAO/tC,KAAK,0CAA0CmuC,EAAYG,QAAQ,OAG5E,IAAMre,EAAM,IAAIpxB,IAChB,QAAW5U,KAAK6jD,EAAIG,WACbhkD,EAAEiE,IAAI6/C,EAAO/tC,KAAK,mCACnBiwB,EAAIrwB,IAAI3V,EAAEiE,KAAK6/C,EAAO/tC,KAAK,4BAA4B/V,EAAEiE,OAC7D+hC,EAAI7hC,IAAInE,EAAEiE,KACNjE,EAAEmkD,OAAS,GAAKnkD,EAAEmkD,OAAS,IAAGL,EAAO/tC,KAAK,cAAc/V,EAAEiE,qCAElE,CAQA,QAN8B,IAA1B4/C,EAAIS,oBACFT,EAAIS,kBAAoB,GAAKT,EAAIS,kBAAoB,IACvDR,EAAO/tC,KAAK,6CAIZ8tC,EAAIU,MAAO,CACb,IAAMC,EAAU,IAAI5vC,IACpB,QAAW6vC,KAAKZ,EAAIU,MACbE,EAAExgD,IAAI6/C,EAAO/tC,KAAK,8BACnByuC,EAAQ7uC,IAAI8uC,EAAExgD,KAAK6/C,EAAO/tC,KAAK,uBAAuB0uC,EAAExgD,OAC5DugD,EAAQrgD,IAAIsgD,EAAExgD,IAEC,UAAXwgD,EAAE15C,OAAqB05C,EAAE7oC,UAC3BkoC,EAAO/tC,KAAK,eAAe0uC,EAAExgD,0BAGnC,CAEA,OAAO6/C,CACT,CAaiBY,CAASb,GACxB,GAAIC,EAAO1jD,OAAS,EAClB,MAAM,IAAIukD,GAA0Bd,EAAIE,MAAQ,YAAaD,GAG/D,IAAMh/C,EAA4C,CAChDb,GAAI4/C,EAAIE,KACRA,KAAMF,EAAIE,KACV70C,KAAM20C,EAAI30C,KACVo1C,kBAAmBT,EAAIS,mBAAqB,EAC5C/O,UAAWsO,EAAItO,UACfqP,cAAef,EAAIe,cACnBZ,WAAYH,EAAIG,WAAW50C,IAAKpP,KAC9BiE,GAAIjE,EAAEiE,GACNiL,KAAMlP,EAAEkP,KACRi1C,OAAQnkD,EAAEmkD,OACV3tB,UAAWx2B,EAAEw2B,WAAa,GAC1BrwB,MAAOnG,EAAEmG,MACT/C,IAAKpD,EAAEoD,IACPgwC,GAAIpzC,EAAEozC,GACNyR,QAAS7kD,EAAE6kD,QACXC,eAAgB9kD,EAAE8kD,eAClBC,cAAe/kD,EAAE+kD,cACjBjvC,UAAW9V,EAAE8V,YAAa,KAE5ByuC,MAAOV,EAAIU,OAAOn1C,IAAKq1C,KACrBxgD,GAAIwgD,EAAExgD,GACN8G,KAAM05C,EAAE15C,KACR6Q,SAAU6oC,EAAE7oC,SACZopC,WAAYP,EAAEO,WACdj2B,UAAW01B,EAAE11B,cAIjB,OAAO7uB,OAAO+kD,OAAOngD,EACvB,CAKO,SAASogD,GAAkBC,GAChC,OAAOA,EAAK/1C,IAAIw0C,GAClB,CA/MA,IAiFae,GAjFbS,GAAAhjD,EAAA,KAiFauiD,GAAN,cAAwCxpB,MAG7C,WAAAijB,CAAY2F,EAAcD,GACxBuB,MAAM,uBAAuBtB,OAAUD,EAAOvgD,KAAK,SACnD86C,KAAKnvC,KAAO,4BACZmvC,KAAKyF,OAASA,CAChB,KCTK,SAASwB,GACdC,EACAxwC,EACAwlB,GAEA,IAAMz1B,EAAaiQ,EAAYE,KAAMuZ,GAAMA,EAAEvqB,KAAOshD,GACpD,IAAKzgD,EAAY,OAAO,KAExB,IAAM2L,EAAM8pB,GAAS9pB,aAAetS,SAAa,IAAcA,SAASuS,KAAO,IACzE8T,EAAayzB,GAAyB1d,GAAS/V,YAAc,CAAC,EAAG/T,GAEvE,IAAKqrC,GAAiBh3C,EAAWywC,UAAW,CAAE9kC,MAAK+T,eACjD,OAAO,KAGT,IAAMgG,EAASjc,GAAUgsB,GAAS/P,QAC5BpiB,EAAYiD,GAAYvG,EAAWb,GAAIumB,GAE7C,IAAKriB,EAAoBC,EAAWtD,EAAWw/C,mBAAqB,GAClE,OAAO,KAIT,IAGMxxC,EAAQxK,GAJKxD,EAAWw/C,mBAAqB,IAEnC,EAAIl8C,EAAY4D,GAAqBlH,EAAWb,GAAIumB,GACpD1lB,EAAWk/C,WAAW50C,IAAKpP,GAAMA,EAAEmkD,SAEnD,GAAIrxC,EAAQ,GAAKA,GAAShO,EAAWk/C,WAAW5jD,OAAQ,OAAO,KAE/D,IAAMolD,EAAY1gD,EAAWk/C,WAAWlxC,GAExC,MAAO,CACL5M,aAAcpB,EAAWb,GACzBwhD,oBAAgB,EAChB1+C,YAAay+C,EAAUvhD,GACvB6O,QACA0jB,UAAWgvB,EAAUhvB,WAAa,GAClCrwB,MAAOq/C,EAAUr/C,MACjBu/C,YAAa5gD,EAAW4gD,YACxB5yB,KAAMhuB,EAAWguB,OAAShuB,EAAW4gD,YAAc,eAAiB,cACpEtiD,IAAKoiD,EAAUpiD,IACfgwC,GAAIoS,EAAUpS,GACdyR,QAASW,EAAUX,QACnBC,eAAgBU,EAAUV,eAC1BC,cAAeS,EAAUT,cACzBY,eAAgBH,EAAUG,eAC1B7vC,YAAmB0vC,EAAU1vC,UAC7B1N,UAAWoiB,EAEf,CA0CO,SAASo7B,GAAqB/B,GACnC,IAAMgC,EAAUjlD,KAAKC,IAAI,EAAGD,KAAKmmB,IAAI,IAAK88B,EAAIiC,gBAAkB,IAAM,IAEhEC,EAAOnC,GAAiB,CAC5BG,KAAMF,EAAIE,KACV70C,KAAM20C,EAAI30C,KACVo1C,kBAAmB,EACnB/O,UAAWsO,EAAItO,UACfyO,WAAY,CACV,CACE//C,GAAI,UACJkgD,OAAQ,EAAI0B,EACZrvB,UAAW,GACX1gB,WAAW,EACX3P,MAAO09C,EAAImC,WAAY,GAEzB,CACE/hD,GAAI,UACJkgD,OAAQ0B,EACRrvB,UAAW,GACXrwB,MAAO09C,EAAIoC,UAAW,MAK5B,MAAO,IACFF,EACH/B,WAAY+B,EAAK/B,WAAW50C,IAAKo2C,QAAoBA,KACrDE,YAAa,CAAE59C,IAAK+7C,EAAIE,MAE5B,CAxMA,IAAAmC,GAAA9jD,EAAA,KAmBA2G,IACAq8C,KAEAv2C,KACA8lC,OCJA,SAASnG,GAAU13B,GACjB,OAAOA,EAAKqvC,WAAaC,KAAKC,YAChC,CAMA,SAASC,GAAa/8C,EAAkByU,GAClCzU,EAAM2X,WAAaziB,KAAKC,OACxB6K,EAAMg9C,QAAQ5wC,IAAIqI,KACtBzU,EAAMg9C,QAAQpiD,IAAI6Z,GAClBzU,EAAM4mB,SAAU,EAChB5mB,EAAM0iB,SAASjO,GACjB,CAEA,SAASwoC,KACa,OAAhBC,KACFjkD,aAAaikD,IACbA,GAAc,KAElB,CAEA,SAASC,KAEP,GADAF,KACuB,IAAnBzkD,GAAQ3B,OAAc,OAC1B,IAAMumD,EAAa/lD,KAAKmmB,OAAOhlB,GAAQqN,IAAK7F,GAAUA,EAAM2X,YACtD0lC,EAAQhmD,KAAKC,IAAI,EAAG8lD,EAAaloD,KAAKC,MAAQ,GACpD+nD,GAAcjiD,WAAW,KACvBiiD,GAAc,KACdI,MACCD,EACL,CAEA,SAASC,KACP,IAAM7lC,EAAKviB,KAAKC,MAChB,QAASoK,EAAI/G,GAAQ3B,OAAS,EAAG0I,GAAK,EAAGA,GAAK,EAC5C,GAAI/G,GAAQ+G,GAAGoY,WAAaF,EAAI,CAC9B,IAAO8lC,GAAW/kD,GAAQiuC,OAAOlnC,EAAG,GACpC,IAAKg+C,EAAQ32B,QACX,IACE22B,EAAQpwB,UACV,OAAS,CAEb,CAEqB,IAAnB30B,GAAQ3B,QAAgB2J,IAC1BA,GAASE,aACTF,GAAW,KACXwiB,IAAU,EACVw6B,GAAa/8B,QACbw8B,MAEAE,IAEJ,CAEA,SAASM,KACPH,KACA,IAAMI,EAAc,IAAI5tC,IACxB,QAAW9P,KAASxH,GAAS,CAC3B,IAAMuQ,EAAQ20C,EAAYhnD,IAAIsJ,EAAMqS,UAChCtJ,EACFA,EAAMyD,KAAKxM,GAEX09C,EAAY1vC,IAAIhO,EAAMqS,SAAU,CAACrS,GAErC,CACA,OAAO09C,CACT,CAEA,SAASC,GAAkBtrC,EAAkB9X,GAC3C,IAAMqsB,EAAqB,GAC3B,IACMqe,GAAU1qC,IAASA,EAAKuY,QAAQT,IAClCuU,EAAQpa,KAAKjS,GAvEnB,SAA6BgT,GAC3B,MAAyF,mBAA1EA,EAAqD4B,gBACtE,CAuEQyuC,CAAoBrjD,IACtBA,EAAK4U,iBAAiBkD,GAAUkB,QAASpY,GAAOyrB,EAAQpa,KAAKrR,GAEjE,OACE,MAAO,EACT,CACA,OAAOyrB,CACT,CAsGO,SAASi3B,GACdl1B,EACApf,EACA6jB,EACAD,GAEA,IAAM5uB,EAAM+sB,GAAe3C,EAAUpf,IA9BhC,SACL8I,EACAqQ,EACAxc,EAAmD,CAAC,GAEpD,IAAM82C,EAAU,IAAIzX,QAChB3e,GAAU,EACd,IACmBpxB,SAAS2Z,iBAAiBkD,GAClCkB,QAASpY,IAChB6hD,EAAQpiD,IAAIO,GACZyrB,GAAU,EACVlE,EAASvnB,IAEb,OAEE,YADA+K,EAAQinB,UAEV,CACA,IAAMtW,EAAQxf,KAAKC,IAAI,IAAOD,KAAKmmB,IAAItX,EAAQ2Q,OAASinC,GAAqB,OAC7EtlD,GAAQgU,KAAK,CAAE6F,WAAUqQ,WAAUs6B,UAASp2B,UAASjP,UAAWziB,KAAKC,MAAQ0hB,EAAOsW,OAAQjnB,EAAQinB,SACpGgwB,KA/CI38C,KACJA,GAAW,IAAI8S,iBAAkB1V,IAC/B,QAAWP,KAAUO,EACC,cAAhBP,EAAOmE,KACTnE,EAAOsW,WAAWJ,QAAShG,KACrB03B,GAAU13B,IAEHA,EAAKqvC,WAAaC,KAAKkB,yBAChCP,GAAa5iD,IAAI2S,KAGI,eAAhBlQ,EAAOmE,MAAyByjC,GAAU5nC,EAAOmY,QAC1DgoC,GAAa5iD,IAAIyC,EAAOmY,QACC,kBAAhBnY,EAAOmE,MAA4BnE,EAAOmY,OAAO9H,eAC1D8vC,GAAa5iD,IAAIyC,EAAOmY,OAAO9H,eAG/B8vC,GAAaluC,KAAO,GAAG0uC,QAEpBz8C,QAAQ/L,SAASgC,gBAAiB,CACzCyjB,YAAY,EACZxH,eAAe,EACfD,WAAW,EACXE,SAAS,GA0Bb,CASE4xB,CAAe3c,EAAStW,SAAWoC,IACjC,GAAI8W,GAAe5C,EAASxT,QAAS,CACnC,GAAI+W,GAAkBzX,EAASlW,GAE7B,YADA6uB,IAAYzE,EAAUlU,EAASlL,GAGjCwjB,GAAqBpE,EAAUlU,EAASlW,EAC1C,MACEwuB,GAAqBpE,EAAUlU,EAASlW,GAE1C6uB,IAAYzE,EAAUlU,EAASlL,IAC9B,CACD4jB,OAAQ,IAAMA,IAASxE,EAAUpf,IAErC,CAlOA,IAYM/Q,GACFgI,GACAwiB,GACEw6B,GACAM,GACFZ,GAwFEc,GAzGNC,GAAAplD,EAAA,KACAsxB,KAWM3xB,GAAuB,GACzBgI,GAAoC,KACpCwiB,IAAU,EACRw6B,GAAe,IAAInyC,IACnByyC,GAAsB,IACxBZ,GAAoD,KAwFlDc,GAAiB,KACjBh7B,KACJA,IAAU,EACVtN,eAAe,KACbsN,IAAU,EAmCd,WACE,GAAuB,IAAnBxqB,GAAQ3B,OACZ,IAAI2mD,GAAaluC,KAAO,EAEtB,YArBJ,WACE,GAA0B,IAAtBkuC,GAAaluC,KAAY,OAC7B,IAAM0a,EAAQxtB,MAAM0S,KAAKsuC,IACzBA,GAAa/8B,QAEb,IAAMi9B,EAAcD,KACpB,QAAYprC,EAAU6rC,KAAoBR,EACxC,QAAWnjD,KAAQyvB,EAAO,CACxB,IAAMlX,EAAU6qC,GAAkBtrC,EAAU9X,GAC5C,QAAWka,KAAW3B,EACpBorC,EAAgB3qC,QAASvT,GAAU+8C,GAAa/8C,EAAOyU,GAE3D,CAEF6oC,IACF,CAKIa,IAjCJ,WACE,IAAMT,EAAcD,KACpB,QAAYprC,EAAU6rC,KAAoBR,EACxC,IACmBloD,SAAS2Z,iBAAiBkD,GAClCkB,QAASpY,IAChB+iD,EAAgB3qC,QAASvT,GAAU+8C,GAAa/8C,EAAO7E,KAE3D,OAAS,CAEXmiD,IACF,CAyBEc,EAAgB,CAClB,CAzCIC,SC9GJC,GAAA,GA8BO,SAASC,GACd/8C,EACAuC,EACAk+B,GAEA,IAAM1sB,EAAQ,CAAEkC,GAAIviB,KAAKC,MAAOqM,OAAMuC,QAAOk+B,UAC7Cuc,GAAShyC,KAAK+I,GACVipC,GAAS3nD,OAAS,KAAiB2nD,GAASC,QAChD,QAAW7pC,KAAY8pC,GACrB,IACE9pC,EAASW,EACX,OAEA,CAGEopC,IAAeA,GAAcC,SACnC,CAEO,SAASC,GAAwBjqC,GACtC,OAAA8pC,GAAe9jD,IAAIga,GACZ,KACL8pC,GAAer3C,OAAOuN,GAE1B,CAMO,SAASkqC,KACd,IACE,UAAWzoD,gBAAoB,IAAa,CAC1C,IAAMD,EAAS,IAAIC,gBAAgBzB,SAAS0B,QAG5C,GAFoC,MAAhCF,EAAOM,IAAI,kBACkB,MAA7BN,EAAOM,IAAI,eACkB,MAA7BN,EAAOM,IAAI,cAAuB,OAAO,CAC/C,CACA,UAAWmF,aAAiB,IAC1B,MAAiD,MAA1CA,aAAa5F,QAAQ,gBAEhC,OAEA,CACA,OAAO,CACT,CAgBO,SAAS8oD,GAAcC,GACxBL,GACFA,GAAcM,OAAOD,GAGvBL,GAAgB,IAAIO,GAAcF,EACpC,CAEO,SAASG,KACVR,KACFA,GAAcS,UACdT,GAAgB,KAEpB,CAmQA,SAASU,GAAIpmB,GACX,OAAOA,EACJz1B,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,SACnB,CAjXA87C,EAAAhB,GAAA,CAAAQ,kBAAA,IAAAA,GAAAP,iBAAA,IAAAA,GAAAQ,cAAA,IAAAA,GAAAF,wBAAA,IAAAA,GAAAM,gBAAA,IAAAA,KAAA,IA0BMX,GAEAE,GAqDFC,GA6BEO,GAyQAK,GAvXNC,GAAA3mD,EAAA,KA0BM2lD,GAA4B,GAE5BE,GAAiB,IAAIrzC,IAqDvBszC,GAAsC,KA6BpCO,GAAN,MAQE,WAAArK,CAAYmK,GAJZlK,KAAQ2K,WAAY,EACpB3K,KAAQ4K,UAA0D,WAClE5K,KAAQ6K,UAAyF,KAG/F7K,KAAKkK,KAAOA,EACZlK,KAAKr/C,KAAOD,SAASiF,cAAc,OACnCq6C,KAAKr/C,KAAKiF,GAAK,qBACfo6C,KAAK8K,OAAS9K,KAAKr/C,KAAKoqD,aAAa,CAAExmD,KAAM,WAC7C7D,SAAS2B,KAAK4D,YAAY+5C,KAAKr/C,MAC/Bq/C,KAAKr4B,SACLq4B,KAAKgL,YACP,CAEA,MAAAb,CAAOD,GACLlK,KAAKkK,KAAOA,EACZlK,KAAKr4B,QACP,CAEA,OAAAmiC,GACE9J,KAAKr4B,QACP,CAEA,OAAA2iC,GACEtK,KAAKr/C,KAAK4E,QACZ,CAEQ,MAAAoiB,GACN,IAAQjR,cAAaV,cAAa8/B,cAAajkC,YAAamuC,KAAKkK,KAEjElK,KAAK8K,OAAOn2B,UAAY,kBACb81B,mMAIoBz0C,EAAYjU,mFACai+C,KAAK2K,UAAY,IAAM,yCAEzE3K,KAAK2K,UAAY,GAAK,oEAEqB,aAAnB3K,KAAK4K,UAA2B,SAAW,8EACxB,gBAAnB5K,KAAK4K,UAA8B,SAAW,oFAC3B,QAAnB5K,KAAK4K,UAAsB,SAAW,2BAA2BlB,GAAS3nD,qDACvD,UAAnBi+C,KAAK4K,UAAwB,SAAW,iGAG9D5K,KAAKiL,iBAAiBv0C,EAAaV,EAAa8/B,GAAe,KAAMjkC,qDAO7EmuC,KAAK8K,OAAOjmD,eAAe,cAAc5B,iBAAiB,QAAS,KACjE+8C,KAAK2K,WAAa3K,KAAK2K,UACvB3K,KAAKr4B,WAGPq4B,KAAK8K,OAAOzwC,iBAAiB,WAAWoE,QAASysC,IAC/CA,EAAIjoD,iBAAiB,QAAS,KAC5B+8C,KAAK4K,UAAaM,EAAoBztC,QAAQytC,IAC9ClL,KAAKr4B,aAKTq4B,KAAK8K,OAAOzwC,iBAAoC,oBAAoBoE,QAAS0sC,IAC3EA,EAAOloD,iBAAiB,SAAU,KAChC,IAAMsO,EAAQ45C,EAAO1tC,QAAQlM,MACvBC,EAAQ25C,EAAOrjD,MACjB0J,GAAOwuC,KAAKkK,KAAKkB,iBAAiB75C,EAAOC,MAGnD,CAEQ,gBAAAy5C,CACNv0C,EACAV,EACA8/B,EACAjkC,GAEA,OAAQmuC,KAAK4K,WACX,IAAK,WACH,OAAO5K,KAAKqL,eAAevV,GAC7B,IAAK,cACH,OAAOkK,KAAKsL,kBAAkBt1C,GAChC,IAAK,MACH,OAAOgqC,KAAKuL,YACd,IAAK,QACH,OAAOvL,KAAKwL,YAAY90C,EAAa7E,GAE3C,CAEQ,cAAAw5C,CAAevV,GACrB,IAAKA,EAAa,MAAO,uDACzB,IAAM2V,EAAU3V,EAAY4V,WAAWD,QAAQ/N,MACzChnC,EAAco/B,EAAY4V,WAAWh1C,YAC3C,MAAO,mFAEkB+0C,EAAQ16C,IAAK46C,GAAS3L,KAAK4L,WAAWD,IAAOzmD,KAAK,2EAEhD,IAAvBwR,EAAY3U,OACV,iEACA2U,EAAY3F,IAAKtK,GAAe,6EAED8jD,GAAI9jD,EAAW2gD,gBAAkB3gD,EAAWoB,mHACQpB,EAAWmP,WAAW20C,GAAI9jD,EAAWmP,qCACpHnP,EAAWolD,oBACT,0DAA0DtB,GAAI9jD,EAAWolD,oCACzE,uDAAuDtB,GAAI9jD,EAAWs0B,QAAU,qEAC5Dt0B,EAAWi3C,MAAM3sC,IAAK46C,GAAS3L,KAAK4L,WAAWD,IAAOzmD,KAAK,yCAEpFA,KAAK,WAEd,CAEQ,UAAA0mD,CAAWD,GACjB,MAAO,qEAE0BA,EAAK/1C,wDACJ20C,GAAIoB,EAAK18C,uDACRs7C,GAAIoB,EAAK5wB,QAAU4wB,EAAK/1C,oCAG7D,CAEQ,iBAAA01C,CAAkBt1C,GACxB,OAA2B,IAAvBA,EAAYjU,OACP,oDAEFiU,EACJjF,IACE5I,GAAM,qEAEsBoiD,GAAIpiD,EAAEN,uFACsB0iD,GAAIpiD,EAAEO,yFACVP,EAAEsM,oFACAtM,EAAEsP,UAAY,MAAQ,qFACpBtP,EAAEgwB,UAAUp2B,iFAClBoG,EAAEpD,IAAM,MAAQ,8EACjBoD,EAAE4sC,GAAK,MAAQ,wFACL5sC,EAAEs+C,eAAiB,MAAQ,uFAC5Bt+C,EAAEu+C,cAAgB,MAAQ,mFAC9Bv+C,EAAEm/C,eAAiB,IAAIn/C,EAAEm/C,eAAe/O,SAAW,IAAM,yCAIjHrzC,KAAK,GACV,CAEQ,SAAAqmD,GACN,OAAwB,IAApB7B,GAAS3nD,OACJ,mDAGF,uBADS,IAAI2nD,IAAUoC,UAAUzjD,MAAM,EAAG,IAE9C0I,IACEof,GAAM,iEACqB,IAAI/vB,KAAK+vB,EAAExN,IAAIopC,yEACR57B,EAAEzjB,SAAS69C,GAAIp6B,EAAEzjB,oDACvB69C,GAAIp6B,EAAElhB,+BAGpC/J,KAAK,WACV,CAEQ,WAAAsmD,CACN90C,EACA7E,GAEA,OAA2B,IAAvB6E,EAAY3U,OACP,uDAEF2U,EACJ3F,IACEiiB,GAAQ,qEAEoBu3B,GAAIv3B,EAAIptB,mEACU2kD,GAAIv3B,EAAIptB,gFAEnDotB,EAAI2yB,WACH50C,IACC,CAACpP,EAAG8I,IACF,kBAAkB8/C,GAAI5oD,EAAEiE,QAAQiM,IAAWmhB,EAAIptB,MAAQjE,EAAEiE,GAAK,WAAa,MAAM2kD,GAAI5oD,EAAEiE,MAAMjE,EAAE8V,UAAY,aAAe,SAAoB,IAAX9V,EAAEmkD,QAAcE,QAAQ,gBAE9J9gD,KAAK,8CAKXA,KAAK,GACV,CAEQ,UAAA8lD,GACN,IAAMgB,EAAS,IAAMhM,KAAK8K,OAAOjmD,eAAe,aAC1ConD,EAAQ,IAAMjM,KAAK8K,OAAOjmD,eAAe,YAEzCqnD,EAAe/7B,IACnB,IAAM4T,EAAIkoB,IACV,IAAKloB,EAAG,OACR,IAAMze,EAAOye,EAAExe,wBACfy6B,KAAK6K,UAAY,CACfsB,OAAQh8B,EAAEi8B,QACVC,OAAQl8B,EAAEm8B,QACVC,QAASjnC,EAAKhK,KACdkxC,QAASlnC,EAAKgsB,KAEhBnhB,EAAEs8B,kBAoBEC,EAAe,KACnB,IAAMC,EAAIX,IACNW,GAAGA,EAAE1pD,iBAAiB,YAAaipD,IAEzCQ,IAGA,IAAME,EAAa5M,KAAKr4B,OAAO1G,KAAK++B,MACpCA,KAAKr4B,OAAS,KACZilC,IACAF,KAGFhsD,SAASuC,iBAAiB,YA9BLktB,IACnB,IAAK6vB,KAAK6K,UAAW,OACrB,IAAM9mB,EAAIkoB,IACV,IAAKloB,EAAG,OACR,IAAM8oB,EAAK18B,EAAEi8B,QAAUpM,KAAK6K,UAAUsB,OAChCW,EAAK38B,EAAEm8B,QAAUtM,KAAK6K,UAAUwB,OACtCtoB,EAAEr+B,MAAM4V,KAAO,GAAG0kC,KAAK6K,UAAU0B,QAAUM,MAC3C9oB,EAAEr+B,MAAM4rC,IAAM,GAAG0O,KAAK6K,UAAU2B,QAAUM,MAC1C/oB,EAAEr+B,MAAM6V,MAAQ,OAChBwoB,EAAEr+B,MAAM2rC,OAAS,SAsBnB3wC,SAASuC,iBAAiB,UAnBR,KAChB+8C,KAAK6K,UAAY,MAmBrB,GAmBIJ,GAAY,8mJCvXlBsC,GAAA,GA4BA,SAASC,GAAMllD,EAAe4gB,EAAalmB,GACzC,OAAOD,KAAKC,IAAIkmB,EAAKnmB,KAAKmmB,IAAIlmB,EAAKsF,GACrC,CAEA,SAASjI,KACP,OAAOC,SAASC,OAASD,SAASE,QACpC,CAMA,SAASitD,GAAUt2C,EAAwBu2C,GACzC,GAAIA,GAAc,EAAG,OAAO,EAC5B,GAAIA,GAAc,EAAG,OAAO,EAC5B,IACE,IAAMzjD,EARV,SAAyBkN,GACvB,MAAO,WAAWA,EAAW9O,gBAAgB8O,EAAWjO,aAC1D,CAMgBykD,CAAgBx2C,GACtBvG,EAAWlP,eAAeC,QAAQsI,GACxC,GAAiB,MAAb2G,EAAkB,OAAO,EAC7B,GAAiB,MAAbA,EAAkB,OAAO,EAC7B,IAAM+K,EAAW5Y,KAAK4L,SAAW++C,EACjC,OAAAhsD,eAAec,QAAQyH,EAAK0R,EAAW,IAAM,KACtCA,CACT,OACE,OAAO5Y,KAAK4L,SAAW++C,CACzB,CACF,CAEA,SAASE,GAAoBtlD,GAC3B,MAAqB,iBAAVA,GAAuBpB,OAAOC,SAASmB,GAC3CklD,GAAMllD,EAAO,EAAG,GAD0C,GAEnE,CAEA,SAASulD,GAAgB1tC,GACvB,IAAM2tC,EAAkB,GACpB/hD,EAA0BoU,EAC9B,KAAOpU,GAAWA,IAAY7K,SAASgC,iBAAmB4qD,EAAMvrD,OAAS,GAAG,CAC1E,IAAMmiB,EAAM3Y,EAAQgiD,QAAQ5+C,cACtB/I,EAAK2F,EAAQ3F,IAAM,wBAAwBsJ,KAAK3D,EAAQ3F,IAC1D,IAAI2F,EAAQ3F,KACZ,GACJ,GAAIA,EAAI,CACN0nD,EAAM/J,QAAQ,GAAGr/B,IAAMte,KACvB,KACF,CAEA,IAAM4nD,EACJjiD,EAAQwN,aAAa,gBACrBxN,EAAQwN,aAAa,cACrBxN,EAAQwN,aAAa,gBACvB,GAAIy0C,GAAU,gBAAgBt+C,KAAKs+C,GAAS,CAC1CF,EAAM/J,QAAQ,GAAGr/B,kBAAoBspC,OACrC,KACF,CAEA,IAAIC,EAAM,EACNC,EAAUniD,EAAQoiD,uBACtB,KAAOD,GACDA,EAAQH,UAAYhiD,EAAQgiD,UAASE,GAAO,GAChDC,EAAUA,EAAQC,uBAEpBL,EAAM/J,QAAQ,GAAGr/B,iBAAmBupC,MACpCliD,EAAUA,EAAQqN,aACpB,CACA,OAAO00C,EAAMpoD,KAAK,MACpB,CAEA,SAAS0oD,GAAgBjuC,GACvB,IAAMuE,EAAMvE,EAAQ4tC,QAAQ5+C,cAC5B,MAAY,UAARuV,GAA2B,aAARA,GAA8B,WAARA,EAAyB,IAC9DvE,EAAQ9Z,aAAe,IAAI6I,QAAQ,OAAQ,KAAK1J,OAAOqD,MAAM,EAAG,GAC1E,CAYA,SAASwlD,GACP73C,EACAU,GAEA,IAAMo3C,EAAkB,IAAI9yC,IAAItE,EAAY3F,IAAKtK,GAAe,CAACA,EAAWb,GAAIa,KAC1EmB,EAA2B,GACjC,QAAW+O,KAAcX,EAAa,CACpC,IAAMib,EAAU68B,EAAgBlsD,IAAI+U,EAAW9O,eAAekmD,gBACzD98B,GAAS3E,SACT2gC,GAAUt2C,EAAYy2C,GAAoBn8B,EAAQi8B,cACvDtlD,EAAI8P,KAAK,IAAKf,EAAYsa,WAC5B,CACA,OAAOrpB,CACT,CAEO,SAASomD,GACdh4C,EACAU,EACA8R,GAEA,IAAInS,EAASw3C,GAA0B73C,EAAaU,GAC9Cu3C,EAAoB,IAAI13C,IAC1B23C,EAAc,EACdC,EAA2D,GAC3DC,EAA0D,KAC1DC,EAAkB,IAAIrzC,IACtBszC,EAAgBzuD,KAChB0uD,EAAqC,KACrCC,EAAoC,KAElCC,EAAkB,IACtBp4C,EAAOY,KAAMN,IAA4C,IAA7BA,EAAWsa,QAAQy9B,OAmB3CC,EAAgB,KACpB,GAA6B,IAAzBN,EAAgB7zC,KAAY,OAChC,IAAMo0C,EAAUP,EAChBA,EAAkB,IAAIrzC,IACtB,IAAM6zC,EAAatsD,KAAKQ,MACtB,IAAI6rD,EAAQhrC,UAAUxZ,OAAO,CAACC,EAAKykD,IAAUzkD,EAAMykD,EAAO,IAE5D,GAAID,EAAaE,GAAuB,OAExC,IAAMC,EA1BsBJ,KAC5B,IAAMK,EAAS,IAAIL,EAAQlrD,WAAWwE,KAAK,CAACC,EAAGC,KAC7C,IAAM8mD,EAAkB9mD,EAAE,GAAKD,EAAE,GACjC,OAA2B,IAApB+mD,EAAwBA,EAAkB/mD,EAAE,GAAGq2B,cAAcp2B,EAAE,MAElE+mD,EAAoB,GACtBptD,EAAS,EACb,QAAYqtD,EAAQN,KAAUG,EAAQ,CACpC,IAAMI,EAAQ,GAAGD,KAAU7sD,KAAKQ,MAAM+rD,KAChCQ,EAAavtD,GAAUotD,EAAQptD,OAAS,EAAI,EAAI,GAAKstD,EAAMttD,OACjE,GAAIutD,EAAaC,GAA4B,MAC7CJ,EAAQz3C,KAAK23C,GACbttD,EAASutD,CACX,CACA,OAAOH,EAAQjqD,KAAK,MAYLsqD,CAAqBZ,GACpC,IAAKI,EAAQ,OACb,IAAIxrD,EAAO1D,SAASE,SACpB,IACEwD,EAAO,IAAI5C,IAAI0tD,GAAetuD,QAChC,OAEA,CACA,IAAM0iC,EAAU,CACdl/B,OACAisD,SAAUnB,EACVoB,eAAgB9sD,OAAO2uC,WACvBoe,gBAAiB/sD,OAAOC,YACxB+sD,gBAAiBrtD,KAAKC,IACpB9B,SAAS2B,KAAKI,aACd/B,SAASgC,gBAAgBD,cAE3BotD,UAAWhB,EACXG,UAGF,QAAWr4C,KAAcN,GACU,IAA7BM,EAAWsa,QAAQy9B,OACvBlmC,EAAM,eAAgBka,EAAS/rB,EAAW9O,aAAc8O,EAAWjO,cAIjEonD,EAAiB,KACrB,GAAiC,YAA7BpvD,SAAS4kD,kBAAkC8I,EAAc,OAC7D,IAAM2B,EAAiBlwD,KACvB,GAAIkwD,IAAmBzB,EAIrB,OAHAK,IACAL,EAAgByB,OAChB3B,EAAe,MAIjB,IAAM4B,EAAiBztD,KAAKC,IAC1B,EACA9B,SAAS2B,KAAKI,aACd/B,SAASgC,gBAAgBD,cAErBwtD,EAAWjD,GACdoB,EAAahC,QAAU7pD,KAAKC,IAAI,EAAGI,OAAO2uC,YAAe,IAC1D,EACA,QAEI2e,EAAWlD,GACdoB,EAAa+B,MAAQH,EAAkB,IACxC,EACA,QAMIvmD,EAAM,GAHVlH,KAAKqE,MAAMqpD,EAAWG,IAAsBA,MAE5C7tD,KAAKqE,MAAMspD,EAAWE,IAAsBA,KAE9C/B,EAAgBn1C,IACdzP,GACC4kD,EAAgBzsD,IAAI6H,IAAQ,GAAK4mD,KAIhCC,EAAiB7vC,IACrB2tC,EAAe,CAAEhC,QAAS3rC,EAAM2rC,QAAS+D,MAAO1vC,EAAM0vC,QAGlD9K,EAAqB,KACQ,WAA7B3kD,SAAS4kD,iBAA8BqJ,KAGvC4B,EAAgBxe,IAChBA,GAAO4c,IACiB,OAAxBJ,IACF3rD,OAAOy/C,cAAckM,GACrBA,EAAsB,MAEG,OAAvBC,IACF5rD,OAAOy/C,cAAcmM,GACrBA,EAAqB,MAEvB9tD,SAAS2C,oBAAoB,cAAeitD,GAC5C5vD,SAAS2C,oBAAoB,mBAAoBgiD,GACjDziD,OAAOS,oBAAoB,WAAYsrD,GACvCP,EAAe,MAGXoC,EAAsB,KAC1B,IAAK/B,IAGH,OAFA8B,GAAa,QACblC,EAAgB1iC,QAGU,OAAxB4iC,IACJD,EAAgBzuD,KAChBa,SAASuC,iBAAiB,cAAeqtD,EAAe,CAAEptD,SAAS,IACnExC,SAASuC,iBAAiB,mBAAoBoiD,GAC9CziD,OAAOK,iBAAiB,WAAY0rD,EAAe,CAAEzrD,SAAS,IAC9DqrD,EAAsB3rD,OAAOu/C,YAAY2N,EAAgBO,IACzD7B,EAAqB5rD,OAAOu/C,YAAYwM,EAAe8B,MAGnDC,EAAa,KACjB,IAAKr6C,EAAOY,KAAMN,IAA8C,IAA/BA,EAAWsa,QAAQ0/B,SAAoB,OACxE,IAAM7tD,EA7KV,WACE,IAAMR,EAAYC,KAAKC,IACrB9B,SAAS2B,KAAKI,aACd/B,SAASgC,gBAAgBD,cAErBE,EAAiBC,OAAOC,aAAe,EAC7C,OAAIP,GAAaK,EAAuB,IACjCJ,KAAKQ,OAAQH,OAAOI,QAAUL,GAAkBL,EAAa,IACtE,CAqKgBsuD,GACNluB,EAAU,CACdl/B,KAAM1D,SAASE,SACfyvD,SAAU5vD,KACVgxD,eAAgB/tD,EAChB4sD,eAAgB9sD,OAAO2uC,WACvBoe,gBAAiB/sD,OAAOC,YACxB+sD,gBAAiBrtD,KAAKC,IAAI9B,SAAS2B,KAAKI,aAAc/B,SAASgC,gBAAgBD,eAGjF,QAAWkU,KAAcN,EACvB,IAAmC,IAA/BM,EAAWsa,QAAQ0/B,QACvB,QAAWvB,KAAU0B,GAAgB,CACnC,GAAIhuD,EAAMssD,EAAQ,SAClB,IAAM3lD,EAAM,GAAGkN,EAAW9O,gBAAgB8O,EAAWjO,eAAe7I,QAAcuvD,IAC9EnB,EAAkB32C,IAAI7N,KAC1BwkD,EAAkBnoD,IAAI2D,GACtB+e,EACE,iBACA,IAAKka,EAASquB,cAAe3B,GAC7Bz4C,EAAW9O,aACX8O,EAAWjO,aAEf,GAIEsoD,EAAWvwC,IACf,IAAKpK,EAAOY,KAAMN,IAA6C,IAA9BA,EAAWsa,QAAQggC,QAAmB,OACvE,IAAM5wD,EAAMD,KAAKC,MACjB,GAAIA,EAAM6tD,EAAc,IAAK,OAC7BA,EAAc7tD,EAEd,IAAMqgB,EAASD,EAAMC,kBAAkB5B,QAAU2B,EAAMC,OAAS,KAChE,IAAKA,EAAQ,OACb,IAAM4E,EAAO5E,EAAO6E,wBACd2rC,EAAQzwC,EAAMywC,MACdf,EAAQ1vC,EAAM0vC,MACpBhC,EAAeA,EACZ33C,OAAQ26C,GAAU9wD,EAAM8wD,EAAMC,GAAKC,IACnChpD,QAAQipD,GAAyB,IACpCnD,EAAaz2C,KAAK,CAAE4b,EAAG49B,EAAOK,EAAGpB,EAAOiB,EAAG/wD,IAI3C,IAAMmxD,EAHkBrD,EAAa33C,OAAQ26C,GAC3C5uD,KAAKkvD,MAAMN,EAAM79B,EAAI49B,EAAOC,EAAMI,EAAIpB,IAAUuB,IAErB3vD,QAAU,EACjC2gC,EAAU,CACdl/B,KAAM1D,SAASE,SACfyvD,SAAU5vD,KACVyzB,EAAG/wB,KAAKQ,MAAMmuD,GACdK,EAAGhvD,KAAKQ,MAAMotD,GACdwB,WAAYpvD,KAAKQ,MAAM0d,EAAM2rC,SAC7BwF,WAAYrvD,KAAKQ,MAAM0d,EAAM6rC,SAC7BuF,MAAOtvD,KAAKQ,MAAO0d,EAAM2rC,QAAU7pD,KAAKC,IAAI,EAAGI,OAAO2uC,YAAe,KAAQ,GAC7EugB,MAAOvvD,KAAKQ,MAAO0d,EAAM6rC,QAAU/pD,KAAKC,IAAI,EAAGI,OAAOC,aAAgB,KAAQ,GAC9E6sD,eAAgB9sD,OAAO2uC,WACvBoe,gBAAiB/sD,OAAOC,YACxB+sD,gBAAiBrtD,KAAKC,IAAI9B,SAAS2B,KAAKI,aAAc/B,SAASgC,gBAAgBD,cAC/E8a,SAAU8vC,GAAgB3sC,GAC1BqxC,YAAarxC,EAAO6sC,QAAQ5+C,cAC5BqjD,aAAcpE,GAAgBltC,GAC9BuxC,UAAW1vD,KAAKQ,MAAMuiB,EAAKhK,KAAO1Y,OAAOsvD,SACzCC,UAAW5vD,KAAKQ,MAAMuiB,EAAKgsB,IAAM1uC,OAAOI,SACxCovD,cAAe7vD,KAAKQ,MAAMuiB,EAAKE,OAC/B6sC,eAAgB9vD,KAAKQ,MAAMuiB,EAAKG,WAC5B+rC,EAAO,CAAEA,KAAM,GAAM,CAAC,GAG5B,QAAW76C,KAAcN,GACW,IAA9BM,EAAWsa,QAAQggC,QACvBzoC,EAAM,gBAAiBka,EAAS/rB,EAAW9O,aAAc8O,EAAWjO,cAIlE4pD,EAAW,KACf1vD,OAAO63B,sBAAsBi2B,IAG/B,OAAAhwD,SAASuC,iBAAiB,QAAS+tD,EAAS,CAAE//B,SAAS,EAAM/tB,SAAS,IACtEN,OAAOK,iBAAiB,SAAUqvD,EAAU,CAAEpvD,SAAS,IACvDN,OAAOK,iBAAiB,SAAUytD,EAAY,CAAExtD,SAAS,IACzDN,OAAOuD,WAAWuqD,EAAY,KAC9BF,IAEO,CACL,MAAArG,CAAOvd,EAAiB2lB,GAClB9D,KAAmBE,IACvBt4C,EAASw3C,GAA0BjhB,EAAiB2lB,GACpD/B,IACAE,GACF,EACA,IAAAhgB,GACE6f,GAAa,GACb7vD,SAAS2C,oBAAoB,QAAS2tD,EAAS,CAAE//B,SAAS,IAC1DruB,OAAOS,oBAAoB,SAAUivD,GACrC1vD,OAAOS,oBAAoB,SAAUqtD,EACvC,EAEJ,CApXAlG,EAAAuC,GAAA,CAAAiB,oBAAA,IAAAA,KAAA,IAkBM8C,GACAT,GACAI,GACAL,GACAb,GACAR,GACAsC,GACAK,GACAJ,GA1BNkB,GAAAzuD,EAAA,KAkBM+sD,GAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,KAClCT,GAAqB,IACrBI,GAAoB,IACpBL,GAAqB,EACrBb,GAA6B,IAC7BR,GAAwB,IACxBsC,GAAuB,KACvBK,GAAuB,GACvBJ,GAAyB,IC1B/BmB,GAAA,GA6CA,SAAS5yD,KACP,OAAOC,SAASC,OAASD,SAASE,QACpC,CAwBA,SAAS0yD,GAAYxhC,GACnB,IAAMxd,EAAUwd,EAAKyhC,aAAa3tD,OAClC,IAAK0O,EAAS,OAAO,EACrB,IAAMlQ,EAAO,GAAG1D,SAASE,WAAWF,SAAS0B,SAC7C,GAAIkS,EAAQnE,WAAW,UACrB,IACE,OAAO,IAAInI,OAAOsM,EAAQrL,MAAM,IAAI6G,KAAK1L,EAC3C,OACE,OAAO,CACT,CAEF,OAAOA,EAAKoL,SAAS8E,EACvB,CAEA,SAASk/C,GAAYjzC,GACnB,IAAMuE,EAAMvE,EAAQ4tC,QAAQ5+C,cAC5B,MAAY,UAARuV,GAA2B,aAARA,GAA8B,WAARA,GAEzCvE,EAAQ5G,aAAa,eACrB4G,EAAQ5G,aAAa,UACrB4G,EAAQ5G,aAAa,UACrB,IACArK,QAAQ,OAAQ,KAAK1J,OAAOqD,MAAM,EAAG,MAGvCsX,EAAQ9Z,aACR8Z,EAAQ5G,aAAa,eACrB4G,EAAQ5G,aAAa,UACrB4G,EAAQ5G,aAAa,QACrB,IACArK,QAAQ,OAAQ,KAAK1J,OAAOqD,MAAM,EAAG,IACzC,CAEA,SAASwqD,GAAS3hC,EAAsBvR,GACtC,MAAyB,aAArBuR,EAAK4hC,YAAmC5hC,EAAKjiB,OAASiiB,EAAK6hC,aAAe7hC,EAAKtrB,GAC1D,cAArBsrB,EAAK4hC,aAA+B5hC,EAAKE,WACnCzR,EAAQ5G,aAAamY,EAAKE,YAAcF,EAAKjiB,OAAS2jD,GAAYjzC,IAAUtX,MAAM,EAAG,MAEvF6oB,EAAKjiB,OAAS2jD,GAAYjzC,IAAYuR,EAAK6hC,aAAe7hC,EAAKtrB,IAAIyC,MAAM,EAAG,IACtF,CAEA,SAAS2qD,KACP,IAAMprD,EAA+B,CAAC,EAChCgS,EAAYlZ,SAASmZ,cAA+B,0BAA0BxH,KAC9E4gD,EAAYvyD,SAASmZ,cAA2B,sBAAsB4D,QAAQw1C,UAC9Et5C,EAASC,EAAYA,EAAU7K,MAAM,cAAc,IAAIA,MAAM,SAAS,QAAK,EACjF,OAAIkkD,IAAWrrD,EAAIyiB,WAAa4oC,GAC5Bt5C,IAAQ/R,EAAIsrD,eAAiBv5C,GAC1B/R,CACT,CAEA,SAASurD,GAAajiC,EAAsBvR,EAAkByY,GAC5D,GAA2B,SAAvBlH,EAAKkiC,cAA0B,OAAO,KAC1C,IAAM3+C,EAAQ2jB,EAASihB,QAAQ15B,GAC/B,OAAOlL,GAAS,EAAIA,EAAQ,EAAI,IAClC,CAEA,SAAS4+C,GAAYniC,EAAsBvR,EAAkByY,GAC3D,IAAM9S,EAAO3F,EAAQ4F,wBACf9Q,EAAQ0+C,GAAajiC,EAAMvR,EAASyY,GAC1C,MAAO,CACLk7B,iBAAkBpiC,EAAKtrB,GACvB2tD,eAAgBriC,EAAKsiC,UACrBC,cAAeviC,EAAK6hC,aAAe,GACnCW,eAAgBb,GAAS3hC,EAAMvR,GAC/B85B,UAAWvoB,EAAK/a,UAAY,GAC5Bw9C,cAAel/C,EACfs9C,YAAapyC,EAAQ4tC,QAAQ5+C,cAC7BqjD,aAAcY,GAAYjzC,GAC1ByyC,cAAe7vD,KAAKQ,MAAMuiB,EAAKE,OAC/B6sC,eAAgB9vD,KAAKQ,MAAMuiB,EAAKG,QAChCjiB,KAAM1D,SAASE,SACfyvD,SAAU5vD,QACPmzD,KAEP,CAOO,SAASY,GACdvlD,EACAma,GAGA,IADKna,GAAUie,UAhIjB,SAAmB4gC,GACjB,GAAIA,GAAc,EAAG,OAAO,EAC5B,GAAIA,GAAc,EAAG,OAAO,EAC5B,IAAMzjD,EAAM,uBACZ,IACE,IAAM2G,EAAWlP,eAAeC,QAAQsI,GACxC,GAAiB,MAAb2G,EAAkB,OAAO,EAC7B,GAAiB,MAAbA,EAAkB,OAAO,EAC7B,IAAM+K,EAAW5Y,KAAK4L,SAAW++C,EACjC,OAAAhsD,eAAec,QAAQyH,EAAK0R,EAAW,IAAM,KACtCA,CACT,OACE,OAAO5Y,KAAK4L,SAAW++C,CACzB,CACF,CAmHOD,CAvIP,SAA6BnlD,GAC3B,MAAwB,iBAAVA,GAAsBpB,OAAOC,SAASmB,GALtD,SAAeA,GACb,OAAOvF,KAAKC,IAKK,EALID,KAAKmmB,IAKN,EALe5gB,GACrC,CAIMklD,CAAMllD,GACN,GACN,CAmIiBslD,CAAoB/+C,EAAS6+C,aAAc,OAAO,KAEjE,IAAM1Z,EA/GR,SAAwBnlC,GAEtB,OADc3G,MAAMC,QAAQ0G,EAASmlC,OAASnlC,EAASmlC,MAAQ,IAE5DziC,IAAKmgB,IACJ,IAAMtrB,EAAKsrB,EAAKtrB,IAAIZ,OACdwuD,EAAYtiC,EAAKsiC,WAAWxuD,OAC5BuY,EAAW2T,EAAK3T,UAAUvY,OAChC,OAAKY,GAAO4tD,GAAcj2C,EACnB,IACF2T,EACHtrB,KACA4tD,YACAj2C,WACA8C,OAAwB,eAAhB6Q,EAAK7Q,OAA0B,aAAe,QACtDyyC,YAAa5hC,EAAK4hC,aAAe,OACjCM,cAAeliC,EAAKkiC,eAAiB,YACrCS,gBAAwC,IAAxB3iC,EAAK2iC,gBAToB,OAY5Cr9C,OAAQ0a,KAAyCA,EACtD,CA2FgB4iC,CAAezlD,GAAUmI,OAAOk8C,IAC9C,IAAKlf,EAAMzxC,OAAQ,OAAO,KAE1B,IAAMgyD,EAAYxxD,KAAKC,IAAI,EAAGD,KAAKmmB,IAAI,IAAKnmB,KAAKQ,MAAMsL,EAAS2lD,qBAAuB,OACjFC,EAAe1xD,KAAKC,IAAI,IAAKD,KAAKmmB,IAAI,IAAQnmB,KAAKQ,MAAMsL,EAAS4lD,cAAgB,OAClFjtC,EAAYzkB,KAAKC,IAAI,IAAMD,KAAKmmB,IAAI,EAAGra,EAAS6lD,qBAAuB,KACvE3wC,EAAO,IAAIhN,IACX49C,EAAS,IAAIn5C,IACfo5C,EAAU,EAEd,SAASC,EAAKnjC,EAAsBvR,EAAkByY,EAAqBk8B,EAAiC,CAAC,GAC3G,GAAIF,GAAWL,EAAW,OAC1B,IAAMtqD,EAxBV,SAAmBynB,EAAsBvR,EAAkByY,GACzD,IAAM3jB,EAAQ0+C,GAAajiC,EAAMvR,EAASyY,IAAa,EACvD,MAAO,GAAGlH,EAAKtrB,MAAM/F,QAAc4U,KAASo+C,GAAS3hC,EAAMvR,IAC7D,CAqBgB40C,CAAUrjC,EAAMvR,EAASyY,GACjClH,EAAK2iC,gBAAkBtwC,EAAKjM,IAAI7N,KACpC8Z,EAAKzd,IAAI2D,GACT2qD,GAAW,EACX5rC,EAAM0I,EAAKsiC,UAAW,IAAKH,GAAYniC,EAAMvR,EAASyY,MAAck8B,IACtE,CAEA,IAAME,EAAkBhhB,EAAMh9B,OAAQ0a,GAAyB,eAAhBA,EAAK7Q,QAC9Co0C,EAAajhB,EAAMh9B,OAAQ0a,GAAyB,UAAhBA,EAAK7Q,QACzCwN,EAAoC,GAE1C,QAAWqD,KAAQsjC,EAAiB,CAClC,IAAIp8B,EAAsB,GAC1B,IACEA,EAAW1wB,MAAM0S,KAAK1Z,SAAS2Z,iBAAiB6W,EAAK3T,UACvD,OACE,QACF,CACA,IAAK6a,EAASr2B,OAAQ,SACtB,IAAM2J,EAAW,IAAI0lC,qBAClB1tC,IACC,QAAWwH,KAASxH,EAAS,CAE3B,GADIwH,EAAMwpD,kBAAoB1tC,GAC1BmtC,EAAO78C,IAAIpM,EAAMwV,QAAS,SAC9B,IAAM4Z,EAAQ13B,OAAOuD,WAAW,KAC9BguD,EAAO5hD,OAAOrH,EAAMwV,QACpB,IAAM4E,EAAOpa,EAAMwV,OAAO6E,wBACtBD,EAAKE,OAAS,GAAKF,EAAKG,QAAU,GACtC4uC,EAAKnjC,EAAMhmB,EAAMwV,OAAQ0X,EAAU,CACjCu8B,WAAYV,EACZW,eAAgBryD,KAAKQ,MAAgC,IAA1BmI,EAAMwpD,sBAElCT,GACHE,EAAOj7C,IAAIhO,EAAMwV,OAAQ4Z,EAC3B,GAEF,CAAEtT,UAAW,CAACA,KAEhBoR,EAAS3Z,QAASkB,GAAYjU,EAASe,QAAQkT,IAC/CkO,EAAUnW,KAAKhM,EACjB,CAEA,IAAMslD,EAAWvwC,IACf,IAAMC,EAASD,EAAMC,kBAAkB5B,QAAU2B,EAAMC,OAAS,KAChE,GAAKA,EACL,QAAWwQ,KAAQujC,EAAY,CAC7B,IAAK/B,GAAYxhC,GAAO,SACxB,IAAIY,EAA0B,KAC9B,IACEA,EAAUpR,EAAO7H,QAAQqY,EAAK3T,SAChC,OACE,QACF,CACKuU,GAELuiC,EAAKnjC,EAAMY,EADMpqB,MAAM0S,KAAK1Z,SAAS2Z,iBAAiB6W,EAAK3T,WAC7B,CAC5Bo0C,WAAYpvD,KAAKQ,MAAM0d,EAAM2rC,SAC7BwF,WAAYrvD,KAAKQ,MAAM0d,EAAM6rC,UAEjC,GAGF,OAAA5rD,SAASuC,iBAAiB,QAAS+tD,EAAS,CAAE//B,SAAS,EAAM/tB,SAAS,IAE/D,CACL,IAAAwtC,GACEhwC,SAAS2C,oBAAoB,QAAS2tD,EAAS,CAAE//B,SAAS,IAC1DpD,EAAUpP,QAAS/S,GAAaA,EAASE,cACzC,QAAW0uB,KAAS65B,EAAOvwC,SAAUhhB,OAAOuB,aAAam2B,GACzD65B,EAAOxoC,OACT,EAEJ,CApPA6+B,EAAAiI,GAAA,CAAAmB,qBAAA,IAAAA,KAAA,IAAAiB,GAAA9wD,EAAA,QCAA+wD,GAAA,GAyFA,SAASC,GAAO1uD,GACd,OAAQA,GAAIR,aAAe,IAAI6I,QAAQ,OAAQ,KAAK1J,MACtD,CAEA,SAASgwD,GAAYz3C,EAAkB03C,GACrC,OAAOvtD,MAAM0S,KAAK1Z,SAAS2Z,iBAAiBkD,IACzCxM,IAAIgkD,IACJv+C,OAAOgM,SACPna,MAAM,EAAG4sD,EACd,CAEA,SAASC,GAAU1tD,GACjB,IACE,IAAM4K,EAAM,IAAIxR,IAAI4G,EAAK1H,SAASuS,MAClC,MAAO,GAAGD,EAAIrS,SAASqS,EAAIpS,UAC7B,OACE,OAAOwH,EAAIuH,MAAM,KAAK,IAAI1G,MAAM,EAAG,MAAQ,EAC7C,CACF,CAEA,SAAS8sD,GAASrtD,GAChB,IAAMZ,EAAQY,EAAMZ,MAAM,mCAC1B,IAAKA,EAAO,OAAO,KAKnB,IAAMkuD,EAAM,IAJEluD,EAAMmB,MAAM,EAAG,GAAG0I,IAAKskD,GACzB9yD,KAAKC,IAAI,EAAGD,KAAKmmB,IAAI,IAAKhiB,OAAOu8C,SAASoS,EAAM,KAAO,IACxDrnD,SAAS,IAAIC,SAAS,EAAG,MAEd/I,KAAK,MAC3B,MAAe,YAARkwD,GAA6B,YAARA,EAAoB,KAAOA,CACzD,CAEA,SAASE,GAAO1xC,EAAkBqxC,GAChC,OAAOvtD,MAAM0S,KAAK,IAAI7D,IAAIqN,EAAOpN,OAAOgM,WAAWna,MAAM,EAAG4sD,EAC9D,CAEA,SAASM,KACP,IAAMC,EAAmB,GACnBC,EAAkB,GAClBC,EAAyB,GACzBt9B,EAAW1wB,MAAM0S,KAAK1Z,SAAS2Z,iBAAiB,WAAWhS,MAAM,EAAG,KAE1E,QAAWhC,KAAM+xB,EAAU,CACzB,IAAM1yB,EAAQwf,iBAAiB7e,GACzBsvD,EAAQR,GAASzvD,EAAMiwD,OACvBC,EAAKT,GAASzvD,EAAMmwD,iBACpBC,EAASX,GAASzvD,EAAMqwD,aAC1BJ,GAAOH,EAAO99C,KAAKi+C,GACnBC,GAAIJ,EAAO99C,KAAKk+C,GAChBE,GAAQN,EAAO99C,KAAKo+C,GACpBpwD,EAAMswD,YAAYP,EAAM/9C,KAAKhS,EAAMswD,WAAWjnD,MAAM,KAAK,IAAIL,QAAQ,KAAM,IAAI1J,QAAU,KAG5E,WAAfqB,EAAGknD,SACyB,WAA5BlnD,EAAG0S,aAAa,SACf1S,aAAc4vD,mBAAqB,kBAAkB/mD,KAAK7I,EAAGsX,aAE9D+3C,EAAah+C,KAAK,CAChB,SAASi+C,GAASjwD,EAAMiwD,QACxB,cAAcC,GAAMlwD,EAAMmwD,kBAC1B,UAAUnwD,EAAMwwD,gBAChBhxD,KAAK,MAEX,CAEA,MAAO,CACLswD,OAAQF,GAAOE,EAAQ,IACvBC,MAAOH,GAAOG,EAAO,GACrBU,QAASb,GAAOI,EAAc,GAElC,CAcA,SAASU,GAAiB3hC,GACxB,IACE,OAdJ,SAAoB/qB,GAClB,IAAKA,EAAS,OAAO,EACrB,IAAMD,EAAM,sBACZ,IACE,OAAAC,EAAQ1H,QAAQyH,EAAK,KACrBC,EAAQwI,WAAWzI,IACZ,CACT,OACE,OAAO,CACT,CACF,CAIW4sD,CAAWzzD,OAAO6xB,GAC3B,OACE,OAAO,CACT,CACF,CAEA,SAAS6hC,KACP,IAAMtlB,EAAMpuC,OACNizB,EAAOn1B,SAASgC,gBAAgBiyB,UAAUtsB,MAAM,EAAG,MACzD,OAAI2oC,EAAI97B,SAAW,oCAAoChG,KAAK2mB,GAAc,UACtEmb,EAAIulB,aAAe,0BAA0BrnD,KAAK2mB,GAAc,cAChE,8BAA8B3mB,KAAK2mB,GAAc,SAC9C,SACT,CAiCO,SAAS2gC,GAAgBhvD,GAC9B,IAAKA,EAAK,OAAO,EACjB,IACE,IAAM4K,EAAM,IAAIxR,IAAI4G,EAAK1H,SAASuS,MAC5B1R,EAAOyR,EAAIvR,SAAS8N,cACpBnL,EAAO4O,EAAIpS,SAAS2O,cAC1B,OACEhO,EAAKiO,SAAS,aACdjO,EAAKiO,SAAS,cACd,iDAAiDM,KAAK1L,IACtD,qCAAqC0L,KAAK1L,EAE9C,OACE,MAAO,2DAA2D0L,KAAK1H,EACzE,CACF,CAEA,SAASivD,GAAez5B,GAItB,IAAM05B,UAHiB5pD,YAAgB,IACnCA,YAAY2iC,iBAAiB,YAC7B,IACsBpnC,MAAM,EAAG,IAAW0I,IAAK7F,KACjDkH,IAAK8iD,GAAUhqD,EAAM2F,MACrBnE,KAAMxB,EAAMyrD,cACZC,WAAYr0D,KAAKQ,MAAMmI,EAAMtH,UAC7BizD,aAAct0D,KAAKC,IAAI,EAAGD,KAAKQ,MAAMmI,EAAM2rD,cAAgB,OAEvDC,EAAch3D,SAASe,SACvBk2D,EAAyB,GAC/BL,EAAUj4C,QAASu4C,IACjB,IACE,IAAMr2D,EAAO,IAAIC,IAAIo2D,EAAS5kD,KAAKvR,SAC/BF,GAAQA,IAASm2D,GAAaC,EAAar/C,KAAK/W,EACtD,OAEA,IAEF,IAAMs2D,EAAsB3B,GAAOyB,EAAc,IAC3CG,EAAeR,EAAUlgD,OAAQwgD,GACrC,mDAAmD9nD,KAAK8nD,EAAS5kD,MACjE/J,MAAM,EAAG,IAGX,MAAO,CACL8uD,mBAHyBn6B,EAAOmB,SAAW+2B,GAAUl4B,EAAOmB,UAAY,GAIxE+4B,eACAD,sBACAP,YACAU,gBAAiBC,GAAehvD,MAAM,EAAG,IAE7C,CAEA,SAASivD,GAAgBt6B,EAAoBvE,GAC3C,IAAM8+B,EAAWvC,GAAY,WAAY,IACnCmB,EAAUnB,GAAY,gEAAiE,IACvFwC,EAAYlC,GAAO5tD,MAAM0S,KAAK1Z,SAAS+2D,QAC1C1mD,IAAK2mD,GAAQA,EAAIC,IAAI3yD,QACrBwR,OAAOgM,SAAU,IACdo1C,EA7ER,WACE,IAAMC,EAAkB,GAExB,OADgBnwD,MAAM0S,KAAK1Z,SAAS2Z,iBAAiB,uCAC7CoE,QAASyX,IACf,IACE,IAAMzuB,EAASrG,KAAKC,MAAM60B,EAAOrwB,aAAe,OAClC6B,MAAMC,QAAQF,GAAUA,EAAS,CAACA,IAC1CgX,QAAS5H,IAEb,IAAMnK,EAAOmI,QADEgC,GAAwB,iBAATA,EAAoBA,EAAkC,CAAC,GAC1D,UAAY,IACnCnK,GAAMmrD,EAAMngD,KAAKhL,IAEzB,OAEA,IAEK4oD,GAAOuC,EAAO,GACvB,CA4DsBC,GACdC,EAAar3D,SAAS2B,KAAK21D,UAAUtpD,QAAQ,OAAQ,KAAK1J,OAAOqD,MAAM,EAAG,KAC1E4vD,EAAe3C,IAClByC,EAAW7wD,MAAM,4FAA8F,IAC7G6J,IAAK8F,GAASA,EAAKlI,eACtB,IAEIupD,EAAkBxwD,MAAM0S,KAAK1Z,SAASy3D,SACzC3hD,OAAQ0f,GAAWsgC,GAAgBtgC,EAAOkiC,KAAO,KACjDr2D,OAEH,MAAO,CACLmU,KAAM,CACJ9D,IAAK8iD,GAAUp1D,SAASuS,MACxB5O,MAAO/C,SAAS+C,MAChBjD,SAAUE,SAASF,SAAW00D,GAAUx0D,SAASF,UAAY,GAC7Dk7C,SAAUh7C,SAASgC,gBAAgBi5C,MAAQ1D,UAAUyD,UAAY,GACjE2c,SAAU,CACR7yC,MAAO5iB,OAAO2uC,WACd9rB,OAAQ7iB,OAAOC,YACfy1D,iBAAkB11D,OAAO01D,mBAG7BC,IAAK,CACHC,WAAW,EACXjgB,QAAS,QACT1lB,OAAQmK,EAAOnK,QAAU,GACzB4lC,aAAchgC,EAAQggC,aACtBC,eAAgBjgC,EAAQigC,eACxBC,wBAAyBlgC,EAAQigC,kBAA0B17B,EAAOmB,SAClEy6B,kBAAmBV,EAAkB,EACrCW,YAAaX,GAEfY,KAAM,CACJ3qB,SAAU1V,EAAQ0V,UAAYmoB,KAC9ByC,cAAqBr4D,SAASmZ,cAAc,2EAC5Cm/C,wBA5Hc,CAChB,oBACA,uBACA,mBACA,sBACA,4BAEY/hD,KAAMsG,GAAa7c,SAASmZ,cAAc0D,KACjD,2CAA2CrO,KAAKxO,SAAS2B,KAAK21D,UAAU3vD,MAAM,EAAG,MAqHpF4wD,eAAsBv4D,SAASmZ,cAAc,2CAC7Cq/C,sBAAuBtB,EAAY3gD,KAAMvK,GAAS,WAAWwC,KAAKxC,IAClEkrD,eAEFuB,IAAK,CACH5B,WACApB,UACAqB,YACA4B,SAAUpE,GAAY,iCAAkC,IACxDiD,eACAF,cAEF9jC,OAAQshC,KACR8D,oBAAqB,CACnBC,iBAAkBrhB,UAAUshB,cAC5BC,sBAAuBpD,GAAiB,gBACxCqD,wBAAyBrD,GAAiB,kBAC1CsD,YAAa,GACbC,gBAAiBtC,GAAetmD,IAAK8F,GAAS,GAAGA,EAAKnK,SAASmK,EAAKzE,OAAO/J,MAAM,EAAG,KAEtFuxD,QAASnD,GAAez5B,GACxB68B,YAAY,IAAIz5D,MAAO+sB,cAE3B,CAEO,SAAS2sC,GAAoB98B,EAAoBvE,GACtD,UAAW71B,OAAW,YAAsBlC,SAAa,IAAa,OACtE,IAAMksB,EA7RR,WACE,IACE,OAAO,IAAIrrB,gBAAgBzB,SAAS0B,QAAQI,IAAI,aAClD,OACE,OAAO,IACT,CACF,CAuRgBm4D,IACTntC,IAtRP,SAAqBA,GACnB,IAAMnjB,EAAM,mBAAmBmjB,KAAS9sB,SAASC,SAASD,SAASE,WACnE,GAAIg6D,KAAsBvwD,EAAK,OAAO,EACtCuwD,GAAoBvwD,EACpB,IACE,GAAoC,MAAhCvI,eAAeC,QAAQsI,GAAc,OAAO,EAChDvI,eAAec,QAAQyH,EAAK,IAC9B,OAEA,CACA,OAAO,CACT,CA2QiBwwD,CAAYrtC,IAzQ7B,SAAkBgB,GAChB,IAAMojB,EAAMpuC,OAG2B,mBAA5BouC,EAAIkpB,oBAIft3D,OAAOuD,WAAWynB,EAAkC,aAAxBltB,SAAS24B,WAA4B,IAAM,MAHrE2X,EAAIkpB,oBAAoBtsC,EAAU,CAAEnE,QAAS,MAIjD,CAkQEvD,CAAS,KACP,IAAMiY,EAAWnB,EAAOm9B,eAAiBC,GACnC/3D,EAAOjB,KAAKa,UAAU,CAC1B2qB,QACAjiB,SAAU2sD,GAAgBt6B,EAAQvE,KAGpC1X,MAAMod,EAAU,CACd4C,OAAQ,OACRlX,QAAS,CAAE,eAAgB,oBAC3BxnB,OACA2+B,UAAW3+B,EAAKN,OAAS,MACxBs/B,MAAM,SAIb,CAzWAmpB,EAAAsK,GAAA,CAAA0B,gBAAA,IAAAA,GAAAsD,oBAAA,IAAAA,KAAA,IAEMM,GAgBA/C,GAEF2C,GApBJK,GAAAt2D,EAAA,KAEMq2D,GAAyB,oDAgBzB/C,GAAkC,GAEpC2C,GAAoB,UAGWp3D,OAAW,MAG5CA,OAAOK,iBAAiB,QAAUwd,IAChC,IAAMC,EAASD,EAAMC,OACrB,KAAMA,aAAkB45C,aAAc,OACtC,IAAMloD,EACJsO,aAAkB65C,mBAClB75C,aAAkB85C,iBACd95C,EAAO03C,IACP13C,aAAkB+5C,gBAChB/5C,EAAOrO,KACP,GACHD,IACLilD,GAAe3/C,KAAK,CAClBtF,IAAK8iD,GAAU9iD,GACf8R,IAAKxD,EAAO6sC,QAAQ5+C,cACpBjC,KAAM,mBAEJ2qD,GAAet1D,OAAS,IAAIs1D,GAAe1N,WAC9C,GAEH/mD,OAAOK,iBAAiB,qBAAsB,KAC5Co0D,GAAe3/C,KAAK,CAClBtF,IAAK8iD,GAAUp1D,SAASuS,MACxB6R,IAAK,SACLxX,KAAM,wBAEJ2qD,GAAet1D,OAAS,IAAIs1D,GAAe1N,aCnDnD+Q,GAAA,GAsCA,SAASC,GAAgB9oD,EAAkCmwC,GACzD,IAAM5vC,EAAM,IAAIxR,IAAId,SAASuS,MACvB3O,EAAU7B,OAAO6B,QAAQmO,GAAU2E,OACvC,EAAE3O,EAAca,KAAiBb,GAAgBa,GAE7CkyD,EAA2C,CAAC,EAClD,QAAY/yD,EAAca,KAAgBhF,EACxCk3D,EAAiB/yD,GAAgBa,EAEnC,IAAM42B,EAzBR,SAA2BztB,GACzB,OAAOhQ,OAAO6B,QAAQmO,GACnBd,IAAI,EAAElJ,EAAca,KAAiB,GAAGb,KAAgBa,KACxDxD,KAAK,IACV,CAqBgB21D,CAAkBD,GAChC,OAAIt7B,GAAOltB,EAAIE,aAAa4G,IAAI,aAAcomB,GACvB,IAAnB57B,EAAQ3B,QACVqQ,EAAIE,aAAa4G,IAAI,qBAAsBxV,EAAQ,GAAG,IACtD0O,EAAIE,aAAa4G,IAAI,oBAAqBxV,EAAQ,GAAG,MAErD0O,EAAIE,aAAaC,OAAO,sBACxBH,EAAIE,aAAaC,OAAO,sBAE1BH,EAAIE,aAAa4G,IAAI,UAAW,KAChC9G,EAAIE,aAAa4G,IAAI,aAAc,KAC/B8oC,GAAa5vC,EAAIE,aAAa4G,IAAI,kBAAmB8oC,GAClD5vC,EAAIpE,UACb,CAEA,SAAS8sD,GAAajpD,EAAkCmwC,GACtD,IACExvC,QAAQC,aAAa,KAAM,GAAIkoD,GAAgB9oD,EAAUmwC,GAC3D,OAAS,CACX,CAyLO,SAAS+Y,GAAe3pD,GAE7B,GAAI1Q,SAASmE,eAAem2D,IAAa,OAEzC,IAAMr6D,EAAOD,SAASiF,cAAc,OACpChF,EAAKiF,GAAKo1D,GACV,IAAMlQ,EAASnqD,EAAKoqD,aAAa,CAAExmD,KAAM,WAEnCmB,EAAQhF,SAASiF,cAAc,SACrCD,EAAMG,YAAco1D,GACpBnQ,EAAO7kD,YAAYP,GAEnB,IAAMw1D,EAAUx6D,SAASiF,cAAc,OACvCu1D,EAAQv9C,UAAY,UAGpB,IAAMquC,EAAStrD,SAASiF,cAAc,OACtCqmD,EAAOruC,UAAY,SAEnB,IAAMw9C,EAAQz6D,SAASiF,cAAc,QACrCw1D,EAAMx9C,UAAY,QAClBw9C,EAAMt1D,YAAc,aAEpB,IAAMu1D,EAAU16D,SAASiF,cAAc,OACvCy1D,EAAQ11D,MAAM4iB,QAAU,2CAExB,IAAM+yC,EAAc36D,SAASiF,cAAc,UAC3C01D,EAAY19C,UAAY,eACxB09C,EAAYx1D,YAAc,IAC1Bw1D,EAAY53D,MAAQ,WACpB,IAAIknD,GAAY,EAChB0Q,EAAYp4D,iBAAiB,QAAS,KACpC0nD,GAAaA,EACbuQ,EAAQ51D,UAAUg2D,OAAO,YAAa3Q,GACtC0Q,EAAYx1D,YAAc8kD,EAAY,IAAM,MAG9C,IAAM4Q,EAAU76D,SAASiF,cAAc,UACvC41D,EAAQ59C,UAAY,WACpB49C,EAAQ11D,YAAc,UACtB01D,EAAQt4D,iBAAiB,QAASmO,EAAQoqD,UAE1CJ,EAAQn1D,YAAYo1D,GACpBD,EAAQn1D,YAAYs1D,GACpBvP,EAAO/lD,YAAYk1D,GACnBnP,EAAO/lD,YAAYm1D,GACnBF,EAAQj1D,YAAY+lD,GAGpB,IAAM3pD,EAAO3B,SAASiF,cAAc,OACpCtD,EAAKsb,UAAY,OACjB,IAAM89C,EAlRR,SAAyBrqD,GACvB,IAAML,EAA8B,IAAMK,EAAQS,UAAY,CAAC,GAC/D,QAAW8E,KAAcvF,EAAQ4E,YAC1BjF,EAAI4F,EAAW9O,gBAClBkJ,EAAI4F,EAAW9O,cAAgB8O,EAAWjO,aAG9C,OAAOqI,CACT,CA0QyB2qD,CAAgBtqD,GAEjCuqD,EAAoBvqD,EAAQ4E,YAAYY,KAAMD,GAAeA,EAAW2wC,gBAC9E,GAAIqU,GAAmBrU,eAAgB,CACrC,IAAMsU,EAAUl7D,SAASiF,cAAc,OACvCi2D,EAAQj+C,UAAY,UACpB,IAAMla,EAAQ/C,SAASiF,cAAc,OACrClC,EAAMka,UAAY,gBAClBla,EAAMoC,YAAc,YAAY81D,EAAkBrU,eAAe/O,SAAW,IAC5EqjB,EAAQ31D,YAAYxC,GACpB,IAAMo4D,EAAiBn7D,SAASiF,cAAc,OAC9Ck2D,EAAel+C,UAAY,kBAC3B,IAAMm+C,EAASp7D,SAASiF,cAAc,UACtCm2D,EAAOn+C,UAAY,WACnBm+C,EAAOj2D,YAAc,gBACrBi2D,EAAO74D,iBAAiB,QAAS,IAAMmO,EAAQ2qD,oBAC/C,IAAMC,EAAct7D,SAASiF,cAAc,UAC3Cq2D,EAAYr+C,UAAY,WACxBq+C,EAAYn2D,YAAc,eAC1Bm2D,EAAY/4D,iBAAiB,QAAS,IAAMmO,EAAQ6qD,mBACpDJ,EAAe51D,YAAY61D,GAC3BD,EAAe51D,YAAY+1D,GAC3BJ,EAAQ31D,YAAY41D,GACpBx5D,EAAK4D,YAAY21D,EACnB,CAEA,GAAmC,IAA/BxqD,EAAQsF,YAAY3U,OAAc,CACpC,IAAMm6D,EAAQx7D,SAASiF,cAAc,OACrCu2D,EAAMv+C,UAAY,iBAClBu+C,EAAMr2D,YAAc,8BACpBxD,EAAK4D,YAAYi2D,EACnB,KAAO,CACL,IAAMC,EAAez7D,SAASiF,cAAc,OAC5Cw2D,EAAax+C,UAAY,gBACzB,IAAMy+C,EAAgB17D,SAASiF,cAAc,UAC7Cy2D,EAAcz+C,UAAY,WAC1By+C,EAAc1vD,KAAO,SACrB0vD,EAAcv2D,YAAc,kBAC5Bu2D,EAAc34D,MAAQ,yDACtB24D,EAAcn5D,iBAAiB,QAAS,KACtC,IAAMo5D,EAAgBD,EAAcv2D,aAlR1CmjB,eAAwBlhB,GACtB,GAAImwC,UAAUqkB,WAAWC,UAEvB,kBADMtkB,UAAUqkB,UAAUC,UAAUz0D,GAGtC,IAAM00D,EAAW97D,SAASiF,cAAc,YACxC62D,EAAS10D,MAAQA,EACjB00D,EAAS92D,MAAMojB,SAAW,QAC1B0zC,EAAS92D,MAAM0f,QAAU,IACzB1kB,SAAS2B,KAAK4D,YAAYu2D,GAC1BA,EAASrR,SACTzqD,SAAS+7D,YAAY,QACrB/7D,SAAS2B,KAAK40B,YAAYulC,EAC5B,EAsQME,CAAS/B,GAAgBc,EAAgBrqD,EAAQ4wC,cAC9CzgC,KAAK,KACJ66C,EAAcv2D,YAAc,SAC5BjD,OAAOuD,WAAW,KAChBi2D,EAAcv2D,YAAcw2D,GAC3B,QAEJh7B,MAAM,KACL+6B,EAAcv2D,YAAc,cAC5BjD,OAAOuD,WAAW,KAChBi2D,EAAcv2D,YAAcw2D,GAC3B,UAIT,IAAMM,EAAiBj8D,SAASiF,cAAc,UAiB9C,GAhBAg3D,EAAeh/C,UAAY,WAC3Bg/C,EAAejwD,KAAO,SACtBiwD,EAAe92D,YAAc,mBAC7B82D,EAAel5D,MAAQ,2DACvBk5D,EAAe15D,iBAAiB,QAAS,KACvC,IACE8D,aAAa/E,QAAQ,gBAAiB,IACxC,OAAS,CACT84D,GAAaW,EAAgBrqD,EAAQ4wC,aACrCliD,SAASg8D,WAGXK,EAAal2D,YAAYm2D,GACzBD,EAAal2D,YAAY02D,GACzBt6D,EAAK4D,YAAYk2D,GAEb/qD,EAAQ4wC,YAAa,CACvB,IAAM4a,EAAUl8D,SAASiF,cAAc,OACvCi3D,EAAQj/C,UAAY,UACpB,IAAMk/C,EAAen8D,SAASiF,cAAc,OAC5Ck3D,EAAal/C,UAAY,gBACzBk/C,EAAah3D,YAAc,aAC3B,IAAM44B,EAAY/9B,SAASiF,cAAc,OACzC84B,EAAU9gB,UAAY,aACtB8gB,EAAU54B,YAAcuL,EAAQ4wC,YAChCvjB,EAAUh7B,MAAQ2N,EAAQ4wC,YAC1B4a,EAAQ32D,YAAY42D,GACpBD,EAAQ32D,YAAYw4B,GACpBp8B,EAAK4D,YAAY22D,EACnB,CAEA,QAAW5pC,KAAO5hB,EAAQsF,YAAa,CACrC,IAAMomD,EAASp8D,SAASiF,cAAc,OACtCm3D,EAAOn/C,UAAY,aAEnB,IAAMo/C,EAASr8D,SAASiF,cAAc,OACtCo3D,EAAOp/C,UAAY,WACnBo/C,EAAOl3D,YAAcmtB,EAAIptB,GACzBm3D,EAAOt5D,MAAQuvB,EAAIptB,GACnBk3D,EAAO72D,YAAY82D,GAEnB,IAAM5R,EAASzqD,SAASiF,cAAc,UACtCwlD,EAAOxtC,UAAY,aAEnB,IAAMq/C,EAAgB5rD,EAAQS,WAAWmhB,EAAIptB,IACvCq3D,EAAexB,EAAezoC,EAAIptB,IAClCs3D,EAAoB9rD,EAAQ4E,YAAYY,KAC3CzO,GAAMA,EAAEN,eAAiBmrB,EAAIptB,IAGhC,QAAWjE,KAAKqxB,EAAI2yB,WAAY,CAC9B,IAAMwX,EAAMz8D,SAASiF,cAAc,UACnCw3D,EAAIr1D,MAAQnG,EAAEiE,GACd,IAAMqJ,EAAQtN,EAAE8V,UAAY,YAAc,YAC1C0lD,EAAIt3D,YAAc,GAAGoJ,OAAWtN,EAAEiE,GAAGyC,MAAM,EAAG,MAE5C40D,IAAiBt7D,EAAEiE,IACnBo3D,IAAkBr7D,EAAEiE,KAClBq3D,IAAiBD,GAAiBE,GAAmBx0D,cAAgB/G,EAAEiE,MAEzEu3D,EAAIhiD,UAAW,GAEjBgwC,EAAOllD,YAAYk3D,EACrB,CAEAhS,EAAOloD,iBAAiB,SAAU,KAChCw4D,EAAezoC,EAAIptB,IAAMulD,EAAOrjD,MAChCgzD,GAAaW,EAAgBrqD,EAAQ4wC,aACrC5wC,EAAQgsD,kBAAkBpqC,EAAIptB,GAAIulD,EAAOrjD,SAG3Cg1D,EAAO72D,YAAYklD,GACnB9oD,EAAK4D,YAAY62D,EACnB,CACF,CAEA5B,EAAQj1D,YAAY5D,GACpByoD,EAAO7kD,YAAYi1D,GACnBx6D,SAAS2B,KAAK4D,YAAYtF,EAC5B,CAEO,SAAS08D,KACd,IAAMh3D,EAAK3F,SAASmE,eAAem2D,IAC/B30D,GAAIA,EAAGd,QACb,CA3bAilD,EAAAkQ,GAAA,CAAAK,eAAA,IAAAA,GAAAsC,iBAAA,IAAAA,KAAA,IAoBMrC,GA+DAC,GAnFNqC,GAAAv5D,EAAA,KAoBMi3D,GAAa,kBA+DbC,GAAiB,4pHC1ChB,SAASsC,KACd,IAAIx4C,EAAQy4C,GAAW,GAAI,CAAE/oC,KAAM,gBAC7BgpC,EAAY,IAAIlnD,IAClBmnD,EAAoC,KACpCC,GAAW,EAQf,SAASC,EAASh7C,GAChBmC,EAAQnC,EAPV,WACE,QAAW9C,KAAY29C,EACrB39C,EAASiF,EAEb,CAIEsvC,EACF,CAEA,SAASvK,IACP,IAAM+T,EAwOV,WACE,IAAMplC,EAAUqlC,KACVC,EAiFR,SACErnD,EACAV,GAEA,OAAOA,EAAYjF,IAAK4F,KACtBywC,eAAgB4W,GAAmBtnD,EAAaC,EAAW9O,cAC3Do2D,cAAeC,GAAkBxnD,EAAaC,EAAW9O,aAAc8O,EAAWjO,eAEtF,CAzFsBy1D,CAA2B1lC,EAAQuE,QAAQtmB,aAAe,GAAI+hB,EAAQziB,aAC1F,GAAIyiB,EAAQ2lC,cACV,MAAO,CACL3pC,KAAM,QACN4pC,YAAa5lC,EAAQ2lC,cAAcC,aAAe5lC,EAAQ2lC,cAAcE,gBACxEP,cACAQ,cAAe,WAGnB,IAAMC,EACiB,YAArB/lC,EAAQ0V,UACyB,YAAjC1V,EAAQuE,QAAQgR,cACsB,YAAtCvV,EAAQuE,QAAQkR,SAASC,SACrBswB,SAAwB77D,OAAW,OAAwBA,OAA4CsS,QAC7G,OAAIspD,GAAqBC,EAChB,CACLhqC,KAAM,UACNiqC,aAAa,EACbT,cAAeU,GAA+BlmC,EAAQuE,QAAQtmB,aAAe,GAAI+hB,EAAQziB,aACzF4oD,UAAW,KACXb,eAGG,CAAEtpC,KAAM,cACjB,CAlQ6BoqC,GACzBjB,EAASJ,GAAWz4C,EAAM6+B,OAAQia,IAIpC70C,eAAkC60C,GAChC,GAA8B,YAA1BA,EAAiBppC,KAAoB,OACzC,IAAMgE,EAAUqlC,KACV3+B,EAAY1G,EAAQziB,YACvBjF,IAAK4F,GAAe,GAAGA,EAAW9O,gBAAgB8O,EAAWjO,eAC7DR,OACAhD,KAAK,KACR,GAAIw4D,IAAuBv+B,EAAW,OACtCu+B,EAAqBv+B,EACrB,IAAMnV,QAsPVhB,iBACE,GAAqB,mBAAVjI,MAAsB,OAAO,KACxC,IACE,IAAMS,QAAiBT,MAAM,WAAY,CAAE8I,QAAS,CAAEC,OAAQ,sBAC9D,IAAKtI,EAASC,GAAI,OAAO,KACzB,IAAMuI,QAAaxI,EAASiB,OAC5B,OAAOuH,GAAwB,iBAATA,IAAsBtiB,MAAMC,QAAQqiB,GACtDA,EACA,IACN,OACE,OAAO,IACT,CACF,CAlQuB80C,GACfnB,GAAYD,IAAuBv+B,GACvCy+B,EAASJ,GAAWz4C,EAAM6+B,OAAQ,IAC7Bia,EACHa,YAAaK,GAAuB/0C,EAAMyO,EAAQziB,aAClDioD,cAAee,GAA4Bh1C,EAAMyO,EAAQuE,QAAQtmB,aAAe,IAChFkoD,UAAW,OAEf,CApBOK,CAAmBpB,EAC1B,CAqBA,IAAMqB,EAAqBC,GAA8BrV,GACnDsV,EAAoBrV,GAAyBtpC,IACjD,IAAM4+C,EA8UV,SAA0B5+C,GACxB,GAAmB,UAAfA,EAAM/T,KAAkB,OAAO,KACnC,IAAMygC,EAAS1sB,EAAM0sB,QAAU,CAAC,EAC1BzgC,EAUR,SAAmBuC,EAAek+B,GAChC,MAAc,sBAAVl+B,GAA2C,6BAAVA,EAA6C,WACpE,aAAVA,GAAkC,wBAAVA,EAAwC,WACtD,SAAVA,EAA2C,gBAAlBk+B,EAAOxc,aAA+C,IAAnBwc,EAAOmyB,QAAwB,UAAY,OACpG,IACT,CAfe9L,CAAU/yC,EAAMxR,MAAOk+B,GACpC,OAAKzgC,EACE,CACL6yD,GAAI9+C,EAAMkC,GACVjW,OACAuC,MAAOuwD,GAAW9yD,EAAM+T,EAAMxR,MAAOk+B,GACrCrlC,MAAO23D,GAAW/yD,EAAMygC,IALR,IAOpB,CAzVmBuyB,CAAiBj/C,GAChC,IAAK4+C,EAAQ,OACb,IAAMzb,EAwXV,SAAqBA,EAAwBnjC,GAC3C,IAAIk/C,EACJ,QAASlrD,EAAQmvC,EAAO7hD,OAAS,EAAG0S,GAAS,EAAGA,GAAS,EAAG,CAC1D,IAAM5F,EAAY+0C,EAAOnvC,GACzB,GACE5F,EAAUnC,OAAS+T,EAAM/T,MACzBmC,EAAUI,QAAUwR,EAAMxR,OAC1BwR,EAAM8+C,GAAK1wD,EAAU0wD,IAAM,KAC3B,CACAI,EAAY9wD,EACZ,KACF,CACF,CACA,MAAO,IAAI+0C,EAAQ+b,EAAY,IAAKl/C,EAAOm/C,YAAaD,EAAUJ,IAAO9+C,GAAOpY,OAAM,IACxF,CAtYmBw3D,CAAY96C,EAAM6+B,OAAQyb,GACzCzB,EAASJ,GAAW5Z,EAAQ7+B,EAAM+6C,iBAGpC,OAAAhW,IAEO,CACLiW,SAAA,IACSh7C,EAETi7C,UAAUlgD,IACR29C,EAAU33D,IAAIga,GACP,KACL29C,EAAUlrD,OAAOuN,KAGrB,cAAAmgD,CAAep4D,EAAca,GAC3Bw3D,GAA4Br4D,EAAca,EAC5C,EACA,UAAAy3D,CAAWt4D,GACTu4D,GAAwBv4D,EAC1B,EACA,MAAAw4D,GACE1C,GAAW,EACXuB,IACAE,IACAptD,KA6XN,WACE,UAAWtR,SAAa,IAAa,OACrC,IAAM4/D,EAAY,CAChB,0BACA,0BACA,iCAEF,QAAW/iD,KAAY+iD,EACrB5/D,SAAS2Z,iBAAiBkD,GAAUkB,QAASkB,GAAYA,EAAQpa,SAErE,CAtYMg7D,EACF,EAEJ,CAEA,SAAS/C,GAAW5Z,EAAwBkc,GAC1C,IAAMrnC,EAAUqlC,KAChB,MAAO,CACLpnD,YAAa8pD,GACX/nC,EAAQuE,QAAQtmB,aAAe,GAC/B+hB,EAAQziB,YACRyiB,EAAQgoC,sBAAsB/pD,aAEhCktC,SACAkc,eACAY,cAAeA,GAAcjoC,EAAQuE,QAAQtmB,aAAe,GAAI+hB,EAAQ5mB,UAE5E,CAEA,SAAS2uD,GACP9pD,EACAV,EACA8/B,GAEA,IAAM6qB,EAAyB,IAAI3lD,IAAIhF,EAAYjF,IAAK4F,GAAe,CAACA,EAAW9O,aAAc8O,KAC3FiqD,EAAyB,IAAI5lD,IAAI86B,EAAY/kC,IAAK6kC,GAAe,CAACA,EAAW/tC,aAAc+tC,KACjG,OAAOl/B,EAAY3F,IAAKtK,IACtB,IAAMkQ,EAAagqD,EAAuB/+D,IAAI6E,EAAWb,KAAO,KAC1DgwC,EAAagrB,EAAuBh/D,IAAI6E,EAAWb,KAAO,KAC1DuhD,EAAYxwC,EACdlQ,EAAWk/C,WAAW/uC,KAAMC,GAASA,EAAKjR,KAAO+Q,EAAWjO,cAAgB,KAC5E,KACEu1D,EAAgB9W,EAAY0Z,GAAqB1Z,EAAW1gD,EAAWk/C,WAAWtM,QAAQ8N,IAAc,KAIxG2Z,IAAiBlrB,GAAYkrB,UAAmBnqD,EAChDw+B,GAAcS,GAAYmrB,qBAAuB,IAAIhwD,IAAIiwD,IACzDC,EAAiB9rB,EAAW3+B,OAAQq+B,GAAkC,UAApBA,EAAU5gC,OAC5DitD,EAAqB/rB,EAAW3+B,OAAQq+B,GAAkC,aAApBA,EAAU5gC,OACtE,MAAO,CACLrO,GAAIa,EAAWb,GACfiL,KAAMpK,EAAWoK,MAAQswD,GAAQ16D,EAAWb,IAC5C8C,YAAaiO,GAAYjO,aAAe,KACxCu1D,gBACA7kD,UAAiBzC,EACjBmqD,SACAM,YAAaC,GAAcJ,EAAgB,YAAarrB,GAAY8H,MAAM9mC,KAAM+0C,GAAqB,SAAZA,EAAK/lD,KAC9F07D,YAAaD,GAAcH,EAAoB,eAAgBtrB,GAAY8H,MAAM9mC,KAAM+0C,GAAqB,aAAZA,EAAK/lD,KACrG27D,qBAAsBA,GAAqB3rB,GAC3C4rB,QAASC,KAA0B9qD,EAAamqD,EAAQ7C,EAAe9oB,EAAYS,GACnFT,aACAwQ,WAAYl/C,EAAWk/C,WAAW50C,IAAI,CAAC8F,EAAMpC,MAC3C7O,GAAIiR,EAAKjR,GACTiL,KAAMgwD,GAAqBhqD,EAAMpC,GACjCgD,YAAmBZ,EAAKY,UACxBiqD,UAAW7qD,EAAKjR,KAAO+Q,GAAYjO,YACnCi5D,QAAQ,OAIhB,CAEA,SAASF,GACProD,EACA0nD,EACA7C,EACA9oB,EACAS,GAEA,GAAIx8B,EAAS,MAAO,GAAG0nD,EAAS,YAAc,aAAa7C,GAAiB,cAC5E,IAAM2D,EAAczsB,EAAWv+B,KAAMi+B,GAAkC,SAApBA,EAAU9vB,OAAwC,UAApB8vB,EAAU9vB,OAC3F,OAAI68C,EAAoBA,EAAYpuD,KAC7BoiC,GAAY7a,QAAU,aAC/B,CAEA,SAASimC,GAAansB,GACpB,IAAM9Z,EAAS8Z,EAAU9Z,QAAU,GAC7B8mC,EAAqC,OAAzBhtB,EAAUd,YAAuBhZ,EAAOxrB,WAAW,YACrE,MAAO,CACL3J,GAAIivC,EAAUjvC,GACdqO,MAAgC,cAAzB4gC,EAAUd,YAAuD,YAAzBc,EAAUd,YAA4Bc,EAAUjvC,GAAG2J,WAAW,aAAeslC,EAAUjvC,GAAG2J,WAAW,cAAgB,WAAa,QACjLwV,MAAO88C,EAAY,QAA+B,WAArBhtB,EAAUj/B,OAAsB,OAA8B,WAArBi/B,EAAUj/B,OAAsB,OAAS,OAC/GpC,KAAMsuD,GAAcjtB,GACpB1H,OAAQ40B,GAAgBltB,EAAWgtB,GACnCG,QAAkC,OAAzBntB,EAAUd,WAAsBc,EAAUn5B,QAAU,KAAO,KAExE,CAEA,SAASomD,GAAcjtB,GACrB,MAA6B,OAAzBA,EAAUd,WAA4B,oBACb,cAAzBc,EAAUd,YAAuD,YAAzBc,EAAUd,aAC7Cc,EAAU9qB,OAIZ8qB,EAAU5lC,OAAS4lC,EAAUn5B,QAAUm5B,EAAUjvC,GAHlD,GAAGivC,EAAU9qB,UAAU8qB,EAAUF,UAAY,WAIrD,CAEA,SAASotB,GAAgBltB,EAAgCgtB,GACvD,GAAIA,EAAW,OAAQhtB,EAAU9Z,QAAU,IAAIrsB,QAAQ,gBAAiB,KAAO,mBAC/E,GAAyB,YAArBmmC,EAAUj/B,OACZ,MAAO,aAAai/B,EAAU9Z,QAAU,iCAE1C,IAAMuyB,EAAkB,GACxB,OAAIzY,EAAU9qB,QAAQujC,EAAM51C,KAAK,WAAWm9B,EAAU9qB,UAClD8qB,EAAUF,UAAU2Y,EAAM51C,KAAK,aAAam9B,EAAUF,YAC7B,cAAzBE,EAAUd,YAA8Bc,EAAUn5B,QAAQ4xC,EAAM51C,KAAK,UAAUm9B,EAAUn5B,UAC3C,OAAzBm5B,EAAUd,YA6BrC,SAAkCjsC,GAChC,GAAqB,iBAAVA,EAAoB,OAAO,EACtC,IACE,IAAM0rC,EAAQpyC,KAAKC,MAAMyG,GACzB,OAAOJ,MAAMC,QAAQ6rC,IAAUA,EAAMzxC,OAAS,GAAKyxC,EAAMxkC,MAAOkiB,GAC9C,iBAATA,GAA8B,OAATA,GAAiB,YAAaA,EAE9D,OACE,OAAO,CACT,CACF,CAvC4D+wC,CAAyBptB,EAAU9f,UACvEu4B,EAAM51C,KAAK,UAAUwqD,GAAYrtB,EAAU9f,kBACjC,IAAvB8f,EAAU9f,UAAwBu4B,EAAM51C,KAAK,aAAawqD,GAAYrtB,EAAU9f,kBAChE,IAArB8f,EAAUJ,QAAsB6Y,EAAM51C,KAAK,WAAWwqD,GAAYrtB,EAAUJ,WACzE6Y,EAAMvrD,OAASurD,EAAMpoD,KAAK,OAAS2vC,EAAU9Z,QAAU,IAChE,CAIA,SAASsmC,GACPlsB,EACAzuB,EACAilC,GAEA,IAAMwW,EAA0B,cAAVz7C,EAAwB,gBAAkB,oBAChE,MAAqB,YAAjBilC,GAAM/1C,QAAwB+1C,EAAK5wB,SAAWonC,EAAsBz7C,EACnD,YAAjBilC,GAAM/1C,OAA6B,gBAClB,WAAjB+1C,GAAM/1C,OAA4B,WACjB,WAAjB+1C,GAAM/1C,OAA4B,WAIZ,IAAtBu/B,EAAWpzC,QACXozC,EAAWnmC,MAAO6lC,GAAkC,SAApBA,EAAU9vB,OAA0B,gBACjEowB,EAAWl+B,KAAM49B,GAAkC,SAApBA,EAAU9vB,OAAwC,UAApB8vB,EAAU9vB,OAC1E,WACA,UACN,CAcA,SAASw8C,GACP3rB,GAKA,GAA2B,8CAAvBA,GAAY7a,OAAwD,MAAO,uBAK/E,GAA2B,iCAAvB6a,GAAY7a,QAAoE,iCAAvB6a,GAAY7a,OAA2C,MAAO,sBAI3H,GAAI6a,GAAYkrB,QAAiC,qBAAvBlrB,GAAY7a,OAA+B,MAAO,SAC5E,GAA2B,uBAAvB6a,GAAY7a,OAAiC,MAAO,oBACxD,GAAI6a,GAAY7a,QAAQxrB,WAAW,WAAY,MAAO,cAItD,IAAM6yD,EAAcxsB,GAAY8H,MAAM9mC,KAAM+0C,GAAqB,YAAZA,EAAK/lD,IAC1D,MAA4B,WAAxBw8D,GAAaxsD,OAA4B,WACjB,WAAxBwsD,GAAaxsD,OAA4B,oBACjB,YAAxBwsD,GAAaxsD,QAA+C,qBAAvBwsD,EAAYrnC,OAAsC,SACpF,eACT,CAmDA,SAASsnC,GAAqBr4C,GAC5B,IAAM7D,EARR,SAA4B6D,GAC1B,IAAM7D,EAAa6D,GAAM7D,WACzB,OAAOA,GAAoC,iBAAfA,IAA4Bze,MAAMC,QAAQwe,GAClEA,EACA,CAAC,CACP,CAGqBm8C,CAAmBt4C,GAChCxiB,EAAM2e,EAAWo8C,iBACvB,GAAmB,iBAAR/6D,EACT,IACE,IAAMC,EAASrG,KAAKC,MAAMmG,GAC1B,GAAIE,MAAMC,QAAQF,GAChB,OAAOA,EACJsJ,IAAK8F,KACJhP,aAAiC,iBAAZgP,GAAMsZ,EAAiBtZ,EAAKsZ,EAAI,GACrDznB,YAAgC,iBAAZmO,GAAMlV,EAAiBkV,EAAKlV,EAAI,MAErD6U,OAAQK,GAASA,EAAKhP,cAAgBgP,EAAKnO,YAElD,OAAS,CAEX,IAAMb,EAAwD,iBAAlCse,EAAWq8C,mBAAkCr8C,EAAWq8C,mBAAqB,GACnG95D,EAAsD,iBAAjCyd,EAAWs8C,kBAAiCt8C,EAAWs8C,kBAAoB,GACtG,OAAO56D,GAAgBa,EAAc,CAAC,CAAEb,eAAca,gBAAiB,EACzE,CAEA,SAASq2D,GAAuB/0C,EAAsChU,GACpE,IAAM0sD,EAAUL,GAAqBr4C,GACrC,IAAK04C,EAAQ3gE,SAAWiU,EAAYjU,OAAQ,OAAO,EACnD,IAAMsU,EAAS,IAAIE,IAAIP,EAAYjF,IAAK4F,GAAe,GAAGA,EAAW9O,gBAAgB8O,EAAWjO,gBAChG,OAAOg6D,EAAQzrD,KAAMN,GAAeN,EAAOiB,IAAI,GAAGX,EAAW9O,gBAAgB8O,EAAWjO,eAC1F,CAEA,SAASs2D,GAA4Bh1C,EAAsCtT,GACzE,IAAOisD,GAAWN,GAAqBr4C,GACvC,OAAK24C,EACEzE,GAAkBxnD,EAAaisD,EAAQ96D,aAAc86D,EAAQj6D,aAD/C,IAEvB,CAYA,SAASg4D,GAAchqD,EAA2B7E,GAChD,IAAMnO,EAAU7B,OAAO6B,QAAQmO,GAAY,CAAC,GAC5C,OAAKnO,EAAQ3B,OACN2B,EAAQqN,IAAI,EAAElJ,EAAca,KAG1B,GAFgBs1D,GAAmBtnD,EAAa7O,OACjCq2D,GAAkBxnD,EAAa7O,EAAca,IAAgBy4D,GAAQz4D,MAE1FxD,KAAK,MALoB,IAM9B,CAEA,SAASy5D,GAA+BjoD,EAA2BV,GACjE,IAAOW,GAAcX,EACrB,OAAOW,EAAaunD,GAAkBxnD,EAAaC,EAAW9O,aAAc8O,EAAWjO,aAAe,IACxG,CAEA,SAASs1D,GAAmBtnD,EAA2B7O,GAErD,OADmB6O,EAAYE,KAAMC,GAASA,EAAKjR,KAAOiC,IACvCgJ,MAAQswD,GAAQt5D,EACrC,CAEA,SAASq2D,GAAkBxnD,EAA2B7O,EAAsBa,GAC1E,IAAMjC,EAAaiQ,EAAYE,KAAMC,GAASA,EAAKjR,KAAOiC,GACpD4M,EAAQhO,GAAYk/C,WAAWid,UAAW/rD,GAASA,EAAKjR,KAAO8C,KAAgB,EAC/Ey+C,EAAY1yC,GAAS,EAAIhO,GAAYk/C,WAAWlxC,GAAS,KAC/D,OAAO0yC,EAAY0Z,GAAqB1Z,EAAW1yC,GAAS0sD,GAAQz4D,EACtE,CAEA,SAASm4D,GAAqB1Z,EAAsB1yC,GAClD,OAAO0yC,EAAUt2C,OAASs2C,EAAU1vC,UAAY,UAAY0pD,GAAQha,EAAUvhD,IAAM,aAAa6O,EAAQ,KAC3G,CAEA,SAAS0sD,GAAQv7D,GACf,OAAOA,EAAG7D,OAAS,GAAK6D,EAAGyC,MAAM,EAAG,GAAKzC,CAC3C,CAsBA,SAAS45D,GAAW9yD,EAA4BuC,EAAek+B,GAC7D,GAAa,SAATzgC,EAAiB,MAAgC,iBAAlBygC,EAAOxc,OAAsBwc,EAAOxc,OAAS,OAChF,GAAa,YAATjkB,EAAoB,MAAO,UAC/B,GAAa,aAATA,EAAqB,MAA8B,iBAAhBygC,EAAO3pC,KAAoB2pC,EAAO3pC,KAAO,WAChF,IAAMi1B,EAAUqlC,KACVj2D,EAA8C,iBAAxBslC,EAAOtlC,aAA4BslC,EAAOtlC,aAAe,GAC/Ea,EAA4C,iBAAvBykC,EAAOzkC,YAA2BykC,EAAOzkC,YAAc,GAC5E0+C,EAAiBv/C,EAAem2D,GAAmBvlC,EAAQuE,QAAQtmB,aAAe,GAAI7O,GAAgB,WACtGo2D,EAAgBp2D,GAAgBa,EAClCw1D,GAAkBzlC,EAAQuE,QAAQtmB,aAAe,GAAI7O,EAAca,GACnE,KACJ,OAAOu1D,EAAgB,GAAG7W,OAAoB6W,IAAkB7W,GAAkBn4C,CACpF,CAEA,SAASwwD,GAAW/yD,EAA4BygC,GAC9C,GAAa,YAATzgC,EAAoB,OAAO,KAC/B,IAAM4yD,EAAUnyB,EAAOmyB,QACjBlpD,EAAsC,iBAApB+2B,EAAO/2B,SAAwB+2B,EAAO/2B,SAASpR,OAAOusB,cAAgB,GAC9F,MAAuB,iBAAZ+tC,GAAwB54D,OAAOC,SAAS24D,GAC1ClpD,EAAW,GAAGysD,GAAavD,MAAYlpD,IAAaysD,GAAavD,GAEnElpD,GAAuB,MAAXkpD,EAAkB,GAAGzqD,OAAOyqD,MAAYlpD,IAAwB,MAAXkpD,EAAkB,KAAOzqD,OAAOyqD,EAC1G,CAkBA,SAAS4C,GAAYp6D,GACnB,GAAqB,iBAAVA,EAAoB,OAAOA,EAEtC,GADqB,iBAAVA,GAAuC,kBAAVA,GAC3B,MAATA,EAAe,OAAO+M,OAAO/M,GACjC,IACE,OAAO1G,KAAKa,UAAU6F,EACxB,OACE,OAAO+M,OAAO/M,EAChB,CACF,CAEA,SAAS+6D,GAAa/6D,GACpB,OAAOpB,OAAOskB,UAAUljB,GAAS+M,OAAO/M,GAASA,EAAMk+C,QAAQ,EACjE,CA5eA,IAAA8c,GAAA/+D,EAAA,KAOA6O,KAEA83C,KACAqY,OC6CA,SAASC,GAAIC,EAAWzoD,EAAc0oD,EAAK,KACzC,MAAO,eAAe1oD,cAAiBA,0EAA6E0oD,oFAAqFD,YAC3M,CAGA,SAAS1Y,GAAIziD,GACX,OAAO+M,OAAO/M,GAAS,IACpB4G,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,SACnB,CAsBA,SAASy0D,GAAW5D,GAClB,IAAM0D,EAAI,IAAI7iE,KAAKm/D,GACb6D,EAAO74D,GAAcsK,OAAOtK,GAAG0D,SAAS,EAAG,KACjD,MAAO,GAAGm1D,EAAIH,EAAEI,eAAeD,EAAIH,EAAEK,iBAAiBF,EAAIH,EAAEM,eAC9D,CAqKA,SAASC,GAAKv0D,EAAew0D,GAC3B,MAAO,0BAA0BA,MAASlZ,GAAIt7C,WAChD,CAEA,SAASy0D,GACPnyD,EACA+f,EACAqyC,GAEA,IAAMptC,EAAI,CACRwW,KAAM,CAAEk2B,EAAGW,GAAE39C,MAAO49C,IAAK,aAAcjO,GAAI,kBAAmB3mD,MAAO,UACrE60D,KAAM,CAAEb,EAAGW,GAAEtwC,EAAGuwC,IAAK,aAAcjO,GAAI,kBAAmB3mD,MAAO,UACjE80D,KAAM,CAAEd,EAAGW,GAAEI,MAAOH,IAAK,YAAajO,GAAI,yBAA0B3mD,MAAO,WAC3EmhB,MAAO,CAAE6yC,EAAGW,GAAEK,MAAOJ,IAAK,aAAcjO,GAAI,kBAAmB3mD,MAAO,UACtEqiB,EAAEvM,OACEtb,EAAM,GAAG8H,KAAS+f,EAAE1rB,KACpBunC,EAAqB,SAAZ7b,EAAEvM,MAjMnB,SAA4BooB,GAC1B,OAAKA,GACEA,EAAOz+B,QAAQ,+BAAgC,CAACw1D,EAAOnpC,KAC5D,IAAMopC,EAAQC,GAAarpC,GAC3B,OAAOopC,EAAQ,aAAaA,iBAAuB,0CAEvD,CA2LsCE,CAAmB/yC,EAAE6b,QAAU7b,EAAE6b,OACjEm3B,EAAY,GAChB,GAAIhzC,EAAE0wC,QAAS,CACb,IAAMt2C,EAAOi4C,EAASrsD,IAAI7N,GAC1B66D,EAAY,2GAE2D/Z,GAAI9gD,mBACnEu5D,GAAIY,GAAE5zC,KAAM,wFACKgzC,GAAIt3C,EAAOk4C,GAAEW,OAASX,GAAEY,MAAO,0CAElD94C,EAAO,QAAQ6+B,GAAIj5B,EAAE0wC,iBAAmB,kBAEhD,CACA,MAAO,4GAG0CzrC,EAAEq/B,YAAYr/B,EAAEstC,QAAQb,GAAIzsC,EAAE0sC,EAAG,EAAG,gDACrD1Y,GAAIj5B,EAAE9d,+DACQ+iB,EAAEstC,QAAQttC,EAAEtnB,qCAEpDk+B,EAAS,4BAA4Bod,GAAIpd,WAAkB,aAC3Dm3B,eAER,CAEA,SAASG,GAAct0C,EAAsBu0C,GAC3C,IAAMh5C,EAAOg5C,EAAKC,SAASrtD,IAAI6Y,EAAEvqB,IAC3Bg/D,EAAWz0C,EAAE2wC,OACf0C,GAAK,SAAU,UACfrzC,EAAE/W,QACAoqD,GAAK,UAAW,WAChBA,GAAK,cAAe,OACtBr2B,EAAS,GACb,GAAIzhB,EAAM,CACR,IAAIm5C,EAAgB,GAYlBA,EAXE10C,EAAE2wC,OAWY,oCAVA3wC,EAAEw1B,WACf50C,IACEpP,GAAM,6CACyBA,EAAE+/D,qDAAqDnX,GAAIp6B,EAAEvqB,kBAAkB2kD,GAAI5oD,EAAEiE,4EAElG2kD,GAAI5oD,EAAEkP,8CACJlP,EAAE+/D,UAAY,aAAe//D,EAAEggE,OAAS,uBAAyB,gCAGvFz8D,KAAK,4LAI0DqlD,GAAIp6B,EAAEvqB,yCAGtEuqB,EAAEw1B,WAAW5jD,OAAS,EAClB,8DAA8DwoD,GAAIp6B,EAAEvqB,qCACpE,GAER,IAAMk/D,EAAQ30C,EAAEglB,WAAW3+B,OAAQ8a,GAAkB,UAAZA,EAAErd,OAAmBlD,IAAKugB,GAAMoyC,GAAQvzC,EAAEvqB,GAAI0rB,EAAGozC,EAAKf,WAAWz+D,KAAK,IACzG6/D,EAAW50C,EAAEglB,WAAW3+B,OAAQ8a,GAAkB,aAAZA,EAAErd,OAAsBlD,IAAKugB,GAAMoyC,GAAQvzC,EAAEvqB,GAAI0rB,EAAGozC,EAAKf,WAAWz+D,KAAK,IACrHioC,EAAS,gFACwC23B,GAAS,4BAA8C,kBAAlB30C,EAAEixC,YAAkC,gBAAoC,aAAlBjxC,EAAEixC,YAA6B,iDAAqE,aAAlBjxC,EAAEixC,YAA6B,oDAAsD,8EAC/P2D,GAAY,4BAA8C,kBAAlB50C,EAAEmxC,YAAkC,gBAAoC,aAAlBnxC,EAAEmxC,YAA6B,qDAAyE,aAAlBnxC,EAAEmxC,YAA6B,uDAAyD,yGACpP/W,GAAIp6B,EAAEoxC,sCAC9EsD,SACN,CACA,MAAO,sEAEmCn5C,yCAA4C6+B,GAAIp6B,EAAEvqB,mCACnEo9D,GAAIt3C,EAAOk4C,GAAEY,MAAQZ,GAAEoB,MAAO,uGAEAza,GAAIp6B,EAAEtf,uEACP05C,GAAIp6B,EAAEqxC,oGAEZjX,GAAIp6B,EAAEixC,0BAA0B7W,GAAIp6B,EAAEixC,wEACtC7W,GAAIp6B,EAAEmxC,0BAA0B/W,GAAIp6B,EAAEmxC,wEACtC/W,GAAIp6B,EAAEoxC,mCAAmChX,GAAIp6B,EAAEoxC,6EAGvFqD,6BAEFz3B,eAER,CAEA,SAAS83B,GAAgBlgD,EAAyB2/C,GAChD,IAAMlgD,EAAQkgD,EAAKljE,OAAOwD,OAAO2J,cAC3Bu2D,EAAUngD,EAAMrO,YAAYF,OAAQ2Z,IACxC,IAAMg1C,EAA6B,QAApBT,EAAKU,aAA6C,OAApBV,EAAKU,WAAwC,aAAlBj1C,EAAEixC,aAAgD,cAAlBjxC,EAAEixC,YAAgD,aAAlBjxC,EAAEixC,aACpIiE,EAAiC,QAAtBX,EAAKY,eAAiD,WAAtBZ,EAAKY,aAA4Bn1C,EAAE2wC,OAA+B,aAAtB4D,EAAKY,aAA8Bn1C,EAAE/W,UAAY+W,EAAE2wC,QAAU3wC,EAAE/W,UAAY+W,EAAE2wC,QAC1K,OAAOqE,GAAUE,KAAc7gD,GAAS2L,EAAEtf,KAAKlC,cAAcC,SAAS4V,IAAU2L,EAAEvqB,GAAG+I,cAAcC,SAAS4V,MAExGpL,EAAU8rD,EAAQ1uD,OAAQ2Z,GAAMA,EAAE/W,SAAW+W,EAAE2wC,QAC/CyE,EAAWL,EAAQ1uD,OAAQ2Z,IAAOA,EAAE/W,UAAY+W,EAAE2wC,QAClD0E,EAAU,mIAC6G,OAApBd,EAAKU,WAAsB,WAAa,+CAAmE,QAApBV,EAAKU,WAAuB,WAAa,2IAClH,aAAtBV,EAAKY,aAA8B,WAAa,+CAAqE,aAAtBZ,EAAKY,aAA8B,WAAa,iDAAuE,WAAtBZ,EAAKY,aAA4B,WAAa,qIAC1O/a,GAAIma,EAAKljE,sBAIxGikE,EAAgB1gD,EAAMrO,YAAYF,OAAQ2Z,IAAOA,EAAE/W,UAAY+W,EAAE2wC,QAAQ/+D,OAC3E2jE,EAAU,GACd,GAAI3gD,EAAMrO,YAAY3U,OAAS,GAAuB,IAAlB0jE,EAClCC,EAAU,mGAAmG1C,GAAIY,GAAE39C,MAAO,GAAI,kBAAkBlB,EAAMrO,YAAY3U,oBAAiD,IAA7BgjB,EAAMrO,YAAY3U,OAAe,GAAK,qCAAG,GACtNgjB,EAAMrO,YAAY3U,OAAS,GAAK0jE,IAAkB1gD,EAAMrO,YAAY3U,OAC7E2jE,EAAU,oGAAoG1C,GAAIY,GAAEK,MAAO,kFAAG,GACxF,IAA7Bl/C,EAAMrO,YAAY3U,OAC3B,OAAOyjE,EAAU,gDACKxC,GAAIY,GAAEljD,OAAQ,4MAatC,OAAO8kD,EAAUE,GARGtsD,EAAQrX,OACxB,kEAAkEqX,EAAQrX,sBAC1EqX,EAAQrI,IAAKof,GAAMs0C,GAAct0C,EAAGu0C,IAAOx/D,KAAK,IAChD,KACiBqgE,EAASxjE,OAC1B,sEAAsEwjE,EAASxjE,sBAC/EwjE,EAASx0D,IAAKof,GAAMs0C,GAAct0C,EAAGu0C,IAAOx/D,KAAK,IACjD,GAEN,CAEA,SAASygE,GAASC,GAOhB,IAAMxU,EAN6F,CACjGlmC,SAAU,CAAE26C,GAAI,cAAejQ,GAAI,gBAAiBkQ,GAAI,cAAe72D,MAAO,YAC9EwhB,KAAM,CAAEo1C,GAAI,cAAejQ,GAAI,mBAAoBkQ,GAAI,iBAAkB72D,MAAO,QAChFqwD,QAAS,CAAEuG,GAAI,aAAcjQ,GAAI,kBAAmBkQ,GAAI,gBAAiB72D,MAAO,WAChF82D,SAAU,CAAEF,GAAI,YAAajQ,GAAI,yBAA0BkQ,GAAI,eAAgB72D,MAAO,aAExE22D,EAAGl5D,MACbs5D,EAAwB,MAAlBJ,EAAGhG,YACf,MAAO,mCACuBoG,+DAEH7C,GAAWyC,EAAGrG,0DACEnO,EAAEyU,iBAAiBzU,EAAEwE,uBAAuBxE,EAAE0U,OAAO1U,EAAEniD,gDACnEs7C,GAAIqb,EAAG32D,0BAC9B22D,EAAG99D,MAAQ,wBAAwByiD,GAAIqb,EAAG99D,gBAAkB,kEAG9Dk+D,EAAM,uBAAuBhD,GAAIY,GAAEK,MAAO,6EAA+E,gBAEjI,CAEA,SAASgC,GAAWlhD,GAClB,IAAMmhD,EAAO,iOAMb,OAA4B,IAAxBnhD,EAAM6+B,OAAO7hD,OAEbmkE,EACA,kDACsBlD,GAAIY,GAAEuC,SAAU,4LAWnCD,EALM,IAAInhD,EAAM6+B,QACpB17C,KAAK,CAACC,EAAGC,IAAMA,EAAEm3D,GAAKp3D,EAAEo3D,IACxBl3D,MAAM,EAAG,IACT0I,IAAI40D,IACJzgE,KAAK,GAEV,CAEA,SAASkhE,GAAgB75D,GACvB,OAAKA,EAAKxK,OACH,yHAGDwK,EACCwE,IACE5I,GAAM,gEAEYoiD,GAAIpiD,EAAEi/C,iEACwB,MAAnBj/C,EAAE81D,kBAA0B1T,GAAIpiD,EAAE81D,eAAiB,+CAGlF/4D,KAAK,kBAZa,EAc3B,CAEA,SAASmhE,GAAiBC,GACxB,GAAgB,gBAAZA,EAAG7xC,KAAwB,MAAO,GACtC,GAAgB,YAAZ6xC,EAAG7xC,KAAoB,CACzB,IAAMzuB,EAAOsgE,EAAG5H,YACZ,6DAA6DnU,GAAI+b,EAAGrI,eAAiB,2BACrF,sDACEjpD,EAAOsxD,EAAG1H,UAAY,0BAA0BuE,GAAWmD,EAAG1H,aAAe,6CACnF,MAAO,2IAGsEoE,GAAIY,GAAE2C,YAAa,6BAA6BvgE,+CACnGukD,GAAIv1C,qCAExBoxD,GAAgBE,EAAGvI,8HAEkDiF,GAAIY,GAAE4C,KAAM,8NAIzF,CACA,IAAMC,EACiB,cAArBH,EAAG/H,cACC,2BAA2ByE,GAAIY,GAAE39C,MAAO,GAAI,4HAC5C,gCAAgC+8C,GAAIY,GAAE8C,MAAO,wIAC7CC,EAAYL,EAAGjI,YACjB,SAAS9T,GAAI+b,EAAGjI,eAChB,iCACJ,MAAO,mIAGoE2E,GAAIY,GAAE57D,MAAO,6BAA6B2+D,WAAmBL,EAAGjI,YAAcmF,GAAK,WAAY,WAAa,uCAC7J8C,EAAGjI,YAAc,qCAAuC,yFAE5E+H,GAAgBE,EAAGvI,uBACnBuI,EAAGjI,YAAcoI,EAAU,gBAEnC,CAGA,SAASG,GAAU7hD,GACjB,IAAM8hD,EAAqC,gBAA5B9hD,EAAM+6C,aAAarrC,KAClC,MAAO,CACL,CAAE7uB,GAAI,MAAOqJ,MAAO,YAAawyC,MAAO18B,EAAMrO,YAAY3U,QAC1D,CAAE6D,GAAI,KAAMqJ,MAAO,SAAUwyC,MAAO18B,EAAM6+B,OAAO7hD,WAC7C8kE,EAAS,GAAK,CAAC,CAAEjhE,GAAI,KAAeqJ,MAAO,eAAgBwyC,MAAmC,UAA5B18B,EAAM+6C,aAAarrC,MAAoB1P,EAAM+6C,aAAazB,YAAc,EAAI,IAEtJ,CAEA,SAASyI,GAASC,EAA0Dnc,GAC1E,OAAOmc,EACJh2D,IAAKqgD,GAAM,gCAAgCA,EAAExrD,KAAOglD,kCAA0CwG,EAAExrD,OAAOwrD,EAAEniD,wBAAwBmiD,EAAE3P,yBACnIv8C,KAAK,GACV,CAsCA,SAAS8hE,GAAcjiD,GACrB,OAAOA,EAAM27C,cACT,2BAA2BsC,GAAIY,GAAEqD,KAAM,wBAAwB1c,GAAIxlC,EAAM27C,4FACzE,EACN,CAYA,SAASwG,GAAgB1sD,GACvB,MAAO,eAAeA,cAAiBA,yhBAKzC,CA5jBA,IAYa2sD,GAePC,GAGAxD,GAuCAQ,GA0BAiD,GA/FNC,GAAAvjE,EAAA,KAYaojE,GAAuB,yBAe9BC,GAAgB,wBAGhBxD,GAAI,CACR39C,MAAO,iBACPqN,EAAG,uBACH0wC,MAAO,WACPC,MACE,4FACFe,MAAO,eACPR,MAAO,eACPD,OAAQ,kBACR0C,KAAM,kCACNM,OACE,0IACFb,MAAO,mDACP1+D,MACE,4EACF0Y,OACE,sGACF6lD,YACE,sEACFC,KACE,0FACFL,SAAU,4BACVn2C,KAAM,+BAiBFo0C,GAAuC,CAC3CoD,aAAc,aACdC,oBAAqB,aACrBC,iBAAkB,aAClBC,iBAAkB,oBAClBC,mBAAoB,oBACpBC,mBAAoB,oBACpBC,SAAU,wBACVC,SAAU,yBAkBNV,GAAM,g1ZC/FZW,GAAA,GAWO,SAASC,KACd,UAAWvnE,SAAa,IAAa,OAAO,KAE5C,GADAwnE,GAAmBA,IAAoB3K,KACnC4K,GAAiB,OAAOA,GAE5B,IAAMC,EAAQ,KACPF,KACLC,GD+iBG,SAA8BngE,GACnC,IAAMoI,EAAW1P,SAASmE,eAAesiE,IACrC/2D,GAAUA,EAAS7K,SAEvB,IAAM5E,EAAOD,SAASiF,cAAc,OACpChF,EAAKiF,GAAKuhE,GACV,IAAMrc,EAASnqD,EAAKoqD,aAAa,CAAExmD,KAAM,SACnCmB,EAAQhF,SAASiF,cAAc,SACrCD,EAAMG,YAAcwhE,GACpB,IAAM5hE,EAAO/E,SAASiF,cAAc,OACpCF,EAAKkY,UAAY,OACjBmtC,EAAOud,OAAO3iE,EAAOD,GACrB/E,SAAS2B,KAAK4D,YAAYtF,GAE1B,IAAI2nE,GAAY,EAChB,IACEA,EAAsD,MAA1CpnE,eAAeC,QAAQimE,GACrC,OAEA,CACA,IAAM1C,EAAkB,CACtBxZ,IAAK,MAAOod,YAAW3D,SAAU,IAAIpuD,IAAOotD,SAAU,IAAIptD,IAC1D6uD,WAAY,MAAOE,aAAc,MAAO9jE,OAAQ,GAAI+mE,YAAY,GAG9DC,EAAgB,EAEhBC,GAAU,EACVC,EAAoD,KACpDC,EAAgB,GAChBC,GAAkB,EAiBhBjhD,EAAS,CAACkhD,GAAY,KAC1B,IAAKA,EAGH,OAFIH,GAAavkE,aAAaukE,QAC9BA,EAAcviE,WAAW,IAAMwhB,GAAO,GAAO,MAK/C,GAFI+gD,GAAavkE,aAAaukE,GAC9BA,EAAc,KACVE,EAEF,YADAF,EAAcviE,WAAW,IAAMwhB,GAAO,GAAO,MAG/C,IAAM5C,EA3Ba,MACnB,IAAMvd,EAAMQ,EAAM+3D,WAClB,OAAOyI,EACH,IAAKhhE,EAAKo8C,OAAQp8C,EAAIo8C,OAAOptC,OAAQ2Z,GAAMA,EAAEovC,GAAKiJ,IAClDhhE,GAuBUshE,GACRC,EArBWhkD,IAAoC3jB,KAAKa,UAAU,CACpEyU,YAAaqO,EAAMrO,YACnBgqD,cAAe37C,EAAM27C,cACrBZ,aAAc/6C,EAAM+6C,aACpBlc,OAAqB,OAAb8gB,EAAKxZ,IAAenmC,EAAM6+B,YAAS,EAC3C8gB,KAAM,CAACA,EAAKxZ,IAAKwZ,EAAK4D,UAAW,IAAI5D,EAAKC,UAAW,IAAID,EAAKf,UAAWe,EAAKU,WAAYV,EAAKY,aAAcZ,EAAKljE,UAgB5F29B,CAAUpa,GAChC,GAAI0jD,GAAWM,IAAkBJ,EAAe,CAC9C,IAAMK,EAAcvjE,EAAKoU,cAA2B,0BAEpD,YADImvD,IAAaA,EAAYnjE,YAAcgP,OAAOkQ,EAAM6+B,OAAO7hD,SAEjE,CAEA,GADA4mE,EAAgBI,GACXN,GAAW/D,EAAK4D,YAAc7iE,EAAKoU,cAAc,UAIpD,OAHApU,EAAKkvB,UAAY+vC,EAAK4D,UAzF5B,SAAkBvjD,GAChB,IAAMxa,EAAIwa,EAAMrO,YAAY3U,OAC5B,MAAO,iJAEiDmlE,GAAgB,+CACxC38D,eAAqB,IAANA,EAAU,GAAK,qBACxDy4D,GAAIY,GAAEW,OAAQ,oBAEtB,CAiFwC0E,CAASlkD,GAnIjD,SAAmBA,EAAyB2/C,GAC1C,IAAMmC,EAAqC,gBAA5B9hD,EAAM+6C,aAAarrC,KAC5BsyC,EAAOH,GAAU7hD,GACjB6lC,EAAmBic,GAAuB,OAAbnC,EAAKxZ,IAAe,MAAQwZ,EAAKxZ,IAC9D7oD,EACU,QAAduoD,EACIqa,GAAgBlgD,EAAO2/C,GACT,OAAd9Z,EACEqb,GAAWlhD,GACXshD,GAAiBthD,EAAM+6C,cAC/B,MAAO,wCAC4B4E,EAAK6D,mJAGXrB,GAAgB,2EAEnC1D,GAAK,UAAW,qOAGyER,GAAIY,GAAEI,MAAO,oMAKhFgD,GAAcjiD,kEAEtC+hD,GAASC,EAAMnc,6CAECvoD,yFAE4B2gE,GAAIY,GAAE2D,OAAQ,6IAIpE,CAiG0D2B,CAAUnkD,EAAO2/C,GACrE+D,GAAU,OACV/D,EAAK6D,YAAa,GAGpB,IAAMlmE,EAAOoD,EAAKoU,cAA2B,SACvCsvD,EAAY9mE,GAAM8mE,WAAa,EAC/BC,EAAUte,EAAOue,cACjBC,EAAgBF,GAAS3rD,QAAQ4C,OACjCjN,EAA8B,WAAlBk2D,GAA8BF,EAC5C,CAACA,EAAQG,eAAgBH,EAAQI,cACjC,KACE5e,EAAwC,gBAA5B7lC,EAAM+6C,aAAarrC,MAAuC,OAAbiwC,EAAKxZ,IAAe,MAAQwZ,EAAKxZ,IAChG,GAAI7oD,IACFA,EAAKsyB,UAA0B,QAAdi2B,EAAsBqa,GAAgBlgD,EAAO2/C,GAAsB,OAAd9Z,EAAqBqb,GAAWlhD,GAASshD,GAAiBthD,EAAM+6C,cACtIz9D,EAAK8mE,UAAYA,EACbG,GAAe,CACjB,IAAMhxD,EAAcjW,EAAKwX,cAAgC,iBAAiByvD,OAC1EhxD,GAAamxD,QACTnxD,GAAiC,MAAlBlF,IAAY,IAA8B,MAAhBA,EAAU,IAAYkF,EAAYoxD,kBAAkBt2D,EAAU,GAAIA,EAAU,GAC3H,CAEF,IAAM0tD,EAASr7D,EAAKoU,cAA2B,0BAC3CinD,IAAQA,EAAOnsC,UAAYqyC,GAAcjiD,IAC7C,IAAM4kD,EAAalkE,EAAKoU,cAA2B,wBAC/C8vD,IACFA,EAAWh1C,UAAYmyC,GAASF,GAAU7hD,GAAQ6lC,KAItDnlD,EAAKxC,iBAAiB,QAAUwd,IAC9B,IAAMC,EAAUD,EAAMC,QAA+B7H,UAAU,iBAC/D,IAAK6H,EAAQ,OACb,IAAML,EAASK,EAAOjD,QAAQ4C,OACxB9O,EAAQmP,EAAOjD,QAAQuV,IAC7B,GAAe,aAAX3S,EAAuB,CACzBqkD,EAAK4D,WAAY,EACjB,IACEpnE,eAAec,QAAQolE,GAAe,IACxC,OAAuB,CACzB,SAAsB,YAAX/mD,EAAsB,CAC/BqkD,EAAK4D,WAAY,EACjB,IACEpnE,eAAegR,WAAWk1D,GAC5B,OAAuB,CACzB,SAAsB,QAAX/mD,EACTqkD,EAAKxZ,IAAOxqC,EAAOjD,QAAQytC,KAAiB,cACxB,eAAX7qC,GAA2B9O,EAChCmzD,EAAKC,SAASrtD,IAAI/F,GAAQmzD,EAAKC,SAASpyD,OAAOhB,GAC9CmzD,EAAKC,SAAS7+D,IAAIyL,QAAK,GACR,gBAAX8O,EAA0B,CACnC,IAAM5W,EAAMiX,EAAOjD,QAAQhU,KAAO,GAC9Bi7D,EAAKf,SAASrsD,IAAI7N,GAAMi7D,EAAKf,SAASpxD,OAAO9I,GAC5Ci7D,EAAKf,SAAS79D,IAAI2D,EACzB,SAAsB,eAAX4W,GAA2B9O,EAAO,CAG3C,IAAM9K,EAAauB,EAAM+3D,WAAWrpD,YAAYE,KAAMuZ,GAAMA,EAAEvqB,KAAO2L,GAC/DhG,EAAU9E,GAAYk/C,WAAW/uC,KAAMjV,GAAMA,EAAE+/D,YAAcj7D,GAAYk/C,WAAW,GACtFl/C,GAAc8E,GAASvD,EAAMi4D,eAAex5D,EAAWb,GAAI2F,EAAQ3F,IACvE8+D,EAAKC,SAAS7+D,IAAIyL,EACpB,SAAsB,mBAAX8O,GAA+B9O,EAAO,CAC/C,IAAMC,EAAQkP,EAAOjD,QAAQmsD,IACzBp4D,GAAOxJ,EAAMi4D,eAAe1uD,EAAOC,EACzC,SAAsB,gBAAX6O,EACTrY,EAAMm4D,WAAW5uD,QAAS,OAAS,IACf,YAAX8O,EAGT,OAFArY,EAAMq4D,cACN1/D,EAAK4E,SAEe,iBAAX8a,IACTmoD,EAAgBpoE,KAAKC,MAAI,CAE3BsnB,GAAO,KAGTliB,EAAKxC,iBAAiB,SAAWwd,IAC/B,IAAMC,EAASD,EAAMC,OACrB,GAA8B,gBAA1BA,EAAOjD,QAAQ4C,OAA0BqkD,EAAKU,WAAa1kD,EAAO5Y,WAAA,GACnC,kBAA1B4Y,EAAOjD,QAAQ4C,OAA4BqkD,EAAKY,aAAe5kD,EAAO5Y,UAAA,IAC5C,WAA1B4Y,EAAOjD,QAAQ4C,OACnB,OADwCqkD,EAAKljE,OAASkf,EAAO5Y,KAC7D,CACL6f,GAAO,KAMTliB,EAAKxC,iBAAiB,QAAUwd,IAC9B,IAAMC,EAASD,EAAMC,OACU,WAA3BA,EAAOjD,SAAS4C,SACpBqkD,EAAKljE,OAASkf,EAAO5Y,OACjB8gE,GACJjhD,GAAO,MAGTliB,EAAKxC,iBAAiB,mBAAqBwd,IAEV,WADhBA,EAAMC,OACVjD,SAAS4C,SAAqBuoD,GAAkB,KAG7DnjE,EAAKxC,iBAAiB,iBAAmBwd,IACvC,IAAMC,EAASD,EAAMC,OACU,WAA3BA,EAAOjD,SAAS4C,SACpBuoD,GAAkB,EAClBlE,EAAKljE,OAASkf,EAAO5Y,MACrB6f,GAAO,MAGT,IAAMkiD,EAAc7hE,EAAMg4D,UAAU,KAClCr4C,MAGF,OAAAA,GAAO,GAEA,CACL,OAAA2iC,GACEuf,IACInB,GAAavkE,aAAaukE,GAC9B/nE,EAAK4E,QACP,EAEJ,CC7uBsBukE,CAAqB5B,MAEzC,OAAIxnE,SAAS2B,MACX+lE,IACOD,KAITznE,SAASuC,iBAAiB,mBAAoBmlE,EAAO,CAAEhlE,MAAM,IACtD,CACL,OAAAknD,GACE5pD,SAAS2C,oBAAoB,mBAAoB+kE,GACjDD,IAAiB7d,UACjB6d,GAAkB,IACpB,GAEJ,CAEO,SAAS4B,KACd,OAAA7B,GAAmBA,IAAoB3K,IAEzC,CAvCA/S,EAAAwd,GAAA,CAAA+B,oBAAA,IAAAA,GAAA9B,iBAAA,IAAAA,KAAA,IAGIC,GACAC,GAJJ6B,GAAAjmE,EAAA,KAAA++D,KACAwE,KAEIY,GAA4C,KAC5CC,GAA0C,OCJ9C8B,GAAA,GAoNA,SAASC,GAAiB93D,EAAa5N,GACrC,UAAWglB,gBAAoB,IAAa,CAC1C,IAAI8Q,EAA8C,KAClD,OAAOluB,QAAQ+9D,KAAK,CAClBppD,MAAM3O,GACN,IAAIhG,QAAkB,CAACilB,EAAG+4C,KACxB9vC,EAAQn0B,WAAW,IAAMikE,EAfjC,WACE,UAAWC,aAAiB,IAC1B,OAAO,IAAIA,aAAa,6BAA8B,cAExD,IAAMj6C,EAAQ,IAAI0M,MAAM,8BACxB,OAAA1M,EAAMvf,KAAO,aACNuf,CACT,CAQwCk6C,IAA4B9lE,OAE7Dg9B,QAAQ,KACK,OAAVlH,GAAgBn2B,aAAam2B,IAErC,CACA,IAAM/Q,EAAa,IAAIC,gBACjB8Q,EAAQn0B,WAAW,IAAMojB,EAAWD,QAAS9kB,GACnD,OAAOuc,MAAM3O,EAAK,CAAE2X,OAAQR,EAAWQ,SAAUyX,QAAQ,KACvDr9B,aAAam2B,IAEjB,CAEAtR,eAAeuhD,GACbn4D,EACAo4D,EAAU,EACVC,EAAU,IACVr5D,EAA6B,CAAC,GAE9B,IAAM5M,EAAYkmE,GAAgBt5D,EAAQ5M,UAAWmmE,IAC/CC,EAAwBF,GAAgBt5D,EAAQw5D,sBAAuBpmE,GAC7E,QAASqmE,EAAU,EAAGA,GAAWL,EAASK,IAAW,CACnD,IAAMC,EAAY1qE,KAAKC,MACnB0qE,EAAkD,KAClDC,GAAa,EAEjB,GADA55D,EAAQ65D,iBAAiBJ,EAAU,GAC/Bz5D,EAAQ85D,OAAQ,CAClB,IAAMC,EAAST,GAAgBt5D,EAAQ+5D,OAAQC,IAC/CL,EAAY5kE,WAAW,KACrB6kE,GAAa,EACb55D,EAAQ85D,SAAS,CAAEL,QAASA,EAAU,EAAGQ,UAAWjrE,KAAKC,MAAQyqE,KAChEK,EACL,CACA,IAEE,IAAM/nB,QAAY8mB,GAAiB93D,EADE,IAAZy4D,EAAgBD,EAAwBpmE,GAQjE,GANkB,OAAdumE,GAAoB5mE,aAAa4mE,GACrC35D,EAAQk6D,eAAe,CACrBT,QAASA,EAAU,EACnBQ,UAAWjrE,KAAKC,MAAQyqE,EACxBl1D,OAAQwtC,EAAIxtC,SAEVwtC,EAAI3hC,IAAMopD,IAAYL,EAAS,OAAOpnB,CAC5C,OAASvmB,GACW,OAAdkuC,GAAoB5mE,aAAa4mE,GACrC,IAAM36C,EAAQyM,aAAeC,MAAQD,EAAI5P,QAAUpY,OAAOgoB,GACpD9C,SAAkBswC,aAAiB,KAAextC,aAAewtC,aACtD,eAAbxtC,EAAIhsB,KACJ,iBAAiB3B,KAAKkhB,GAO1B,GANAhf,EAAQk6D,eAAe,CACrBT,QAASA,EAAU,EACnBQ,UAAWjrE,KAAKC,MAAQyqE,EACxB16C,QACA2J,aAEE8wC,IAAYL,EAAS,MAAM3tC,CACjC,CACkB,OAAdkuC,IAAuBC,GAAY7mE,aAAa4mE,SAC9C,IAAI3+D,QAAS63B,GAAM99B,WAAW89B,EAAGwmC,GAAWI,EAAU,IAC9D,CACA,MAAM,IAAI/tC,MAAM,gCAClB,CAoHA,SAASyuC,KACP,IAAMzjE,EAAQhB,WAAWgG,aAAazM,QACtC,MAAwB,iBAAVyH,GAAsBpB,OAAOC,SAASmB,GAASA,EAAQ1H,KAAKC,KAC5E,CAEA,SAASmrE,GAAoB1jE,GAC3B,OAAKpB,OAAOC,SAASmB,GACdvF,KAAKQ,MAA2D,GAArDR,KAAKmmB,IAAI+iD,GAAsBlpE,KAAKC,IAAI,EAAGsF,KAAgB,GADzC,CAEtC,CAEA,SAAS4jE,KACP,MAAO,CAAEZ,UAAWS,KAAgBI,OAAQ,CAAC,EAAGC,qBAAqB,EACvE,CAEA,SAASC,GAAa3vC,EAA0B4vC,EAAqBhB,GACnE,IAAMiB,EAAUP,GAAoBD,KAAiBT,GACrD5uC,EAAQyvC,OAAOG,GAASN,IAAqBtvC,EAAQyvC,OAAOG,IAAU,GAAKC,EAC7E,CAgDA,SAASrB,GAAgB5iE,EAAgB0xB,GACvC,MAAqB,iBAAV1xB,GAAsBpB,OAAOC,SAASmB,IAAUA,EAAQ,EAAUA,EACtE0xB,CACT,CAEA,SAASwyC,GAAqBhvC,GAC5B,IAAMivC,EAAgBjvC,EAAOivC,eAAiBC,GAExCC,EAAkBnvC,EAAOmvC,mBACF,IAAvBnvC,EAAOovC,YAAwB,OAA+B,IAAvBpvC,EAAOovC,YAAuB,OAAS,UAE9EC,EAAuB3B,GAC3B1tC,EAAOqvC,sBAAwBrvC,EAAOsvC,mBACtCC,IAGIC,EAAgBxvC,EAAOwvC,gBACS,kBAAzBxvC,EAAOyvC,cACbzvC,EAAOyvC,cAAgB,OAAS,YACjCC,IAEAC,EAAwBjC,GAC5B1tC,EAAO2vC,sBACPC,IAGIC,EAAiB7vC,EAAO6vC,gBAAkBC,GAEhD,MAAO,CACLb,gBACAE,kBACAE,uBACAU,qBAAsB/vC,EAAO+vC,qBAC7BP,gBACAG,wBACAE,iBAEJ,CAQA,SAASG,GAAsBhwC,EAAoBiwC,GACjD,OAAqC,IAAjCjwC,EAAO2R,KAAKu+B,oBAEmB,IAAjClwC,EAAO2R,KAAKu+B,kBACQ,eAApBD,GACoB,eAApBA,GACwB,QAAxBjwC,EAAOgR,aAEX,CAQA,SAASm/B,GAAMzgE,EAAcuC,EAAek+B,GAC1C,GAAKigC,GACL,IACEhhE,QAAAL,UAAAwV,KAAA,KAAA8rD,KAAAC,KAAqB/rD,KAAK,EAAGkoC,uBAC3BA,EAAiB/8C,EAAMuC,EAAOk+B,KAC7B9L,MAAM,OACX,OAEA,CACF,CAMA,SAASksC,GAAUtgD,EAAiB1pB,GACLwpB,GAAS,QAASE,EAAS1pB,EAC1D,CAEA,SAASiqE,GAAU/mE,EAAwBklD,GACzC,IAAM/1C,EAAyB,WAAhB+1C,EAAK/1C,OAChB,WACgB,WAAhB+1C,EAAK/1C,OACH,eACA,UACuB23D,GAAU,GAAG9mE,EAAWb,OAAO+lD,EAAK18C,YAAY2G,IAAU,CACrFmlB,OAAQ4wB,EAAK5wB,UACT4wB,EAAKxe,QAAiC,iBAAhBwe,EAAKxe,OAAsB,CAAEA,OAAQwe,EAAKxe,QAAW,CAAC,GAEpF,CASA,SAASsgC,KACP,OAAO1oD,GAAM2oD,uBAA0B3oD,GAAMoX,kBAAoBpX,GAAMqX,cACzE,CAEA,SAASuxC,GAAkB3wC,GACzB,OAAoD,IAA7CA,EAAO4wC,gBAAgBC,mBAZhC,WACE,IAAMhgC,EAAM/mC,WAAWmxC,UACjBjH,EAAMlqC,WACNgB,EAAQ+lC,GAAKigC,YAAcjgC,GAAKkgC,cAAgB/8B,EAAI88B,YAAc,GACxE,MAAiB,MAAVhmE,GAAyC,QAAxBA,EAAM6G,aAChC,CAO8Dq/D,EAC9D,CAEA,SAAS5hD,GAAe+P,EAA0BC,EAAyBsxC,GACzE,QAASvxC,GAAmBC,KAAoBsxC,CAClD,CAEA,SAASO,GAASxoE,EAAejC,GAC/B,IAAKA,EAAM,OACX,IAAM8pD,EAAQ9pD,EAAKuL,MAAM,KAAKgC,IAAKskD,GAASA,EAAKrwD,QAAQwR,OAAOgM,SAC5DjX,EAAU9F,EACd,QAAW4vD,KAAQ/H,EAAO,CACxB,GAAe,MAAX/hD,GAAsC,iBAAZA,EAAsB,OACpDA,EAAUA,EAAQ8pD,EACpB,CACA,OAAO9pD,CACT,CAEA,SAAS2iE,GAAe1qE,GACtB,GAAKA,EACL,OAAOyqE,GAASnnE,WAAuCtD,EACzD,CAmHA,SAAS2qE,GAAyBnxC,GAChC,IAAMoxC,EAAUpxC,EAAOqxC,YACvB,GAA0B,iBAAtBD,GAASE,SACX,OA/GJ,SAAiCC,GAC/B,IAIIC,EAJE/oE,EAAOqB,WACP2nE,EAAKhpE,EAAKipE,OAAUjpE,EAAK7C,QAA4C8rE,MAC3E,IAAKD,GAAwC,mBAA3BA,EAAGE,oBAAoC,OAAO,KAGhE,IACEH,EAAWC,EAAGE,qBAChB,OACE,OAAO,IACT,CACA,IAAKjnE,MAAMC,QAAQ6mE,GAAW,OAAO,KAErC,IAAMhrC,EAAW+qC,GAAevpE,QAAU,OACpC4pE,EAAUJ,EAAS53D,KAAMC,IAC7B,IAAKA,GAAwB,iBAATA,EAAmB,OAAO,EAC9C,IAAMhI,EAAYgI,EAClB,MAAO,CACLhI,EAAUgC,KACVhC,EAAUjJ,GACViJ,EAAUggE,UACVhgE,EAAUigE,WACVjgE,EAAUkgE,cACVlgE,EAAUmgE,mBACV/3D,KAAMnP,GA7BZ,SAA6BA,EAAgB07B,GAC3C,OAAa,MAAT17B,GACG+M,OAAO/M,GAAO9C,OAAO2J,gBAAkB60B,EAASx+B,OAAO2J,aAChE,CA0BsBsgE,CAAoBnnE,EAAO07B,MAG/C,QAAKorC,KAC8B,IAA5BA,EAAQR,SAASx4D,SAA6C,IAA1Bg5D,EAAQM,gBAA6C,IAAnBN,EAAQh5D,OACvF,CAkFWu5D,CAAwBf,EAAQG,eAEzC,GAA0B,cAAtBH,GAASE,SACX,OAnFJ,SAA8BC,GAC5B,IAAM9oE,EAAOqB,WACPsoE,EAAY3pE,EAAK4pE,WAAc5pE,EAAK7C,QAA4CysE,UACtF,IAAKD,GAAkC,iBAAdA,EAAwB,OAAO,KAExD,IAAMhB,EAAUgB,EAAUhB,QAC1B,IAAKA,GAA8B,iBAAZA,EAAsB,OAAO,KAEpD,IAAMphD,GAAYuhD,GAAevpE,QAAU,cAAc2J,cAYnD7G,EAAQsmE,EAX0B,CACtChgC,UAAW,aACXkhC,MAAO,aACPC,UAAW,aACXC,WAAY,aACZC,UAAW,YACXC,WAAY,cACZC,YAAa,cACbC,UAAW,aAEO5iD,IAAaA,GAEjC,MAAwB,kBAAVllB,GAAsBA,CACtC,CA6DW+nE,CAAqBzB,EAAQG,eAEtC,GAA0B,UAAtBH,GAASE,SACX,OA9DJ,SAA0BC,GACxB,IAAM9oE,EAAOqB,WACPgpE,EAAMrqE,EAAKsqE,KAAQtqE,EAAK7C,QAA4CmtE,IAC1E,IAAKD,GAAsB,iBAARA,EAAkB,OAAO,KAC5C,IAAME,EAAaF,EAAIG,mBACvB,IAAKvoE,MAAMC,QAAQqoE,GAAa,OAAO,KAEvC,IAAMxsC,EAAW+qC,GAAevpE,QAAU,OACpCkrE,EAAe1sC,EAAS70B,cAC9B,OAAOqhE,EAAW/4D,KAAMJ,IACtB,IAAKA,GAAwB,iBAATA,EAAmB,OAAO,EAC9C,IAAMhI,EAAYgI,EACZhG,EAAiC,iBAAnBhC,EAAUgC,KAAoBhC,EAAUgC,KAAK7L,OAAO2J,cAAgB,GAClF/I,EAA6B,iBAAjBiJ,EAAUjJ,GAAkBiJ,EAAUjJ,GAAK,GAC7D,OAAOiL,IAASq/D,GAAgBtqE,IAAO49B,GAE3C,CA8CW2sC,CAAiB/B,EAAQG,eAElC,GAA0B,cAAtBH,GAASE,SACX,OA/CJ,SAA8BC,GAC5B,IAAM9oE,EAAOqB,WAePspE,EAbkC,CACtChiC,UAAW,6BACXohC,WAAY,6BACZD,UAAW,6BACXD,MAAO,6BACPG,UAAW,mBACXE,YAAa,+BACbD,WAAY,+BACZW,aAAc,oBACdC,WAAY,oBACZ,eAAgB,oBAChBC,KAAM,sBAZShC,GAAevpE,QAAU,aAAa2J,eAevD,IAAKyhE,EAAY,OAAO,EACxB,IAAMI,EAAU,CACd/qE,EAAKgrE,WAAchrE,EAAK7C,QAA4C6tE,UACpEhrE,EAAKyP,SAASw7D,iBAAoBjrE,EAAK7C,QAA4CsS,SAASw7D,iBAG9F,QAAWh1D,KAAU80D,EACnB,GAAK90D,GAA4B,iBAAXA,GAAqD,mBAAvBA,EAAO00D,GAC3D,IACE,IAAMtoE,EAAQ4T,EAAO00D,KACrB,GAAqB,kBAAVtoE,EAAqB,OAAOA,CACzC,OAEA,CAEF,OAAO,IACT,CAcW6oE,CAAqBvC,EAAQG,eAEtC,IAAKH,GAASwC,QAAgC,aAAtBxC,GAASE,SAAyB,OAAO,KACjE,IAAM9mE,EAAM0mE,GAAeE,EAAQwC,QAAU,wBAC7C,GAAmB,kBAARppE,EAAmB,OAAOA,EACrC,IAAMg8B,EAAW4qC,EAAQG,cACzB,OAAK/qC,EACD97B,MAAMC,QAAQH,GAAaA,EAAIuJ,IAAI8D,QAAQjG,SAAS40B,GACrC,iBAARh8B,GACFA,EAAIuH,MAAM,KAAKgC,IAAK8F,GAASA,EAAK7R,QAAQwR,OAAOgM,SAAS5T,SAAS40B,GAH/C,MAAPh8B,GAAsC,KAAvBqN,OAAOrN,GAAKxC,MAMnD,CAEA,SAAS6rE,GAAsB7zC,GAC7B,IAAKjY,GAAMoX,gBAAiB,OAC5B,IAAM9P,EAAa8hD,GAAyBnxC,GAC1B,MAAd3Q,GAAsBA,IAAetH,GAAMqX,gBAC/C00C,GAAWzkD,EACb,CAkEA,SAAS0kD,GAAuB/zC,GAC9B,OAC4B,IAA1BA,EAAOg0C,gBACsB,kBAAtBh0C,EAAOi0C,aACkB,IAAhCj0C,EAAOqxC,aAAa/hD,OAExB,CAEA,SAAS4kD,GAAsBl0C,EAAoBb,GACjD,OAAKA,IAC4B,kBAAtBa,EAAOi0C,WAAiCj0C,EAAOi0C,WACvC9C,GAAyBnxC,IAoP9C,WACE,IAAKl2B,WAAWpG,UAAUyG,OAAQ,OAAO,EACzC,IACE,OAAO,IAAIC,OAAO,cAAc+pE,eAAgCjiE,KAAKpI,WAAWpG,SAASyG,OAC3F,OACE,OAAO,CACT,CACF,CAzPSiqE,GACT,CAEA,SAASC,KACP,OAAOjlD,GAAerH,GAAMoX,gBAAiBpX,GAAMqX,eAAgBrX,GAAM2oD,sBAC3E,CAIA,SAAS4D,GAAkBxpE,EAAgBypE,GACzC,GAAqC,MAAVzpE,EAC3B,IAAkB,WAAdypE,EAAwB,CAC1B,IAAMC,EAAU9qE,OAAOoB,GACvB,OAAOpB,OAAOC,SAAS6qE,GAAWA,OAAU,CAC9C,CACA,GAAkB,YAAdD,EAAyB,CAC3B,GAAqB,kBAAVzpE,EAAqB,OAAOA,EACvC,IAAM2G,EAAaoG,OAAO/M,GAAO9C,OAAO2J,cACxC,QAAI,CAAC,IAAK,OAAQ,MAAO,MAAMC,SAASH,KACpC,CAAC,IAAK,QAAS,KAAM,OAAOG,SAASH,SACzC,CACF,CACA,MAAkB,iBAAd8iE,EACE7pE,MAAMC,QAAQG,GAAeA,EAAMiJ,IAAK8F,GAAShC,OAAOgC,GAAM7R,QAAQwR,OAAOgM,SAC1E3N,OAAO/M,GAAOiH,MAAM,KAAKgC,IAAK8F,GAASA,EAAK7R,QAAQwR,OAAOgM,SAElD,SAAd+uD,EAA6BzpE,EAC1B+M,OAAO/M,EAAK,CACrB,CAEA,SAAS2pE,GAAkBz0C,GACzB,IAAM00C,EAAc10C,EAAO5Z,SAAW,GACtC,IAAKsuD,EAAY3vE,OAAQ,OACzB,IAAI0F,EAAqB,KACzB,IACEA,EAAS,IAAI7G,IAAIo8B,EAAO5qB,KAAOtS,SAASuS,YAAavS,SAAa,IAAcA,SAASC,OAAS,YACpG,OACE0H,EAAS,IACX,CACA,GAAKA,EAEL,QAAWkqE,KAAcD,EAAa,CACpC,IAAMzgD,EAAU0gD,EAAW1gD,QAC3B,IAAK0gD,EAAWloE,KAAyB,kBAAlBwnB,GAAS1sB,OAA6B0sB,EAAQ2gD,UAAW,SAChF,IAAMpqE,EAAMC,EAAO6K,aAAa1Q,IAAIqvB,EAAQ2gD,WAC5C,GAAW,MAAPpqE,GAAuB,KAARA,EAAY,EACL,IAApBypB,EAAQzE,SAAmB9I,GAAmBiuD,EAAWloE,KAC7D,QACF,CACA,IAAM3B,EAAQwpE,GAAkB9pE,EAAKmqE,EAAWJ,gBAClC,IAAVzpE,GACF+pE,GAAkBF,EAAWloE,IAAK3B,EAAO,CACvCib,QAAS4uD,EAAW5uD,QACpByJ,QAASyE,EAAQzE,QACjB9Q,OAAQ,iBAGd,CACF,CA4DA,SAASm2D,GACPpoE,EACA3B,EACAoiD,GAEA,GAAKzgD,EACL,KAAqB,IAAjBygD,EAAK19B,UAAsB6kD,KAE7B,YADA5tD,GAAiBha,EAAK3B,EAAOoiD,EAAKxuC,QAGpCoH,GAAgBrZ,EAAK3B,EAAOoiD,EAAKnnC,QAASmnC,EAAKxuC,QAC/C+H,GAAiBha,EAAK3B,EAAOoiD,EAAKxuC,OAAM,CAC1C,CAEA,SAASo2D,GAAgBroE,EAAa3B,EAAgBib,EAAkBrH,EAAS,UAC3E21D,KACFvuD,GAAgBrZ,EAAK3B,EAAOib,EAASrH,GAErC+H,GAAiBha,EAAK3B,EAAO4T,EAEjC,CAEA,SAASq2D,GAAiB3gE,EAAyC,CAAC,GAClE,OAAO8R,GAAiB,IACnB9R,EACH+R,iBAA6C,IAA5B/R,EAAQ+R,iBAAoCkuD,MAEjE,CAEA,SAASW,GAAqBlqE,GAC5B,GAAqB,iBAAVA,EAAoB,MAAO,GACtC,IAAM2B,EAAM3B,EACT9C,OACA2J,cACAD,QAAQ,SAAU,IAClBA,QAAQ,cAAe,KACvBA,QAAQ,WAAY,IACpBA,QAAQ,MAAO,KAClB,OAAKjF,EACE,SAASyF,KAAKzF,GAAOA,EAAM,WAAWA,IAD5B,EAEnB,CAMA,SAASwoE,GAAYC,EAAkB77D,GAAkB,GACvD,IAAM87D,EAAoBH,GAAqBE,GAC/C,IAAKC,EAAmB,OACxB,IAAMC,KACO,IAAX/7D,GAEIA,GAA4B,iBAAXA,GAAuB,aAAcA,IAC3CA,EAAkCg8D,UAEnD5uD,GAbF,SAA2B0uD,GACzB,MAAO,gBAAgBA,GACzB,CAWmBG,CAAkBH,GAAoBC,EAAY,YACnE,IACE1xE,SAASusC,cAAc,IAAIC,YAAY,uBAAwB,CAC7DC,OAAQ,CAAEzxB,OAAQ,WAAYw2D,QAASC,EAAmB97D,OAAQ+7D,KAEtE,OAAS,CACX,CAEA,SAASG,GAAwB5yD,EAAkBsR,GACjD,GAAuB,cAAnBA,EAAQvV,QAA0BuV,EAAQG,UAAW,OAAOzR,EAAQ5G,aAAakY,EAAQG,WAC7F,GAAuB,YAAnBH,EAAQvV,QAAwBuV,EAAQG,UAAW,CACrD,IAAM3nB,EAAMwnB,EAAQG,UAAU1iB,QAAQ,SAAU,IAAIA,QAAQ,YAAa,CAAC2iB,EAAGmhD,IAAiBA,EAAKjhD,eACnG,OAAQ5R,EAAwBlC,UAAUhU,EAC5C,CACA,MAAuB,aAAnBwnB,EAAQvV,OAA8BuV,EAAQnpB,QAAS,EACpD6X,EAAQ9Z,aAAab,QAAU,EACxC,CAEA,SAASytE,GAA2Bz1C,GAClC,IAAM00C,EAAc10C,EAAO5Z,SAAW,GACtC,QAAWuuD,KAAcD,EAAa,CACpC,IAAMzgD,EAAU0gD,EAAW1gD,QAC3B,GAAKA,EACL,IAAqB,iBAAjBA,EAAQ1sB,MAA2B0sB,EAAQ1T,iBAAmB7c,SAAa,IAAa,CAC1F,IAAIif,EAA0B,KAC9B,IACEA,EAAUjf,SAASmZ,cAAcoX,EAAQ1T,SAC3C,OACEoC,EAAU,IACZ,CACA,IAAKA,EAAS,SACd,IAAM7X,EAAQwpE,GAAkBiB,GAAwB5yD,EAASsR,GAAU0gD,EAAWJ,gBACxE,IAAVzpE,GACF+pE,GAAkBF,EAAWloE,IAAK3B,EAAO,CACvCib,QAAS4uD,EAAW5uD,QACpByJ,QAASyE,EAAQzE,QACjB9Q,OAAQ,gBAGd,CACA,GAAqB,WAAjBuV,EAAQ1sB,MAAqB0sB,EAAQztB,KAAM,CAC7C,IAAMsE,EAAQwpE,GAAkBpD,GAAej9C,EAAQztB,MAAOmuE,EAAWJ,gBAC3D,IAAVzpE,GACF+pE,GAAkBF,EAAWloE,IAAK3B,EAAO,CACvCib,QAAS4uD,EAAW5uD,QACpByJ,QAASyE,EAAQzE,QACjB9Q,OAAQ,UAGd,EACF,CACF,CA2BA,SAASg3D,KACP,IACE,IAAMhpE,EAAU5C,WAAWC,aAM3B,GALA2C,GAASwI,WAAW,YACpBxI,GAASwI,WAAW,cACpBxI,GAASwI,WAAW,4BACpBxI,GAASwI,WAAWygE,IxC15BjB,WACL,IACE5rE,aAAamL,WAAWmQ,IACxBtb,aAAamL,WAAWsR,GAC1B,OAAS,CACX,CwCs5BIovD,GACIlpE,EACF,QAASe,EAAIf,EAAQ3H,OAAS,EAAG0I,GAAK,EAAGA,IAAK,CAC5C,IAAMhB,EAAMC,EAAQD,IAAIgB,GACpBhB,GAAK8F,WAAWsjE,KAA0BnpE,EAAQwI,WAAWzI,EACnE,CAEJ,OAAS,CACT,IACE,IAAMC,EAAU5C,WAAW5F,eAK3B,GAJAwI,GAASwI,WAAW,YACpBxI,GAASwI,WAAW,YACpBxI,GAASwI,WAAW,eACpBxI,GAASwI,WAAW,YAChBxI,EACF,QAASe,EAAIf,EAAQ3H,OAAS,EAAG0I,GAAK,EAAGA,IAAK,CAC5C,IAAMhB,EAAMC,EAAQD,IAAIgB,GACpBhB,GAAK8F,WAAW,aAAa7F,EAAQwI,WAAWzI,EACtD,CAEJ,OAAS,CAIT,GAHAqpE,KlD57BK,WACL,IACEhsE,WAAWC,cAAcmL,WAAWlL,EACtC,OAEA,EA1EF,WACE,IACE,IAAKF,WAAWpG,SAAU,OAC1BoG,WAAWpG,SAASyG,OAClBE,EAAc,oCAClB,OAEA,CACF,CAmEE0rE,EACF,CkDs7BEC,G5C/+BK,WACL,IACElsE,WAAWC,cAAcmL,WAAWlL,GACtC,OAEA,CACAiL,GAAa5K,GACf,C4Cy+BE4rE,GACInsE,WAAWpG,SACb,IACEoG,WAAWpG,SAASyG,OAAS,4CAC/B,OAAS,CAEb,CAUA,SAAS+rE,GAAgBtlD,GAClB9mB,WAAWpG,UAAoC,YAAxBA,SAAS24B,WAIrC34B,SAASuC,iBAAiB,mBAAoB2qB,EAAU,CAAExqB,MAAM,IAH9DwqB,GAIJ,CAkBA,SAASulD,GAAsBn2C,GAC7B,IAAMo2C,EAAcp2C,EAAOo2C,YACrBr+B,EAAKq+B,GAAar+B,IACnBq+B,GAAa9mD,UAAYyoB,GAC9Bm+B,GAAgB,IAAMnjD,GAAOglB,EAAI,mBACnC,CAuCA,SAASs+B,GAA6Bx+B,GACpC,IAAM7kB,EAAO6kB,EAAUE,IAAI/kB,MAAQ,GACnC,MAA8B,aAAvB6kB,EAAUE,IAAIxwC,MACnB,kBAAkB2K,KAAK8gB,IACvB,iBAAiB9gB,KAAK8gB,EAC1B,CAEA,SAASsjD,GAAsBz+B,GAC7B,IAAMxiC,SAAczP,OAAW,IAAcA,OAAO9C,SAASuS,KAAO,YAEpE,MAAO,CACLsqC,UAFgB42B,KAGhBptD,WAAYyzB,GAAyB,CAAC,EAAGvnC,GACzC3R,gBAAiBA,SAAa,IAAcA,cAAW,EACvDZ,gBAAiBA,SAAa,IAAcA,cAAW,EACvDiqB,OAAQ8qB,EAAU9qB,OAClB3X,IAAK,IAAIxR,IAAIyR,EAAM,aACnBvK,MAAO+sC,EAAU/sC,MACjBlF,cAAeA,OAAW,IAAcA,YAAS,EAErD,CAkFA,SAAS4wE,GAAuBtiD,EAAyBnL,GACvD,IAAMxhB,EAAO2sB,EAAK+iB,SAAS1vC,KAC3B,GAAa,oBAATA,GAAuC,eAATA,EAAuB,MAAO,OAChE,IAAMmX,EAASwV,EAAK+iB,SAASD,WAAWhvC,OAClC+kB,EAASmH,EAAK+iB,SAASlqB,OAC7B,IAAKrO,GAAUA,EAAO3Z,OAAS,MAASgoB,EAAQ,MAAO,OAEvD,IAAI0pD,EACAp9D,IAAiB07D,GAAiB,CAAE5uD,iBAAiB,IAAS4G,GAC5D3Y,EAAU,CAAEihE,SAAUh8D,EAAQshC,OAAQzmB,EAAKtrB,GAAIssE,QAAShhD,EAAK+iB,SAASi+B,SACtEwB,EAAY9wD,IAChB,IAAMwvD,KACK,IAATxvD,GAEIA,GAAwB,iBAATA,GAAqB,aAAcA,IACvCA,EAAgCyvD,UAEjDh8D,EAAS+7D,EACThhE,EAAQihE,SAAWD,EACnB3uD,GAAiBsG,EAAQqoD,EAAY,gBACrCrsD,KAGF,IACE,IAAM1T,SAAczP,OAAW,IAAcA,OAAO9C,SAASuS,KAAO,YAC9D6pB,EAAU,CACdygB,UAAW42B,KACXptD,WAAYyzB,GAAyB,CAAC,EAAGvnC,GACzC3R,gBAAiBA,SAAa,IAAcA,cAAW,EACvDZ,gBAAiBA,SAAa,IAAcA,cAAW,EACvD63C,OAAQzmB,EAAKtrB,GACbssE,QAAShhD,EAAK+iB,SAASi+B,QACvBnoD,SACA3X,IAAK,IAAIxR,IAAIyR,EAAM,aACnBzP,cAAeA,OAAW,IAAcA,YAAS,GAkBnD6wE,EAhBW,IAAIvjD,SACb,WACA,UACA,UACA,8RAUKxU,MAdI,CAgBGg4D,EAAUtiE,EAAS8qB,EACnC,OAAS9L,GACsB5C,GAAU,yBAA0B4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACjH3M,GAAiBsG,GAAQ,EAAO,eAClC,CAEA,MAAO,KACL,IAC0B,mBAAb0pD,GAAyBA,GACtC,OAASrjD,GACsB5C,GAAU,+BAAgC4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,GACzH,CACA1M,GAAmBqG,GACnBhE,IAEJ,CAoOA,SAAS4tD,KACP,QAAW7zD,KAAY8zD,GACrB,IACE9zD,GACF,OAEA,CAEJ,CAeA,SAAS+zD,GAAwB79D,GAC/B,OAAK89D,GACE99D,EAAYY,KAAMD,GAAeA,EAAW2wC,gBAAgBysB,cAAgB,KADtD,IAE/B,CAEA,SAASC,KACkB,OAArBC,KACFrxE,OAAOy/C,cAAc4xB,IACrBA,GAAmB,MAErBC,GAAiB,EACnB,CAEA,SAASC,GAAqBC,GAC5B,IAAKA,EAAS77B,SAAW67B,EAAS77B,SAAW,EAAG,OAChD,IAAMhtC,EAAUsoE,GAAwB9uD,GAAM/O,aACzCzK,GAAS+7C,gBAAgBysB,aAC1BxoE,EAAQ+7C,eAAe/O,UAAY67B,EAAS77B,UAEnBxrB,GAAS,UAAW,6BAA6BqnD,EAAS77B,WAC1D40B,GAAM,UAAW,SAAU,CAAE50B,QAAS67B,EAAS77B,UAE5E87B,GAAWtvD,GAAM/O,aACjB+O,GAAM/O,YAAc+O,GAAM/O,YAAYjF,IAAK4F,IACzC,IAAM29D,EAAc39D,EAAW2wC,eAC/B,OAAKgtB,GAAeA,EAAYP,cAAgBxoE,EAAQ+7C,gBAAgBysB,YACjE,IACFp9D,EACH+vC,cAAe0tB,EAAS1tB,oBAAiB,EACzCD,eAAgB2tB,EAAS3tB,qBAAkB,EAC3Ca,eAAgB,IACXgtB,EACH/7B,QAAS67B,EAAS77B,QAClB11B,UAAWuxD,EAASvxD,WAAayxD,EAAYzxD,UAC7CkxD,YAAaK,EAASL,aAAeO,EAAYP,YACjDQ,eAAgBH,EAASG,gBAAkBD,EAAYC,iBAViC59D,IAc9F69D,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAC1C7pB,GAAM0vD,wBAA0BrlC,GAAoBrqB,GAAM/O,aAC5D,CAEA,SAAS0+D,GAAoBX,GACtBD,KACDpzE,SAASi0E,QACb5zD,MAAMgzD,EAAa,CAAExyC,MAAO,aACzBhgB,KAAM6hC,IACL,IAAKA,EAAI3hC,GAAI,MAAM,IAAIqb,MAAM,4BAA8BsmB,EAAIxtC,QAC/D,OAAOwtC,EAAI3gC,SAEZlB,KAAK4yD,IACL9yC,MAAOjR,IACuB5C,GAAU,UAAW4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACrE+8C,GAAM,UAAW,cAAe,CAAC,KAEpE,CAmCA,SAASyH,GAAkBz2C,GACzB,OAAOA,EAASzvB,QAAQ,OAAQ,IAAIA,QAAQ,YAAa,GAC3D,CAEA,SAASmmE,GAAkB73C,GACzB,OAAOA,EAAOmB,SACVy2C,GAAkB53C,EAAOmB,UAAY,eACrC,CACN,CA6CAnV,eAAe8rD,GAA6B93C,EAAoBpQ,GAC9D,IAAKoQ,EAAOnK,SAAWmK,EAAOmB,SAAU,OAAO,KAC/C,IAAM3c,QAAiBT,MAAM,GAAG6zD,GAAkB53C,EAAOmB,+BAAgC,CACvF4C,OAAQ,OACRlX,QAAS,CACP,eAAgB,mBAChB,cAAemT,EAAOnK,QAExBxwB,KAAMjB,KAAKa,UAAU,CAAE6wB,YAAalG,IACpC7C,OAAQgrD,YAAYtrD,QAAQ+I,GAAsBwK,EAAOg4C,qBAE3D,OAAKxzD,EAASC,UACAD,EAASiB,QAAiCigB,QAD/B,IAE3B,CAEA,SAASuyC,KAC0B,OAA7BlwD,GAAMmwD,qBACRtyE,OAAOuB,aAAa4gB,GAAMmwD,oBAC1BnwD,GAAMmwD,mBAAqB,MAG7B,IAAMC,EADIruE,WACWsuE,mBACS,OAA1BrwD,GAAMswD,iBAAkD,mBAAfF,IAC1CA,EAAoCpwD,GAAMswD,iBAC3CtwD,GAAMswD,gBAAkB,KAE5B,CAyBA,SAASC,GAAgB5yC,EAAkCl/B,GACzD,IAAMsE,EAAQwpE,GAAkBrD,GAASvrC,EAASl/B,GAAO,UACzD,MAAwB,iBAAVsE,GAAsBpB,OAAOC,SAASmB,GAASA,OAAQ,CACvE,CAEA,SAASytE,GAAe7yC,EAAkCl/B,GACxD,IAAMsE,EAAQwpE,GAAkBrD,GAASvrC,EAASl/B,GAAO,UACzD,MAAwB,iBAAVsE,GAAsBA,EAAQA,OAAQ,CACtD,CA2CA,SAAS0tE,GACPvhC,EACAvR,EACA+yC,EACAC,GAAiB,GAEjB,IAAMC,EA5ER,SACEC,EACAC,GAEA,IAAMxW,EAAmB,GACzB,QAAWyW,KAAWD,GAAY,GAAI,CACpC,IAAKC,GAAS17D,OAAS07D,EAAQC,GAAI,SACnC,IAAMjuE,EAAQwpE,GAAkBrD,GAAS2H,EAAcE,EAAQ17D,MAAO07D,EAAQvE,gBAChE,IAAVzpE,IACJ+pE,GAAkBiE,EAAQC,GAAIjuE,EAAO,CACnCib,QAAS+yD,EAAQ/yD,QACjByJ,QAASspD,EAAQtpD,QACjB9Q,OAAQ,eAEV2jD,EAAO3nD,KAAKo+D,EAAQC,IACtB,CACA,OAAO1W,CACT,CA2DwB2W,CAAuBtzC,EAASuR,EAAQ4hC,UAS9D,GARA9wD,GAAMkxD,qBAAuB,CAC3BC,UAAWjiC,EAAQiiC,UACnBT,gBACAlW,GAAIn/D,KAAKC,MACTs1E,mBACID,EAAiB,CAAEA,gBAAgB,GAAS,CAAC,GAG/C3wD,GAAMoxD,wBAAyB,OAEnC,IAAMC,EAAmD,iBAA3BniC,EAAQmiC,gBAA+BniC,EAAQmiC,eAAer0E,OAAS,EACjGkyC,EAAQmiC,eACR,OAC0B,IAA1BniC,EAAQoiC,eAA0BD,IACpC5tD,GAAM4tD,GAAkB,WAAY,CAClC16D,OAAQ,aACR46D,eAAgBriC,EAAQiiC,aACrBxzC,IAtDT,SAA+BuR,EAAmCvR,GAChE,IAAMr0B,EAAW4lC,EAAQsiC,aACzB,IAAKloE,IAAiC,IAArBA,EAASie,QAAmB,OAE7C,IAAMgzC,EAAUgW,GAAgB5yC,EAASr0B,EAASmoE,aAAe,SACjE,QAAgB,IAAZlX,EAAuB,OAE3B,IAAMmX,EAAqC,CACzC/6D,OAAQ,aACR46D,eAAgBriC,EAAQiiC,WAEpBQ,EAAUnB,GAAe7yC,EAASr0B,EAASsoE,aAAe,kBAC1DvgE,EAAWm/D,GAAe7yC,EAASr0B,EAASuoE,cAAgB,YAC5DC,EAAOvB,GAAgB5yC,EAASr0B,EAASyoE,UACzCC,EAASzB,GAAgB5yC,EAASr0B,EAAS2oE,YAC7CN,IAASD,EAAUC,QAAUA,GAC7BtgE,IAAUqgE,EAAUrgE,SAAWA,QACtB,IAATygE,IAAoBJ,EAAUI,KAAOA,QAC1B,IAAXE,IAAsBN,EAAUM,OAASA,GAE7C,QAAWjB,KAAWznE,EAASw5B,YAAc,GAAI,CAE/C,IADKiuC,GAAS17D,OAAS07D,EAAQC,IAC3BkB,GAAiC3/D,IAAIw+D,EAAQC,IAAK,SACtD,IAAMjuE,EAAQwpE,GAAkBrD,GAASvrC,EAASozC,EAAQ17D,MAAO07D,EAAQvE,gBAC3D,IAAVzpE,IAAqB2uE,EAAUX,EAAQC,IAAMjuE,EACnD,CAEAyuE,GAAajX,EAASmX,EACxB,CA8BES,CAAsBjjC,EAASvR,IAEJ,IAAvBuR,EAAQkjC,YACVC,GAAsB,MAE1B,CAyDA,SAASC,GAA4B/1D,GACnCyD,GAAMuyD,+BAAiC,CAACh2D,KAAWyD,GAAMuyD,gCAAgCjvE,MAAM,EAAG,GACpG,CAIA,SAASkvE,GAAc57C,EAAgB9qB,GAMrC,MALY,GAAG8qB,IAAS9qB,IACrBnC,QAAQ,mBAAoB,IAC5BA,QAAQ,OAAQ,KAChB1J,OACAqD,MAAM,EAAG,KACE,iBAChB,CAEA,SAASmvE,GAAoBC,EAA0E/0C,GACrG,IAAMud,EAAQiuB,GAAeuJ,EAAYC,YACzC,IAAKz3B,EAAO,MAAM,IAAInjB,MAAM,iBAC5B,IAAMo5C,EAAYuB,EAAYvB,WAAa,uBAC3C,GAAIxuE,MAAMC,QAAQs4C,GAChBA,EAAMvoC,KAAK+/D,EAAY12C,OACnB,CAAEA,OAAQ02C,EAAY12C,OAAQ42C,WAAYzB,EAAW0B,iBAAkBl1C,GACvE,CAAEjiB,MAAOy1D,KAAcxzC,QAH7B,CAMA,GAA0B,mBAAfud,EAAMvoC,KAMjB,MAAM,IAAIolB,MAAM,sBALdmjB,EAAMvoC,KAAK+/D,EAAY12C,OACnB,CAAEA,OAAQ02C,EAAY12C,OAAQ42C,WAAYzB,EAAW0B,iBAAkBl1C,GACvE,CAAEjiB,MAAOy1D,KAAcxzC,GAJ7B,CAQF,CA6KA,SAASm1C,GAAsBlhE,GAI7B,MAAO,GAH8B,oBAApBA,EAAW8d,MAA8B9d,EAAWmhE,gBACjEnhE,EAAWmhE,gBAAgBlyE,GAC3B+Q,EAAW9O,gBACO8O,EAAWjO,eAAeiO,EAAWnQ,iBAAmB,IAChF,CAEA,SAASuxE,GAAgCphE,GAKvC,MAAO,GAAGA,EAAW9O,gBAAgB8O,EAAWjO,eAAeiO,EAAWnQ,iBAAmB,IAC/F,CAEA,SAASwxE,GAAmCrhE,GAC1C,IAAM8xB,EAAgB1jB,GAAMiY,QAAQi7C,UAAUh9D,OAAOwtB,cACrD,GAC6B,IAA3BA,GAAe8P,UACd7xC,OAAOyR,cAAcswB,EAAcyvC,WACpCzvC,EAAcyvC,UAAY,IACzBzvC,EAAcr/B,eAAewF,SAAS+H,EAAW9O,cAClD,OAAO,EAIT,IAAMkP,EAAcgO,GAAMiY,QAAQi7C,UAAUh9D,OAAOvE,YAChDE,KAAMnQ,GAAeA,EAAWqQ,gBAAkBH,EAAW9O,eAC5DuN,SAASuB,EAAWjO,aACxB,SACEqO,GACCA,EAAYE,KAAMC,GAAuD,iBAAjCA,EAAWU,sBAIhD,IAFCmN,GAAMozD,+BAA+B7gE,IAC1CygE,GAAgCphE,GAEpC,CAEA,SAASyhE,GAAsCzhE,GAC7C,IAAM8xB,EAAgB1jB,GAAMiY,QAAQi7C,UAAU76C,UAAUqL,cACxD,OAC6B,IAA3BA,GAAe8P,UACd7xC,OAAOyR,cAAcswB,EAAcyvC,WACpCzvC,EAAcyvC,UAAY,IACzBzvC,EAAcr/B,eAAewF,SAAS+H,EAAW9O,gBAI9C,IAFCkd,GAAMszD,kCAAkC/gE,IAC7CygE,GAAgCphE,GAEpC,CAEA,SAAS2hE,GAAoC3hE,GAC3C,IAAM8xB,EAAgB1jB,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,cACtD,OAC6B,IAA3BA,GAAe8P,UACd7xC,OAAOyR,cAAcswB,EAAcyvC,WACpCzvC,EAAcyvC,UAAY,IACzBzvC,EAAcr/B,eAAewF,SAAS+H,EAAW9O,gBAI9C,IAFCkd,GAAMwzD,gCAAgCjhE,IAC3CygE,GAAgCphE,GAEpC,CAEA,SAAS6hE,GAAgBlkB,GACvB,MAAO,CAILrrB,YAActyB,IAGN,IAFNoO,GAAMwzD,gCAAgCjhE,IACpCygE,GAAgCphE,OAEjC29C,EAEP,CAGA,SAASmkB,GAAiC9hE,GACxC,SACEA,EAAWwhB,UAAUp2B,QACrB4U,EAAW5R,KACX4R,EAAWo+B,IACXp+B,EAAW+hE,eACX/hE,EAAWgiE,cACXhiE,EAAW8vC,gBACX9vC,EAAW+vC,cAEf,CAGA,SAASkyB,GACPh2C,GAEA,IAAM5pB,EAAW+L,GAAMwzD,+BACjB31D,EAAO,IAAIrM,IACfqsB,EAAsB7xB,IAAIgnE,KAE5BhzD,GAAMwzD,+BAAiC31D,EAIvC,IAAMi2D,EAAoB,IAAItiE,IAC5BwO,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAer/B,eAAiB,IAE1C2b,GAAM/O,YAAYiB,KAAMN,GAC9CkiE,EAAkBvhE,IAAIX,EAAW9O,eACjC+a,EAAKtL,IAAIygE,GAAgCphE,MACxCqC,GAAU1B,IAAIygE,GAAgCphE,KAC/C8hE,GAAiC9hE,MAKjC09D,GAAWtvD,GAAM/O,aACjBw+D,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAE9C,CAuDA,SAASkqC,KACH/zD,GAAMg0D,kBAAoBh0D,GAAMiY,SAAWywC,MAC7CuL,GAAuBj0D,GAAMiY,OAEjC,CAMA,SAASg8C,GAAuBh8C,GAC9B,IAAyB,IAArBA,EAAOi8C,UAAqB,OAChC,IAAMjjE,EA7CR,SAAqCgnB,GACnC,OAAOjY,GAAM/O,YACVQ,OACEG,GACCA,EAAWc,WACVugE,GAAmCrhE,I1Cz2CrC,SACLtI,EACAsI,GAEA,IAAMI,EAAc1I,GAAUqI,YAAYE,KACvCnQ,GAAeA,EAAWqQ,gBAAkBH,EAAW9O,eACvDuN,SAASuB,EAAWjO,aACvB,SACEiO,EAAWc,WACVV,GAAaE,KAAMC,GAAeA,EAAWsE,aAC9CzE,EAAYE,KACTC,GAAuD,iBAAjCA,EAAWU,oBAEpCsE,KAA8BvF,EAElC,C0C21CUuiE,CAAgCl8C,EAAOi7C,UAAUh9D,MAAOtE,IAE7DH,OACEG,GACCyhE,GAAsCzhE,IAM9C,SACEqmB,EACArmB,GAEA,IAAMlQ,EAAau2B,EAAOi7C,UAAU76C,UAAU1mB,YAAYE,KACvD/H,GAAcA,EAAUiI,gBAAkBH,EAAW9O,cAExD,IAAKpB,EAAY,OAAO,EACxB,IAAMykB,EAAW1E,GACf/f,EAAW2O,WACHuB,EAAWc,UACnBhR,EAAW2O,SAASuB,EAAWjO,cAEjC,OAASwiB,EAAS/D,mBAAqB+D,EAAS9D,iBtC1pE3C,SACLvf,GAEA,OAA6C,IAAtC4iB,GAAgB7oB,IAAIiG,EAC7B,CsCupEOsxE,CAAmCxiE,EAAW9O,aACrD,CApBQuxE,CAA+Bp8C,EAAQrmB,IAE1CH,OAAO8hE,GACZ,CA+BsBe,CAA4Br8C,GAChD,GAA2B,IAAvBhnB,EAAYjU,OAAc,OAC9B,IAAMqQ,EAAM4qB,EAAO5qB,aAAetS,SAAa,IAAcA,SAASuS,KAAO,IAIvEinE,EpBhsED,SAAoCt5D,GAIzC,IAAM4D,EAA8C,CAAC,EAErD,QAAY21D,EAAWC,KAAc59C,GAAkB,CACrD,IAAM9zB,EAAQya,GAAevC,EAAMmG,WAAWozD,SAChC,IAAVzxE,IAAqB8b,EAAO41D,GAAa1xE,EAC/C,CAEA,QAAWiiB,KAAU/J,EAAMy5D,eAAiB,GAAI,CAG9C,IAFK1vD,EAAOtgB,KACR+xB,GAA0BzR,EAAOtgB,OAChC,CAAC,SAAU,SAAU,WAAWmF,SAASmb,EAAOwnD,WAAa,UAAW,SAC7E,IAAMiI,EAAYp+C,GAAyBrR,EAAOtgB,KAElD,GADI4xB,GAA0Bm+C,IAC1B33E,OAAO4sB,UAAU0U,eAAethB,KAAK+B,EAAQ41D,GAAY,SAC7D,IAAM1xE,EAAQya,GAAevC,EAAMmG,WAAW4D,EAAOtgB,WACvC,IAAV3B,IAAqB8b,EAAO41D,GAAa1xE,EAC/C,CAEA,OAxCF,SAAyB8b,GACvB,IAAM9hB,EAAOD,OAAOC,KAAK8hB,GAAQ1b,OACjC,KAAOpG,EAAKC,OAAS85B,IAAU,CAC7B,IAAMpyB,EAAM3H,EAAKuV,MACb5N,UAAYma,EAAOna,EACzB,CAEA,KAAO3H,EAAKC,OAAS,GAAKX,KAAKa,UAAU2hB,GAAQ7hB,OAAS+5B,IAAgB,CACxE,IAAMryB,EAAM3H,EAAKuV,MACb5N,UAAYma,EAAOna,EACzB,CAEA,OAAmC,IAA/B5H,OAAOC,KAAK8hB,GAAQ7hB,OAAqB,KACtCF,OAAOg/B,YACZh/B,OAAOC,KAAK8hB,GAAQ1b,OAAO6I,IAAKtH,GAAQ,CAACA,EAAKma,EAAOna,KAEzD,CAwBSiwE,CAAgB91D,EACzB,CoByqE0B+1D,CAA2B,CACjDxzD,WAJiByzB,GAAyB5c,EAAO7W,YAAc,CAAC,EAAG/T,EAAK,CACxE2nC,eAAgBs3B,OAIhBoI,cAAez8C,EAAO5Z,UAExBpN,EAAYyI,QAAStW,IACnB,IAAMyxE,EAAc/B,GAAsB1vE,GACtC4c,GAAM80D,sBAAsBviE,IAAIsiE,KACpC70D,GAAM80D,sBAAsB/zE,IAAI8zE,GACjB,oBAAXzxE,EAAEssB,MAA8BtsB,EAAE2vE,gBACpCtvD,GACE,2BACA,CACE/T,MAAOtM,EAAEsM,SACL6kE,EAAkB,CAAEl2D,QAASk2D,GAAoB,CAAC,EACtDQ,YAAa,kBACbC,mBAAoB5xE,EAAE2vE,gBAAgBlyE,GACtCo0E,oBAAqB7xE,EAAE2vE,gBAAgBruE,IACvCwwE,wBAAyB9xE,EAAE2vE,gBAAgBoC,OAC3CC,8BAA+BhyE,EAAE2vE,gBAAgBsC,aACjDC,wBAAyBlyE,EAAE2vE,gBAAgBwC,QAC3CC,6BAA8BpyE,EAAE2vE,gBAAgB0C,aAElDryE,EAAEN,aACFM,EAAEO,aAGJ8f,GACE,oBACA,CACE/T,MAAOtM,EAAEsM,SACL6kE,EAAkB,CAAEl2D,QAASk2D,GAAoB,CAAC,GAExDnxE,EAAEN,aACFM,EAAEO,aA1YV,SAAkCiO,EAAwBqmB,GACxD,IAAMy9C,EAAez9C,EAAO09C,qBAC5B,IAAKD,EAAc,OACnB,IAAM/3C,EAAU,CACdi4C,WAAY39C,EAAOnK,QAAU,GAC7B/b,cAAeH,EAAW9O,aAC1Bm9B,aAAcruB,EAAWjO,YACzBkyE,gBAAiBjkE,EAAWywC,gBAAkBzwC,EAAW9O,aACzDgzE,gBAAiBlkE,EAAWlC,MAC5BqmE,eAAgBnkE,EAAWjO,YAC3BqyE,WAAYpkE,EAAWc,WAEnB8nD,EAAKn/D,KAAKC,MAEhB,GAAIo6E,EAAaO,WAAW1uD,QAC1B,IACE,IAAMmpD,EAAgBgF,EAAaO,UAAUvF,eAAiB,YACxDnrE,EAAI1H,OACJyvC,EAAQ3qC,MAAMC,QAAQ2C,EAAEmrE,IAAkBnrE,EAAEmrE,GAAiB,GACnEnrE,EAAEmrE,GAAiBpjC,EACnBA,EAAM36B,KAAK,CACT+I,MAAOg6D,EAAaO,UAAU9E,WAAa,6BACI,IAA3CuE,EAAaO,UAAUC,gBAA4B,CACrDnkE,cAAeH,EAAW9O,aAC1Bm9B,aAAcruB,EAAWjO,aACvBg6B,IAEN20C,GAA4B,CAAE3qE,KAAM,YAAakJ,OAAQ,OAAQ2pD,MACnE,OAASnvC,GACPinD,GAA4B,CAAE3qE,KAAM,YAAakJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACjI,CAGF,GAAIqqD,EAAaS,QAAQ5uD,QACvB,IACE,IAAM6uD,EAAMv4E,OAAeu4E,GAC3B,GAAkB,mBAAPA,EAAmB,MAAM,IAAIr+C,MAAM,kBACb,UAA7B29C,EAAaS,OAAO32E,KACtB42E,EAAG,QAASV,EAAaS,OAAOhF,WAAa,0BAE7CiF,EAAG,WAAY,KAAM,CAAEC,aAAc,GAAGzkE,EAAW9O,gBAAgB8O,EAAWjO,gBAEhF2uE,GAA4B,CAAE3qE,KAAM,SAAUkJ,OAAQ,OAAQ2pD,MAChE,OAASnvC,GACPinD,GAA4B,CAAE3qE,KAAM,SAAUkJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IAC9H,CAGF,GAAIqqD,EAAaY,SAAS/uD,QACxB,IACE,IAAMgvD,EAAa14E,OAAey4E,QAClC,GAAyB,mBAAdC,EAA0B,MAAM,IAAIx+C,MAAM,mBACrD,IAAMv4B,EAAqC,UAA9Bk2E,EAAaY,QAAQ92E,MAAkD,SAA9Bk2E,EAAaY,QAAQ92E,KACvEk2E,EAAaY,QAAQ92E,KACrB,MAYJ,GAXa,QAATA,GAA2B,SAATA,GAMpB+2E,EAAU,MALE/D,GACVkD,EAAaY,QAAQE,WAAa,QAClC5kE,EAAWywC,gBAAkBzwC,EAAW9O,cAE5B8O,EAAWc,UAAY,UAAY,WAAWd,EAAWlC,UAG5D,UAATlQ,GAA6B,SAATA,IACtB+2E,EAAU,QAASb,EAAaY,QAAQnF,WAAa,0BAEnDuE,EAAaY,QAAQG,UAAYC,GACnC,IACEH,EAAU,UAAW,mBACrBG,IAAqB,CACvB,OAEA,CAEFpE,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,OAAQ2pD,MACjE,OAASnvC,GACPinD,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IAC/H,CAGF,GAAIqqD,EAAaiB,eAAepvD,QAC9B,IACE,IAAMhiB,EAAI1H,OACJ+4E,EAAOrxE,EAAEsxE,KAAOl0E,MAAMC,QAAQ2C,EAAEsxE,OAAUtxE,EAAEsxE,MAA+B,mBAAhBtxE,EAAEsxE,KAAKlkE,KAAuBpN,EAAEsxE,KAAO,GAClGnyE,EAAM8tE,GACVkD,EAAaiB,cAAcG,WAAa,QACxCllE,EAAWywC,gBAAkBzwC,EAAW9O,cACxCQ,MAAM,EAAG,IACXszE,EAAIjkE,KAAK,CACP,uBACA,CACEjO,MACA3B,MAAO6O,EAAWc,UAAY,UAAY,WAAWd,EAAWlC,WAGpE4iE,GAA4B,CAAE3qE,KAAM,gBAAiBkJ,OAAQ,OAAQ2pD,MACvE,OAASnvC,GACPinD,GAA4B,CAAE3qE,KAAM,gBAAiBkJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACrI,CAGF,GAAIqqD,EAAaqB,SAASxvD,QACxB,IACE,IAAMwvD,EAAWl5E,OAAek5E,QAChC,IAAKA,GAA+B,iBAAZA,GAA2C,mBAAZA,GAAsD,mBAApBA,EAAQ7qD,QAC/FomD,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ,wBACxE,CACL,IAAMx2B,EAAqC,YAA9Bk2E,EAAaqB,QAAQv3E,MAAoD,aAA9Bk2E,EAAaqB,QAAQv3E,KACzEk2E,EAAaqB,QAAQv3E,KACrB,QACS,YAATA,GAA+B,SAATA,IACxBu3E,EAAQ7qD,QAAQwpD,EAAaqB,QAAQ5F,WAAa,yBAA0BxzC,GAEjE,aAATn+B,GAAgC,SAATA,EACO,mBAArBu3E,EAAQC,SACjB1E,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ,8BAE7E+gD,EAAQC,SAAS,CAAE,CAAC,YAAYplE,EAAW9O,gBAAiB8O,EAAWjO,cACvE2uE,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,OAAQ2pD,QAGjE8X,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,OAAQ2pD,MAEnE,CACF,OAASnvC,GACPinD,GAA4B,CAAE3qE,KAAM,UAAWkJ,OAAQ,SAAU2pD,KAAIxkC,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IAC/H,CAGF,QAAW6vB,KAASw6B,EAAauB,QAAU,GACzC,IAAsB,IAAlB/7B,EAAM3zB,QACV,IACEkrD,GAAoBv3B,EAAOvd,GAC3B20C,GAA4B,CAAE3qE,KAAM,SAASuzC,EAAMy3B,aAAc9hE,OAAQ,OAAQ2pD,MACnF,OAASnvC,GACPinD,GAA4B,CAC1B3qE,KAAM,SAASuzC,EAAMy3B,aACrB9hE,OAAQ,SACR2pD,KACAxkC,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IAE5D,CAEJ,CA8PI6rD,CAAyB9zE,EAAG60B,GA0hBhC,SAA+BrmB,GAC7B,IAAK06D,KAA4B,OACjC,IAAMhxE,EAAMD,KAAKC,MACX67E,EAAYC,KACf3lE,OAAQtL,GAAUA,EAAMilB,IAAMxZ,EAAW9O,cAC5Cq0E,EAAUxkE,KAAK,CAAEyY,EAAGxZ,EAAW9O,aAAclG,EAAGgV,EAAWjO,YAAarI,MA3G1E,SAAmC67E,GACjC,GAAK7K,KACL,IACEvqE,WAAWC,cAAc/E,QACvB2wE,GACAvxE,KAAKa,UAAUm6E,GAA0BF,IAE7C,OAAS,CACX,CAoGEG,CAA0BH,GAC1BI,IACF,CAjiBIC,CAAsBp0E,GACtB60B,EAAOw/C,qBAAqBr0E,KAEhC,CAEA,SAASs0E,GAAkBzmE,EAA2BU,GACpDsb,K5BxsEK,SACLhc,EACAU,GAGAqa,G4BosEqC,CAACJ,EAAQha,EAAYpT,KACxDilB,GAAM,OAAQ,CAAEmI,YAAWptB,GAAQoT,EAAW9O,aAAc8O,EAAWjO,c5BpsEzEkpB,GAAmB,GAEfK,KACFvxB,SAAS2C,oBAAoB,QAAS4uB,IAAe,GACrDA,GAAgB,MAGlB,IAAMyqD,EAAS,IAAI1hE,IAAItE,EAAY3F,IAAKof,GAAM,CAACA,EAAEvqB,GAAIuqB,KACjDwsD,GAAgB,EAEpB,QAAWhmE,KAAcX,EAAa,CACpC,IAAMgd,EAAM0pD,EAAO96E,IAAI+U,EAAW9O,cAClC,GAAKmrB,GAAKkzB,MACV,QAAWz1B,KAAQuC,EAAIkzB,MACH,UAAdz1B,EAAK/jB,OAAqB+jB,EAAKlT,UAAYkT,EAAKoB,aAClDD,GAAiBla,KAAK,CAAE+Y,OAAM9Z,eAC9BgmE,GAAgB,GAEA,aAAdlsD,EAAK/jB,QACF+jB,EAAKk2B,YAAcp3B,GAAckB,EAAKk2B,WAAY7mD,SAASuS,QAC9Dme,GAASC,EAAM9Z,EAIvB,CAEIgmE,IACF1qD,GAAgBN,GAChBjxB,SAASuC,iBAAiB,QAASgvB,IAAe,GAEtD,C4BqqEE2qD,CAAW5mE,EAAaU,EAG1B,CAEA,SAASmmE,GAAqB7mE,EAA2BU,GACvD,GAAKomE,IACA/3D,GAAMg4D,UAAWtP,KACtB,IAAI1oD,GAAMi4D,kBAER,YADAj4D,GAAMi4D,kBAAkB7yB,OAAOn0C,EAAaU,GAG9CtK,QAAAL,UAAAwV,KAAA,KAAA07D,KAAAC,KAAoB37D,KAAK,EAAGysC,2BACrBjpC,GAAMg4D,SAAWtP,MAAqB1oD,GAAMi4D,oBACjDj4D,GAAMi4D,kBAAoBhvB,EAAoBh4C,EAAaU,EAAa8R,OACvE6Y,MAAM,OAAQ,CACnB,CAEA,SAAS87C,KACFp4D,GAAMi4D,oBACXj4D,GAAMi4D,kBAAkBtsC,OACxB3rB,GAAMi4D,kBAAoB,KAC5B,CAWA,SAASI,KACFr4D,GAAMs4D,qBACXt4D,GAAMs4D,mBAAmB3sC,OACzB3rB,GAAMs4D,mBAAqB,KAC7B,CAEA,SAASC,GACP5wE,EACAnJ,GAEA,OAAOwhB,GAAM/O,YAAYjF,IAAK4F,KAC5BjK,OACAnJ,KAAMg6E,GAAwBh6E,EAAMoT,EAAW9O,aAAc8O,EAAWjO,aACxE0J,IAAKvS,IACLgI,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,cAE5B,CAEA,SAASo5C,GAAoBp1C,EAAcnJ,GACzC,IAAM4E,EAAI4c,GAAM/O,YAAYjU,OAAS,EAAIgjB,GAAM/O,YAAY,GAAK,KAChE,MAAO,CACL,CACEtJ,OACAnJ,KAAMg6E,GAAwBh6E,EAAM4E,GAAGN,aAAcM,GAAGO,aACxD0J,IAAKvS,IACLgI,aAAcM,GAAGN,aACjBa,YAAaP,GAAGO,gBAEf40E,GAA8B,uBAAwB/5E,GAE7D,CAGA,SAASi6E,GAAe9wE,EAAcnJ,GAEpC,GADIkqE,OACC1oD,GAAMg4D,QAAS,OAGpB,IAAM50E,EAAI4c,GAAM/O,YAAYjU,OAAS,EAAIgjB,GAAM/O,YAAY,GAAK,KAC1DyK,EAAoB,CACxB/T,OACAnJ,KAAMg6E,GAAwBh6E,EAAM4E,GAAGN,aAAcM,GAAGO,aACxD0J,IAAKvS,IACLgI,aAAcM,GAAGN,aACjBa,YAAaP,GAAGO,aAQlB,GAN6BykE,GAAM,QAASzgE,EAAM,CAChD7E,aAAcM,GAAGN,aACjBa,YAAaP,GAAGO,eACbnF,IAELwhB,GAAMg4D,QAAQv0D,MAAM/H,GACP,aAAT/T,EAAqB,CACnBqY,GAAMiY,QAAQygD,GAA4B14D,GAAMiY,QACpD,QAAW0gD,KAAiBJ,GAA8B,sBAAuB/5E,GAC/EwhB,GAAMg4D,QAAQv0D,MAAMk1D,EAExB,SAAoB,cAAThxE,EACT,QAAWgxE,KAAiBJ,GAA8B,uBAAwB/5E,GAChFwhB,GAAMg4D,QAAQv0D,MAAMk1D,EAG1B,CAEA,SAASC,KACP,UAAW/6E,OAAW,IAAa,OACnC,IAAMg7E,EAAah7E,OACbgyB,EAAOgpD,EAAW/oD,WAAa+oD,EAAW/oD,YAAc,CAAC,EAC/DD,EAAKipD,WAAa94D,GAAM+4D,KAAKC,MAC7BnpD,EAAKopD,oBAAsBj5D,GAAM+4D,KAAKG,uBACC,IAAnCl5D,GAAM+4D,KAAKI,sBAAmCtpD,EAAKupD,sBAAwBp5D,GAAM+4D,KAAKI,0BACzD,IAA7Bn5D,GAAM+4D,KAAKM,gBAA6BxpD,EAAKypD,gBAAkBt5D,GAAM+4D,KAAKM,oBACzC,IAAjCr5D,GAAM+4D,KAAKQ,oBAAiC1pD,EAAK2pD,oBAAsBx5D,GAAM+4D,KAAKQ,wBAClD,IAAhCv5D,GAAM+4D,KAAKU,mBAAgC5pD,EAAK6pD,kBAAoB15D,GAAM+4D,KAAKU,uBAC/C,IAAhCz5D,GAAM+4D,KAAKY,mBAAgC9pD,EAAK+pD,kBAAoB55D,GAAM+4D,KAAKY,uBAChD,IAA/B35D,GAAM+4D,KAAKc,kBAA+BhqD,EAAKiqD,iBAAmB95D,GAAM+4D,KAAKc,gBACnF,CAEA,SAASE,GAAsBC,GAC7Bh6D,GAAM+4D,KAAO,IACR/4D,GAAM+4D,QACNiB,EACH/7D,UAAW5iB,KAAKC,OAElBs9E,KACA,IACEj9E,SAASusC,cAAc,IAAIC,YAAY,sBAAuB,CAAEC,OAAQ,IAAKpoB,GAAM+4D,QACrF,OAEA,CAC6B/wD,GAAS,QAAS,mBAAmBgyD,EAAMhB,QAASgB,EACnF,CAgBA,SAASC,GAAez7E,GAClBkqE,OACJ1oD,GAAMk6D,YAAc,IACf17E,EACH86E,gBAAiBt5D,GAAM+4D,KAAKM,cAC5BD,sBAAuBp5D,GAAM+4D,KAAKI,oBAClCF,oBAAqBj5D,GAAM+4D,KAAKG,kBAChCiB,yBAA0Bn6D,GAAM+4D,KAAKqB,sBACrCC,uBAAwBr6D,GAAM+4D,KAAKU,iBACnCa,uBAAwBt6D,GAAM+4D,KAAKY,iBACnCY,sBAAuBv6D,GAAM+4D,KAAKc,iBAEtC,CAWA,SAASW,GAAez3E,EAAgB0xB,EAAW,WACjD,MAAqB,iBAAV1xB,EAA2B0xB,EACtB1xB,EAAM9C,OAAOqD,MAAM,EAAG,MACpBmxB,CACpB,CAEA,SAASgmD,KACP,IAAM13E,EAAShB,WAAuC24E,IACtD,IAAK33E,GAA0B,iBAAVA,GAAsBJ,MAAMC,QAAQG,GAAQ,OAAO,KACxE,IAAMS,EAAST,EACf,MAAO,CACL43E,eAAgBH,GAAeh3E,EAAOm3E,eAAgB,iBACtDC,WAAYJ,GAAeh3E,EAAOo3E,YAClCC,eAAgBL,GAAeh3E,EAAOq3E,eAAgB,QAE1D,CAqBA,SAASC,GAAmB7iD,GAC1B,IAAM8iD,EAAeN,KACfO,EAAkB/iD,EAAOgjD,UAAU9H,SACzC,MAAO,CACL+H,YAAaV,GAAeviD,EAAO2iD,YACnCO,kBAAmBX,GAAeviD,EAAOmjD,iBACzCC,oBAAqBb,GAAeviD,EAAOqjD,mBAC3CC,oBAAqBf,GAAeviD,EAAOujD,mBAC3CC,iBAA6C,iBAApBT,GAAgCr5E,OAAOC,SAASo5E,GACrEx9E,KAAKC,IAAI,EAAGD,KAAKqE,MAAMm5E,SACvB,EACJU,gBAAiBlB,GAAeviD,EAAO4iD,eAAgB,QACvDc,gBAAiBnB,GAAeviD,EAAO0iD,eAAgB,iBACvDiB,sBAAuBb,GAAcJ,gBAAkBH,GAAeviD,EAAO0iD,eAAgB,iBAEjG,CAEA,SAASkB,GACP5jD,EACAtwB,EACAnJ,EACA4oB,GAGA,GADIshD,MACA1oD,GAAM87D,eAAgB,OAC1B,IAAM1iD,EAAW02C,GAAkB73C,GACnC,GAAKmB,GAAanB,EAAOnK,OACzB,IACE,IAAMkqD,EAAU,IAAIl9B,GAAQ,CAC1B1hB,WACAtL,OAAQmK,EAAOnK,OACfkuB,aAAc/jB,EAAO+jB,cAAgB/jB,EAAOnK,OAC5CuL,gBAAiBpB,EAAOoB,gBACxBlL,UAAW/G,QAAU,EACrBw1B,gBAAiB,IACjBC,aAAc,EACdG,OAAQh9B,GAAMg9B,OACdC,YAAaj9B,GAAMi9B,YACnB1f,YAAatF,EAAO8jD,cAAcC,WAAa,eAEjDhE,EAAQv0D,MAAM,CACZ9b,OACAnJ,KAAM,IAAKs8E,GAAmB7iD,MAAYz5B,GAC1C6O,IAAKvS,MAEFk9E,EAAQhrC,QAAQvQ,QAAQ,IAAMu7C,EAAQrsC,OAC7C,OAEA,CACF,CAUA,SAASswC,KACP,OAASp+E,OAA0BiyB,YAAc,CAAC,CACpD,CAEA,SAASosD,GAAapwE,GACpB,IAAM+sE,EAAah7E,OACbgyB,EAAOgpD,EAAW/oD,WAAa+oD,EAAW/oD,YAAc,CAAC,EACzDtpB,EAAUqpB,EAAK/jB,GACrB,GAAuB,iBAAZtF,GAAwB7E,OAAOC,SAAS4E,GAAU,OAAOA,EACpE,IAAMlL,EAAMD,KAAKC,MACjB,OAAAu0B,EAAK/jB,GAAQxQ,EACNA,CACT,CAEA,SAAS6gF,GAAWtsD,EAA+B/jB,GACjD,IAAM/I,EAAQ8sB,EAAK/jB,GACnB,MAAwB,iBAAV/I,GAAsBpB,OAAOC,SAASmB,GAASA,OAAQ,CACvE,CAEA,SAASq5E,GAAsBvsD,GAC7B,MAAO,I/Ct+EArpB,EAAUZ,EAASY,GAAWO,G+Cw+EnCouB,sBAAuBgnD,GAAWtsD,EAAM,yBACxCuF,iBAAkB+mD,GAAWtsD,EAAM,oBACnCwF,mBAA8C,IAA3BxF,EAAKwF,kBACxBC,cAAoC,IAAtBzF,EAAKyF,aACnB+mD,cAAeF,GAAWtsD,EAAM,kBAAoB,EACpDysD,wBAAwD,IAAhCzsD,EAAKysD,uBAEjC,CAEA,SAASC,GAAetkD,EAAoBsS,GAQ1C,IAAM1a,EAAOosD,KACPO,EAAoBjyC,EAAOiyC,mBAAqBnhF,KAAKC,MACrDmhF,EAAwBN,GAAWtsD,EAAM,4BACzCxpB,EAAW81E,GAAWtsD,EAAM,aAC5B+2C,EAASr8B,EAAOq8B,QAAU,CAAC,EAC3B8V,EAAkB5/E,OAAO+hB,OAAO+nD,GAAQvhE,OAAO,CAACD,EAAOrC,IAAUqC,GAASrC,GAAS,GAAI,GACvFs2E,EAAgB9uC,EAAOs8B,oBAAsB7mD,GAAM+4D,KAAKM,eAAiB,EAAI,EAC7EsD,OAA4C,IAAvBpyC,EAAOqyC,iBAC9B,EACAnW,GAAoBl8B,EAAOqyC,YAAcF,EAAkBrD,GACzDwD,EAAgB78D,GAAM/O,YAAY5L,OACtC,CAACD,EAAOwM,IAAexM,EAAQwM,EAAWwhB,UAAUp2B,OACpD,GAEIg8D,EAAc8hB,GAAmB7iD,GACvC,MAAO,CACLuhD,oBAAqBjvC,EAAOgvC,kBAC5BuD,cAAevyC,EAAOqyC,YACtBG,iBAAkBnW,EAAOmW,iBACzBC,oBAAqBpW,EAAOoW,oBAC5BC,iBAAkBrW,EAAOqW,iBACzBC,wBAAyBtW,EAAOsW,wBAChCC,qBAAsBvW,EAAOuW,qBAC7BC,qBAAsBT,EACtBU,gBAAiB9yC,EAAO+yC,cACxBl0C,SAAUppB,GAAMopB,SAChBm0C,cAAev9D,GAAM0zC,aACrB8pB,gBAAiBx9D,GAAM6pB,eACvBqxC,YAAaprE,OAAOkpD,EAAYkiB,aAChCC,kBAAmBrrE,OAAOkpD,EAAYmiB,mBACtCE,oBAAqBvrE,OAAOkpD,EAAYqiB,qBACxCE,oBAAqBzrE,OAAOkpD,EAAYuiB,qBACxCE,iBAA0D,iBAAjCziB,EAAYyiB,iBAAgCziB,EAAYyiB,sBAAmB,EACpGC,gBAAiB5rE,OAAOkpD,EAAY0iB,iBACpC+B,iBAAkBxlD,EAAOtmB,aAAa3U,QAAU,EAChD0gF,iBAAkB19D,GAAM/O,YAAYjU,OACpC2gF,eAAgBd,EAChBe,kBAAmBzB,GAAWtsD,EAAM,qBACpCguD,yBAA0BpB,EAC1BqB,oBAAqBtB,EACrBuB,kBAAmB5B,GAAWtsD,EAAM,qBACpCmuD,UAAW33E,EACX43E,mBAAoBxB,GAAyBp2E,EAAW7I,KAAKC,IAAI,EAAG4I,EAAWo2E,QAAyB,EACxGyB,iCAAkC/B,GAAWtsD,EAAM,oCACnDsuD,eAAgD,iBAAzBlmD,EAAOmmD,cAA6BnmD,EAAOmmD,mBAAgB,EAClFC,oBAAyD,iBAA7BpmD,EAAOqmD,kBAAiCrmD,EAAOqmD,uBAAoB,EAC/F3C,gBAAiB7rE,OAAOkpD,EAAY2iB,iBACpCC,sBAAuB9rE,OAAOkpD,EAAY4iB,0BACvCQ,GAAsBvsD,GAE7B,CAEA,SAAS0uD,KACP,IAAKv+D,GAAMk6D,cAAgBl6D,GAAMg4D,QAAS,OAC1C,IAAMkC,EAAcl6D,GAAMk6D,YAC1Bl6D,GAAMk6D,YAAc,KACpB,IAAM92E,EAAI4c,GAAM/O,YAAYjU,OAAS,EAAIgjB,GAAM/O,YAAY,GAAK,KAE1DyK,EAAoB,CACxB/T,KAAM,WACNnJ,KAAMg6E,GAAwB,IACzB0B,KACAkC,GALMH,OAMR74E,GAAGN,aAAcM,GAAGO,aACvB0J,IAAKvS,IACLgI,aAAcM,GAAGN,aACjBa,YAAaP,GAAGO,aAElBqc,GAAMg4D,QAAQv0D,MAAM/H,GACpB,IAAM8iE,E/C1jFCh4E,GAASc,SAAWF,G+C2jFrBtE,EAAeM,GAAGN,aAClBa,EAAcP,GAAGO,YACjB0J,EAAMvS,IACP0jF,EAAWhiE,KAAM1V,KACfA,GAAWkZ,GAAM87D,gBAAkBpT,OAAsB1oD,GAAMg4D,SACpEh4D,GAAMg4D,QAAQv0D,MAAM,CAClB9b,KAAM,UACNnJ,KAAMg6E,GAAwB,IACzB1xE,EACH23E,eAAe,GACd37E,EAAca,GACjB0J,MACAvK,eACAa,iBAGN,CAiBA,SAAS0zE,GAA0BF,EAAkC77E,EAAMD,KAAKC,OAC9E,OAAO67E,EACJ1lE,OAAQtL,GACY,iBAAZA,EAAMilB,GACbjlB,EAAMilB,GACa,iBAAZjlB,EAAMvJ,GACbuJ,EAAMvJ,GACa,iBAAZuJ,EAAMkmD,GACb1qD,OAAOC,SAASuE,EAAMkmD,IACtB/wD,EAAM6K,EAAMkmD,GAAKqyB,IAElBv7E,KAAK,CAACC,EAAGC,IAAMD,EAAEipD,EAAIhpD,EAAEgpD,GACvB/oD,OAAOq7E,GACZ,CAEA,SAASvH,KACP,IAAK9K,KAA4B,MAAO,GACxC,IACE,IAAM7pE,EAAMV,WAAWC,cAAc5F,QAAQwxE,IACvClrE,EAASD,EAAMpG,KAAKC,MAAMmG,GAAO,GACvC,OAAKE,MAAMC,QAAQF,GACZ20E,GAA0B30E,GADE,EAErC,OACE,MAAO,EACT,CACF,CAYA,SAASqrE,KACP,GAAKhsE,WAAWpG,SAChB,IACEoG,WAAWpG,SAASyG,OAAS,GAAGw8E,sCAClC,OAAS,CACX,CA+BA,SAASC,KACP,OAAOrhF,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,GAAKjI,KAAKC,MAAM2N,SAAS,GACnE,CAgBA,SAASsuE,KACP,GAAI7O,KACF,OAAAqF,KACO,GAET,IAAKhsE,WAAWpG,WAAaqkB,GAAMoH,OAAQ,MAAO,GAClD,IAAM+vD,EArDR,WACE,IAAM2H,EAAU,IAAI7oE,IACdkhE,EAAYC,KAClB,QAAS1nE,EAAQynE,EAAUn6E,OAAS,EAAG0S,GAAS,EAAGA,IAAS,CAC1D,IAAMyW,EAAWgxD,EAAUznE,GAC3B,IAAIovE,EAAQvsE,IAAI4T,EAASiF,KACzB0zD,EAAQ3qE,IAAIgS,EAASiF,EAAGjF,GACpB24D,EAAQrpE,MAAQ,IAAI,KAC1B,CACA,OAAO9S,MAAM0S,KAAKypE,EAAQjgE,UAAUkoC,SACtC,CA2CoBg4B,GAClB,IACE,IAAM30B,EA3CV,SACEj8B,EACAuL,EACAy9C,GAEA,IAAI33B,EAAY23B,EAAU7zE,QAC1B,OAAa,CAGX,IAAMb,EAAM,KAAK0rB,KAAauL,KAAa8lB,EAAUxzC,IAAK7F,GAAU,GAAGA,EAAMilB,KAAKjlB,EAAMvJ,KAAKuD,KAAK,OAC5FiqD,EAAUnmD,mBAAmBxB,GACnC,GAAI2nD,EAAQptD,QAAUgiF,GAA2C,OAAO50B,EACxE,GAAyB,IAArB5K,EAAUxiD,OAAc,OAAO,KACnCwiD,EAAYA,EAAUl8C,MAAM,EAC9B,CACF,CA4BoB27E,CACdj/D,GAAMoH,OAvBZ,WACE,IAAM83D,EAAmBl/D,GAAMg4D,SAAS96B,eACxC,GAAIgiC,EAAkB,OAAOA,EAC7B,IACE,IAAM7zE,EAAWtJ,WAAW5F,gBAAgBC,QAAQ+iF,IACpD,GAAI9zE,EAAU,OAAOA,EACrB,IAAME,EAAUszE,KAChB,OAAA98E,WAAW5F,gBAAgBc,QAAQkiF,GAAqB5zE,GACjDA,CACT,OACE,OAAOszE,IACT,CACF,CAYMO,GACAjI,GAEF,IAAK/sB,EACH,OAAA2jB,KACOoJ,EAETp1E,WAAWpG,SAASyG,OAClB,GAAGw8E,MAAgCx0B,oCAA0Ci1B,IACjF,OACEtR,IACF,CACA,OAAOoJ,CACT,CAyBA,SAASmI,KACP,IAAMngC,EAAS,IAAIlpC,IACnB,QAAWkQ,KAAYixD,KACrBj4B,EAAOhrC,IAAIgS,EAASiF,EAAG,CAAEtoB,aAAcqjB,EAASiF,EAAGznB,YAAawiB,EAASvpB,IAE3E,QAAWgV,KAAcoO,GAAM/O,YAC7BkuC,EAAOhrC,IAAIvC,EAAW9O,aAAc,CAClCA,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,cAG5B,OAAOhB,MAAM0S,KAAK8pC,EAAOtgC,UAAUvb,MAAM,EAAGq7E,GAC9C,CAEA,SAASY,GAAuBx8E,GAC9B,GAAqB,iBAAVA,GAAsBpB,OAAOC,SAASmB,GAAQ,OAAO+M,OAAO/M,GACvE,GAAqB,iBAAVA,EAAoB,OAAO,KACtC,IAAMQ,EAAUR,EAAM9C,OACtB,OAAOsD,EAAUA,EAAQD,MAAM,EAAG,KAAO,IAC3C,CAWA,SAASk8E,KAKP,UAAW3hF,OAAW,YAAsBlC,SAAa,IAAa,OAAO,KAC7E,IAAMo5C,SAAoBh6C,SAAa,IAAcA,SAASuS,KAAO,GACrE,GAAI0S,GAAMy/D,4BAA8B1qC,QAA+C,IAAjC/0B,GAAM0/D,uBAC1D,OAAO1/D,GAAM0/D,uBAEf,IAAMn6E,EAAI1H,OACJ8hF,EAAsB,CAC1Bp6E,EAAEq6E,oBACF1W,GAAS3jE,EAAG,gCACZ2jE,GAAS3jE,EAAG,yBAER0wE,EAAYtzE,MAAMC,QAAQ2C,EAAE0wE,WAAa1wE,EAAE0wE,UAAY,GAC7D,QAAWnkE,KAAQmkE,EAAW,CAC5B,IAAKnkE,GAAwB,iBAATA,GAAqBnP,MAAMC,QAAQkP,GAAO,SAC9D,IAAMq/D,EAAYoO,GAAwBztE,EAAiC4J,OACzD,aAAdy1D,GAA0C,gBAAdA,GAA6C,uBAAdA,IAC/DwO,EAAShtE,KAAKu2D,GAASp3D,EAAM,uBAC7B6tE,EAAShtE,KAAKu2D,GAASp3D,EAAM,cAC7B6tE,EAAShtE,KAAKb,GAChB,CAEA,IAAIynD,EAAiC,KACjCD,EAA6B,KAC7BlwB,EArCN,WACE,GAAuB,YAAnBppB,GAAMopB,UAA6C,aAAnBppB,GAAMopB,SAAyB,OAAOppB,GAAMopB,SAChF,IAAM7jC,EAAIxD,WACV,OAAIwD,EAAEs6E,eAAuB,WACzBt6E,EAAE4K,QAAgB,UAClB5K,EAAEu6E,IAAMv6E,EAAEw6E,mBAA2B,cAClC,QACT,CA8BiBC,GACXC,GAAe,EACnB,QAAWtpE,KAAUgpE,EAAU,CAC7B,IAAKhpE,GAA4B,iBAAXA,GAAuBhU,MAAMC,QAAQ+T,GAAS,SACpEspE,GAAe,EACf,IAAMz8E,EAASmT,EACf4iD,IAAoBgmB,GAClB/7E,EAAO+1D,iBAAmB/1D,EAAOmuE,SAAWnuE,EAAO08E,UAAY18E,EAAO28E,gBAExE7mB,IAAgBimB,GACd/7E,EAAO81D,aAAe91D,EAAO48E,cAAgB58E,EAAO68E,QAAU78E,EAAO28E,gBAEvE,IAAMG,EAAiBf,GAAuB/7E,EAAO4lC,WAEhC,YAAnBk3C,GACmB,aAAnBA,GACmB,gBAAnBA,GACmB,WAAnBA,GACmB,WAAnBA,KAEAl3C,EAAWk3C,EAEf,CAEA,IAAKL,EAAc,CACjB,IAAMM,EAAY5kF,SAASmZ,cAA2B,wBAChD0rE,EAAgB7kF,SAASmZ,cAA2B,4BACpD2rE,EAAalB,GAAuBgB,GAAW7nE,QAAQgoE,aACvDC,EAAiBpB,GAAuBiB,GAAe9nE,QAAQkoE,kBACjEH,GAAcE,KAChBV,GAAe,EACf1mB,IAAoBknB,EACpBnnB,IAAgBqnB,EAEpB,CAEA,GAAIV,EACF,IACE,IAAM1jF,EAAS,IAAIC,gBAAgBzB,SAAS0B,QAC5C88D,IAAoBgmB,GAClBhjF,EAAOM,IAAI,oBAAsBN,EAAOM,IAAI,YAAcN,EAAOM,IAAI,aAEvEy8D,IAAgBimB,GACdhjF,EAAOM,IAAI,gBAAkBN,EAAOM,IAAI,iBAAmBN,EAAOM,IAAI,kBAE1E,OAAS,CAGX,IAAM0f,EAAS0jE,IAAiB1mB,GAAmBD,GAC/C,CAAElwB,WAAUmwB,kBAAiBD,eAC7B,KACJ,OAAAt5C,GAAMy/D,0BAA4B1qC,EAClC/0B,GAAM0/D,uBAAyBnjE,EACxBA,CACT,CAgBA,SAASm8D,GAA4BzgD,GAEnC,GADIjY,GAAM87D,gBAAkBpT,OACvB1oD,GAAMg4D,QAAS,OACpB,IAAM5+C,EA7RR,SAA+BnB,GAC7B,OAAKA,EAAOmB,SACLy2C,GAAkB53C,EAAOmB,UAAY,kBADf,IAE/B,CA0RmBynD,CAAsB5oD,IAClCmB,IAAanB,EAAOnK,SAAWmK,EAAOoB,iBAE3Cx7B,OAAOuD,WAAW,KAChB,IAAM0/E,EAAWtB,KACjB,IAAKsB,EAAU,OACf,IAAM7vE,EAAcquE,KACpB,GAA2B,IAAvBruE,EAAYjU,OAAc,OAC9B,IAAM0H,EAzBV,SAAgCo8E,EAI7B7vE,GACD,MAAO,CACL,sBACA6vE,EAAS13C,SACT03C,EAASvnB,iBAAmB,GAC5BunB,EAASxnB,aAAe,GACxBroD,EAAYjF,IAAK4F,GAAe,GAAGA,EAAW9O,gBAAgB8O,EAAWjO,eAAexD,KAAK,MAAQ,QACrGA,KAAK,KAAKmD,MAAM,EAAG,IACvB,CAagBy9E,CAAuBD,EAAU7vE,GAC7C,IACE,GAAoC,MAAhC9U,eAAeC,QAAQsI,GAAc,MAC3C,OAAS,CACT,GAAIsb,GAAMghE,sBAAsBzuE,IAAI7N,GAAM,OAC1Csb,GAAMghE,sBAAsBjgF,IAAI2D,GAEhC,IASMi5B,EAAU,CACdmhB,QAAS7mB,EAAO+jB,cAAgB/jB,EAAOnK,OACvCixB,WAAY9mB,EAAOoB,gBACnB+P,SAAU03C,EAAS13C,SACnBmwB,gBAAiBunB,EAASvnB,gBAC1BD,YAAawnB,EAASxnB,YACtBnrC,UAAWnO,GAAMoH,QAAU,GAC3BsS,UAAW1Z,GAAMg4D,SAAS96B,gBAAkB,GAC5CjsC,cACA5D,IAAKvS,KAEDwC,EAAOjB,KAAKa,UAAUygC,GACtBsjD,EAAiB,KAGrB,WACa/tC,UAAc,KAA+C,mBAAzBA,UAAU6M,YACvD7M,UAAU6M,WAAW3mB,EAAU,IAAI4mB,KAAK,CAAC1iD,GAAO,CAAEqK,KAAM,qBAE5D,OAAS,GAEX9J,OAAOK,iBAAiB,WAAY+iF,EAAgB,CAAE5iF,MAAM,IACvD2d,MAAMod,EAAU,CACnB4C,OAAQ,OACRlX,QAAS,CAAE,eAAgB,oBAC3BxnB,OACA2+B,WAAW,IAEVzf,KAAMC,IACDA,EAAS5L,QAAU,KAAO4L,EAAS5L,OAAS,MAtC9B,MACpB,IACE1U,eAAec,QAAQyH,EAAK,IAC9B,OAAS,GAoCLw8E,GAKArjF,OAAOS,oBAAoB,WAAY2iF,MAG1C3kD,MAAM,QACNG,QA3CkB,KACnBzc,GAAMghE,sBAAsBxzE,OAAO9I,MA2CpC,EACL,CAEA,SAASy8E,GAAenxD,EAAkB3b,EAAiB+sE,EAAgB1uE,GACzE,OAAiB,IAAbsd,EAAuBtd,EAAY,UAAY,eAC/C2B,GAAW2b,GAAuB,IAAXoxD,EAAqB,UAC5C/sE,EAAU,EAAU,UACjB,MACT,CA4DA,SAASgtE,GAAoBppD,EAAoBtmB,GAC/C,GAAIqO,GAAMg0D,iBAAkB,OAC5B,GAAIh0D,GAAMshE,oBAWR,YAJKthE,GAAMshE,oBAAoB9kE,KAAK,KAC9BwD,GAAMiY,SAAWA,GACrBopD,GAAoBppD,EAAQtmB,KAMhC,GAFIqO,GAAM87D,gBACNpT,OACC1oD,GAAMuhE,wBAAyB,OAEpC,IAAMC,EAAiD,kBAA1BvpD,EAAO4iD,gBAC/B76D,GAAMgqB,UAAUe,uBA3jCvB,SAA8B9S,GAG5B,GAFIjY,GAAMg4D,SACNh4D,GAAM87D,gBACN97D,GAAM2oD,sBAAuB,OACjC,IAAM8Y,EAAiB3R,GAAkB73C,GACpCwpD,IAELzhE,GAAMg4D,QAAU,IAAIl9B,GAAQ,CAC1B1hB,SAAUqoD,EACV3zD,OAAQmK,EAAOnK,OACfkuB,aAAc/jB,EAAO+jB,cAAgB/jB,EAAOnK,OAC5CuL,gBAAiBpB,EAAOoB,gBACxBlL,UAAWnO,GAAMoH,aAAU,EAC3B01B,oBAAqB,KACnB,IAAM15C,EAAI4c,GAAM/O,YAAYjU,OAAS,EAAIgjB,GAAM/O,YAAY,GAAK,KAChE,OAAO7N,EAAI,CAAEN,aAAcM,EAAEN,aAAca,YAAaP,EAAEO,aAAgB,MAE5Eo5C,oBAAqBA,GACrBC,OAAQh9B,GAAMg9B,OACdC,YAAaj9B,GAAMi9B,YACnB1f,YAAatF,EAAO8jD,cAAcC,WAAa,eAEpBh0D,GAAS,UAAW,kBAAmB,CAAEoR,SAAUqoD,EAAgBzkC,OAAQh9B,GAAMg9B,SAC9Gh9B,GAAMg4D,QAAQvoE,QAChB,EAoiCEiyE,CAAqBzpD,GAChBupD,IAgXP,SAA4C7vE,GAI1C,IAHK26D,MAGDtsD,GAAMg9B,OAAQ,OAClB,IAAM2kC,EAAOC,GAAejwE,GAC5B,QAAWC,KAAcoO,GAAM/O,YAAa,CAK1C,GAFI4wE,GAA8BtvE,IAAIX,IAClCA,EAAW8d,MAA4B,eAApB9d,EAAW8d,MAC9B1P,GAAMlT,WAAW8E,EAAW9O,cAAe,SAC/C,IAAMpB,EAAaigF,EAAK9kF,IAAI+U,EAAW9O,eAClCpB,IAAeogF,GAAgCpgF,KAC5BA,EAAWk/C,WAAW1uC,KAC3CkwC,GAAcA,EAAUvhD,KAAO+Q,EAAWjO,cAG7CQ,EAA+BzC,EAAYkQ,EAAWjO,YACxD,CACF,CAnYIo+E,CAAmCpwE,GACnCqwE,MAEFzD,KAlCF,WACE,IAAKv+D,GAAMg4D,SAAWtP,MAA4D,IAAvC1oD,GAAMiiE,sBAAsBjlF,OAAc,OACrF,IAAM6hD,EAAS7+B,GAAMiiE,sBAAsBr1C,OAAO,GAClD,QAAWlxB,KAASmjC,EAClB7+B,GAAMg4D,QAAQv0D,MAAM/H,EAExB,CA6BEwmE,GACA,IAAMC,EAAuB5K,KACxBiK,IA3TP,SAAsCrK,GACpC,IAAKA,EAAUn6E,OAAQ,OACvB,IAAMolF,EAAW,IAAI5wE,IAAI2lE,EAAUnrE,IAAK7F,GAAU,GAAGA,EAAMilB,KAAKjlB,EAAMvJ,MACtE,QAAWgV,KAAcoO,GAAM/O,YAE3B4wE,GAA8BtvE,IAAIX,IAClCwwE,EAAS7vE,IAAI,GAAGX,EAAW9O,gBAAgB8O,EAAWjO,gBAEtDqc,GAAM80D,sBAAsB/zE,IAAI+xE,GAAsBlhE,GAG5D,CAiTIywE,CAA6BF,GAC7BlO,GAAuBh8C,GACvBy/C,GAAkB13D,GAAM/O,YAAaU,GACrCmmE,GAAqB93D,GAAM/O,YAAaU,GA5yB5C,SAA+BsmB,IACxBjY,GAAMg4D,SAAWtP,MAClB1oD,GAAMs4D,oBACVjxE,QAAAL,UAAAwV,KAAA,KAAA8lE,KAAAC,KAAqB/lE,KAAK,EAAGqyC,4BACtB7uC,GAAMg4D,SAAWtP,MAAqB1oD,GAAMs4D,qBACjDt4D,GAAMs4D,mBAAqBzpB,EAAqB52B,EAAOuqD,iBAAkB/+D,OACxE6Y,MAAM,OACX,CAsyBImmD,CAAsBxqD,IAExBygD,GAA4BzgD,GAC5BjY,GAAMg0D,kBAAmB,EACpBwN,GAAsBkB,GAAmCzqD,GACjCmwC,GAAM,QAAS,0BAA2B,CAAEn3D,YAAa+O,GAAM/O,YAAYjU,SACxG9B,EAAYu9E,IACRz4D,GAAMoX,kBAAoBoqD,GAC5BmB,IAEJ,CAEA,SAASC,GAAuB3qD,EAAoBtmB,GAClDu+D,KACA,IAAM9sC,EAAM,KACV8sC,KACAmR,GAAoBppD,EAAQtmB,IAGxBkxE,EAAc7iE,GAAM4nD,sBAE1B5nD,GAAMmwD,mBAAqBtyE,OAAOuD,WAAWgiC,EAAKy/C,GAGlD,IAAMC,EADI/gF,WACYozD,oBACK,mBAAhB2tB,IACT9iE,GAAMswD,gBAAmBwS,EAGZ1/C,EAAK,CAAE1e,QAASm+D,IAEjC,CAEA,SAASE,KAGP,GAFI/iE,GAAMg4D,UAAYh4D,GAAMiY,QACxBywC,OACC1oD,GAAMuhE,wBAAyB,OAEpC,IAAM5vE,EAAcqO,GAAMiY,OAAOtmB,aAAe,GAChD0vE,GAAoBrhE,GAAMiY,OAAQtmB,EACpC,CAEA,SAASqxE,GAAkBl1D,EAAgBm1D,GAEzC,OAAOnV,GAA0BhgD,EAAS,KAD9Bm1D,GAAkB,aAEhC,CAEA,SAAS5xB,GAAiB3hC,GACxB,IACE,IAAM/qB,EAAU5C,WAAW2tB,GAC3B,IAAK/qB,EAAS,OAAO,EACrB,IAAMD,EAAM,yBACZ,OAAAC,EAAQ1H,QAAQyH,EAAK,KACrBC,EAAQwI,WAAWzI,IACZ,CACT,OACE,OAAO,CACT,CACF,CA8CA,SAASw+E,GACPvxE,EACAwxE,EACAh6C,EACAzV,EACArV,EACA60D,GAEA,IACE,OAAO72E,KAAKa,UAAU,CACpByU,cACAwxE,gBAAiBA,GAAmB,GACpCh6C,QAASA,GAAW,KACpBzV,QAASA,GAAW,KACpBrV,QAASA,GAAW,GACpB60D,SAAUA,GAAY,MAE1B,OACE,MAAO,EACT,CACF,CAoCA,SAASkQ,GACPnrD,EACAvE,EACAyV,GAEA,IAAKzV,GAA8B,iBAAZA,EACrB,OAAOyV,EAAU,IAAKlR,EAAQkR,WAAYlR,EAE5C,IAAMiH,EAAIxL,EACJ2zC,EAAcnoC,EAAEmoC,aAAwC,iBAAlBnoC,EAAEmoC,YAA2BnoC,EAAEmoC,YAAc,CAAC,EACpFgc,EAAUnkD,EAAEmkD,SAAgC,iBAAdnkD,EAAEmkD,QAAuBnkD,EAAEmkD,QAAU,CAAC,EACpEC,EAAgBpkD,EAAEokD,eAA4C,iBAApBpkD,EAAEokD,cAA6BpkD,EAAEokD,cAAgB,CAAC,EAC5FC,EAAQrkD,EAAEqkD,OAA4B,iBAAZrkD,EAAEqkD,MAAqBrkD,EAAEqkD,WAAQ,EAC3DC,EAActkD,EAAEskD,aAAwC,iBAAlBtkD,EAAEskD,YAA2BtkD,EAAEskD,iBAAc,EACnFla,EAAcpqC,EAAEoqC,aAAwC,iBAAlBpqC,EAAEoqC,YAA2BpqC,EAAEoqC,iBAAc,EACnF1/B,EAAM1K,EAAE0K,KAAwB,iBAAV1K,EAAE0K,IAAmB1K,EAAE0K,SAAM,EACnDqmC,EAAmB/wC,EAAE+wC,kBAAkD,iBAAvB/wC,EAAE+wC,iBAAgC/wC,EAAE+wC,sBAAmB,EACvGwT,EAAoB9gF,MAAMC,QAAQs8B,EAAEukD,mBAAqBvkD,EAAEukD,uBAAoB,EAC/E9N,EAAuBz2C,EAAEy2C,sBAA0D,iBAA3Bz2C,EAAEy2C,qBAAoCz2C,EAAEy2C,0BAAuB,EACvHtH,EAAcnvC,EAAEmvC,aAAwC,iBAAlBnvC,EAAEmvC,YAA2BnvC,EAAEmvC,iBAAc,EACnF0N,EAAe78C,EAAE68C,cAA0C,iBAAnB78C,EAAE68C,aAA4B78C,EAAE68C,kBAAe,EACvF2H,EAAmBxkD,EAAEwkD,kBAAkD,iBAAvBxkD,EAAEwkD,iBAAgCxkD,EAAEwkD,sBAAmB,EACvG7a,EAAiB3pC,EAAE2pC,gBAA8C,iBAArB3pC,EAAE2pC,eAA8B3pC,EAAE2pC,oBAAiB,EAC/F2Z,EAAmBtjD,EAAEsjD,kBAAkD,iBAAvBtjD,EAAEsjD,iBAAgCtjD,EAAEsjD,sBAAmB,EACvGmB,EAAiBzkD,EAAEykD,gBAA8C,iBAArBzkD,EAAEykD,eAA8BzkD,EAAEykD,oBAAiB,EAErG,MAAO,IACF1rD,EACHkR,QAASA,GAAWlR,EAAOkR,QAC3Bi+B,gBAAiBC,EAAY7nE,MAAQy4B,EAAOmvC,gBAC5CE,qBAAsBD,EAAY5nE,WAAaw4B,EAAOqvC,qBACtDU,qBAAsBX,EAAY1nE,WAAas4B,EAAO+vC,qBACtD4b,iBAAkBP,EAAQO,kBAAoB3rD,EAAO2rD,iBACrDC,qBAAsB,IACjB5rD,EAAO4rD,qBACVC,mBAAoBR,EAAcQ,oBAAsB7rD,EAAO4rD,sBAAsBC,mBACrFC,kBAAmBT,EAAcS,mBAAqB9rD,EAAO4rD,sBAAsBE,mBAErFza,YAAaA,EAAc,IAAKrxC,EAAOqxC,eAAgBA,GAAgBrxC,EAAOqxC,YAC9Eia,MAAOA,EAAQ,IAAKtrD,EAAOsrD,SAAUA,GAAUtrD,EAAOsrD,MACtDC,YAAaA,EAAc,IAAKvrD,EAAOurD,eAAgBA,GAAgBvrD,EAAOurD,YAC9E55C,IAAKA,EAAM,IAAK3R,EAAO2R,OAAQA,GAAQ3R,EAAO2R,IAC9CqmC,iBAAkBA,EAAmB,IAAKh4C,EAAOg4C,oBAAqBA,GAAqBh4C,EAAOg4C,iBAClGwT,kBAAmBA,GAAqBxrD,EAAOwrD,kBAC/C9N,qBAAsBA,EAAuB,IAAK19C,EAAO09C,wBAAyBA,GAAyB19C,EAAO09C,qBAClHtH,YAAaA,EAAc,IAAKp2C,EAAOo2C,eAAgBA,GAAgBp2C,EAAOo2C,YAC9E0N,aAAcA,EAAe,IAAK9jD,EAAO8jD,gBAAiBA,GAAiB9jD,EAAO8jD,aAClF2H,iBAAkBA,EAAmB,IAAKzrD,EAAOyrD,oBAAqBA,GAAqBzrD,EAAOyrD,iBAClG7a,eAAgBA,EAAiB,IAAK5wC,EAAO4wC,kBAAmBA,GAAmB5wC,EAAO4wC,eAC1F2Z,iBAAkBA,EAAmB,IAAKvqD,EAAOuqD,oBAAqBA,GAAqBvqD,EAAOuqD,iBAClGmB,eAAgBA,EAAiB,IAAK1rD,EAAO0rD,kBAAmBA,GAAmB1rD,EAAO0rD,eAE9F,CASA,SAASK,GAAU/1D,EAAiB7G,EAAgB4rB,GAClD,OAAI/kB,EAAIuzB,eAA6C,MAA5BxO,EAAM/kB,EAAIuzB,eAC1B1xC,OAAOkjC,EAAM/kB,EAAIuzB,gBAEnBp6B,CACT,CAEA,SAAS68D,GACPviF,EACA0gD,EACA1yC,EACA1K,GAEA,MAAO,CACLlC,aAAcpB,EAAWb,GACzBwhD,eAAgB3gD,EAAWoK,KAC3BnI,YAAay+C,EAAUvhD,GACvB6O,QACA0jB,UAAWgvB,EAAUhvB,UACrBrwB,MAAOq/C,EAAUr/C,MACjBu/C,YAAa5gD,EAAW4gD,YACxBywB,gBAAiBrxE,EAAWqxE,gBAC5BrjD,KAAMhuB,EAAWguB,OAAShuB,EAAWqxE,gBAAkB,kBAAoBrxE,EAAW4gD,YAAc,eAAiB,cACrHqxB,cAAejyE,EAAW1B,IAC1B4zE,aAAclyE,EAAWsuC,GACzBk0C,kBAAmBxiF,EAAW+/C,QAC9BzhD,IAAKoiD,EAAUpiD,IACfgwC,GAAIoS,EAAUpS,GACdyR,QAASW,EAAUX,QACnBC,eAAgBU,EAAUV,eAC1BC,cAAeS,EAAUT,cACzBY,eAAgBH,EAAUG,eAC1B7vC,YAAmB0vC,EAAU1vC,UAC7B1N,YACAvD,gBAAiB8C,EAA2B9C,gBAAgBC,GAEhE,CAKA,SAASyiF,GACPxyE,GAEA,GAAK26D,OAA8BtsD,GAAMg9B,SAAUh9B,GAAM87D,eAGzD,OlDrwGK,SACLnqE,EACA5N,EAAUN,KAEV,IAAM2gF,EAAU,IAAI5yE,IAAIG,EAAY3F,IAAKtK,GAAeA,EAAWb,KAC/DyD,GAAU,EACd,QAAWxB,KAAgBhG,OAAOC,KAAKgH,GAChCqgF,EAAQ7xE,IAAIzP,YACRiB,EAAQjB,GACfwB,GAAU,GAGd,OAAIA,GAASR,EAA0BC,GAChCA,CACT,CkDuvGSsgF,CAA0B1yE,EACnC,CAEA,SAAS2yE,GACP5iF,EACAy+C,EACAokC,EACA5rC,EACAqjB,EACAhmC,GAEA,IAAMpkB,EAAaqyE,GACjBviF,EACAy+C,EAAUiC,UACVjC,EAAUzwC,MACV60E,GAEa,oCAAXvuD,GACF6rD,GAA8B9gF,IAAI6Q,GAEpC+mC,EAAMhmC,KACJ,CACE9R,GAAI,UACJqJ,MAAO,qBACP2G,OAAQ,UACRmlB,OAAQ,wBAEV,CACEn1B,GAAI,aACJqJ,MAAO,uBACP2G,OAAQ,SACRmlB,SACAoS,OAAQ,CACNzkC,YAAaw8C,EAAUiC,UAAUvhD,GACjC6O,MAAOywC,EAAUzwC,MACjB9L,MAAOu8C,EAAU38C,OAAOI,SAI9B,QAAWgjD,KAAQjO,EAAMr1C,OAAM,GAAkCmlE,GAAU/mE,EAAYklD,GACvF,OAA6B4hB,GAAU,8BAA8BroB,EAAUiC,UAAUvhD,KAAM,CAC7FiC,aAAcpB,EAAWb,GACzB6O,MAAOywC,EAAUzwC,MACjB9L,MAAOu8C,EAAU38C,OAAOI,MACxB4gF,UAAsB,oCAAXxuD,IAEgBhO,GAAS,OAAQ,GAAGtmB,EAAWb,6BAA6Bs/C,EAAUzwC,QAAS,CAC1G/L,YAAaw8C,EAAUiC,UAAUvhD,GACjC+C,MAAOu8C,EAAU38C,OAAOI,MACxB4gF,UAAsB,oCAAXxuD,IAEgBoyC,GAAM,OAAQ,GAAG1mE,EAAWb,uBAAuBs/C,EAAUzwC,QAAS,CACjG/L,YAAaw8C,EAAUiC,UAAUvhD,GACjC+C,MAAOu8C,EAAU38C,OAAOI,MACxB4gF,UAAsB,oCAAXxuD,IAEN,CACLpkB,aACAi/B,WAAY4zC,GACV/iF,EACAi3C,EACA/mC,EACAokB,GACA,EACAgmC,GAGN,CAEA,SAASwc,GACPh6E,EACAsE,EACAa,GAEA,IAAKb,IAAiBa,EAAa,OAAOnF,EAC1C,IAAMoT,EAAaoO,GAAM/O,YAAYY,KAClCC,GACCA,EAAKhP,eAAiBA,GAAgBgP,EAAKnO,cAAgBA,GAG/D,OADKiO,GAAYnQ,iBACbmQ,EAAW8d,MAA4B,eAApB9d,EAAW8d,KAA8BlxB,EACzD,IAAMA,GAAQ,CAAC,EAAIiU,iBAAkBb,EAAWnQ,gBACzD,CAEA,SAASqgF,GAAgCpgF,GACvC,OAAQA,EAAWguB,MAA4B,eAApBhuB,EAAWguB,IACxC,CAwBA,SAAS+0D,GACP/iF,EACAi3C,EACA/mC,EACAokB,EACA+lC,GAAS,EACTC,GAEA,IAAM0oB,EAAS/rC,EAAM9mC,KAAM+0C,GAAyB,WAAhBA,EAAK/1C,QACzC,MAAO,CACL/N,aAAcpB,EAAWb,GACzBwhD,eAAgB3gD,EAAWoK,KAC3B+E,OAAQe,EAAa,SAAW,SAChCokB,OAAQA,GAAU0uD,GAAQ1uD,OAC1B8wB,oBAAqBl1C,GAAYjO,YACjCghF,uBAAwB/yE,GAAYlC,MACpCqsD,SACApjB,WACIqjB,EAAsB,CAAEA,uBAAwB,CAAC,EAEzD,CAEA,SAAS4oB,GACPljF,EACA0tC,GAOA,IAAMuJ,EAAoC,GAO1C,GAN6B6vB,GAAU,wBA7gGzC,SAAmB3nE,EAAYiL,GAC7B,OAAOA,GAAQA,IAASjL,EAAK,IAAIiL,OAAUjL,KAAQA,CACrD,CA2gGiEgkF,CAAUnjF,EAAWb,GAAIa,EAAWoK,QAAS,CAC1G4jB,KAAMhuB,EAAWguB,MAAQ,aACzB7e,OAAQnP,EAAWmP,QAAU,UAC7B+vC,WAAYl/C,EAAWk/C,WAAW5jD,UAG/B0E,EAAWk/C,WAAW5jD,OACzB,OAAA27C,EAAMhmC,KAAK,CAAE9R,GAAI,aAAcqJ,MAAO,uBAAwB2G,OAAQ,SAAUmlB,OAAQ,kBAC3DhO,GAAS,OAAQ,GAAGtmB,EAAWb,4BAC/BunE,GAAM,OAAQ,GAAG1mE,EAAWb,4BAClD,CAAE+Q,WAAY,KAAMi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO,KAAM,kBAGvF,IAAMmsC,EAAc9kE,GAAMlT,WAAWpL,EAAWb,IAC1CkkF,EAAYD,EACdpjF,EAAWk/C,WAAWid,UAAWjhE,GAAMA,EAAEiE,KAAOikF,IAChD,EACEE,EAAkBD,GAAa,EAAIrjF,EAAWk/C,WAAWmkC,GAAa,KAEtEzkB,GAAY5+D,EAAWmP,QAAgC,YAAtBnP,EAAWmP,OAQlD,GAPA8nC,EAAMhmC,KAAK,CACT9R,GAAI,cACJqJ,MAAO,oBACP2G,OAAQm0E,EAAkB,UAAY1kB,EAAW,SAAW,SAC5DtqC,OAAQgvD,EAAkB,mBAAqB1kB,EAAW,UAAY,UAAU5+D,EAAWmP,WAEhE43D,GAAU/mE,EAAYi3C,EAAMA,EAAM37C,OAAS,KACnEgoF,IAAoB1kB,EACvB,OAA6Bt4C,GAAS,OAAQ,GAAGtmB,EAAWb,oBAAoBa,EAAWmP,WAC9Du3D,GAAM,OAAQ,GAAG1mE,EAAWb,oBAAoBa,EAAWmP,WACjF,CAAEe,WAAY,KAAMi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO,KAAM,UAAUj3C,EAAWmP,WAG5G,IAAM0zE,EAASP,GAAUtiF,EAAY0tC,EAAIhoB,OAAQgoB,EAAIhuB,YAC/C++B,EACJ/Q,EAAI61C,sBAAwBnD,GAAgCpgF,GlDt6GzD,SACLA,EACAqC,EAAUN,KAEV,IAAMD,EAASO,EAAQrC,EAAWb,IAElC,IADK2C,GACDA,EAAOI,QAAUnC,EAAgBC,GAAa,OAAO,KACzD,IAAMgO,EAAQhO,EAAWk/C,WAAWid,UACjCzb,GAAcA,EAAUvhD,KAAO2C,EAAOG,aAEzC,OAAI+L,EAAQ,EAAU,KACf,CAAE0yC,UAAW1gD,EAAWk/C,WAAWlxC,GAAQA,QAAOlM,SAC3D,CkD25GQ0hF,CAAuBxjF,EAAY0tC,EAAI61C,sBACvC,KAEA9yC,EAAYuH,GAA+Bh4C,EAAWywC,UAAW,CAAE9kC,IAAK+hC,EAAI/hC,IAAK+T,WAAYguB,EAAIhuB,aACvGu3B,EAAMhmC,QAAQw/B,EAAUwG,OACxB,QAAWiO,KAAQzU,EAAUwG,MAAoC8vB,GAAU/mE,EAAYklD,GACvF,IAAKzU,EAAUplB,QAAS,CAItB,IAAMo4D,IAHehzC,EAAUwG,MAAMzmC,KAClC00C,GAAqB,SAAZA,EAAK/lD,IAAiC,WAAhB+lD,EAAK/1C,SAGnC6oC,GACE,IACKh4C,EAAWywC,UACd9kC,IAAK,GACLwrC,UAAW,GAGXpK,MAAO,IAET,CAAEphC,IAAK+hC,EAAI/hC,IAAK+T,WAAYguB,EAAIhuB,aAChC2L,QAEN,GACEozB,GACuC,eAAvCilC,GAAuB1jF,IACvByjF,EAEA,OAAOb,GACL5iF,EACAy+C,EACAokC,EACA5rC,EACAxG,EAAU/B,WACV,mCAGJ,IAAMpa,EAASmc,EAAUwG,MAAM9mC,KAAM+0C,GAAyB,WAAhBA,EAAK/1C,SAAsBmlB,QAAU,qBACnF,OAA6BhO,GAAS,OAAQ,GAAGtmB,EAAWb,iCAC/BunE,GAAM,OAAQ,GAAG1mE,EAAWb,iCAClD,CAAE+Q,WAAY,KAAMi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO,KAAM3iB,GAAQ,EAAOmc,EAAU/B,YAChH,CAEA,GAAI40C,EAAiB,CACnB,IAAMpzE,EAAaqyE,GAAgBviF,EAAYsjF,EAAiBD,EAAW31C,EAAIhoB,QAC/EuxB,EAAMhmC,KACJ,CAAE9R,GAAI,UAAWqJ,MAAO,qBAAsB2G,OAAQ,UAAWmlB,OAAQ,oBACzE,CAAEn1B,GAAI,aAAcqJ,MAAO,uBAAwB2G,OAAQ,SAAUmlB,OAAQ,qBAE/E,QAAW4wB,KAAQjO,EAAMr1C,OAAM,GAAkCmlE,GAAU/mE,EAAYklD,GACvF,OAA6B4hB,GAAU,uBAAuBsc,IAAe,CAC3EhiF,aAAcpB,EAAWb,GACzB6O,MAAOq1E,EACPhpB,QAAQ,IAEmB/zC,GAAS,OAAQ,GAAGtmB,EAAWb,0BAA0BkkF,IAAa,CAAEphF,YAAamhF,IACrF1c,GAAM,OAAQ,GAAG1mE,EAAWb,oBAAoBkkF,IAAa,CAAEphF,YAAamhF,IAClG,CAAElzE,aAAYi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO/mC,EAAY,oBAAoB,EAAMugC,EAAU/B,YAC3H,CACA,GAAI+P,EACF,OAAOmkC,GACL5iF,EACAy+C,EACAokC,EACA5rC,EACAxG,EAAU/B,WACV,wBAIJ,IAAMprC,EAAYiD,GAAYvG,EAAWb,GAAI0jF,GACvCc,EAAetgF,EAAoBC,EAAWtD,EAAWw/C,mBAAqB,GASpF,GARAvI,EAAMhmC,KAAK,CACT9R,GAAI,UACJqJ,MAAO,qBACP2G,OAAQw0E,EAAe,SAAW,SAClCrvD,OAAQqvD,EAAe,WAAa,qBACpCj9C,OAAQ,CAAEpjC,YAAWC,WAAYvD,EAAWw/C,mBAAqB,KAEtCunB,GAAU/mE,EAAYi3C,EAAMA,EAAM37C,OAAS,KACnEqoF,EACH,OAA6Br9D,GAAS,OAAQ,GAAGtmB,EAAWb,wCAAyC,CAAEmE,YAAWC,WAAYvD,EAAWw/C,oBAC5GknB,GAAM,OAAQ,GAAG1mE,EAAWb,gCAAiC,CAAEmE,YAAWC,WAAYvD,EAAWw/C,oBACvH,CAAEtvC,WAAY,KAAMi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO,KAAM,sBAAsB,EAAOxG,EAAU/B,aAI9H,IAGM1gC,EAAQxK,GAJKxD,EAAWw/C,mBAAqB,IAEnC,EAAIl8C,EAAY4D,GAAqBlH,EAAWb,GAAI0jF,GACpD7iF,EAAWk/C,WAAW50C,IAAKpP,GAAMA,EAAEmkD,SAEnD,GAAIrxC,EAAQ,GAAKA,GAAShO,EAAWk/C,WAAW5jD,OAC9C,OAAA27C,EAAMhmC,KAAK,CAAE9R,GAAI,aAAcqJ,MAAO,uBAAwB2G,OAAQ,SAAUmlB,OAAQ,sBACjF,CAAEpkB,WAAY,KAAMi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO,KAAM,qBAAqB,EAAOxG,EAAU/B,aAG7H,IAAMgS,EAAY1gD,EAAWk/C,WAAWlxC,GAClCkC,EAAaqyE,GAAgBviF,EAAY0gD,EAAW1yC,EAAO60E,GACjE,OAAIjY,OAA+BtsD,GAAMg9B,QAAU8kC,GAAgCpgF,IACjFyC,EAA+BzC,EAAY0gD,EAAUvhD,IAEvD83C,EAAMhmC,KAAK,CACT9R,GAAI,aACJqJ,MAAO,uBACP2G,OAAQ,SACRmlB,OAAQ,WACRoS,OAAQ,CAAEzkC,YAAay+C,EAAUvhD,GAAI6O,WAEV+4D,GAAU/mE,EAAYi3C,EAAMA,EAAM37C,OAAS,IAC3CwrE,GAAU,uBAAuBpmB,EAAUvhD,KAAM,CAC5EiC,aAAcpB,EAAWb,GACzB6O,QACA1K,cAE2BgjB,GAAS,OAAQ,GAAGtmB,EAAWb,4BAA4B6O,IAAS,CAAE/L,YAAay+C,EAAUvhD,GAAImE,cACjGojE,GAAM,OAAQ,GAAG1mE,EAAWb,aAAa6O,MAAU0yC,EAAUvhD,MAAO,CAAE8C,YAAay+C,EAAUvhD,GAAImE,cACvH,CAAE4M,aAAYi/B,WAAY4zC,GAAqB/iF,EAAYi3C,EAAO/mC,EAAY,YAAY,EAAOugC,EAAU/B,YACpH,CAEA,SAASk1C,GACP5jF,EACA0tC,GAOA,OAAOw1C,GAA2BljF,EAAY0tC,GAAKx9B,UACrD,CAsBA,SAAS2zE,GACPt0E,EACA8/B,GAEA,IAAMy0C,EAAc,IAAIh0E,IAClBi0E,EAA0B,IAAIj0E,IAC9Bk0E,EAAyB,GAE/B,QAAW9zE,KAAcX,EAAa,CACpC,IAAMvM,EAAMkN,EAAWmhE,iBAAiBruE,IACpCA,GAAO8gF,EAAYjzE,IAAI7N,GACzB+gF,EAAwB1kF,IAAI6Q,EAAW9O,eAGzC4iF,EAAS/yE,KAAKf,GACVlN,IAAsD,IAA/CkN,EAAWmhE,iBAAiB4S,gBACrCH,EAAYzkF,IAAI2D,GAEpB,CAEA,OAAKqsC,GAAgD,IAAjC00C,EAAwBhwE,KAIrC,CACLxE,YAAay0E,EACb30C,YAAaA,EAAY/kC,IAAK6kC,GAC5B40C,EAAwBlzE,IAAIs+B,EAAW/tC,cA/C7C,SACE+tC,GAEA,IAAQiW,oBAAqB8+B,EAAsBjB,uBAAwBkB,KAA4BC,GAASj1C,EAChH,MAAO,IACFi1C,EACHj1E,OAAQ,SACRmlB,OAAQ,4CACR2iB,MAAO,IACF9H,EAAW8H,MACd,CACE93C,GAAI,2BACJqJ,MAAO,2BACP2G,OAAQ,SACRmlB,OAAQ,8BAIhB,CA8BU+vD,CAAiCl1C,GACjCA,IARC,CAAE5/B,YAAay0E,EAAU30C,cAWpC,CA8BA,SAASi1C,GACPn1C,EACA7a,EACAoS,GAEA,MAAO,IACFyI,EACH8H,MAAO,IACF9H,EAAW8H,MACd,CACE93C,GAAI,kBACJqJ,MAAO,kBACP2G,OAAQ,SACRmlB,SACAoS,WAIR,CAEA,SAAS69C,GACPh1E,EACAkmB,EACA4Z,GAMA,IAAQ9/B,YAAai1E,EAAaC,a5CnrH7B,SACLl1E,EACAi/B,EACAd,GAOA,IAAM+2C,EAAsC,GAC5C,IAAKj2C,GAA4B,IAAlBA,EAAOlzC,OACpB,MAAO,CAAEiU,cAAak1E,aAGxB,IAAM1+D,GAA0B,IAAhB2nB,EAAI3nB,QACds0C,EAAS,IAAIvqD,IAAI49B,EAAIg3C,qBAAuB,IAG5CnjF,EAAQmsC,EAAInsC,OAAS+K,GAGrBq4E,EAAe,IAAIpwE,IACzB,QAAWrE,KAAcX,EACvBo1E,EAAalyE,IAAIvC,EAAW9O,aAAc8O,GAG5C,IAAM00E,EAAa,IAAI90E,IAEvB,QAAWtC,KAASghC,EAAQ,CAC1B,IACGhhC,GAAOrO,KACP8B,MAAMC,QAAQsM,EAAMq3E,UACI,IAAzBr3E,EAAMq3E,QAAQvpF,OAEd,SAEF,IAAM4G,EAAQkK,GAAeoB,EAAMtL,OAC7B4iF,EAAsBt3E,EAAMq3E,QAAQr0E,KACvCu0E,GACCJ,EAAa9zE,IAAIk0E,EAAO3jF,eACxBi5D,EAAOxpD,IAAIk0E,EAAO3jF,eAEhB4jF,EAAwBj/D,IAAY++D,EAGpCG,EAAcz3E,EAAMq3E,QAAQ90E,OAC/Bg1E,GACCJ,EAAa9zE,IAAIk0E,EAAO3jF,gBACvBi5D,EAAOxpD,IAAIk0E,EAAO3jF,eAGvB,GAAI6jF,EAAY3pF,QAAU,EAAG,CAKF,IAAvB2pF,EAAY3pF,QACZ2pF,EAAY,GAAGC,MAAQ,GACvBF,GAEAzjF,EAAMmL,MAAMc,EAAMrO,GAAI,CACpBiC,aAAc6jF,EAAY,GAAG7jF,aAC7Bc,UAGJ,QACF,CAEA,IAIIijF,EAJEC,EAAiBH,EAAY36E,IAAKy6E,GAAWA,EAAO3jF,cAGpDikF,EAAQL,EAAwBzjF,EAAMiL,KAAKgB,EAAMrO,IAAM,KAEzDmmF,GAAS,EACPC,EAAcF,EAChBJ,EAAY90E,KAAM40E,GAAWA,EAAO3jF,eAAiBikF,EAAMjkF,mBAC3D,EACEokF,EAAoBP,EAAYz0E,KAAMu0E,GAAWA,EAAOG,MAAQ,GACtE,GACEG,GACAA,EAAMnjF,QAAUA,GAChBqjF,IACCA,EAAYL,MAAQ,IAAMM,GAE3BL,EAAWE,EAAMjkF,aACjBkkF,GAAS,MACJ,CAEL,IAAMG,EAAoBR,EAAY36E,IAAKy6E,GACzC9kF,OAAOC,SAAS6kF,EAAOG,QAAUH,EAAOG,MAAQ,EAAIH,EAAOG,MAAQ,GAK/DzhF,EAAUgiF,EAAkBj1E,KAAM6uC,GAAWA,EAAS,GACxDomC,EACAA,EAAkBn7E,IAAI,IAAM,GAE1B0D,EAAQxK,EADI+C,GAAY,GAAGiH,EAAMrO,eAAgBuuC,EAAIhoB,QAClBjiB,GACzC0hF,EACEF,EAAYnpF,KAAKC,IAAI,EAAGD,KAAKmmB,IAAIjU,EAAOi3E,EAAY3pF,OAAS,KAC1D8F,aACD4jF,GACFzjF,EAAMmL,MAAMc,EAAMrO,GAAI,CAAEiC,aAAc+jF,EAAUjjF,SAEpD,CAEA,IAAMwjF,EAAgBN,EAAer1E,OAAQ5Q,GAAOA,IAAOgmF,GAC3D,QAAWhmF,KAAMumF,EAAed,EAAWvlF,IAAIF,GAE/CslF,EAAUxzE,KAAK,CACbxE,QAASe,EAAMrO,GACfwmF,yBAA0BP,EAC1BQ,mBAAoBT,EACpBpB,wBAAyB2B,EACzBJ,UAEJ,CAEA,OAAwB,IAApBV,EAAW7wE,KACN,CAAExE,cAAak1E,aAGjB,CACLl1E,YAAaA,EAAYQ,OACtBG,IAAgB00E,EAAW/zE,IAAIX,EAAW9O,eAE7CqjF,YAEJ,C4CijHkDoB,CAC9Ct2E,EACAkmB,EAAQgsD,gBACR,CACE/7D,OAAQ+P,EAAQ/P,OAChBg/D,oBAAqBpmE,GAAMlT,SAAWhQ,OAAOC,KAAKijB,GAAMlT,UAAY,GACpE2a,QAAS6kD,OAA+BtsD,GAAMg9B,SAI9CwqC,EAAkBz2C,EACtB,GAAIA,GAAe5Z,EAAQgsD,iBAAiBnmF,OAAQ,CAClD,IAAMspF,EAAa,IAAIrwE,IACjBwxE,EAAoB,IAAIxxE,IAC9B,QAAWyxE,KAAYvB,EAAW,CAC5BuB,EAASJ,oBACXG,EAAkBtzE,IAAIuzE,EAASJ,mBAAoBI,GAErD,QAAW5kF,KAAgB4kF,EAASjC,wBAClCa,EAAWnyE,IAAIrR,EAAc4kF,EAEjC,CACA,IAAMC,EAAiB,IAAIn2E,IAAIP,EAAYjF,IAAK4F,GAAeA,EAAW9O,eACpE8kF,EAAY,IAAIp2E,IAAIwO,GAAMlT,SAAWhQ,OAAOC,KAAKijB,GAAMlT,UAAY,IACzE06E,EAAkBz2C,EAAY/kC,IAAK6kC,IACjC,IAAMg3C,EAAiBvB,EAAWzpF,IAAIg0C,EAAW/tC,cACjD,GAAI+kF,EAAgB,OAnF1B,SACEh3C,EACA62C,GAEA,IAAQ5gC,oBAAqB8+B,EAAsBjB,uBAAwBkB,KAA4BC,GAASj1C,EAC1G7a,EAAS0xD,EAASV,OACpB,+BACA,+BACJ,MAAO,IACFlB,EACHj1E,OAAQ,SACRmlB,SACA2iB,MAAO,IACF9H,EAAW8H,MACd,CACE93C,GAAI,kBACJqJ,MAAO,kBACP2G,OAAQ,SACRmlB,SACAoS,OAAQ,CACNj6B,QAASu5E,EAASv5E,QAClBm5E,mBAAoBI,EAASJ,sBAKvC,CAyDiCQ,CAA0Bj3C,EAAYg3C,GAEjE,IAAME,EAAkBN,EAAkB5qF,IAAIg0C,EAAW/tC,cACzD,GAAIilF,EACF,OAAO/B,GACLn1C,EACAk3C,EAAgBf,OAAS,gCAAkC,iCAC3D,CACE74E,QAAS45E,EAAgB55E,QACzBk5E,yBAA0BU,EAAgBV,2BAKhD,IAAMn4E,EAAQioB,EAAQgsD,iBAAiBtxE,KAAM/H,GAC3CA,EAAUy8E,QAAQr0E,KAAMu0E,GAAWA,EAAO3jF,eAAiB+tC,EAAW/tC,eAExE,IAAKoM,IAAUy4E,EAAep1E,IAAIs+B,EAAW/tC,eAAiB8kF,EAAUr1E,IAAIs+B,EAAW/tC,cACrF,OAAO+tC,EAET,IAAMm3C,EAAc94E,EAAMq3E,QACvBv6E,IAAKy6E,GAAWA,EAAO3jF,cACvB2O,OAAQ3O,GAAiB6kF,EAAep1E,IAAIzP,KAAkB8kF,EAAUr1E,IAAIzP,IAC/E,OAA8B,IAAvBklF,EAAYhrF,OACfgpF,GAAsBn1C,EAAY,6BAA8B,CAC9D1iC,QAASe,EAAMrO,GACfwmF,yBAA0BW,IAE5Bn3C,GAER,CAEA,IAAMkiC,EAAkBwS,GAAqCW,EAAasB,GAC1E,MAAO,CACLv2E,YAAa8hE,EAAgB9hE,YAC7B8/B,YAAagiC,EAAgBhiC,aAAey2C,EAC5CrB,YAEJ,CAEO,SAAS8B,GACdt2E,EACAwlB,GAQA,IAAM9pB,EAAM8pB,GAAS9pB,KAAOtS,SAASuS,KAC/B8T,EAAayzB,GAAyB1d,GAAS/V,YAAc,CAAC,EAAG/T,EAAK,CAC1E2nC,eAAgB7d,GAAS6d,iBAErB5tB,EAASjc,GAAUgsB,GAAS/P,QAC5BnW,EAA4B,GAC5Bg0E,EAAuBd,GAAyBxyE,GACtD,QAAWjQ,KAAciQ,EAAa,CACpC,IAAMC,EAAa0zE,GAAmB5jF,EAAY,CAChD2L,MACA+T,aACAgG,SACA69D,yBAEErzE,GAAYX,EAAY0B,KAAKf,EACnC,CACA,OAAOq0E,GAAiCh1E,EAAa,CACnDmW,SACA+7D,gBAAiBhsD,GAASgsD,kBACzBlyE,WACL,CAEA,SAASi3E,GACPv2E,EACAwlB,GASA,IAAM9pB,EAAM8pB,GAAS9pB,KAAOtS,SAASuS,KAC/B8T,EAAayzB,GAAyB1d,GAAS/V,YAAc,CAAC,EAAG/T,EAAK,CAC1E2nC,eAAgB7d,GAAS6d,iBAErB5tB,EAASjc,GAAUgsB,GAAS/P,QAC5BnW,EAA4B,GAC5B8/B,EAAgD,GAChDk0C,EAAuB9tD,GAAW,yBAA0BA,EAC9DA,EAAQ8tD,2BAAwB,EAChCd,GAAyBxyE,GAC7B,QAAWjQ,KAAciQ,EAAa,CACpC,IAAM4K,EAASqoE,GAA2BljF,EAAY,CACpD2L,MACA+T,aACAgG,SACA69D,yBAEFl0C,EAAYp+B,KAAK4J,EAAOs0B,YACpBt0B,EAAO3K,YAAYX,EAAY0B,KAAK4J,EAAO3K,WACjD,CACA,IAAMguB,EAAWqmD,GACfh1E,EACA,CAAEmW,SAAQ+7D,gBAAiBhsD,GAASgsD,iBACpCpyC,GAEF,MAAO,CACL9/B,YAAa2uB,EAAS3uB,YACtB8/B,YAAanR,EAASmR,aAAeA,EAEzC,CAMA,SAASo3C,GAA2Bx5E,EAAiBtB,GACnD,IAAKsB,EAAS,OAAO,EACrB,IACE,IAAMnI,EAAU,IAAI3K,IAAIwR,EAAKtS,SAASuS,MAChC86E,EAAez5E,EAAQ9E,SAAS,QAEjC8E,EAAQnE,WAAW,KADpBmE,EACqC,IAAMA,EACzC05E,EAAK,IAAIhmF,OAAO,IAX1B,SAA6BU,GAC3B,OAAOA,EAAM4G,QAAQ,qBAAsB,QAAQA,QAAQ,MAAO,KACpE,CASgC2+E,CAAoBF,GAAgB,KAChE,OAAOz5E,EAAQ9E,SAAS,OACpBw+E,EAAGl+E,KAAK3D,EAAQ8G,MAChB+6E,EAAGl+E,KAAK3D,EAAQvL,SAAWuL,EAAQ/J,SAAW4rF,EAAGl+E,KAAK3D,EAAQvL,SACpE,OACE,OAAO,CACT,CACF,CAEA,SAASstF,GAA0B55E,EAAiBtB,GAClD,IACE,IAAM7G,EAAU,IAAI3K,IAAIwR,EAAKtS,SAASuS,MAChC+6E,EAAK,IAAIhmF,OAAOsM,GACtB,OAAO05E,EAAGl+E,KAAK3D,EAAQ8G,OAAS+6E,EAAGl+E,KAAK3D,EAAQvL,SAAWuL,EAAQ/J,SAAW4rF,EAAGl+E,KAAK3D,EAAQvL,SAChG,OACE,OAAO,CACT,CACF,CAEA,SAASutF,GAAwB/5C,EAA6CphC,GAC5E,IAAKohC,GAAOzxC,OAAQ,OAAO,EAC3B,IAAIu1C,GAAa,EACbk2C,GAAa,EACjB,QAAWt8D,KAAQsiB,EAAO,CACxB,IAAKtiB,GAAgC,iBAAjBA,EAAKxd,QAAsB,SAC/C,IAAMoe,EAAwB,UAAdZ,EAAKxkB,KACjB4gF,GAA0Bp8D,EAAKxd,QAAStB,GACxC86E,GAA2Bh8D,EAAKxd,QAAStB,GAC7C,IAAqB,IAAjB8e,EAAKwiB,SAAqB5hB,EAAS,OAAO,GACzB,IAAjBZ,EAAKwiB,UACP4D,GAAa,EACTxlB,IAAS07D,GAAa,GAE9B,CACA,OAAQl2C,GAAck2C,CACxB,CAEA,SAASC,GAAuBjmF,GAC9B,IAAO+V,EAAU8C,EAAQvY,GAASN,EAClC,GAAwB,iBAAb+V,IAA0BA,GAA8B,iBAAX8C,EAAqB,OAAO,KACpF,IAAMqtE,EAAO,CAAEnwE,WAAU8C,UACzB,OAAQA,GACN,IAAK,OACL,IAAK,UACH,MAAwB,iBAAVvY,EAAqB,IAAK4lF,EAAMl6E,KAAM1L,GAAU,KAChE,IAAK,OACL,IAAK,eACL,IAAK,cACH,MAAwB,iBAAVA,EAAqB,IAAK4lF,EAAM73D,KAAM/tB,GAAU,KAChE,IAAK,YACH,OAAKA,GAA0B,iBAAVA,GAAsBJ,MAAMC,QAAQG,GAAe,KACpE,SAAUA,EAAc,IAAK4lF,EAAMt8D,UAAWtpB,GAC3C,IAAK4lF,EAAMvnE,WAAYre,GAChC,IAAK,QACL,IAAK,WACH,OAAOA,GAA0B,iBAAVA,IAAuBJ,MAAMC,QAAQG,GACxD,IAAK4lF,EAAMz5D,OAAQnsB,GACnB,KACN,IAAK,SACH,OAAO4lF,EACT,QACE,OAAO,KAEb,CAoGA,SAASC,KACP,IAEE,IADK5oE,GAAMiY,SAAWgwC,GAAsBjoD,GAAMiY,OAAQjY,GAAMkoD,mBAC3DloD,GAAM/O,YAAYjU,OAAQ,OAC/B6rF,GAA4B7oE,GAAM/O,YACpC,OAAS,CACX,CAsBA,SAAS63E,GAAwBz8E,EAA4C,CAAC,GAC5E,IAAMhG,EAAW61E,GAAa,aAC9Bp0E,IACAiyE,GAAsB,CAAEf,MAAO,WAAY3yE,aAC3CqoB,KACAntB,KACmC,IAA/B8K,EAAQ08E,oBA1Bd,WACE,IACE,IAAMC,EAAQ,IAAMJ,YACT/qF,OAAW,KAAuD,mBAAjCA,OAAO63B,sBACjD73B,OAAO63B,sBAAsBszD,UACbnrF,OAAW,IAC3BA,OAAOuD,WAAW4nF,EAAO,GAEzB5nF,WAAW4nF,EAAO,GAGpB,IAAMj8C,EAAa/sB,GAAMiY,QAAQ2R,KAAKmD,YAAc,WACzClvC,OAAW,IACpBA,OAAOuD,WAAWwnF,GAAuB77C,GAEzC3rC,WAAWwnF,GAAuB77C,EAEtC,OAAS,CACX,CASIk8C,EAEJ,CAEA,SAASC,GACPt3E,EACAu3E,EACAC,GAEIx3E,EAAW+hE,gBAAkByV,EAAsB72E,IAAIX,EAAW9O,gBACvC0lE,GAAU,GAAG52D,EAAW9O,wCAAyC,CAC5FsF,MAAOwJ,EAAW+hE,cAAc32E,SAELgrB,GAAS,QAAS,GAAGpW,EAAW9O,0CrCppI1D,SAA6B9C,EAAa8C,GAC/C,IAAMjC,EAAK,gBAAkBiC,EACzBnC,EAAQhF,SAASmE,eAAee,GAC/BF,IACHA,EAAQhF,SAASiF,cAAc,SAC/BD,EAAME,GAAKA,EACXF,EAAMiY,UAAYiO,IACjBlrB,SAASsF,MAAQtF,SAASgC,iBAAiBuD,YAAYP,IAE1DA,EAAMG,YAAcd,CACtB,CqC2oIIqpF,CAAoBz3E,EAAW+hE,cAAe/hE,EAAW9O,eAEvD8O,EAAW5R,MACgBwoE,GAAU,GAAG52D,EAAW9O,6BAA8B,CACjFa,YAAaiO,EAAWjO,YACxByE,MAAOwJ,EAAW5R,IAAIhD,SAEKgrB,GAAS,QAAS,GAAGpW,EAAW9O,+BrCtqI1D,SAAmB9C,EAAa8C,EAAsBa,GAC3D,IAAM9C,EAAK,YAAciC,EAAe,IAAMa,EAC9C,GAAIhI,SAASmE,eAAee,GAAK,OACjC,IAAMF,EAAQhF,SAASiF,cAAc,SACrCD,EAAME,GAAKA,EACXF,EAAMiY,UAAYiO,GAClBlmB,EAAMG,YAAcd,GACnBrE,SAASsF,MAAQtF,SAASgC,iBAAiBuD,YAAYP,EAC1D,CqC+pII2oF,CAAU13E,EAAW5R,IAAK4R,EAAW9O,aAAc8O,EAAWjO,cAI7DiO,EAAWgiE,cACXhiE,EAAW8vC,gBACX9vC,EAAW+vC,eACX/vC,EAAWo+B,GAMdm+B,GAAgB,KACd,GAAIgb,IAAoBnpE,GAAMupE,0BAA2B,OACzD,IAAMr/E,EAAQ0H,EAAW9O,aAAe,IAAM8O,EAAWjO,YACrDiO,EAAWgiE,eAAiBwV,EAAsB72E,IAAIX,EAAW9O,gBACtC0lE,GAAU,GAAG52D,EAAW9O,uCAAwC,CAC3FsF,MAAOwJ,EAAWgiE,aAAa52E,SAEJgrB,GAAS,QAAS,GAAGpW,EAAW9O,yCAC7DkmB,GAAS,IAAMgC,GAAOpZ,EAAWgiE,aAAehiE,EAAW9O,aAAe,oBAE5EsmF,EAAsBroF,IAAI6Q,EAAW9O,eACpB8O,EAAW8vC,erCpqIzB,SAA2Br0C,EAAavK,EAAsBa,GACnE,OAAO,IAAI0D,QAAQ,CAACL,EAASq+D,KAC3B,IAAMxkE,EAAK,iBAAmBiC,EAAe,IAAMa,EAC7CsQ,EAAWtY,SAASmE,eAAee,GACzC,GAAIoT,GAAYA,EAASD,aAAa,UAAY3G,EAEhD,YADArG,IAGEiN,GAAUA,EAASzT,SACvB,IAAMgpF,EAAO7tF,SAASiF,cAAc,QACpC4oF,EAAK3oF,GAAKA,EACV2oF,EAAK5wE,UAAYkO,GACjB0iE,EAAKC,IAAM,aACXD,EAAKl8E,KAAOD,EACZm8E,EAAKE,OAAS,IAAM1iF,IACpBwiF,EAAKG,QAAU,IAAMtkB,EAAO,IAAIttC,MAAM,gCAAkC1qB,KACvE1R,SAASsF,MAAQtF,SAASgC,iBAAiBuD,YAAYsoF,IAE5D,CqCmpIQI,CAAkBh4E,EAAW8vC,eAAgB9vC,EAAW9O,aAAc8O,EAAWjO,aAC9E6Y,KAAK,KACyBgsD,GAAU,GAAG52D,EAAW9O,oCAAqC,CACxFa,YAAaiO,EAAWjO,YACxB0J,IAAKuE,EAAW8vC,iBAEW15B,GAAS,QAAS,GAAGpW,EAAW9O,qCAChCslE,GAAM,UAAW,sBAAuB,CAAE/6D,IAAKuE,EAAW8vC,mBAExFplB,MAAOjR,IACuB5C,GAAU,QAAS4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACnE+8C,GAAM,UAAW,sBAAuB,CAAE/6D,IAAKuE,EAAW8vC,mBAE3Fr6C,QAAQL,WAEHwV,KAAK,KACR2sE,IAAoBnpE,GAAMupE,4BACd33E,EAAW+vC,c7BrrI1B,SAAwBt0C,EAAa6d,GAC1C,MAAqB,WAAjBH,WACS5C,QAAY,KACrBA,QAAQO,KAAK,mDAAqDwC,GAE7D7jB,QAAQL,WAEV,IAAIK,QAAQ,CAACL,EAASq+D,KAC3B,IAAMxkE,EAAK,oBAAsBqqB,EAC3BjX,EAAWtY,SAASmE,eAAee,GACzC,GAAIoT,GAAYA,EAASD,aAAa,SAAW3G,EAE/C,YADArG,IAGEiN,GAAUA,EAASzT,SAEvB,IAAM2wB,EAASx1B,SAASiF,cAAc,UACtCuwB,EAAOtwB,GAAKA,EACZswB,EAAOvY,UAAY0S,GACnB6F,EAAOkiC,IAAMhmD,EACb8jB,EAAOlN,OAAQ,EACfkN,EAAOu4D,OAAS,IAAM1iF,IACtBmqB,EAAOw4D,QAAU,IAAMtkB,EAAO,IAAIttC,MAAM,+BAAiC1qB,KACxE1R,SAASsF,MAAQtF,SAASgC,iBAAiBuD,YAAYiwB,IAE5D,C6B6pIU04D,CAAej4E,EAAW+vC,cAAez3C,GACtCsS,KAAK,KACyBgsD,GAAU,GAAG52D,EAAW9O,mCAAoC,CACvFa,YAAaiO,EAAWjO,YACxB0J,IAAKuE,EAAW+vC,gBAEW35B,GAAS,QAAS,GAAGpW,EAAW9O,oCAChCslE,GAAM,UAAW,qBAAsB,CAAE/6D,IAAKuE,EAAW+vC,kBAEvFrlB,MAAOjR,IACuB5C,GAAU,QAAS4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACnE+8C,GAAM,UAAW,qBAAsB,CAAE/6D,IAAKuE,EAAW+vC,kBAE1Ft6C,QAAQL,WAEJwV,KAAK,KACP2sE,IAAoBnpE,GAAMupE,2BAC1B33E,EAAWo+B,KACgBw4B,GAAU,GAAG52D,EAAW9O,4BAA6B,CAChFa,YAAaiO,EAAWjO,YACxByE,MAAOwJ,EAAWo+B,GAAGhzC,SAEMgrB,GAAS,QAAS,GAAGpW,EAAW9O,8BAC7DkmB,GAAS,IAAMgC,GAAOpZ,EAAWo+B,GAAK9lC,WAzD5Ck/E,EAAsBroF,IAAI6Q,EAAW9O,aA8DzC,CAEA,SAAS2sE,GAAiBx+D,EAA2B44B,GACtB2+B,GAAU,0BAA2B,CAChEv3D,YAAaA,EAAYjU,OACzB6sC,mBAE2B7hB,GAAS,QAAS,YAAY/W,EAAYjU,wBAC1CorE,GAAM,QAAS,YAAYn3D,EAAYjU,wBACpE,IAAMmsF,IAAoBnpE,GAAMupE,0BAC1BH,EAAwB,IAAI53E,IAC5B0hE,EAAWlzD,GAAMiY,QAAQi7C,SACzB4W,KAAyB5W,GAAUh9D,OAASg9D,GAAU76C,UAAY66C,GAAU56C,QAC5EyxD,EAAsBD,EACxBE,GAA6B/4E,GAC7BA,EACA64E,EAozBN,SAA4C74E,GAG1C,GAFA+O,GAAMiqE,gCACNjqE,GAAMiqE,4BAA8B,MAC/BC,GAA0Bj5E,GAgB7B,OAVI+O,GAAMiY,QAAQi7C,UAAU56C,SAC1BtY,GAAMiqE,4BAA8BnuE,GAAsB,KACnDorB,GACHlnB,GAAMiY,QAAQi7C,UAAU56C,OACxB0xD,KACAvW,GAAgB,CAAEhsC,iBAAiB,aAIpCP,GAAqBlnB,GAAMiY,QAAQi7C,UAAU56C,OAAQ0xD,MAI5DhqE,GAAMiqE,4BAA8BnuE,GAAsB,KACxDkmE,GAAkC,CAAEmI,mBAAmB,EAAM5vD,OAAO,OAElE6vD,IAA4Bx0E,UAIhCosE,GAAkC,CAAEmI,mBAAmB,GACzD,CAj1BIE,CAAmCN,GAM9B7iD,GAAqBlnB,GAAMiY,QAAQi7C,UAAU56C,OAAQ0xD,MAQ5D,IAAMM,EAAyB14E,IAC5B2hE,GAAoC3hE,GAEnC6nE,EAAmB,EACvB,QAAWr2E,KAAK6N,EACVq5E,EAAsBlnF,KAC1Bq2E,GAAoBr2E,EAAEgwB,UAAUp2B,QAKlC,IAAMutF,EAAerX,GAAUh9D,OAASpD,GACtCogE,EAASh9D,MACT6zE,EACA9W,IACE,EAAI,EACRwG,GAAoB8Q,EACpB,IAAIC,EAAgB,EACdC,EAAc,CAAC74E,EAAwBlC,IAC3C,GAAGkC,EAAW9O,iBAAqB8O,EAAWjO,gBAAoB+L,IAE9Dg7E,EAAmB,IAAIz0E,IACvB00E,EAAe/4E,GAA2B,GAAGA,EAAW9O,iBAAqB8O,EAAWjO,cAC9F,QAAWiO,KAAcX,EACnBq5E,EAAsB14E,IAC1B84E,EAAiBv2E,IAAIw2E,EAAY/4E,GAAa,CAC5CA,aACAoe,SAAUpe,EAAWwhB,UAAUp2B,OAC/BqX,QAAS,IAAI7C,IACb4vE,OAAQ,IAAI5vE,IACZ69C,SAAS,IAGb,IAAMu7B,EAA2B5S,IAC3BA,EAAQ3oB,SACR2oB,EAAQhoD,SAAW,GAAKgoD,EAAQ3jE,QAAQoB,KAAOuiE,EAAQoJ,OAAO3rE,KAAOuiE,EAAQhoD,WACjFgoD,EAAQ3oB,SAAU,EAzwCtB,SACEz9C,EACApT,GAQA,GAAIwhB,GAAM87D,eAAgB,OAC1B,IAAMpgE,EAAoB,CACxB/T,KAAM,kBACNnJ,KAAM,CACJqsF,mBAAoBrsF,EAAKssF,kBACzBlR,kBAAmBp7E,EAAKm7E,iBACxBoR,gBAAiBvsF,EAAKwsF,eACtBC,aAAc9J,GACZ3iF,EAAKssF,kBACLtsF,EAAKm7E,iBACLn7E,EAAKwsF,eACLp5E,EAAWc,WAEbw4E,iBAAkBt5E,EAAWlC,MAC7BsmE,WAAYpkE,EAAWc,UACvBqiE,YAAanjE,EAAW8d,MAAQ,aAChC8tD,gBAAiBh/E,EAAKqrC,eACtB0zC,cAAev9D,GAAM0zC,aACrBtqB,SAAUppB,GAAMopB,SAChB+hD,iBAAkB3sF,EAAK2qF,gBACvBhL,eAAuD,iBAAhCn+D,GAAMiY,QAAQmmD,cAA6Bp+D,GAAMiY,OAAOmmD,mBAAgB,EAC/F3rE,iBACGb,EAAW8d,MAA4B,eAApB9d,EAAW8d,UAE3B,EADA9d,EAAWnQ,iBAGnB4L,IAAKvS,IACLgI,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,cAEtBqc,GAAMg4D,SAAYtP,MAItB1oD,GAAMiiE,sBAAsBtvE,KAAK+I,GAC7BsE,GAAMiiE,sBAAsBjlF,OAAS,IACvCgjB,GAAMiiE,sBAAsBr1C,OAAO,EAAG5sB,GAAMiiE,sBAAsBjlF,OAAS,KAL3EgjB,GAAMg4D,QAAQv0D,MAAM/H,EAOxB,CA0tCI0vE,CAAyBpT,EAAQpmE,WAAY,CAC3Ck5E,kBAAmB9S,EAAQhoD,SAC3B2pD,iBAAkB3B,EAAQ3jE,QAAQoB,KAClCu1E,eAAgBhT,EAAQoJ,OAAO3rE,KAC/B0zE,kBACAt/C,qBAGJkwC,GAAsB,CACpBf,MAAO,sBACPS,mBACAE,iBAAkB,EAClBE,gBAAiB,IAGnB,IAAMwR,EAAsB,IAAI75E,IAC1B85E,EAAqB,IAAI95E,IAC3B+5E,GAAW,EACTC,EAA+B,MAC9BD,GAAYF,EAAoB51E,KAAO61E,EAAmB71E,KAAO+0E,GAAiB/Q,IACrF8R,GAAW,EACXzC,OAGE2C,EAAoBhS,EAAmB,EACvC,CAAC7nE,EAAwBkd,EAAoBlU,EAAkBlL,KACxC,aAAnBm6B,GxBhrIL,SACLjvB,EACAkU,EACAqI,EACA0W,GAEA,GAAwB,WAApB/e,EAASxT,QAA2C,iBAApBwT,EAASxT,QAAiD,gBAApBwT,EAASxT,OAA0B,QA7B/G,SAAiBV,GACf,UAAWnB,iBAAqB,KAAe0W,GAAM5d,IAAIqI,GAAU,OACnE,QAAY8wE,GAAe/kF,eAAewpB,GACpCu7D,EAAY1qF,cAChB2F,EAASE,aACTkiB,GAAwBpiB,GACxBwpB,GAAM3iB,OAAOk+E,IAEf,IAAM/sF,EAAmB,GACnBi3B,EAA+B7xB,IACnC,QAAWP,KAAUO,EACnB,QAAWoC,KAASxH,GACbwH,EAAMwzC,SAAW1gC,GAAQ9S,EAAO3C,IAASysB,GAAY9pB,GAG1DgjB,GAAQ1T,MAtDA,OAAV2a,KACJA,GAAQsF,sBAAsB,KAC5BtF,GAAQ,KACR,IAAM90B,EAAMD,KAAKC,MACjB,QAAW6K,KAASgjB,GAAS,CAC3B,GAAIhjB,EAAMwzC,QAAS,SAEnB,GADAxzC,EAAMwlF,MAAQxlF,EAAMwlF,MAAMl6E,OAAQ+oD,GAAOl/D,EAAMk/D,EAAK,KACzB,KAAvBr0D,EAAMwlF,MAAM3uF,OAAe,CAC7BmJ,EAAMwzC,SAAU,EAChB,IAAM7yC,EAAU+oB,KACZ/oB,IAASA,EAAQw1E,wBAAyB,GAC9C,QACF,CACA,GAA8B,SAA1Bn2E,EAAM2oB,SAASxT,QAAqB+T,GAAuBlpB,EAAO+pB,GAAW3d,IAAIpM,IAAS,CAI5F0oB,GAAoB1oB,GACpB,QACF,CACAA,EAAMwlF,MAAMh5E,KAAKrX,GACjB0tB,GAAS,IAAM7iB,EAAM0nC,MAAM1nC,EAAM7E,GAAI6E,EAAM2oB,WAC3CD,GAAoB1oB,GACpB,IAAMW,EAAU+oB,KACZ/oB,IAASA,EAAQu1E,eAAiB16E,OAAOmF,EAAQu1E,gBAAkB,GAAK,GAC9C,SAA1Bl2E,EAAM2oB,SAASxT,QACjB3f,SAASusC,cAAc,IAAIC,YAAY,0BAA2B,CAAEC,OAAQ,CAC1EtlC,aAAcqD,EAAMrD,aACpBa,YAAawC,EAAMxC,YACnB6U,SAAUrS,EAAM2oB,SAAStW,SACzB8C,OAAQnV,EAAM2oB,SAASxT,UAG7B,CACA6N,GAAQvC,QACRsJ,GAAWtJ,YAqBPjgB,EAAW,IAAI8S,iBAAiBmc,GACtCzF,GAAMhc,IAAIyG,EAAS,CAAEjc,UAASgI,aAC9BiiB,GAAsBjiB,EAAUivB,GAChCjvB,EAASe,QAAQkT,EAAS,CAAEwG,YAAY,EAAMxH,eAAe,EAAMD,WAAW,EAAME,SAAS,GAC/F,CASEnS,CAAQkT,GACR,IAAMjc,EAAUwxB,GAAMtzB,IAAI+d,IAAUjc,QACpC,IAAKA,EAAS,OACd,IAAM0M,EAAW1M,EAAQkT,KAAM1L,GAAUA,EAAM2oB,WAAaA,GAC5D,GAAIzjB,EACFvO,OAAOwhB,OAAOjT,EAAU8rB,EAAS,CAAE5H,UAAWl0B,KAAKC,MAAOuyC,UAC1Dhf,GAAoBxjB,OACf,CACL,IAAMlF,EAAe,CAAE7E,GAAIsZ,EAASkU,cAAaqI,EAAS5H,UAAWl0B,KAAKC,MAAOuyC,QAAO89C,MAAO,GAAIhyC,SAAS,GAC5G9qB,GAAoB1oB,GACpBxH,EAAQgU,KAAKxM,EACf,CACF,CwB8pIUylF,CACEhxE,EACAkU,EACA,CAAEhsB,aAAc8O,EAAW9O,aAAca,YAAaiO,EAAWjO,aACjE,CAACgY,EAAQkwE,IAAoB15D,GAAe05D,EAAiBlwE,IAGjE,IAAMjX,EAAM+lF,EAAY74E,EAAYlC,GACpC,GAAI27E,EAAoB94E,IAAI7N,GAAM,OAClC2mF,EAAoBtqF,IAAI2D,GACxB4mF,EAAmB99E,OAAO9I,GAC1B,IAAMszE,EAAU0S,EAAiB7tF,IAAI8tF,EAAY/4E,IAC7ComE,IACFA,EAAQ3jE,QAAQtT,IAAI2O,GACpBsoE,EAAQoJ,OAAO5zE,OAAOkC,GACtBk7E,EAAwB5S,IAG1B+B,GAAsB,CACpBf,MAAO,mBACP8S,gBAHsB5P,GAAa,qBAInCzC,mBACAE,iBAAkB0R,EAAoB51E,KACtCokE,gBAAiByR,EAAmB71E,OAETuS,GAAS,QAAS,qBAAqBqjE,EAAoB51E,QAAQgkE,KAAqB,CACnHjhE,SAAUsW,EAAStW,WAErBgzE,KAEF,KACEO,EAAmBtS,EAAmB,EACxC,CAAC7nE,EAAwBkd,EAAoBpf,KAC3C,IAAMhL,EAAM+lF,EAAY74E,EAAYlC,GACpC,GAAI27E,EAAoB94E,IAAI7N,IAAQ4mF,EAAmB/4E,IAAI7N,GAAM,OACjE4mF,EAAmBvqF,IAAI2D,GACvB,IAAMszE,EAAU0S,EAAiB7tF,IAAI8tF,EAAY/4E,IAC7ComE,IACFA,EAAQoJ,OAAOrgF,IAAI2O,GACnBk7E,EAAwB5S,IAE1B+B,GAAsB,CACpBf,MAAO,kBACPS,mBACAE,iBAAkB0R,EAAoB51E,KACtCokE,gBAAiByR,EAAmB71E,OAETgT,GAAU,QAAS,GAAG7W,EAAW9O,qDAAsD,CAClHa,YAAaiO,EAAWjO,YACxB6U,SAAUsW,EAAStW,WAErBgzE,KAEF,KAEJ,QAAW55E,KAAcX,EACvB,IAAIq5E,EAAsB14E,GAC1B,IAAIA,EAAWwhB,UAAUp2B,OACMwrE,GAAU,GAAG52D,EAAW9O,mCAAoC,CACvFa,YAAaiO,EAAWjO,YACxB+4C,MAAO9qC,EAAWwhB,UAAUp2B,OAC5B6sC,mBAE2B7hB,GAAS,QAAS,GAAGpW,EAAW9O,iBAAiB8O,EAAWwhB,UAAUp2B,qBAAsB,CAAE6sC,mBACpG,WAAnBA,EACF1W,GAAevhB,EAAWwhB,UAAW,CACnCG,UAAWk4D,EACP,CAAC38D,EAAUlU,EAASlL,IAAU+7E,EAAkB75E,EAAYkd,EAAUlU,EAASlL,QAC/E,EACJ4jB,OAAQy4D,EACJ,CAACj9D,EAAUpf,IAAUq8E,EAAiBn6E,EAAYkd,EAAUpf,QAC5D,IAINkC,EAAWwhB,UAAU1Z,QAAQ,CAAC8X,EAAG9rB,IAAMs+C,GACrCxyB,EACA9rB,EACA+lF,EACI,CAAC38D,EAAUlU,EAASlL,IAAU+7E,EAAkB75E,EAAYkd,EAAUlU,EAASlL,QAC/E,EACJq8E,EACI,CAACj9D,EAAUpf,IAAUq8E,EAAiBn6E,EAAYkd,EAAUpf,QAC5D,QAGH,CACL,IAAMsoE,EAAU0S,EAAiB7tF,IAAI8tF,EAAY/4E,IAC7ComE,GAAS4S,EAAwB5S,EACvC,CACAkR,GAAoBt3E,EAAYu3E,EAAiBC,EAAqB,CAGxE,GAAIlW,GAAUh9D,MACZ,IACEwE,GACEw4D,EAASh9D,MACT6zE,EACAj5E,GACA,KACE05E,EAAgBD,EACZA,GAAciB,KAEpBvY,GAEJ,OACEuX,EAAgBD,EACZA,GAAciB,GACpB,CAEEtY,GAAU76C,UACZzS,GACEstD,EAAS76C,SACTpnB,EAAYQ,OAAO4hE,IACnBU,KAKqB,IAArB0F,GAA6C,WAAnB5vC,IAC5Bi/C,KAn1FJ,SAA6B73E,GAC3B,IAAK89D,GAAiB,OACtB,IAAMn9D,EAAak9D,GAAwB79D,GACrC+9D,EAAcp9D,GAAY2wC,gBAAgBysB,YAChD,IAAKA,EAEH,YADAC,KAIF,IAAM+c,EAAaxuF,KAAKC,IAAI,IAAKmU,EAAW2wC,gBAAgBitB,gBAAkB,KACxEyc,EAAU,GAAGjd,KAAegd,IAC9B7c,KAAmB8c,GAAgC,OAArB/c,KAElCD,KACAE,GAAiB8c,EACjBtc,GAAoBX,GACpBE,GAAmBrxE,OAAOu/C,YAAY,IAAMuyB,GAAoBX,GAAcgd,GAEzEE,KACHA,IAA6B,EAC7BvwF,SAASuC,iBAAiB,mBAAoB,KAC5C,IAAMsI,EAAUsoE,GAAwB9uD,GAAM/O,cACzCtV,SAASi0E,QAAUppE,GAAS+7C,gBAAgBysB,aAC/CW,GAAoBnpE,EAAQ+7C,eAAeysB,gBAInD,CA2zFEmd,CAAoBl7E,EACtB,CAEA,SAAS43E,GAA4B53E,GACnC,IAAMmiB,EAAYniB,EAAY5L,OAAgC,CAAC+mF,EAAKx6E,KAClEw6E,EAAIz5E,QAAQf,EAAWwhB,WAChBg5D,GACN,IACEh5D,EAAUp2B,QvBplIV,SAAwCo2B,EAAuB/mB,EAAwB,CAAC,GAC7F,IAAM3L,EAAO2L,EAAQ3L,MAAQ/E,SAC7By3B,EAAU1Z,QAAQ,CAACoV,EAAUpf,KACvBgiB,GAAe5C,EAASxT,SAA+B,WAApBwT,EAASxT,QAC/B5a,EAAK4U,iBAAiBwZ,EAAStW,UACvCkB,QAASkB,IAChBoO,GAAS,IAAMmJ,GAAerD,EAAUlU,IACxCvO,EAAQknB,YAAYzE,EAAUlU,EAASlL,MAG7C,CuB2kIE28E,CAA+Bj5D,EACjC,CAEA,SAASk8C,GAAWgd,GAClBtsE,GAAMupE,4BACNta,KACAjvD,GAAMiqE,gCACNjqE,GAAMiqE,4BAA8B,KAEpC,QAAW7mF,KAAKkpF,EACVlpF,EAAEq+C,SACJz2B,GAAO5nB,EAAEq+C,QAASr+C,EAAEN,aAAe,UAGvC,IAAMypF,EAAqB,IAAI/6E,IAC/B,QAAWpO,KAAKkpF,GACTlpF,EAAE8gF,mBAAqBqI,EAAmBh6E,IAAInP,EAAEN,gBACrDypF,EAAmBxrF,IAAIqC,EAAEN,cACzBkoB,GAAO5nB,EAAE8gF,kBAAmB9gF,EAAEN,aAAe,sBTjwI/CnE,GAAQ3B,OAAS,EACjBmsB,IAAU,EACVw6B,GAAa/8B,QACTjgB,KACFA,GAASE,aACTF,GAAW,MAEby8C,KS8vIAryC,KACA8U,KxBvzIK,WACS,OAAVuK,IAAgBoF,qBAAqBpF,IACzCA,GAAQ,KACRjH,GAAQvC,QACRsJ,GAAWtJ,QACX,QAAajgB,cAAcwpB,GAAMtR,SAC/BlY,EAASE,aACTkiB,GAAwBpiB,GAE1BwpB,GAAMvJ,OACR,CC8ME4lE,GACAxjE,GAAS,KACP,QAAStjB,EAAI+pB,GAAkBzyB,OAAS,EAAG0I,GAAK,EAAGA,GAAK,EACtDisB,GAAgBlC,GAAkB/pB,MAGtC+pB,GAAkBzyB,OAAS,Ed/V3BrB,SAAS2Z,iBAAiB,IAAMuR,IAAWnN,QAASpY,GAAOA,EAAGd,UAC9D7E,SAAS2Z,iBAAiB,IAAMwR,IAAgBpN,QAASpY,GAAOA,EAAGd,UQOnE7E,SAAS2Z,iBAAiB,IAAMgW,IAAmB5R,QAASpY,GAAOA,EAAGd,U6Bq7ItEysB,KACA67D,GAAwB,CAAEC,oBAAoB,GAChD,CAEA,SAAS0D,KACP,MAAO,MAAQjvF,KAAK4L,SAASH,SAAS,IAAI3F,MAAM,GAAKjI,KAAKC,MAAM2N,SAAS,GAC3E,CAaA,SAASyjF,KACP,OAAOtC,KAA+B,CACpCx0E,UAAU,EACV3E,YAAa,GACbkmB,QAAS,KAEb,CAEA,SAASw1D,KACP,OAAO3sE,GAAMiY,QAAUjY,GAAMoH,OACzB,GAAGpH,GAAMiY,OAAOnK,WAAe9N,GAAMoH,SACrC,IACN,CAEA,SAAS4iE,GAA6B/4E,EAAc+O,GAAM/O,aACxD,IAAM27E,EAAWxC,GACjB,IACGwC,GAAU37E,YAAYjU,QACvB4vF,EAASz1D,UAAYw1D,KACrB,OAAO17E,EACT,IAAM47E,EAAsB,IAAIr7E,IAAIP,EAAYjF,IAAK4F,GAAeA,EAAW9O,eACzEm7B,EAA+B,IAAIzsB,IACvCwO,GAAMiY,QAAQi7C,UAAUh9D,OAAOwtB,eAAer/B,eAAiB,IAE3Du4B,EAAgC,IAAIprB,IACxCwO,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAer/B,eAAiB,IAE5DsN,EAAc,IAAIsE,KACrB+J,GAAMiY,QAAQtmB,aAAe,IAAI3F,IAAKtK,GAAe,CAACA,EAAWb,GAAIa,KAElEorF,EAAoBF,EAAS37E,YAAYQ,OAAQG,IAErD,GADIi7E,EAAoBt6E,IAAIX,EAAW9O,gBAEpCm7B,EAA6B1rB,IAAIX,EAAW9O,gBAC5C85B,EAA8BrqB,IAAIX,EAAW9O,cAC9C,OAAO,EACT,IAAMpB,EAAaiQ,EAAY9U,IAAI+U,EAAW9O,cAC9C,QAASpB,GACP6C,EAA2B9C,gBAAgBC,KAAgBkQ,EAAWnQ,iBACtEC,EAAWk/C,WAAW1uC,KAAMkwC,GAAcA,EAAUvhD,KAAO+Q,EAAWjO,eAE1E,OAAOmpF,EAAkB9vF,OAAS,IAAIiU,KAAgB67E,GAAqB77E,CAC7E,CAEA,SAAS87E,KACP,QAAWx3D,KAASy3D,GAClBnvF,OAAOuB,aAAam2B,GAEtBy3D,GAA8B,EAChC,CAEA,SAASC,GAAmCh8E,GAC1C,IAAMgnB,EAASjY,GAAMiY,OACf/hB,EAAQ+hB,GAAQi7C,UAAUh9D,MAChC,IAAK+hB,IAAW/hB,IAAU8J,GAAMoH,OAAQ,OAAO,EAC/C,IAAM6W,EAA+B,IAAIzsB,IACvC0E,EAAMwtB,eAAer/B,eAAiB,IAExC,GAA0C,IAAtC45B,EAA6BxoB,KAAY,OAAO,EACpD,IAAMy3E,EAAe,IAAIj3E,IACnBk3E,EAAiD,GACjDC,EAAiC,IAAI57E,IAC3C,QAAWktB,KAAiBztB,EAAa,CACvC,GACEm8E,EAA+B76E,IAAImsB,EAAc57B,gBAChDm7B,EAA6B1rB,IAAImsB,EAAc57B,gBAC/CoT,EAAMvE,YAAYO,KAChBxQ,GAAeA,EAAWqQ,gBAAkB2sB,EAAc57B,cAE7D,OAAO,EACTsqF,EAA+BrsF,IAAI29B,EAAc57B,cACjD,IAAMpB,EAAau2B,EAAOtmB,aAAaE,KACpC/H,GAAcA,EAAUjJ,KAAO69B,EAAc57B,cAE1CuqF,EAAiB3rF,GAAYk/C,WAAWid,UAC3Czb,GAAcA,EAAUvhD,KAAO69B,EAAc/6B,eAC3C,EAEL,IADKjC,GAAc2rF,EAAiB,GAElC3uD,EAAcj9B,kBACZ8C,EAA2B9C,gBAAgBC,GAC7C,OAAO,EACT,IAAM6R,EAAc0wE,GAClBviF,EACAA,EAAWk/C,WAAWysC,GACtBA,EACArtE,GAAM/O,YAAYY,KACfD,GAAeA,EAAW9O,eAAiB47B,EAAc57B,eACzDkC,WAAagb,GAAMoH,QAEpBsX,EAAc+B,kBAChB0sD,EAAiCx6E,KAAKY,GAEtC25E,EAAa/4E,IAAIuqB,EAAc57B,aAAcyQ,EAEjD,CAEA,IAAMs0B,EAAkB7nB,GAAM/O,YAC3BQ,OAAQG,IAAgBqsB,EAA6B1rB,IAAIX,EAAW9O,eACvE,QAAW47B,KAAiBztB,EAAa,CACvC,IAAMsC,EAAc25E,EAAarwF,IAAI6hC,EAAc57B,cAC/CyQ,GAAas0B,EAAgBl1B,KAAKY,EACxC,CAEA,IAAM+5E,EAAsBttE,GAAM/O,YAC5B27E,EAAWF,KACXa,EAAuCX,EAAS37E,YAChDu8E,EAAmCZ,EAASz1D,QAClD,IAcE,GAbAm4C,GAAWge,GACXttE,GAAM/O,YAAc42B,EACpB+kD,EAAS37E,YAAc,IAClBs8E,EAAqC97E,OACrCG,IAAgBqsB,EAA6B1rB,IAAIX,EAAW9O,kBAE5DqqF,GAELP,EAASz1D,QAAUw1D,KACnBC,EAASh3E,UAAW,EACpB65D,GAAiB5nC,EAAiB7nB,GAAM6pB,gBACb,IAAvB54B,EAAYjU,QAAc+T,KAC9BiP,GAAM0vD,wBAA0BrlC,GAAoBxC,GAChDykC,OAA+BtsD,GAAMg9B,OAAQ,CAC/C54C,EAAyC65B,GACzC,QAAWS,KAAiBztB,EAAa,CACvC,GAAIytB,EAAc+B,kBAAmB,SACrC,IAAM/+B,EAAau2B,EAAOtmB,aAAaE,KACpC/H,GAAcA,EAAUjJ,KAAO69B,EAAc57B,cAE5CpB,GACFyC,EAA+BzC,EAAYg9B,EAAc/6B,YAE7D,CACF,CACA,OAAIqc,GAAMg0D,mBAAqBtL,MAAqB1oD,GAAMuhE,0BACxD7J,GAAkB7vC,EAAiB5P,EAAOtmB,aAAe,IACzDmmE,GAAqBjwC,EAAiB5P,EAAOtmB,aAAe,IAC5DgxE,MAEF/T,MACO,CACT,OACE,OAAA5uD,GAAM/O,YAAcq8E,EACpBV,EAAS37E,YAAcs8E,EACvBX,EAASz1D,QAAUq2D,GACZ,CACT,SACEZ,EAASh3E,UAAW,CACtB,CACF,CAWA,SAAS63E,GACPx8E,GAEA,IAAMgnB,EAASjY,GAAMiY,OACfK,EAASL,GAAQi7C,UAAU56C,OACjC,IAAKL,IAAWK,IAAWtY,GAAMoH,OAAQ,OAAO,KAChD,IAAMwV,EAAgC,IAAIprB,IACxC8mB,EAAOoL,eAAer/B,eAAiB,IAEzC,GAA2C,IAAvCu4B,EAA8BnnB,KAAY,OAAO,KACrD,IAAMy3E,EAAe,IAAIj3E,IACnBk3E,EAAiD,GACjDC,EAAiC,IAAI57E,IAC3C,QAAWktB,KAAiBztB,EAAa,CACvC,GACEm8E,EAA+B76E,IAAImsB,EAAc57B,gBAChD85B,EAA8BrqB,IAAImsB,EAAc57B,cACjD,OAAO,KACTsqF,EAA+BrsF,IAAI29B,EAAc57B,cACjD,IAAMpB,EAAau2B,EAAOtmB,aAAaE,KACpC/H,GAAcA,EAAUjJ,KAAO69B,EAAc57B,cAE1CuqF,EAAiB3rF,GAAYk/C,WAAWid,UAC3Czb,GAAcA,EAAUvhD,KAAO69B,EAAc/6B,eAC3C,EAEL,IADKjC,GAAc2rF,EAAiB,GAElC3uD,EAAcj9B,kBACZ8C,EAA2B9C,gBAAgBC,GAC7C,OAAO,KACT,IAAM6R,EAAc0wE,GAClBviF,EACAA,EAAWk/C,WAAWysC,GACtBA,EACArtE,GAAM/O,YAAYY,KACfD,GAAeA,EAAW9O,eAAiB47B,EAAc57B,eACzDkC,WAAagb,GAAMoH,QAEpBsX,EAAc+B,kBAChB0sD,EAAiCx6E,KAAKY,GAEtC25E,EAAa/4E,IAAIuqB,EAAc57B,aAAcyQ,EAEjD,CACA,MAAO,CAAEqpB,gCAA+BswD,eAAcC,mCACxD,CAEA,SAASO,GAAuCz8E,GAC9C,OAAwD,OAAjDw8E,GAAgCx8E,EACzC,CAEA,SAAS08E,GAAoC18E,GAC3C,IAAMgnB,EAASjY,GAAMiY,OACf21D,EAAOH,GAAgCx8E,GAC7C,IAAKgnB,IAAW21D,EAAM,OAAO,EAC7B,IACEhxD,gCACAswD,eACAC,oCACES,EAEE/lD,EAAkB7nB,GAAM/O,YAAYQ,OACvCG,IAAgBgrB,EAA8BrqB,IAAIX,EAAW9O,eAEhE,QAAW47B,KAAiBztB,EAAa,CACvC,IAAMsC,EAAc25E,EAAarwF,IAAI6hC,EAAc57B,cAC/CyQ,GAAas0B,EAAgBl1B,KAAKY,EACxC,CACA,IAAM+5E,EAAsBttE,GAAM/O,YAC5B27E,EAAWF,KACXa,EAAuCX,EAAS37E,YAChDu8E,EAAmCZ,EAASz1D,QAClD,IAaE,GAZAm4C,GAAWge,GACXttE,GAAM/O,YAAc42B,EACpB+kD,EAAS37E,YAAc,IAClBs8E,EAAqC97E,OACrCG,IAAgBgrB,EAA8BrqB,IAAIX,EAAW9O,kBAE7DqqF,GAELP,EAASz1D,QAAUw1D,KACnBC,EAASh3E,UAAW,EACpB65D,GAAiB5nC,EAAiB7nB,GAAM6pB,gBACxC7pB,GAAM0vD,wBAA0BrlC,GAAoBxC,GAChDykC,OAA+BtsD,GAAMg9B,OAAQ,CAC/C54C,EAAyCw4B,GACzC,QAAW8B,KAAiBztB,EAAa,CACvC,GAAIytB,EAAc+B,kBAAmB,SACrC,IAAM/+B,EAAau2B,EAAOtmB,aAAaE,KACpC/H,GAAcA,EAAUjJ,KAAO69B,EAAc57B,cAE5CpB,GAAYyC,EAA+BzC,EAAYg9B,EAAc/6B,YAC3E,CACF,CACA,OAAIqc,GAAMg0D,mBAAqBtL,MAAqB1oD,GAAMuhE,0BACxD7J,GAAkB7vC,EAAiB5P,EAAOtmB,aAAe,IACzDmmE,GAAqBjwC,EAAiB5P,EAAOtmB,aAAe,IAC5DgxE,MAEF/T,MACO,CACT,OACE,OAAA5uD,GAAM/O,YAAcq8E,EACpBV,EAAS37E,YAAcs8E,EACvBX,EAASz1D,QAAUq2D,GACZ,CACT,SACEZ,EAASh3E,UAAW,CACtB,CACF,CAEA,SAASi4E,GAAkC1D,GAAoB,GAE7D,IADKA,IAAsBzhB,OAAsB1oD,GAAMuhE,2BACjDvhE,GAAM/O,YAAYjU,SAoJ1B,WACE,GAAI47B,MAAsCE,KAAqC,OAAO,EACtF,IAAM4K,EAAgB1jB,GAAMiY,QAAQi7C,UAAU76C,UAAUqL,cACxD,OAAkC,IAA3BA,GAAe8P,SACjB7xC,OAAOyR,cAAcswB,EAAcyvC,WACnCzvC,EAAcyvC,SAAW,GACzBxwE,MAAMC,QAAQ8gC,EAAcr/B,gBAC5Bq/B,EAAcr/B,cAAcrH,OAAS,CAC5C,CA5JqC8wF,KAA2C9tE,GAAMoH,OAAQ,OAAO,KAEnG,IAAM2mE,EAAwB/D,KACxBgE,EAA+BC,GAAwCF,GACvEnB,EAAWxC,GACXn5E,EAAc88E,EAAsB/hF,IAAK4F,KAC7C9O,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,YACxBlC,gBACGmQ,EAAW8d,MAA4B,eAApB9d,EAAW8d,UAE3B,EADA9d,EAAWnQ,mBAEbmrF,GAAUz1D,UAAYw1D,MACtBC,EAAS37E,YAAYpH,SAAS+H,GAC9B,CAAE6uB,mBAAmB,GACrB,CAAC,KAEDytD,EAAwB,IAAI18E,IAChCP,EAAYjF,IAAK4F,GAAeA,EAAW9O,eAEvC+2B,EAA2B7Z,GAAMiY,QAAQkrD,iBAC3Cn3E,IAAKkD,IACL,IAAMi/E,EAASj/E,EAAMq3E,QAAQ10E,KAAM40E,GACjCyH,EAAsB37E,IAAIk0E,EAAO3jF,eAEnC,OAAOqrF,EACH,CACEhgF,QAASe,EAAMrO,GACfiC,aAAcqrF,EAAOrrF,aACrBc,MAAOjC,OAAOC,SAASsN,EAAMtL,OACzBpG,KAAKC,IAAI,EAAGD,KAAKqE,MAAMqN,EAAMtL,OAAS,IACtC,GAEN,OAEL6N,OAAQpD,GACO,OAAdA,GAGJ,MAAO,CACL4C,cACAunB,oBAAqBw1D,EAA6Bv4E,KAAO,EACrDxE,EAAYQ,OAAQG,GACpBo8E,EAA6Bz7E,IAAIX,EAAW9O,oBAC5C,EACJqrB,UAAWnO,GAAMoH,OACjBsS,UAAW1Z,GAAMg4D,SAAS96B,gBAAkB,GAC5CpvB,OAAQ9N,GAAMiY,QAAQ+jB,cAAgBh8B,GAAMiY,QAAQnK,OACpDsL,SAAUpZ,GAAMiY,QAAQmB,SACxBC,gBAAiBrZ,GAAMiY,QAAQoB,gBAC/BhsB,WAAYtS,SAAa,IAAcA,SAASuS,UAAO,EACvDiwB,YAAavd,GAAMiY,QAAQ8jD,cAAcC,UACzCvjD,4BACEzY,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAeyvC,SACjDp6C,oBACE/Y,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAer/B,cACjDq0B,8BACE1Y,GAAMiY,QAAQi7C,UAAU76C,UAAUqL,eAAeyvC,SACnDn6C,sBACEhZ,GAAMiY,QAAQi7C,UAAU76C,UAAUqL,eAAer/B,cACnDs0B,2BACE3Y,GAAMiY,QAAQi7C,UAAUh9D,OAAOwtB,eAAeyvC,SAChDt6C,mBACE7Y,GAAMiY,QAAQi7C,UAAUh9D,OAAOwtB,eAAer/B,iBAC5C2b,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAer/B,eAAerH,OAC9D,CACEm/B,uBAAwBwxD,GACxBttD,0BAA2BqtD,GAC3B1yD,kCAAmC64C,IAErC,CAAC,EAILz3C,eAAiBnX,KjBxlId,SAAkCA,GACvC,IAAMrf,EAAWqf,EACjB,IAAKtiB,MAAMC,QAAQgD,GAAUwf,OAAQ,OAAO,EAC5C,IAAMuU,EAAsC,iBAAnB/zB,EAASiiB,OAAsBjiB,EAASiiB,MAAQjiB,EAASiiB,MAAQ,KACtFumE,GAAQ,EACZ,QAAWt8E,KAAQlM,EAASwf,MAAO,CACjC,IAAKtT,GAAwB,iBAATA,EAAmB,SACvC,IAAMuyB,EAAOxB,GAAO/wB,GACpB,GAAY,MAARuyB,EAAc,SAClB,IAAMjyB,EAAY4wB,GAAclxB,GAI1BzG,EAAWu2B,GAAgByC,GAIjC/B,GAAe+B,EAAM1K,EAAWvnB,EAC5B,gCAAgCA,SAChC,GALiB/G,GAAY82B,GAAqB92B,EAAUsuB,GAC5DsI,GAAoB52B,GACpB,YAG2B,GAC/B+iF,GAAQ,CACV,CACA,OAAOA,CACT,EiBkkIUC,CAAyBppE,IACtBiiB,GACHlnB,GAAMiY,QAAQi7C,UAAU56C,OACxB0xD,KACAvW,UAIF76C,KACA,CACEuH,sBAAuB8sD,GACvBnyD,iCAAmC+C,IACjC7d,GAAMozD,8BAAgC,IAAI5hE,IACxCqsB,EAAsB7xB,IAAIgnE,OAIhC,CAAC,KACD/5C,KACA,CACE8B,oCAAsC8C,IACpC7d,GAAMszD,iCAAmC,IAAI9hE,IAC3CqsB,EAAsB7xB,IAAIgnE,OAIhC,CAAC,EACLn5C,yBACEA,GAA0B78B,OAAS68B,OAA2B,EAEpE,CA8BA,SAASy0D,GAA4BrvD,GACnC,IAAMyE,EAAgB1jB,GAAMiY,QAAQi7C,WAAWj0C,IAAQyE,cACvD,OAAkC,IAA3BA,GAAe8P,SACjB7xC,OAAOyR,cAAcswB,EAAcyvC,WACnCzvC,EAAcyvC,SAAW,GACzBxwE,MAAMC,QAAQ8gC,EAAcr/B,gBAC5Bq/B,EAAcr/B,cAAcrH,OAAS,CAC5C,CAgBA,SAASktF,GAA0Bj5E,EAAc+O,GAAM/O,aACrD,OAAO2nB,MACFE,MA7BP,SAA8C7nB,EAAc+O,GAAM/O,aAChE,OAAOg9E,GAAwCh9E,GAAawE,KAAO,CACrE,CA4BO84E,CAAqCvE,GAA6B/4E,GACzE,CAEA,SAASg9E,GACPh9E,EAAc+O,GAAM/O,aAEpB,IAAMK,EAAS,IAAI2E,IACjBhF,EACGQ,OAAQG,IAAgBA,EAAWc,WACnC1G,IAAK4F,GAAe,CAACA,EAAW9O,aAAc8O,EAAWjO,eAExD6qF,EAAkB,IAAIh9E,IAC5BwO,GAAMiY,QAAQi7C,UAAUh9D,OAAOvE,YAAY+H,QAAShY,IAClD,IAAMiC,EAAc2N,EAAOzU,IAAI6E,EAAWqQ,eACpCH,EAAaX,EAAYY,KAC5B/H,GAAcA,EAAUhH,eAAiBpB,EAAWqQ,eAEpC,MAAfpO,IACiC,MAA/BjC,EAAW+Q,kBACV/Q,EAAW+Q,mBAAqBb,GAAYnQ,kBAC9CC,EAAW2O,SAAS1M,IAAcuO,KAClCC,GAAuD,iBAAjCA,EAAWU,oBAEpC27E,EAAgBztF,IAAIW,EAAWqQ,iBAInC,IAAM08E,EAAqB,IAAIj9E,IAC7BwO,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAer/B,eAAiB,IAElE,QAAWvB,KAAgB2rF,EACrBn9E,EAAOiB,IAAIzP,IAAe0rF,EAAgBztF,IAAI+B,GAGpD,IAAMu1B,EAAWrY,GAAMiY,QAAQi7C,UAAU76C,SACnCq2D,EAAwB,IAAIl9E,IAAI6mB,GAAUqL,eAAer/B,eAAiB,IAChF,OAAAg0B,GAAU1mB,YAAY+H,QAAShY,IAC7B,IAAMiC,EAAc2N,EAAOzU,IAAI6E,EAAWqQ,eACpCH,EAAaX,EAAYY,KAC5B/H,GAAcA,EAAUhH,eAAiBpB,EAAWqQ,eAEjDL,EAAyB,MAAf/N,OAAsB,EAAYjC,EAAW2O,SAAS1M,GAClE+qF,EAAsBn8E,IAAI7Q,EAAWqQ,iBACJ,MAA/BrQ,EAAW+Q,kBACV/Q,EAAW+Q,mBAAqBb,GAAYnQ,kBACvB,SAAvBiQ,GAASsQ,WtC37JX,SAAgClf,GAIrC,OAAO4iB,GAAgB7oB,IAAIiG,KAAiB,CAC9C,CsCu7JS6rF,CAAuBjtF,EAAWqQ,gBACrCy8E,EAAgBztF,IAAIW,EAAWqQ,iBAG5By8E,CACT,CAEA,SAAS19E,KACP,OAAI89E,IAAgCC,sBACM,YAAtC7uE,GAAM8uE,qBAAqBj+E,OAA6B,UACf,SAAtCmP,GAAM8uE,qBAAqBj+E,OACpC,CAEA,SAASmxE,GAAkC31E,EAGvC,CAAC,GACH,IAAM89E,GAAkD,IAA9B99E,EAAQ89E,mBAC7BD,KACL,IAAKC,IAAsBzhB,OAAsB1oD,GAAMuhE,yBAA0B,OACjF,IAAMtmE,EAAQ4yE,GAAkC1D,GAChD,IAAKlvE,EAAO,OACZ,IAAMwf,IAAes0D,GACfC,EAA2B71D,GAA2Cle,GACxE2d,MACF5Y,GAAMozD,+BAA+BxsD,QAEnCqS,MACFjZ,GAAMszD,kCAAkC1sD,QAO1C5G,GAAM8uE,oBAAsB,CAC1Bt0B,GAAIn/D,KAAKC,MACTuV,OAAQm+E,EAA2B,SAAW,UAC9Ch5D,OAAQg5D,EAA2B,4BAAyB,EAC5DC,gBAAiBjvE,GAAM/O,YAAYjU,QAEhCm9B,GAA0Blf,EAAO,CAAEsf,MAAOluB,EAAQkuB,QAAS/d,KAAMD,IAChEke,IAAes0D,KACnB/uE,GAAM8uE,oBAAsB,CAC1Bt0B,GAAIn/D,KAAKC,MACTuV,OAAQ0L,EAAO1L,OACfmlB,OAAQzZ,EAAOyZ,OACfi5D,gBAAiBjvE,GAAM/O,YAAYjU,QAEf,WAAlBuf,EAAO1L,QAKJq2B,GACHlnB,GAAMiY,QAAQi7C,UAAU56C,OACxB0xD,KACAvW,GAAgB,CAAEtuC,mBAAmB,KAGnB,SAAlB5oB,EAAO1L,QACJq2B,GACHlnB,GAAMiY,QAAQi7C,UAAU56C,OACxB0xD,KACAvW,M1CvrID,WACL,IAAKj5D,GAAmB,OACxB,IAAMmsC,EAAansC,GACnBmsC,EAAWrsC,SAAW9c,KAAKC,IACzBkpD,EAAWrsC,SACXjf,KAAKC,MAAQqf,IAEfN,GACEssC,EAAWr9C,SACXq9C,EAAW11C,YACX01C,EAAW71C,sBACX61C,EAAWrsC,SACXqsC,EAAWpsC,WACXosC,EAAWz1C,uBAEf,C0C0qIMg+E,GACAtpE,GACE5F,GAAMiY,QAAQi7C,UAAU76C,SACxBrY,GAAM/O,YAAYQ,OAAO4hE,IACzBU,IAEE/zD,GAAMg0D,kBAAoBh0D,GAAMiY,SAAWywC,MAC7CuL,GAAuBj0D,GAAMiY,SAEtBW,MACT7nB,OAGN,CAyCA,SAASo+E,KACP,IAAIzmB,MAAsB1oD,GAAMuhE,wBAShC,IACE,IAAMj4C,EAAWzrC,OAAesS,SAASk5B,WAAWC,QACpD,GAAuB,mBAAZA,EAOT,YANAtpB,GAAMovE,0BAA4B,CAChC50B,GAAIn/D,KAAKC,MACTuV,OAAQ,UACRmlB,OAAQ,0BACRi5D,gBAAiBjvE,GAAM/O,YAAYjU,SAKvCssC,EAAQ,uBAAwB,CAC9Bnb,UAAWnO,GAAMoH,OACjBsS,UAAW1Z,GAAMg4D,SAAS96B,gBAAkB,GAC5CF,OAAQh9B,GAAMg9B,OACdC,YAAaj9B,GAAMi9B,YACnBhsC,YAAa+O,GAAM/O,YAAYjF,IAAK5I,KAClCN,aAAcM,EAAEN,aAChBa,YAAaP,EAAEO,YACflC,gBACG2B,EAAEssB,MAAmB,eAAXtsB,EAAEssB,UAA4C,EAApBtsB,EAAE3B,mBAE3C4tF,MAAO,CACLxkD,6BAA8B7qB,GAAMgqB,UAAUa,gCAGlD7qB,GAAMovE,0BAA4B,CAChC50B,GAAIn/D,KAAKC,MACTuV,OAAQ,OACRo+E,gBAAiBjvE,GAAM/O,YAAYjU,OAEvC,OAASquB,GACPrL,GAAMovE,0BAA4B,CAChC50B,GAAIn/D,KAAKC,MACTuV,OAAQ,SACRmlB,OAAQ3K,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,GACxD4jE,gBAAiBjvE,GAAM/O,YAAYjU,OAEvC,MA/CEgjB,GAAMovE,0BAA4B,CAChC50B,GAAIn/D,KAAKC,MACTuV,OAAQ,UACRmlB,OAAQ,mBACRi5D,gBAAiBjvE,GAAM/O,YAAYjU,OA4CzC,CAEA,SAAS2lF,KAEP,GADAoK,KACqC,kBAAjC/sE,GAAMiY,QAAQ4iD,iBAAsC76D,GAAMgqB,UAAUe,sBAGxE,QAAWyY,KAAS8rC,GACd9rC,GAAS,EACX2rC,KAGFnC,GAA4Br6E,KAC1B9U,OAAOuD,WAAW+tF,GAA6B3rC,GAGrD,CAEA,SAAS+rC,GAAkBt3D,GACzB,OAAOT,GACLS,EAAO4rD,sBAAsBC,mBAC7B9rD,GACEC,EACAjY,GAAMoH,OACNpH,GAAMoX,gBACNpX,GAAMqX,eACN,oBAEF,EAEJ,CAEA,SAASqrD,GAAmCzqD,GAC1C,IAAMu3D,EAA0C,CAC9C3uF,GAAI,cACJqJ,MAAO,yBACP2G,OAAQmP,GAAMyvE,yBAA2B,SAAW,SACpDz5D,OAAQhW,GAAMyvE,yBAA2B,0BAA4B,2BAEjEC,EAAyC,CAC7C7uF,GAAI,WACJqJ,MAAO,gBACP2G,OAAQ63D,OAAsB1oD,GAAMuhE,wBAA0B,SAAW,SACzEvrD,OAAQ0yC,KACJ,yBACA1oD,GAAMuhE,wBACJ,yBACA,0BAEFoO,EAAsC,CAC1C9uF,GAAI,QACJqJ,MAAO,iBACP2G,OAAQmP,GAAMg0D,iBAAmB,SAAW,UAC5Ch+C,OAAQhW,GAAMg0D,iBAAmB,mBAAqB,uBACtD5rC,OAAQ,CAAE+Y,OAAQlpB,EAAOtmB,aAAe,IAAItM,OAAO,CAACq3C,EAAOh7C,IAAeg7C,GAASh7C,EAAWy/C,OAAOnkD,QAAU,GAAI,KAErHgjB,GAAM07C,sBAAsBhV,QAAU,CAAE/N,MAAO,CAAC62C,EAAeE,EAAcC,GAC/E,CAEA,SAASC,GAAgB33D,GACvB,OAAOT,GACLS,EAAO4rD,sBAAsBE,kBAC7B/rD,GACEC,EACAjY,GAAMoH,OACNpH,GAAMoX,gBACNpX,GAAMqX,eACN,mBAEF,EAEJ,CAEA,SAASuqD,GAAejwE,GACtB,OAAO,IAAIsE,IAAItE,EAAY3F,IAAKtK,GAAe,CAACA,EAAWb,GAAIa,IACjE,CAEA,SAAS0jF,GACP1jF,GAEA,IAAMlC,EAAOkC,GAAYywC,WAAW09C,WAAWrwF,KAC/C,MAAgB,eAATA,GACI,gBAATA,GACS,eAATA,EACEA,EACA,OACN,CAkBA,SAASswF,KACP5f,KACA6c,KACA/sE,GAAMk6D,YAAc,KACpBl6D,GAAMiiE,sBAAwB,GAC9Bh1D,KACAmrD,KACAC,KACIr4D,GAAMg4D,UACRh4D,GAAMg4D,QAAQrsC,OACd3rB,GAAMg4D,QAAU,MAElBh4D,GAAMg0D,kBAAmB,EACzBh0D,GAAM80D,sBAAsBluD,QACxB5G,GAAMiY,QAA0C,kBAAhCjY,GAAMiY,OAAO4iD,gBAC/B6H,GAAmC1iE,GAAMiY,OAE7C,CAEA,SAASo6C,GACPr8C,EACAmY,GAAe,EACf4hD,GAAe,GAEf,IAAK/vE,GAAMiY,SAAWjY,GAAMoH,OAAQ,OAAOpH,GAAM/O,YACjD,GAAI+O,GAAMshE,oBAMR,OAAIthE,GAAMgwE,eACRhwE,GAAMgwE,cAAch6D,OAASA,EAC7BhW,GAAMgwE,cAAc7hD,aAClBnuB,GAAMgwE,cAAc7hD,cAAgBA,IAEtCnuB,GAAMgwE,cAAgB,CAAEh6D,SAAQmY,gBAC3BnuB,GAAMshE,oBAAoB9kE,KAAK,KAClC,IAAMsjC,EAAS9/B,GAAMgwE,cACrBhwE,GAAMgwE,cAAgB,KAClBlwC,GAAQuyB,GAAsBvyB,EAAO9pB,OAAQ8pB,EAAO3R,iBAGrDnuB,GAAM/O,YAEf,IAAK8+E,GAAgBj8D,KAAmB,CAItC,IAAM8yB,EAAsB1yB,GAC1BlU,GAAMiY,OAAO2R,KAAKqmD,oBAAsB,IACxC,CAAE57D,kBAAkB,IACpB7X,KAAK,KACDwD,GAAMshE,sBAAwB16B,IAAM5mC,GAAMshE,oBAAsB,MACpEjP,GAAsBr8C,EAAQmY,GAAc,KAE9C,OAAAnuB,GAAMshE,oBAAsB16B,EACrB5mC,GAAM/O,WACf,CACA,GAAoC,kBAAhC+O,GAAMiY,OAAO4iD,gBAAsC76D,GAAMgqB,UAAUe,sBACrE,OAAA/qB,GAAM/O,YAAc,GACpB+O,GAAMyvE,0BAA2B,EACjCzvE,GAAM07C,sBAAwB,CAAEhV,QAAS,CAAE/N,MAAO,IAAMhnC,YAAa,IACrEqO,GAAM0vD,wBAA0B,OACzB1vD,GAAM/O,YAEf,IAAMi/E,EAAOlwE,GAAMiY,OAAOtmB,aAAe,GAMzC,GAJA+6D,GAAkB1sD,GAAMiY,QACxBy1C,GAA2B1tD,GAAMiY,QACjCjY,GAAMyvE,yBAA2BF,GAAkBvvE,GAAMiY,QACzDyqD,GAAmC1iE,GAAMiY,SACpCjY,GAAMyvE,yBACT,OAAIzvE,GAAM/O,YAAYjU,OAAS,GAC7BsyE,GAAWtvD,GAAM/O,aAEnB+O,GAAM/O,YAAc,GACpB+O,GAAM07C,sBAAsB/pD,YAAc,GAC1CqO,GAAM0vD,wBAA0B,OAChChhD,KAC6B1G,GAAS,OAAQ,+CAA+CgO,MAC7F44C,KACO5uD,GAAM/O,YAGf,IAAMk/E,EAAajI,GAAwBgI,EAAM,CAC/C7iF,IAAKtS,SAASuS,KACd8T,WAAYpB,GAAMiY,OAAO7W,YAAc,CAAC,EACxCgG,OAAQpH,GAAMoH,OACd4tB,eAAgBs3B,KAChB6W,gBAAiBnjE,GAAMiY,OAAOkrD,kBAE1BiN,EA5GR,SACEn8E,EACA4J,EACAlM,GAEA,IAAKsC,EAASjX,OAAQ,OAAO6gB,EAC7B,IAAMkrC,EAAkB64B,GAAejwE,GACjC0+E,EAAoB,IAAI7+E,IAAIqM,EAAK7R,IAAK4F,GAAeA,EAAW9O,eAChEwtF,EAAar8E,EAASxC,OACzBG,IACEy+E,EAAkB99E,IAAIX,EAAW9O,eACuC,eAAzEsiF,GAAuBr8B,EAAgBlsD,IAAI+U,EAAW9O,gBAE1D,OAAOwtF,EAAWtzF,OAAS,IAAI6gB,KAASyyE,GAAczyE,CACxD,CA8FoB0yE,CAChBvwE,GAAM/O,YACNk/E,EAAWl/E,YACXi/E,GAIIM,EAAUvK,GAAiCmK,EAAW,CAC1DhpE,OAAQpH,GAAMoH,OACd+7D,gBAAiBnjE,GAAMiY,OAAOkrD,kBAC7BlyE,YACH+O,GAAM07C,sBAAsB/pD,YAAcw+E,EAAWp/C,YACrD,IAAMizB,EAAgB35B,GAAoBmmD,GACpCC,EAAaD,EAAQt+E,KACxBN,GAEC,gBADAwzE,GAAuB8K,EAAKr+E,KAAMnQ,GAAeA,EAAWb,KAAO+Q,EAAW9O,gBAG5EwB,EAAU0/D,IAAkBhkD,GAAM0vD,yBAA2B+gB,EAEnE,OAAInsF,GAAW6pC,GACbmhC,GAAWtvD,GAAM/O,aACjB+O,GAAM/O,YAAcu/E,EACpB/gB,GAAiB+gB,EAASxwE,GAAM6pB,gBAChC7pB,GAAM0vD,wBAA0B1L,EAC5BhkD,GAAMg0D,mBAAqBtL,MAAqB1oD,GAAMuhE,0BACxD7J,GAAkB13D,GAAM/O,YAAai/E,GACrCpY,GAAqB93D,GAAM/O,YAAai/E,GACxClO,KACAW,KACe,QAAX3sD,GACFi+C,GAAuBj0D,GAAMiY,WAIjCjY,GAAM/O,YAAcu/E,EACpB3H,GAA4B2H,IAGDxoE,GAAS,OAAQ,6BAA6BgO,KAAW,CACpF1xB,UACAo4C,MAAO18B,GAAM/O,YAAYjU,SAE3B4xE,KACO5uD,GAAM/O,WACf,CAEA,SAASy/E,KACP,GAAK1wE,GAAMiY,QAAWjY,GAAMoH,OAM5BirD,GAAsB,UAAU,GAChCzD,UANE,IACE7zE,SAASg8D,QACX,OAAS,CAKb,CAEO,SAASgC,KACd,MAAO,CACL9gC,OAAQjY,GAAMiY,OACdhnB,YAAa+O,GAAM/O,YAAY3N,QAC/Bo4D,sBAAuB,CACrBhV,QAAS,CAAE/N,MAAO34B,GAAM07C,sBAAsBhV,QAAQ/N,MAAMr1C,SAC5DqO,YAAaqO,GAAM07C,sBAAsB/pD,YAAYrO,SAEvDwJ,SAAUkT,GAAMlT,SAAW,IAAKkT,GAAMlT,UAAa,KACnDs8B,SAAUppB,GAAMopB,SAChB4T,OAAQh9B,GAAMg9B,OACdqc,cAAemmB,KAEnB,CAEO,SAASplB,GAA8Br/C,GAC5C,OAAA8zD,GAA4B9tE,IAAIga,GACzB,KACL8zD,GAA4BrhE,OAAOuN,GAEvC,CAEO,SAASogD,GAA4Br4D,EAAsBa,IAC3Db,IAAiBa,IACtBqc,GAAMlT,SAAW,IAAMkT,GAAMlT,UAAY,CAAC,EAAIse,CAACtoB,GAAea,GAC9DkJ,GAAemT,GAAMlT,UACrB4jF,KACF,CAEO,SAASr1B,GAAwBv4D,GACtC,GAAKA,GACc,GACRkd,GAAMlT,SAAU,CACzB,IAAM+Q,EAAO,IAAKmC,GAAMlT,iBACjB+Q,EAAK/a,GACZkd,GAAMlT,SAAWhQ,OAAOC,KAAK8gB,GAAM7gB,OAAS6gB,EAAO,IACrD,OALEmC,GAAMlT,SAAW,KAMnBD,GAAemT,GAAMlT,UAAY,CAAC,GAClC4jF,IACF,CAEA,SAASC,GACP14D,EACAtmB,EACA+hD,EAA6B,SAC7Bk9B,EAA+BjqB,KAC/BkqB,EAAsE,MAEtE,IAAMC,EAA0BtqB,KAC1BuqB,EAAgB9pB,GAAqBhvC,GACrC+4D,EAASD,EAAc3pB,gBACvB6pB,EAAYF,EAAczpB,qBAC1B4pB,EAAaH,EAActpB,cAC3Bob,EAAckO,EAAcnpB,sBAC5BupB,EAAWJ,EAAcjpB,eACzB1+B,EAAWJ,GAAgB/Q,GAC3B+R,EAAYF,GAAc7R,GAC1Bm5D,EhB15KD,SACLn5D,EACAtmB,EACAy3B,GA4BA,QA1B8B,kBAA1BnR,EAAO4iD,iBACN/wC,GAAc7R,GAAQ8S,uBACvBp5B,EAAY3U,OAAS,IACpBi7B,EAAO5Z,SAASrhB,QAAU,GAAK,GAChC4rC,GAAc3Q,EAAOi7C,YACpBj7C,EAAOwrD,mBAAmBzmF,QAAU,GAAK,IACzCi7B,EAAOg4C,kBAAkBtiD,SAAS3wB,QAAU,GAAK,GAClD4rC,GAAc3Q,EAAO09C,uBA1B3B,SAAwB19C,GACtB,IAAMo2C,EAAcp2C,EAAOo2C,YAC3B,SACEA,GAAa9mD,SACV8mD,GAAaruE,KAAKC,QAClBouE,GAAagjB,UAAUpxF,QACvBouE,GAAar+B,IAAI/vC,OAExB,CAmBMqxF,CAAer5D,IACfA,EAAOuqD,kBAAkBj7D,SACzB0Q,EAAOsrD,OAAOh8D,SACd0Q,EAAOs5D,iBAAmBz0F,OAAO6B,QAAQs5B,EAAOs5D,iBAAiBr/E,KAAK,EAAExN,EAAK6iB,KACvE,eAAR7iB,IAAoC,IAAZ6iB,IAEtB0Q,EAAOs5D,iBAAiBC,YAAoD,SAAtCv5D,EAAOs5D,gBAAgBC,YAC7Dv5D,EAAOurD,aAAaiO,aAAkD,WAAnCx5D,EAAOurD,YAAYiO,aACtDx5D,EAAOy5D,YAAoC,SAAtBz5D,EAAOy5D,YAA+C,SAAtBz5D,EAAOy5D,YAC5Dz5D,EAAO2R,MACT3R,EAAO2R,IAAI+nD,YACR15D,EAAO2R,IAAIu+B,kBACmB,WAA9BlwC,EAAO2R,IAAIC,gBACV5R,EAAO2R,IAAI8nD,YAAwC,SAA1Bz5D,EAAO2R,IAAI8nD,YAAmD,SAA1Bz5D,EAAO2R,IAAI8nD,aAE7C,QAA7Bz5D,EAAOkR,SAASC,UAA8C,QAAxBnR,EAAOgR,cAAuC,QAAbG,GACvEnR,EAAO4rD,sBAAsBC,oBAAoB7jF,QACU,iBAA1Dg4B,EAAO4rD,qBAAqBC,mBAAmB7jF,QAChDg4B,EAAO4rD,sBAAsBE,mBAAmB9jF,QACU,iBAAzDg4B,EAAO4rD,qBAAqBE,kBAAkB9jF,OAErD,CgBw3KuC2xF,CAA0B35D,EAAQtmB,EAAay3B,GAC9ES,EAAiBF,GAAsB1R,GACvCiwC,EAp9JR,SAAgCjwC,GAC9B,IAAMz4B,EAAOy4B,EAAOurD,aAAaiO,YACjC,MAAa,eAATjyF,GAAkC,eAATA,GAAkC,WAATA,EAA0BA,EACzE,QACT,CAg9J0BqyF,CAAuB55D,GACzC65D,EAAiB9nD,EAAUY,wBhBz0K5B,SAA2B3S,EAAoBmR,GACpD,GAAInR,EAAO2R,KAAK+nD,WAAY,MAAO,OACnC,IAAMI,EAAY95D,EAAO2R,KAAK8nD,YAAcz5D,EAAOy5D,YAAc,OACjE,MAAkB,SAAdK,EAA6BA,EAChB,YAAb3oD,GAA2BnR,EAAO2R,KAAKu+B,iBACpCt/B,KAAqB,aAAe,UADyB,MAEtE,CgBo0KMmpD,CAAkB/5D,EAAQmR,GAC1B,UACEsoD,EAAiC,eAApBxpB,GAAuD,SAAnB4pB,EACnD,UACAA,EACEG,GAAkD,IAA3Bh6D,EAAO2R,KAAK+nD,YAA2C,WAApBzpB,EAC1DgqB,EAAiBjqB,GAAsBhwC,EAAQiwC,GAC/CiqB,EhB9wKD,SACLxgF,EACA0M,EAAiC,IAEjC,IAAM+rB,EAAqB,CAAE3rC,MAAM,EAAOhC,QAAQ,EAAO4e,MAAM,GAC/D,QAAW4S,KAAOtc,EAAa,CAC7B,IAAM88B,EAAQxgB,EAAIkkB,WAAW9kC,IAC7B,GAAKohC,GAA0B,IAAjBA,EAAMzxC,OACpB,QAAWmvB,KAAQsiB,EAEjB,GADAtE,GAAsBC,EAAMje,EAAKxd,QAASwd,EAAKxkB,MAC3CyiC,EAAK3rC,MAAQ2rC,EAAK3tC,QAAU2tC,EAAK/uB,KAAM,OAAO+uB,CAEtD,CAEA,QAAWwiC,KAAcvuD,GAAW,GAAI,CACtC,IAAM7e,EAAOotE,EAAW1gD,SAAS1sB,KASjC,GARa,kBAATA,IACF4qC,EAAK3tC,QAAS,IAEH,iBAAT+C,GAAoC,WAATA,KAC7B4qC,EAAK3rC,MAAO,EACZ2rC,EAAK3tC,QAAS,EACd2tC,EAAK/uB,MAAO,GAEV+uB,EAAK3rC,MAAQ2rC,EAAK3tC,QAAU2tC,EAAK/uB,KAAM,OAAO+uB,CACpD,CAEA,OAAOA,CACT,CgBkvKuBgoD,CAAoBzgF,EAAasmB,EAAO5Z,SAC7DyoD,GAAa8pB,EAAa,mBAAoBE,GAC9C,IAAMuB,EAAsB7rB,KAE5BuT,GAAsB,CACpBf,MAAO,eACPjT,UAHoB1qE,KAAKC,MAIzB49E,kBAAoC,YAAjBxlB,EAA6B1zC,GAAM+4D,KAAKG,kBAAoBl5D,GAAM+4D,KAAKG,mBAAqB,SAEjH,IAAMoZ,EAA2B9rB,KAC3B+rB,EAAyBvmB,GAAuB/zC,GAChDu6D,EAAwBrmB,GAAsBl0C,EAAQs6D,GACtDE,EAA+B7pB,GAAkB3wC,GACjDy6D,EAAwBrrE,GAC5BkrE,EACAC,EACAC,GAEFzyE,GAAMoX,gBAAkBm7D,EACxBvyE,GAAMqX,eAAiBm7D,EACvBxyE,GAAM2yE,oBAAqD,IAAhC16D,EAAOqxC,aAAa/hD,QAC/CvH,GAAM2oD,sBAAwB8pB,EAC9BppF,GAAyBqpF,EAAwBz6D,EAAO4wC,eAAiB,IAAM5wC,EAAO4wC,gBAAkB,CAAC,EAAIt/D,YAAa,WACrHmpF,GACH/kB,KAEF,IAAMilB,EAAWxB,EAA+B,KAAOP,EACnD6B,GAAyBE,GAAUzkE,YAAc8J,EAAO7Q,QAC1D5b,GAAYonF,EAASzkE,WAEvB,IAAM0kE,EAAiBH,EACnBvnF,GAAU8sB,EAAO7Q,Q9ClyKhB,SAA4Bhc,GACjC,OAAOA,GAAYvC,IACrB,C8CiyKMiqF,CAAmB76D,EAAO7Q,QAE9BD,GAAe8Q,EAAOsrD,MAAOsP,EAAgB,CAAExrE,eAAgBqrE,IAC/D5rB,GAAa8pB,EAAa,sBAAuB0B,GAEjD,IAAMS,EAAwBvsB,KpC33KzBz+C,cACMI,QAAY,KACvBA,QAAQjZ,MAAM,GAAGoZ,UAAmBC,KoC23KPP,GAAS,OAAQ,qBAAqBrW,EAAY3U,uBAAwB,CACrGkqE,cAAe6pB,EAAc7pB,cAC7BG,YAAa2pB,EACbvpB,cAAeypB,EACf9nD,WACAsoD,aACA7nD,iBACA25C,YAAatb,EACbxU,iBAE2B8U,GAAU,4BAA6B,CAClE2K,SAAUl7C,EAAOgjD,UAAU9H,SAC3Bqe,WAAYv5D,EAAOs5D,iBAAiBC,WACpC99B,eACA0qB,cAAenmD,EAAOgjD,UAAUmD,eAAiBnmD,EAAOmmD,gBAE7B5V,GAAU,oBAAqB,CAC1D16C,OAAQmK,EAAOnK,OACfo5C,cAAe6pB,EAAc7pB,cAC7B99B,WACAsoD,aACA7nD,iBACA25C,YAAatb,IAEcE,GAAM,OAAQ,SAASz2D,EAAY3U,uBAAwB,CACtFkqE,cAAe6pB,EAAc7pB,cAC7BG,YAAa2pB,EACb5nD,WACAsoD,aACA7nD,iBACA25C,YAAatb,EACbxU,iB7BjhLG,SAAqBs/B,GAC1BjoE,GAAeioE,CACjB,C6BmhLEC,CAAY9B,GACPC,GAh8IP,SAA0Bn5D,GACxB,IAAMo2C,EAAcp2C,EAAOo2C,YAC3B,GAAKA,GAAa9mD,QAClB,IAAI8mD,EAAYruE,KAAO+B,WAAWpG,SAAU,CAC1C,IAAMkF,EAAK,mBACPF,EAAQhF,SAASmE,eAAee,GAC/BF,IACHA,EAAQhF,SAASiF,cAAc,SAC/BD,EAAME,GAAKA,GACVlF,SAASsF,MAAQtF,SAASgC,iBAAiBuD,YAAYP,IAE1DA,EAAMG,YAAcutE,EAAYruE,GAClC,CACIquE,EAAYgjB,UAAUrmE,GAAOqjD,EAAYgjB,SAAU,iBAAgB,CACzE,CAk7IqC6B,CAAiBj7D,GAEpD,IAAMk7D,EAAc/mF,GAAgB,CAAEE,eAAgBggE,OAChD8mB,EAAmBR,GAAU9lF,UAAYhQ,OAAOC,KAAK61F,EAAS9lF,UAAU9P,OAAS,EACnF41F,EAAS9lF,SACT,KACJkT,GAAMlT,SAAWsmF,GAAoBD,EACjC,IAAMC,GAAoB,CAAC,KAAQD,GAAe,CAAC,GACnD,KAIJnzE,GAAMg9B,OAAStwC,GAAS,CAAEJ,eAAgBggE,OAC1CtsD,GAAM87D,eAAiBpwE,KACvB,IAAM81E,EAAuB4P,IACvBpxE,GAAMg9B,SACNh9B,GAAM87D,eACNuX,EAAiB,IAClBp7D,EACHtmB,cACAkpE,eAAgB2G,EAAuB,gBAAkB,QAKrD8R,EAAwB16D,MACa,YAAtC5Y,GAAM8uE,qBAAqBj+E,QAE7BwiF,EAAengB,UAAUh9D,Q1Cz/Kb,OAAbvP,IACiB,OAAjB6S,IACAD,GAAU9D,KAAO,GACjBvB,GAAmBuB,KAAO,GACd,OAAZjP,IACAoP,IACmB,OAAnBrF,IACoB,OAApBE,IACsB,OAAtB+J,I0Ck/K4B84E,KAE5BvE,IAA6B,ElBr/K/Bv0D,IAAwB,EkBu/KtBzpB,MAEFiP,GAAMiY,OAASo7D,EACfrzE,GAAMoH,OAASyrE,EACf7yE,GAAMynD,cAAgBypB,EACtBlxE,GAAM4nD,sBAAwBib,EAC9B7iE,GAAMoX,gBAAkBm7D,EACxBvyE,GAAMqX,eAAiBm7D,EACvBxyE,GAAM2yE,oBAAqD,IAAhC16D,EAAOqxC,aAAa/hD,QAC/CvH,GAAM2oD,sBAAwB8pB,EAC9BzyE,GAAMyvE,yBAA2BjO,GAAwB+N,GAAkB8D,GAC3ErzE,GAAMuhE,wBAA0BC,GAAwBoO,GAAgByD,GACxErzE,GAAMg0D,kBAAmB,EACzBh0D,GAAM80D,sBAAsBluD,QAC5B5G,GAAMozD,8BAAgC,KACtCpzD,GAAMszD,iCAAmC,KACzCtzD,GAAMwzD,+BAAiC,KACnCob,KACFA,GAA+Bn0D,YAAc,EAC7Cm0D,GAA+BC,qBAAsB,EACrDD,GAA+BzlE,QAAU,MAE3CnJ,GAAMopB,SAAWA,EACjBppB,GAAM0xE,WAAaA,EACnB1xE,GAAM6pB,eAAiBA,EACvB7pB,GAAMgqB,UAAYA,EAClBhqB,GAAMmyE,aAAeA,EACrBnyE,GAAM0zC,aAAeA,EACrB1zC,GAAM+wE,cAAgBA,EACtB/wE,GAAMkoD,gBAAkBA,EACxBloD,GAAMoxD,yBAA0B,EAChC,IAAM/jE,EAAM4qB,EAAO5qB,KAAOtS,SAASuS,KA4FnC,GA3F6Bk7D,GAAU,iBAAkB,CACvDn7D,MACAsE,YAAaA,EAAY3U,OACzBqhB,QAASg1E,EAAeh1E,SAASrhB,QAAU,IAIzCgjB,GAAMg9B,QACRh9B,GAAMi9B,Y7Cp8KH,SAAwBxoB,EAAwBpoB,GACrD,IAAMgb,GAA6C,IAA5Bhb,GAASgb,eAC1B1b,EAAQqB,GACZ,IAAIxQ,gBAAgBzB,SAAS0B,QAAQI,IAAI,oBAE3C,GAAI8O,EAAO,CACT,GAAI0b,EACF,IACElrB,eAAec,QAAQmQ,GAAwBzB,EACjD,OAAS,CAEX,OAAOA,CACT,CAEA,IAAK0b,EAAgB,OAAOoN,IAE5B,IACE,IAAMv4B,EAAS8Q,GAAoB7Q,eAAeC,QAAQgR,KAC1D,GAAIlR,EAAQ,OAAOA,EACnB,IAAMq3F,EAAY9+D,IAClB,OAAAt4B,eAAec,QAAQmQ,GAAwBmmF,GACxCA,CACT,OACE,OAAO9+D,GACT,CACF,C6C26KwB++D,CAAe/G,GAAqB,CAAEplE,eAAgBilD,OAC7CtkD,GAAS,KAAM,iBAAkB,CAAElb,SAAUkT,GAAMlT,SAAU4sB,UAAW1Z,GAAMi9B,cAC9EmrB,GAAM,KAAM,iBAAkB,CAAE1uC,UAAW1Z,GAAMi9B,cAE1Ej9B,GAAMlT,UAAYw/D,MACpBz/D,GAAemT,GAAMlT,WAGvBkT,GAAMi9B,YAAc,GAElBj9B,GAAM87D,iBACqB9zD,GAAS,KAAM,0BACfogD,GAAM,KAAM,2BAIvCpoD,GAAMyzE,eACRzzE,GAAMyzE,eACNzzE,GAAMyzE,aAAe,MAEnBzzE,GAAM0zE,kBACR1zE,GAAM0zE,kBACN1zE,GAAM0zE,gBAAkB,MAEtB1zE,GAAM2zE,eACR3zE,GAAM2zE,eACN3zE,GAAM2zE,aAAe,MAEnB3zE,GAAM4zE,qBACR5zE,GAAM4zE,qBACN5zE,GAAM4zE,mBAAqB,MAEzB5zE,GAAM6zE,qBACR7zE,GAAM6zE,qBACN7zE,GAAM6zE,mBAAqB,MAEzB7zE,GAAM8zE,uBACR9zE,GAAM8zE,uBACN9zE,GAAM8zE,qBAAuB,MAE3B9zE,GAAM+zE,wBACR/zE,GAAM+zE,wBACN/zE,GAAM+zE,sBAAwB,MAE5B/zE,GAAMg0E,uBACRh0E,GAAMg0E,uBACNh0E,GAAMg0E,qBAAuB,MAE/Bh0E,GAAMiqE,gCACNjqE,GAAMiqE,4BAA8B,KACpC/Z,KACAjjD,KACAmrD,KACAC,KACIr4D,GAAMg4D,UACRh4D,GAAMg4D,QAAQrsC,OACd3rB,GAAMg4D,QAAU,MAElBh4D,GAAMiiE,sBAAwB,GAG9Bh7E,EAAoBu6E,GAEpBxhE,GAAMg0E,qBA37JR,SAAuC/7D,GACrC,IAAKA,EAAOqxC,aAAa/hD,gBAAkB1pB,OAAW,IAAa,OAAO,KAC1E,IAAMghD,EAAS,CACb,wBACA,wBACA,0BACA,oBACA,qBACA,2BACA,kBACA,yBACA,oBACA,oBACA,uBACA,2BAEIxhD,EAAU,IAAMyuE,GAAsB7zC,GAC5C4mB,EAAOnlC,QAASgC,GAAU7d,OAAOK,iBAAiBwd,EAAOre,IACzD,IAAM42F,EAAiB,CAAC,uBAAwB,kCACrCt4F,SAAa,KACtBs4F,EAAev6E,QAASgC,GAAU/f,SAASuC,iBAAiBwd,EAAOre,IAGrE,IAAI62F,EAAmD,KACnDC,EAAqD,KACnDC,EAAc,KACA,OAAdF,IACF52C,cAAc42C,GACdA,EAAY,MAEO,OAAjBC,IACF/0F,aAAa+0F,GACbA,EAAe,OAInB,OA3CF,SAAqCl8D,GACnC,IAAMoxC,EAAUpxC,EAAOqxC,YAEvB,SADKD,GAAS9hD,SAAWvH,GAAMqX,gBAC3BgyC,EAAQE,UAAY8qB,GAA+B9hF,IAAI82D,EAAQE,WACvC,WAArBF,EAAQE,UAA8C,cAArBF,EAAQE,UAAsD,iBAAnBF,EAAQwC,OAC7F,CAsCMyoB,CAA4Br8D,KAC9Bi8D,EAAY92C,YAAY,KACtB0uB,GAAsB7zC,GAClBjY,GAAMqX,gBAAgB+8D,KACzBG,IACHJ,EAAe/yF,WAAWgzF,EAAaI,KAGlC,KACLJ,IACAv1C,EAAOnlC,QAASgC,GAAU7d,OAAOS,oBAAoBod,EAAOre,WACjD1B,SAAa,KACtBs4F,EAAev6E,QAASgC,GAAU/f,SAAS2C,oBAAoBod,EAAOre,IAG5E,CAw4J+Bo3F,CAA8BpB,GACtD7R,IACH9U,GAAkB2mB,GAClB3lB,GAA2B2lB,GAC3BrzE,GAAM4zE,mBAj0JV,SAAoC37D,GAClC,IAAM00C,GAAe10C,EAAO5Z,SAAW,IAAI5M,OAAQm7D,GACpB,mBAA7BA,EAAW1gD,SAAS1sB,MAA6BotE,EAAW1gD,QAAQ1T,UAEtE,IAAKm0D,EAAY3vE,eAAiBrB,SAAa,MAAgBA,SAASuC,iBACtE,OAAO,KAGT,IAAMb,EAAWqe,IACf,IAAK4wD,KAA4B,OACjC,IAAM3wD,EAASD,EAAMC,OACrB,IAAKA,GAAiD,mBAA/BA,EAAmB7H,QAAwB,OAClE,IAAM4gF,EAAgB/4E,EAEtB,QAAWixD,KAAcD,EAAa,CACpC,IAAMzgD,EAAU0gD,EAAW1gD,QACrB1T,EAAW0T,EAAQ1T,SACzB,IAAKA,EAAU,SACf,IAAIoC,EAA0B,KAC9B,IACEA,EAAU85E,EAAc5gF,QAAQ0E,EAClC,OACEoC,EAAU,IACZ,CACA,IAAKA,EAAS,SAEd,IAAInY,GAAe,EAGnB,GAFuB,SAAnBypB,EAAQvV,SAAmBlU,EAAMmY,EAAQ9Z,aAAab,QAAU,IAC7C,cAAnBisB,EAAQvV,QAA0BuV,EAAQG,YAAW5pB,EAAMmY,EAAQ5G,aAAakY,EAAQG,YACrE,YAAnBH,EAAQvV,QAAwBuV,EAAQG,UAAW,CACrD,IAAM3nB,EAAMwnB,EAAQG,UAAU1iB,QAAQ,SAAU,IAAIA,QAAQ,YAAa,CAAC2iB,EAAGmhD,IAAiBA,EAAKjhD,eACnG/pB,EAAOmY,EAAwBlC,UAAUhU,EAC3C,CACuB,aAAnBwnB,EAAQvV,SAAuBlU,EAAMypB,EAAQnpB,QAAS,GAE1D,IAAMA,EAAQwpE,GAAkB9pE,EAAKmqE,EAAWJ,gBAClC,IAAVzpE,GAAqBgb,GAAgB6uD,EAAWloE,IAAK3B,EAAO6pE,EAAW5uD,QAAS,iBACtF,GAGF,OAAAriB,SAASuC,iBAAiB,QAASb,GAAS,GACrC,IAAM1B,SAAS2C,sBAAsB,QAASjB,GAAS,EAChE,CAuxJ+Bs3F,CAA2BtB,GACtDrzE,GAAM6zE,mBAvyHV,SAAsCliF,GACpC,OAAOA,EAAYO,KAAMxQ,IACvB,IACE,OAAOrF,KAAKa,UAAUwE,EAAWywC,WAAa,CAAC,GAAGtoC,SAASyX,GAC7D,OACE,OAAO,CACT,GAEJ,CA+xH+BszE,CAA6BjjF,GvC/gLrD,WACL,IAAMnL,EAAUma,KAChBjC,GAAiB4C,GAAyB9a,GAC1C,IAAMmlC,EAAO5qB,GAA+B4F,IAC1CjI,GAAiB4C,GAAyBqF,GuC6gLpC+mD,GAA2B2lB,GAC3BhhB,GAAsB,SvC3gL9B,MAAO,KACL1mC,IACAhtB,GAAmB2C,IAEvB,CuCqgLQuzE,GAIA,KACJ70E,GAAM8zE,qBA52IV,SAAkCniF,EAA2BqP,GAC3D,IbhaK,SAAgCrP,GACrC,OAAOA,EAAYO,KAAMxQ,IACtBA,EAAWywC,WAAW0G,WAAa,IAAI3mC,KAAMia,KACpCA,EAAK4iB,mBAAmB9jB,MAAMhrB,UAC5BksB,EAAK+iB,SAASD,WAAWhvC,UAElCyB,EAAWywC,WAAWiH,cAAgB,IAAIlnC,KAAMia,IAC9CA,EAAKsiB,OAAO2B,YAAc,IAAIl+B,KAAM49B,KAC3BA,EAAUE,IAAI/kB,MAAMhrB,SAItC,CaqZK60F,CAAuBnjF,WACjB9T,OAAW,YACXlC,SAAa,IAEpB,MAAO,OAIT,IAAMo5F,EA1NR,SAAoCpjF,GAClC,IAAM6M,EAAO,IAAIhN,IACX4+B,EAAiC,GACvC,QAAW1uC,KAAciQ,EACvB,QAAWwa,KAAQzqB,EAAWywC,WAAWiH,cAAgB,GACvD,QAAWtJ,KAAa3jB,EAAKsiB,OAAO2B,YAAc,GAAI,CACpD,IAAMnlB,EAAO6kB,EAAUE,IAAI/kB,MAAMhrB,OACjC,IAAKgrB,EAAM,SACX,IAAMvmB,EAAM,GAAGorC,EAAU9qB,UAAUiG,IAC/BzM,EAAKjM,IAAI7N,KACb8Z,EAAKzd,IAAI2D,GACT0rC,EAAWz9B,KAAKm9B,GAClB,CAGJ,OAAOM,CACT,CAyM8B4kD,CAA2BrjF,GAEpDF,OAAO68D,IACPtiE,IAAK8jC,GAzIV,SAAkCA,EAA6B9uB,GAC7D,IAAMrK,EAASm5B,EAAUE,IAAI/kB,MAAMhrB,OACnC,IAAK0W,GAAUA,EAAO3Z,OAAS,IAAM,MAAO,OAE5C,IAAI0xE,EACAp9D,IAAiB07D,GAAiB,CAAE5uD,iBAAiB,IAAS0xB,EAAU9qB,QACtE3Y,EAAU,CAAEihE,SAAUh8D,GACtBq9D,EAAY9wD,IAChB,IAAMwvD,KACK,IAATxvD,GAEIA,GAAwB,iBAATA,GAAqB,aAAcA,IACvCA,EAAgCyvD,UAEjDh8D,EAAS+7D,EACThhE,EAAQihE,SAAWD,EACnB3uD,GAAiBoxB,EAAU9qB,OAAQqoD,GACnCrsD,KAGF,IACE,IAAMmW,EAAUo3C,GAAsBz+B,GAiBtC4+B,EAhBW,IAAIvjD,SACb,WACA,UACA,UACA,8PASKxU,iFAbI,CAgBGg4D,EAAUtiE,EAAS8qB,EACnC,OAAS9L,GACsB5C,GAAU,+BAAgC4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,IACvH3M,GAAiBoxB,EAAU9qB,QAAQ,EACrC,CAEA,MAAO,KACL,IAC0B,mBAAb0pD,GAAyBA,GACtC,OAASrjD,GACsB5C,GAAU,6BAA8B4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,GACvH,EAzEJ,SAA2BykB,GACzB,IAAMmlD,EAAYnlD,EAAUE,IAAIilD,WAAWh1F,OAC3C,GAAKg1F,KAAaA,EAAUj4F,OAAS,KACrC,IACE,IAAMm6B,EAAUo3C,GAAsBz+B,GAC3B,IAAI3kB,SACb,UACA,0QASiB8pE,oBAXR,CAaR99D,EACL,OAAS9L,GACsB5C,GAAU,0BAA2B4C,aAAiB0M,MAAQ1M,EAAMnD,QAAUpY,OAAOub,GACpH,CACF,EAoDI6pE,CAAkBplD,GAClBnxB,GAAmBmxB,EAAU9qB,QAC7BhE,IAEJ,CAmFwBm0E,CAAyBrlD,EAAW9uB,IACpDo0E,EA3MR,SAAiCzjF,GAC/B,IAAM6M,EAAO,IAAIhN,IACXi9B,EAA6B,GACnC,QAAW/sC,KAAciQ,EACvB,QAAWwa,KAAQzqB,EAAWywC,WAAW0G,WAAa,GAAI,CACxD,IAAMr5C,EAAO2sB,EAAK+iB,SAAS1vC,KAC3B,GAAa,oBAATA,GAAuC,eAATA,EAAuB,SACzD,IAAMyrB,EAAOkB,EAAK+iB,SAASD,WAAWhvC,OAChC+kB,EAASmH,EAAK+iB,SAASlqB,OAC7B,IAAKiG,IAASjG,EAAQ,SACtB,IAAMtgB,EAAM,GAAGsgB,KAAUiG,IACrBzM,EAAKjM,IAAI7N,KACb8Z,EAAKzd,IAAI2D,GACT+pC,EAAM97B,KAAKwZ,GACb,CAEF,OAAOsiB,CACT,CA0L8B4mD,CAAwB1jF,GACjD3F,IAAKmgB,GAASsiD,GAAuBtiD,EAAMnL,IAE1CC,EAA2B,KACzBE,EAAW,KACG,OAAdF,IACJA,EAAYpjB,OAAOuD,WAAW,KAC5B6f,EAAY,KACZD,KACC,MAGC03C,EAAmF,CACvF,CAAC/8D,SAAU,QAASwlB,EAAU,CAAE+K,SAAS,EAAM/tB,SAAS,IACxD,CAACxC,SAAU,QAASwlB,EAAU,CAAE+K,SAAS,EAAM/tB,SAAS,IACxD,CAACxC,SAAU,SAAUwlB,EAAU,CAAE+K,SAAS,EAAM/tB,SAAS,IACzD,CAACxC,SAAU,QAASwlB,EAAU,CAAE+K,SAAS,IACzC,CAACvwB,SAAU,eAAgBwlB,GAC3B,CAACxlB,SAAU,uBAAwBwlB,GACnC,CAACtjB,OAAQ,SAAUsjB,EAAU,CAAEhjB,SAAS,IACxC,CAACN,OAAQ,SAAUsjB,EAAU,CAAEhjB,SAAS,KAGtCwI,EAAoC,KACxC,cAAW8S,iBAAqB,KAAe9d,SAASgC,kBACtDgJ,EAAW,IAAI8S,iBAAiB0H,GAChCyH,GAAsBjiB,EAAUwa,GAChCxa,EAASe,QAAQ/L,SAASgC,gBAAiB,CACzCyjB,YAAY,EACZzH,WAAW,EACXE,SAAS,KAIb6+C,EAAUh/C,QAAQ,EAAEiC,EAAQD,EAAOX,EAAU1O,MAC3CsP,EAAOzd,iBAAiBwd,EAAOX,EAAU1O,KAGpC,KACa,OAAd4U,GAAoBpjB,OAAOuB,aAAa6hB,GACxCta,IACFA,EAASE,aACTkiB,GAAwBpiB,IAE1BouF,EAAiBr7E,QAASmzB,GAAYA,KACtCuoD,EAAoB17E,QAASmzB,GAAYA,KACzC6rB,EAAUh/C,QAAQ,EAAEiC,EAAQD,EAAOX,EAAU1O,MAC3CsP,EAAOrd,oBAAoBod,EAAOX,EAAU1O,KAGlD,CA6yIiCipF,CAAyB3jF,EAAa,KACjE0gE,GAAsB,SAExBryD,GAAM+zE,sBA71HV,SAAkC97D,GAChC,IAAMs9D,EA9GR,SAAoCt9D,GAClC,OAAQA,EAAOwrD,mBAAqB,IAAIhyE,OAAQy9B,IAAiC,IAArBA,GAAS3nB,WAA6B2nB,EAAQiiC,UAC5G,CA4GmBqkB,CAA2Bv9D,GAC5C,IAAKs9D,EAASv4F,eAAiBa,OAAW,IAAa,OAAO,KAE9D,IAAM43F,EAAU,IAAIx/E,IACpB,QAAWi5B,KAAWqmD,EAAU,CAC9B,IAAMnoD,EAAY8B,EAAQwhC,eAAiB,YAC3C+kB,EAAQthF,IAAIi5B,EAAW,IAAKqoD,EAAQ54F,IAAIuwC,IAAc,GAAK8B,GAC7D,CAEA,IAAM9C,EAA8B,GACpC,QAAYgB,EAAWsoD,KAAkBD,EAAQ92F,UAAW,CAC1D,IAAM4G,EAAI1H,OACJyvC,EAAQ3qC,MAAMC,QAAQ2C,EAAE6nC,IAAc7nC,EAAE6nC,GAAa,GAC3D7nC,EAAE6nC,GAAaE,EACf,IAAMC,EAAeD,EAAM36B,KACvBrB,GAAS,EACPk8B,EAAW17B,IACf,IAAKR,EAAQ,OACb,IAAMqsB,EAAU/T,GAAwB9X,GACxC,IAAK6rB,EAAS,OACd,IAAMwzC,EAAqC,iBAAlBxzC,EAAQjiB,MAAqBiiB,EAAQjiB,MAAQ,GACtE,QAAWwzB,KAAWwmD,EAChBvkB,IAAcjiC,EAAQiiC,WACxBV,GAAqBvhC,EAASvR,EAASyP,EAAWzP,IAAY7rB,IAKpEw7B,EAAMhqC,MAAM9F,KAAKC,IAAI,EAAG6vC,EAAMtwC,OAAS,KAAK0c,QAAQ8zB,GACpD,IAAMI,EAAc,YAAaxoB,GAC/B,IAAM7I,EAASgxB,EAAaM,MAAMP,EAAOloB,GACzC,OAAAA,EAAM1L,QAAQ8zB,GACPjxB,CACT,EACA+wB,EAAM36B,KAAOi7B,EACbxB,EAASz5B,KAAK,KACZrB,GAAS,EACLg8B,EAAM36B,OAASi7B,IAAaN,EAAM36B,KAAO46B,IAEjD,CAEA,MAAO,IAAMnB,EAAS1yB,QAASmzB,GAAYA,IAC7C,CAkzHkC8oD,CAAyBtC,IAMrD7R,EACFxhE,GAAM07C,sBAAwB,CAAEhV,QAAS,CAAE/N,MAAO,IAAMhnC,YAAa,QAChE,CACL+wE,GAAmC2Q,GACnC,QAAWzsC,KAAQ5mC,GAAM07C,sBAAsBhV,QAAQ/N,MACxB6vB,GAAU,WAAW5hB,EAAK18C,YAAY08C,EAAK/1C,SAAU,CAChFmlB,OAAQ4wB,EAAK5wB,UACT4wB,EAAKxe,QAAiC,iBAAhBwe,EAAKxe,OAAsB,CAAEA,OAAQwe,EAAKxe,QAAW,CAAC,GAGtF,CACA0+B,GAAa8pB,EAAa,mBAAoBmC,GAC9C,IAAM6C,EAA+BpvB,KAC/Bye,EAAuBzD,OACzB,EACA2C,GAAyBxyE,GAC7B,GAAI6vE,EACFxhE,GAAM/O,YAAc,QAAC,IACXghF,GAAwBjyE,GAAMyvE,yBAA0B,CAClE,IAAMruE,EAAayzB,GAAyB5c,EAAO7W,YAAc,CAAC,EAAG/T,EAAK,CACxE2nC,eAAgBs3B,OAIlB,GAAIr0C,EAAOkrD,iBAAiBnmF,OAAQ,CAClC,IAAMmzF,EAAajI,GAAwBv2E,EAAa,CACtDtE,MACA+T,aACAgG,OAAQpH,GAAMoH,OACd4tB,gBAAgB,EAChBmuC,gBAAiBlrD,EAAOkrD,gBACxB8B,yBAEFjlE,GAAM/O,YAAck/E,EAAWl/E,YAC/B+O,GAAM07C,sBAAsB/pD,YAAcw+E,EAAWp/C,WACvD,KAAO,CACL,IAAM8kD,EA5sDZ,SACElkF,EACAi8E,EACAx+C,GAMA,IAAM0mD,EAAuB,IAAItkF,IAC3BP,EAA4B,GAC5B8kF,EAAuD,GAC7D,IAAKnI,GAAM5wF,QAAUgjB,GAAMlT,SACzB,MAAO,CAAEmE,cAAa6kF,uBAAsBC,sBAG9C,IAAMhtC,EAAkB,IAAI9yC,IAAItE,EAAY3F,IAAKtK,GAAe,CAACA,EAAWb,GAAIa,KAChF,QAAWoQ,KAAQ87E,EAAM,CACvB,IAAK97E,GAAMsZ,IAAMzoB,MAAMC,QAAQkP,EAAKlV,GAAI,SACxC,IAAM8E,EAAaqnD,EAAgBlsD,IAAIiV,EAAKsZ,GAC5C,IAAK1pB,GAAcA,EAAWmP,QAAgC,YAAtBnP,EAAWmP,OAAsB,SAEzE,GADAilF,EAAqB/0F,IAAIW,EAAWb,KAC/B2nF,GAAwB12E,EAAKotB,EAAGkQ,EAAI/hC,KAAM,CAC7C0oF,EAAmBpjF,KAAK8xE,GACtB/iF,EACA,CACE,CAAEb,GAAI,OAAQqJ,MAAO,aAAc2G,OAAQ,SAAUmlB,OAAQ,gBAG7D,CAAEn1B,GAAI,WAAYqJ,MAAO,iBAAkB2G,OAAQ,UAAWmlB,OAAQ,sBAExE,KACA,iBAEF,QACF,CAEA,IAAMuuD,EAASP,GAAUtiF,EAAY0tC,EAAIhoB,OAAQgoB,EAAIhuB,YAC/Cpc,EAAYiD,GAAYvG,EAAWb,GAAI0jF,GAC7C,IAAKx/E,EAAoBC,EAAWtD,EAAWw/C,mBAAqB,GAAI,CACtE60C,EAAmBpjF,KAAK8xE,GACtB/iF,EACA,CACE,CAAEb,GAAI,OAAQqJ,MAAO,aAAc2G,OAAQ,SAAUmlB,OAAQ,8BAC7D,CAAEn1B,GAAI,WAAYqJ,MAAO,iBAAkB2G,OAAQ,UAAWmlB,OAAQ,qBACtE,CACEn1B,GAAI,UACJqJ,MAAO,qBACP2G,OAAQ,SACRmlB,OAAQ,qBACRoS,OAAQ,CAAEpjC,YAAWC,WAAYvD,EAAWw/C,mBAAqB,KAGrE,KACA,uBAEF,QACF,CAGA,IAEM80C,EAAY9wF,GAHCxD,EAAWw/C,mBAAqB,IAEnC,EAAIl8C,EAAY4D,GAAqBlH,EAAWb,GAAI0jF,GACdzyE,EAAKlV,EAAEoP,IAAKo2C,GAAcA,EAAU78C,IACpF0wF,EAAmBD,GAAa,EAAIlkF,EAAKlV,EAAEo5F,GAAa,KAC9D,IAAKC,EAAkB,SACvB,IAAMC,EAAYx0F,EAAWk/C,WAAWid,UAAWzb,GAAcA,EAAUvhD,KAAOo1F,EAAiBp1F,IACnG,GAAIq1F,EAAY,EAAG,SACnB,IAAMC,EAAgBz0F,EAAWk/C,WAAWs1C,GACtC9iE,EAAY6iE,EAAiBzkE,EAChCxlB,IAAI08E,IACJj3E,OAAQqd,KAA2CA,GAEtD7d,EAAY0B,KAAK,CACf7P,aAAcpB,EAAWb,GACzBwhD,eAAgB3gD,EAAWoK,KAC3BnI,YAAawyF,EAAct1F,GAC3B6O,MAAOwmF,EACP9iE,YACArwB,MAAOozF,EAAcpzF,MACrBu/C,YAAa5gD,EAAW4gD,YACxBywB,gBAAiBrxE,EAAWqxE,gBAC5BrjD,KAAMhuB,EAAWguB,OAAShuB,EAAWqxE,gBAAkB,kBAAoBrxE,EAAW4gD,YAAc,eAAiB,cACrHqxB,cAAejyE,EAAW1B,IAC1B4zE,aAAclyE,EAAWsuC,GACzBk0C,kBAAmBxiF,EAAW+/C,QAC9BzhD,IAAKm2F,EAAcn2F,IACnBgwC,GAAImmD,EAAcnmD,GAClByR,QAAS00C,EAAc10C,QACvBC,eAAgBy0C,EAAcz0C,eAC9BC,cAAew0C,EAAcx0C,cAC7BY,eAAgB4zC,EAAc5zC,eAC9B7vC,aAAmByjF,EAAczjF,YAAaujF,EAAiB1pE,GAC/DvnB,UAAWu/E,GAEf,CACA,MAAO,CAAEtzE,cAAa6kF,uBAAsBC,qBAC9C,CA4mDuBK,CACfzkF,EACAsmB,EAAOgjD,UAAUob,qBACjB,CAAEhpF,MAAK+T,aAAYgG,OAAQpH,GAAMoH,SAa7BqN,EAAWyzD,GAXW2N,EAASC,qBAAqBrgF,KACtD9D,EAAYF,OAAQ/P,IACjBm0F,EAASC,qBAAqBvjF,IAAI7Q,EAAWb,KAEL,eAAvCukF,GAAuB1jF,KACtBm0F,EAAS5kF,YAAYiB,KACnBN,GAAeA,EAAW9O,eAAiBpB,EAAWb,KAI7D8Q,EAC0D,CAC1DtE,MACA+T,aACAgG,OAAQpH,GAAMoH,OACd4tB,gBAAgB,EAChBiwC,yBAEJjlE,GAAM/O,YAAc,IACf4kF,EAAS5kF,eACTwjB,EAASxjB,aAEd,IAAMqlF,EAAwB,IAAI9kF,IAChCijB,EAASsc,YAAY/kC,IAAK6kC,GAAeA,EAAW/tC,eAEtDkd,GAAM07C,sBAAsB/pD,YAAc,IACrCkkF,EAASE,mBAAmBtkF,OAC5Bo/B,IAAgBylD,EAAsB/jF,IAAIs+B,EAAW/tC,kBAErD2xB,EAASsc,aAEd,QAAWn/B,KAAcikF,EAAS5kF,YAAa,CAC7C,IAAMvP,EAAaiQ,EAAYE,KAAM/H,GAAcA,EAAUjJ,KAAO+Q,EAAW9O,cAC1EpB,GACLse,GAAM07C,sBAAsB/pD,YAAY6sC,QAAQimC,GAC9C/iF,EACA,CACE,CAAEb,GAAI,OAAQqJ,MAAO,aAAc2G,OAAQ,SAAUmlB,OAAQ,8BAI7D,CAAEn1B,GAAI,WAAYqJ,MAAO,iBAAkB2G,OAAQ,UAAWmlB,OAAQ,qBACtE,CAAEn1B,GAAI,UAAWqJ,MAAO,qBAAsB2G,OAAQ,SAAUmlB,OAAQ,YACxE,CAAEn1B,GAAI,aAAcqJ,MAAO,uBAAwB2G,OAAQ,SAAUmlB,OAAQ,2BAE/EpkB,EACA,0BAEJ,CACF,CACF,MACEoO,GAAM/O,YAAc,GACpB+O,GAAM07C,sBAAsB/pD,YAAcsgF,EACtCtgF,EAAY3F,IAAKtK,GAAe+iF,GAC9B/iF,EACA,CAAC,CAAEb,GAAI,aAAcqJ,MAAO,eAAgB2G,OAAQ,UAAWmlB,OAAQ,2BACvE,KACA,2BAEF,GAEN,GAAIhW,GAAM/O,YAAYjU,OAAS,EAAG,CAChC,IAAMu5F,EAAkBhR,GACtBvlE,GAAM/O,YACN+O,GAAM07C,sBAAsB/pD,aAE9BqO,GAAM/O,YAAcslF,EAAgBtlF,YACpC+O,GAAM07C,sBAAsB/pD,YAAc4kF,EAAgBxlD,aAAe/wB,GAAM07C,sBAAsB/pD,WACvG,CACA,IAAK6vE,GAAmC,QAAXwP,EAAkB,CAC7C,IAAMtxF,EAA6B,WAAXsxF,EA//K5B,SAAgCr/E,EAA2BsmB,EAAqBhnB,EAA4B,IAC1G,IAAMsqD,EAAY,IAAI/pD,IACtB,QAAWyc,KAAOtc,EAChB,IAAIsc,EAAIpd,QAAyB,YAAfod,EAAIpd,OACtB,QAAWjU,KAAKqxB,EAAI2yB,WAAY,CAC9BhkD,EAAE45F,sBAAsB98E,QAASlB,GAAa+iD,EAAUx6D,IAAIyX,IAC5D,QAAWgZ,KAAK50B,EAAEw2B,UACZ5B,EAAEhZ,UAAU+iD,EAAUx6D,IAAIywB,EAAEhZ,SAEpC,CAEF,OAAIzF,GAAsBklB,GAAQi7C,UAAUh9D,MAAOjF,IACjDuG,GAAyBkC,QAASlB,GAAa+iD,EAAUx6D,IAAIyX,IAExD7V,MAAM0S,KAAKkmD,EACpB,CAi/KQk7B,CAAuB9kF,EAAa0hF,EAAgBrzE,GAAM/O,kBAC1D,EACJ1R,EAAiByxF,EAAQC,EAAWvxF,EAAiBqxF,EAAc/oB,qBACrE,CACAlB,GAAa8pB,EAAa,0BAA2BgF,GACrD,IAAMc,EAA4BlwB,KAC9BmwB,EAA4C,KAChD,GAAKnV,EA8DHxhE,GAAMshE,oBAAsB,SA9DH,CACzB,IAAMjtD,EAAuD,oBAApCg/D,EAAezpD,KAAKgtD,YACvCC,EtB5nLH,SACL5lF,EACA6lF,GAEA,OACE7lF,EAAYiB,KACTN,GACCA,EAAWwhB,UAAUp2B,OAAS,MAE5B4U,EAAW5R,KACT4R,EAAWo+B,IACXp+B,EAAW8vC,gBACX9vC,EAAW+vC,eACX/vC,EAAW+hE,eACX/hE,EAAWgiE,gBAEd9gE,GAA2BgkF,EAAe7lF,EAEnD,CsB0mL+B8lF,CACzB/2E,GAAM/O,YACNoiF,EAAengB,UAAUh9D,OAE3B,IAAKme,GAAoBP,OAAsB+iE,EAAoB,CACjE,IAAMG,EAAkB3D,EAClB4D,EAAel8F,SAASuS,KAC9BqpF,EAAsBziE,GACpBm/D,EAAezpD,KAAKqmD,oBAAsB,IAC1C,CAAE57D,qBACF7X,KAAK,KAOL,GAHIwD,GAAMshE,sBAAwBqV,IAChC32E,GAAMshE,oBAAsB,MAE1BthE,GAAMiY,SAAW++D,EACrB,IAAIj8F,SAASuS,OAAS2pF,EAQpB,OAFA5kB,GAAsB,OAAO,GAAM,QACnCjE,GAAsB4oB,GAGxBvnB,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAG1CukC,GAAsB4oB,EAAe,IAEvCh3E,GAAMshE,oBAAsBqV,CAC9B,MAEE32E,GAAMshE,oBAAsB,KAC5B7R,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAC1CukC,GAAsBilB,GAEpB/mB,OAAmE,IAArCr0C,EAAOyrD,kBAAkBn8D,SjDvxLxD,SACL5V,EACAtF,IAnDF,SAA4BsF,GAC1B,IAAMzV,EAASuI,EAAeG,GAC9B,IAAK1I,EAAQ,OAEb,IAAMg7F,EAAgB,IAAI1lF,IACpB2lF,EAAqB,IAAI3lF,IAC/B,QAAW9P,KAAciQ,EAAa,CACpC,QAAW+Z,KAAQhqB,EAAWy/C,OAAS,GAAI+1C,EAAcn2F,IAAI2qB,EAAK7qB,IAClE,QAAWuhD,KAAa1gD,EAAWk/C,YAAc,GAAIu2C,EAAmBp2F,IAAIqhD,EAAUvhD,GACxF,CAEA,IAAMgd,EAAiC,CAAC,EACxC,QAAY+N,EAAQwrE,KAAiBt6F,OAAO6B,QAAQzC,GAAS,CAC3D,IAAKg7F,EAAc3kF,IAAIqZ,KAAYjpB,MAAMC,QAAQw0F,GAAe,SAChE,IAAMC,EAAOD,EAAa3lF,OAAQ9N,GACT,iBAAhBA,GAA4BwzF,EAAmB5kF,IAAI5O,IAExD0zF,EAAKr6F,SAAQ6gB,EAAK+N,GAAUyrE,EAClC,CAEA,IACE,IAAM1yF,EAAU5C,WAAWC,aAC3B,IAAK2C,EAAS,OACV7H,OAAOC,KAAK8gB,GAAM7gB,OAAQ2H,EAAQ1H,QAAQ2H,EAAWvI,KAAKa,UAAU2gB,IACnElZ,EAAQwI,WAAWvI,EAC1B,OAEA,CACF,EAyBE0yF,CAAmB3lF,GAvBrB,SAA4B4lF,EAAwBC,EAAgB,KAClE,IAAKD,EAAe,OACpB,IAAME,EAAWp8F,KAAKC,MAAqC,MAA7BkC,KAAKC,IAAI,EAAG+5F,GAC1C,IACE,IAAM7yF,EAAU5C,WAAWC,aAC3B,IAAK2C,EAAS,OACd,QAASe,EAAIf,EAAQ3H,OAAS,EAAG0I,GAAK,EAAGA,IAAK,CAC5C,IAAMhB,EAAMC,EAAQD,IAAIgB,GAExB,IADKhB,GAAK8F,WAAW3F,IACjBH,EAAI8F,WAAW3F,EAAsB0yF,EAAgB,KAAM,SAC/D,IAAM70F,EAAS+B,EAAeC,GACxBgzF,EAAyC,iBAAtBh1F,GAAQg1F,UAAyBh1F,EAAOg1F,UAAY,IACxEA,GAAaA,EAAYD,IAAU9yF,EAAQwI,WAAWzI,EAC7D,CACF,OAEA,CACF,CAOEizF,CAAmBtrF,GAASyhB,OAAQzhB,GAASmrF,eAAiB,IAChE,CiDkxLMI,CAAwBjmF,EAAa,CACnCmc,OAAQmK,EAAOnK,OACf0pE,cAAev/D,EAAOyrD,kBAAkB8T,gBAG5Cx3E,GAAM2zE,a3BhrLH,SACLrqF,EACAuuF,EACAC,GAEA,IAAMnqE,EAAUD,GAAepkB,GAC/B,IAAKqkB,EAAQ3wB,SAAW+E,WAAWpG,SAAU,MAAO,OACpD,IAAIo8F,EAAqC,KACrCC,EAAmC,KACnCC,EAAyB,EACzBC,EAA8C,KAC5CC,EAAO,KACX,IAAKL,EAAa,OAAO,KACzB,IAAMxpC,EAAcupC,IACpB,OAAKvpC,GACA4pC,IACHA,EAAeJ,IACZt7E,KAAMmhB,IACLo6D,EAAsBp6D,EACtBq6D,EAAoBr6D,EAAU2wB,EAAc,KAC5C2pC,EAAyBt6D,EAhInC,SAAwB56B,GACtB,IAEE,IAAM2G,GADc3G,EAAM8G,SAAS,KAAO9G,EAAMiH,MAAM,KAAK,GAAKjH,GACjC4G,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAC1Dc,EAASf,EAAa,IAAIgB,QAAQ,EAAKhB,EAAW1M,OAAS,GAAM,GACjE0F,EAASrG,KAAKC,MAAMqO,KAAKF,IAC/B,MAA6B,iBAAf/H,EAAOurB,IAAmBvrB,EAAOurB,IAAM,IACvD,OACE,OAAO,IACT,CACF,CAsH6CmqE,CAAez6D,IAAY,EAAI,EAC3DA,IAERrB,MAAM,IAAM,MACZG,QAAQ,KACPy7D,EAAe,QAGdA,GAdkB,MAiBrBG,EAAc,KAClB,IAAM/pC,EAAcupC,IACdv8F,EAAMkC,KAAKqE,MAAMxG,KAAKC,MAAQ,KACpC,OACEy8F,GACGC,IAAsB1pC,GACtB2pC,EAAyB38F,EAErBy8F,EAIF,MAGHO,EAAcC,IAClB,IAAKA,EAAQ,OAAO,KACpB,IACE,IAAMlrF,EAAM,IAAIxR,IAAI08F,EAAQx2F,WAAWhH,UAAUuS,MACjD,IAAKsgB,GAAYvgB,EAAIvR,SAAU6xB,GAAU,OAAO,KAChD,IAAMgQ,EAAU06D,IAChB,OAAK16D,EA/IX,SAAwBtwB,EAAU/D,EAAgDq0B,GAChF,OAAAtwB,EAAIE,aAAa4G,IAAIiZ,GAAU9jB,GAAWq0B,GACnCtwB,EAAIpE,UACb,CA6IauvF,CAAenrF,EAAK/D,EAAUq0B,GADhB,IAEvB,OACE,OAAO,IACT,GAGI86D,EAAoBF,IACxB,IAAKA,EAAQ,OAAO,EACpB,IACE,OAAO3qE,GAAY,IAAI/xB,IAAI08F,EAAQx2F,WAAWhH,UAAUuS,MAAMxR,SAAU6xB,EAC1E,OACE,OAAO,CACT,GAGI+qE,EAAmBh9E,IACvB,IAAM8tE,EA3JV,SAAqB7tE,GACnB,IAAM7R,EAAY6R,EAMlB,OAAK7R,GACuC,mBAAtBA,EAAUgK,QAC5BhK,EAAUgK,QAAQ,WAClB,QAE2D,mBAArChK,EAAU+J,eAAeC,QAC/ChK,EAAU+J,cAAcC,QAAQ,WAChC,MAPmB,IASzB,CA2IiB6kF,CAAYj9E,EAAMC,QAE/B,IADK6tE,IACAiP,EAAiBjP,EAAKx1E,aAAa,SAAU,OAClD,IAAMmV,EAAUgvE,IACVS,EAAU,KACd,IAAM/6E,EAAOy6E,EAAW9O,EAAKx1E,aAAa,SACtC6J,IAAM2rE,EAAKl8E,KAAOuQ,IAExB,GAAmB,UAAfnC,EAAM/T,MAAoBwhB,IAAYkvE,IAMxC,OALA38E,EAAMgsC,sBACDv+B,EAAQ3M,KAAK,KAChBo8E,IApJR,SAA8BpP,GAC5B,IAAM7tE,EAAS6tE,EAAKx1E,aAAa,UAE/B2H,GAC4B,UAAzBA,EAAO/R,eACoB,mBAApB7H,WAAW4kB,KAErB5kB,WAAW4kB,KAAK6iE,EAAKl8E,KAAMqO,GAM7B5Z,WAAWhH,UAAUujB,OAAOkrE,EAAKl8E,KACnC,CAuIQurF,CAAqBrP,KAIpBrgE,GAAS3M,KAAKo8E,GACnBA,KAGIE,EAAe,IAAIptD,QACnBqtD,EAAgBr9E,IACpB,IAAMhE,EAAOgE,EAAMC,OAEnB,IADKjE,GAAyB,SAAjBA,EAAK8wC,SACdswC,EAAatrF,OAAOkK,GAAO,OAC/B,IAAMshF,EAAat9E,EAAsBs9E,WAAa,KAChDC,EAnJV,SACEvhF,EACAshF,GAEA,IAAME,EAAkBF,GAAWhlF,aAAa,cAChD,OAAuB,MAAnBklF,EACKA,GAAmBn3F,WAAWhH,UAAUuS,MAAQ,GAElDoK,EAAK1D,aAAa,WAAajS,WAAWhH,UAAUuS,MAAQ,EACrE,CA0IsB6rF,CAAiBzhF,EAAMshF,GACzC,IAAKP,EAAiBQ,GAAY,OAClC,IAAM9vE,EAAUgvE,IACXhvE,IACLzN,EAAMgsC,iBACDv+B,EAAQ3M,KAAK,KAChB,IAAMmhB,EAAU06D,IACV/8E,EAASg9E,EAAWW,GAC1B,GAAIt7D,GAAWriB,EAAQ,CACjB09E,GAAW1gF,aAAa,cAC1B0gF,EAAU1kF,aAAa,aAAcgH,GAErC5D,EAAK4D,OAASA,EAEhB,IAAMxP,EAAOshB,GAAU9jB,GACnB2R,EAAQvD,EAAK5C,cAAc,eAAehJ,OACzCmP,IACHA,EAAQtf,SAASiF,cAAc,SAC/Bqa,EAAMtT,KAAO,SACbsT,EAAMnP,KAAOA,EACb4L,EAAKxW,YAAY+Z,IAEnBA,EAAMlY,MAAQ46B,CAChB,CACAm7D,EAAa/3F,IAAI2W,GACbshF,EACFthF,EAAK0hF,cAAcJ,GAEnBthF,EAAK0hF,oBAKX,OAAAz9F,SAASuC,iBAAiB,QAASw6F,GAAiB,GACpD/8F,SAASuC,iBAAiB,SAAU66F,GAAc,GAC3C,KACLp9F,SAAS2C,oBAAoB,QAASo6F,GAAiB,GACvD/8F,SAAS2C,oBAAoB,SAAUy6F,GAAc,GAEzD,C2B0iLyBM,CAAyBphE,EAAOg4C,iBAAkB,IACrE3D,MAA8BtsD,GAAMoH,QAAUpH,GAAM/O,YAAYjU,O3BnsL/D,SACLmxB,EACAld,EACA3H,GAEA,IAAMgwF,EAAM97F,KAAKqE,MAAMxG,KAAKC,MAAQ,KACpC,OApIF,SAAuByH,GACrB,IAAM2a,EAAOrhB,KAAKa,UAAU6F,GAC5B,OAAOuH,KAAKoT,GAAM/T,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,MAAO,GAC3E,CAiIS4vF,CAAc,CACnB38F,EAAG,EACH08F,MACArrE,IAAKqrE,EAAMhsE,GAAWhkB,GACtB+kB,IAAKF,EACLG,IAAKrd,EAAYjF,IAAK4F,KACpBwZ,EAAGxZ,EAAW9O,aACdyrB,EAAG3c,EAAWjO,gBAGpB,C2BorLU61F,CAA+Bx5E,GAAMoH,OAAQpH,GAAM/O,YAAagnB,EAAOg4C,kBACvE,KACH,IACD3D,MAA8BtsD,GAAMoH,QAAUpH,GAAM/O,YAAYjU,OAnsItEinB,eACEgU,EACA9J,EACAld,GAKA,IAHKgnB,EAAOnK,SAAWmK,EAAOoB,kBAAuD,IAApCpB,EAAOg4C,kBAAkBwpB,SAGrExhE,EAAOmB,SAAU,OAAO,KAE7B,IAAM35B,EAAYguB,GAAsBwK,EAAOg4C,kBACzCzrD,EAAa,IAAIC,gBACjBxD,EAAYpjB,OAAOuD,WAAW,IAAMojB,EAAWD,QAAS9kB,GAC9D,IACE,IAAMgd,QAAiBT,MAAM,GAAG6zD,GAAkB53C,EAAOmB,6BAA8B,CACrF4C,OAAQ,OACRlX,QAAS,CACP,eAAgB,mBAChB,cAAemT,EAAO+jB,cAAgB/jB,EAAOnK,OAC7C,mBAAoBmK,EAAOoB,iBAE7B/7B,KAAMjB,KAAKa,UAAU,CACnBixB,YACAb,WAAY2K,EAAOg4C,kBAAkBziD,mBACrCvc,YAAaA,EAAYjF,IAAK4F,KAC5B9O,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,iBAG5BqhB,OAAQR,EAAWQ,OACnB00E,YAAa,OACbz9D,WAAW,IAEb,IAAKxf,EAASC,GAAI,OAAO,KACzB,IAAMihB,QAAgBlhB,EAASiB,OAC/B,MAAgC,iBAAlBigB,EAAQ9V,OAAsB8V,EAAQ9V,MAAQ8V,EAAQ9V,MAAQ,IAC9E,OACE,OAAO,IACT,SACEhqB,OAAOuB,aAAa6hB,EACtB,CACF,CA2pIU04E,CAA6B1hE,EAAQjY,GAAMoH,OAAQpH,GAAM/O,aACzD5J,QAAQL,QAAQ,MAExB,CAOAgZ,GAAM0vD,wBAA0BrlC,GAAoBrqB,GAAM/O,aAC1D+O,GAAM45E,QAAU7+F,SAASuS,KACzB0S,GAAMoxD,yBAA0B,EAChCtK,GAAa8pB,EAAa,uBAAwB8F,GAClD,IAAMmD,EAA6BrzB,KAC7B+S,EAAoB9S,GAAoBozB,EAA6BxH,GACrEzV,EAAcnW,GAAoBozB,EAA6BjJ,EAAY7qB,WAC3EyW,GAAoBnhF,KAAKC,MAC/By+E,GAAsB,CACpBf,MAAO,oBACPwD,qBACAjD,sBAEFU,GAAesC,GAAe8W,EAAgB,CAC5C9Z,oBACAqD,cACAhW,OAAQ,IAAKgqB,EAAYhqB,QACzBC,oBAAqB+pB,EAAY/pB,oBACjCyW,cAAehzC,KACfkyC,wBAEFjF,KAEA,IAAMuiB,GAAgB,KAChB95E,GAAMiY,SAAWo7D,IAChBrzE,GAAMuhE,wBAEe,SAAf2P,EACTtO,GAAuByQ,EAAgB1hF,GAEvC0vE,GAAoBgS,EAAgB1hF,GAJPqW,GAAS,QAAS,4CAQjD26D,OAEF,OAAIgU,EAA0BA,EAAoBn6E,KAAKs9E,IAClDA,KAEDC,IACF1yF,QAAAL,UAAAwV,KAAA,KAAAw9E,KAAAC,KAAkBz9E,KAAK,EAAGu4C,0BACxBA,EAAoBs+B,EAAgB,CAClC3/B,aAAc1zC,GAAM0zC,aACpBC,iBAAwB3zC,GAAMg4D,QAC9B5uC,SAAUppB,GAAMopB,aAEjB9M,MAAM,SAINklD,GAA4C,WAApBtZ,IAC3BloD,GAAMyzE,arB11LH,SACLj0F,EACAmH,GAEA,GAAa,SAATnH,EAAiB,MAAO,OAE5B,IAAMu2B,EAAa,CAAEhzB,MAAOhI,SAASuS,MAC/B8+B,EAA8B,GAEpC,MAAa,eAAT5sC,GACF4sC,EAASz5B,KA9Bb,SAA8BhM,EAAyBovB,GAErD,IAAMgT,EADIhnC,WACWgnC,WAIrB,IAAKA,GAAqD,mBAAhCA,EAAW7qC,iBACnC,MAAO,OAGT,IAAM6c,EAAW,IAAM+a,GAAgBC,EAAY,aAAcpvB,GACjE,OAAAoiC,EAAW7qC,iBAAiB,WAAY6c,GAEjC,KACyC,mBAAnCguB,EAAWzqC,qBACpByqC,EAAWzqC,oBAAoB,WAAYyc,GAGjD,CAYkBm/E,CAAqBvzF,EAAUovB,KAGlC,YAATv2B,GAA+B,eAATA,IACxB4sC,EAASz5B,KA/Db,SAA+BhM,EAAyBovB,GACtD,IAAMokE,EAAQn+D,IACZ,IAAM5nB,EAAW3G,QAAQuuB,GACzB,OAAAvuB,QAAQuuB,GAAU,YAAa5f,GAC7B,IAAMg+E,EAAMhmF,EAASy5B,MAAMoN,KAAM7+B,GACjC,OAAA0Z,GAAgBC,EAAYiG,EAAQr1B,GAC7ByzF,CACT,EACO,KACL3sF,QAAQuuB,GAAU5nB,IAIhBimF,EAAcF,EAAK,aACnBG,EAAiBH,EAAK,gBACtBI,EAAa,IAAMzkE,GAAgBC,EAAY,WAAYpvB,GAC3D6zF,EAAc,IAAM1kE,GAAgBC,EAAY,aAAcpvB,GAEpE,OAAA9I,OAAOK,iBAAiB,WAAYq8F,GACpC18F,OAAOK,iBAAiB,aAAcs8F,GAE/B,KACLH,IACAC,IACAz8F,OAAOS,oBAAoB,WAAYi8F,GACvC18F,OAAOS,oBAAoB,aAAck8F,GAE7C,CAoCkBC,CAAsB9zF,EAAUovB,IAGzC,KACL,QAAW8W,KAAWT,EAAUS,IAEpC,CqBs0LyB6tD,CAAoB16E,GAAM0xE,WAAY,EAAGz7D,cAAaC,UAASF,aAClF,IAAKhW,GAAMiY,SAAWjY,GAAMoH,OAAQ,OACpC,IAAMuzE,IAA6B36E,GAAM26E,yBAGzC1zF,KAGK+Y,GAAM87D,gBAAkB97D,GAAMg0D,kBACjCp1E,EAAW65E,IAEb,IAAMyX,EAAOlwE,GAAMiY,OAAOtmB,aAAe,GACnCipF,EAAiBv/F,KAAKC,MACtBu/F,GAAmB76E,GAAMgqB,UAAUc,iChB9sLxC,SACL7U,EACAC,EACAkU,GAEA,GAAInU,IAAgBC,EAAS,OAAO,EACpC,IAAM4kE,EAAO7wD,GAAchU,GACrBpY,EAAOosB,GAAc/T,GAI3B,UAHK4kE,IAASj9E,GACVusB,EAAK3rC,MAAQq8F,EAAK7/F,WAAa4iB,EAAK5iB,UACpCmvC,EAAK3tC,QAAUq+F,EAAKr+F,SAAWohB,EAAKphB,QACpC2tC,EAAK/uB,MAAQy/E,EAAKz/E,OAASwC,EAAKxC,SAC/B+uB,EAAK3rC,MAAS2rC,EAAK3tC,QAAW2tC,EAAK/uB,OACpB6uB,GAAmB4wD,EAAKvtF,gBACxB28B,GAAmBrsB,EAAKtQ,aAI9C,CgB6rLUwtF,CAA6B9kE,EAAaC,EAASlW,GAAMmyE,cAE7DnyE,GAAMg7E,gBAAkB,CACtB/kE,cACAC,UACAF,SACAwkC,GAAIn/D,KAAKC,MACT2/F,YAAaJ,GAGXA,GACFxoB,GAAsB,OAEnBryD,GAAMshE,qBAGTx5E,IAGFkY,GAAM45E,QAAU1jE,EAChBlW,GAAMuhE,wBAA0BqO,GAAgB5vE,GAAMiY,QACtDyqD,GAAmC1iE,GAAMiY,QACzC,IAAMukD,EAAoBnhF,KAAKC,MAC/B2+E,GAAesC,GAAev8D,GAAMiY,OAAQ,CAC1CshD,kBAAmBiD,EAAoBoe,EACvCtd,cAAe,EACfd,uBAGF,IAAM0e,EAAoB,KACpBP,IAA6B36E,GAAM26E,0BAClC36E,GAAMiY,SAIX0qD,KACI3iE,GAAMg0D,mBAAqBh0D,GAAMuhE,wBACnCuO,KACS9vE,GAAMg0D,kBACfuK,KACAv+D,GAAM80D,sBAAsBluD,QAC5BqtD,GAAuBj0D,GAAMiY,QAC7By/C,GAAkB13D,GAAM/O,YAAai/E,GACrCpY,GAAqB93D,GAAM/O,YAAai/E,GACxCh1F,EAAYu9E,MACFz4D,GAAM87D,iBAAmBpT,MAAqB1oD,GAAMuhE,0BAClC,SAAxBvhE,GAAMynD,cACRmb,GAAuB5iE,GAAMiY,OAAQi4D,GAErC7O,GAAoBrhE,GAAMiY,OAAQi4D,MAIpClwE,GAAMshE,oBAKHthE,GAAMshE,oBAAoB9kE,KAAK0+E,GAEpCA,QAKD1Z,GAAwB0Q,IAAmBD,IAC9CjyE,GAAM0zE,gBlCp+LH,SACL/sF,EACAomC,EAAa,KAEb,UAAWtzB,iBAAqB,MAAgB9d,SAASgC,gBACvD,MAAO,OAGT,IAAI43B,EAAuB,KASrBK,EAA+BxC,IAClBA,EAAUlhB,KAAM4c,GACT,eAAlBA,EAASnnB,KACJmnB,EAASnT,kBAAkB5B,UAAYsP,GAAWyF,EAASnT,QAE7DhZ,MAAM0S,KAAKyZ,EAAShV,YAAY5H,KAAMwB,IAAU2V,GAAW3V,OAZtD,OAAV6hB,GAAgB13B,OAAOuB,aAAam2B,GACxCA,EAAQ13B,OAAOuD,WAAW,KACxBm0B,EAAQ,KACR5uB,KACComC,KAYCouD,EAAmB,IAAI1hF,iBAAiBmc,GAE9C,OAAAhN,GAAsBuyE,EAAkBvlE,GACxCulE,EAAiBzzF,QAAQ/L,SAASgC,gBAAiB,CACjDgc,WAAW,EACXE,SAAS,EACTuH,YAAY,EACZC,gBAAiB,CAAC,QAAS,QAAS,SAAU,iBAGzC,KACS,OAAVkU,GAAgB13B,OAAOuB,aAAam2B,GACxC4lE,EAAiBt0F,aACjBkiB,GAAwBoyE,GAE5B,CkC27L4BC,CAAkB,KACxC/oB,GAAsB,QACrBp6C,EAAO2R,KAAKmD,YAAc,MAGF/kB,GAAS,OAAQ,GAAGhI,GAAM/O,YAAYjU,8BAA+BgjB,GAAM/O,YAAYjF,IAAI5I,KACtH1B,WAAY0B,EAAEN,aACds/C,UAAWh/C,EAAEO,YACb+O,UAAWtP,EAAEsP,cAEc81D,GAAU,2BAA4B,CACjEv3D,YAAa+O,GAAM/O,YAAYjF,IAAK4F,KAClC9O,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,YACxB+O,UAAWd,EAAWc,epC/3LrBqV,cACMI,QAAY,KACvBA,QAAQkzE,YoCo4LJC,IAAct7E,GAAMg9B,SAAWh9B,GAAM87D,gBA8E3C,SAAyByf,GACvB,GAAKD,GAIL,IACEj0F,QAAAL,UAAAwV,KAAA,KAAAg/E,KAAAC,KACGj/E,KAAK,EAAG0mD,uBACMA,KACFq4B,QAEZj/D,MAAM,IAAMi/D,MACjB,OAEEA,KACF,MAbEA,KAcJ,CA1FIG,CAAgB,MAkBpB,SAAuB/pF,GACrB,GAAK2pF,GACL,IACEj0F,QAAAL,UAAAwV,KAAA,KAAAm/E,KAAAC,KAAuBp/E,KAAK,EAAGw5C,qBAC7BA,EAAe,CACbrkD,cACAV,YAAa+O,GAAM/O,YACnBnE,SAAUkT,GAAMlT,SAChBmwC,YAAaj9B,GAAMi9B,YACnBob,kBAAmB,CAACv1D,EAAsBa,KAKxC,GAJKqc,GAAMlT,WAAUkT,GAAMlT,SAAW,CAAC,GACvCkT,GAAMlT,SAAShK,GAAgBa,EAC/BkJ,GAAemT,GAAMlT,UAEjBkT,GAAMiY,OAAQ,CAChB,IAAMi4D,EAAOlwE,GAAMiY,OAAOtmB,aAAe,GACzC29D,GAAWtvD,GAAM/O,aACjB,IAAMk/E,EAAajI,GAAwBgI,EAAM,CAC/C7iF,IAAKtS,SAASuS,KACd8T,WAAYpB,GAAMiY,OAAO7W,YAAc,CAAC,EACxCgG,OAAQpH,GAAMoH,OACd4tB,eAAgBs3B,KAChB6W,gBAAiBnjE,GAAMiY,OAAOkrD,kBAEhCnjE,GAAM/O,YAAck/E,EAAWl/E,YAC/B+O,GAAM07C,sBAAsB/pD,YAAcw+E,EAAWp/C,YACrD0+B,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAC1C7pB,GAAM0vD,wBAA0BrlC,GAAoBrqB,GAAM/O,YAC5D,GAEFwlD,SAAU,KACRxpD,KACAlS,SAASg8D,UAEXC,eAAgB,KACd,IAAMplD,EAAak9D,GAAwB9uD,GAAM/O,aAC7CW,GAAY2wC,gBAAgBysB,aAC9BW,GAAoB/9D,EAAW2wC,eAAeysB,cAGlD9X,cAAe,KACb,IAAM7pD,EAAM,IAAIxR,IAAId,SAASuS,MAC7BD,EAAIE,aAAaC,OAAO,gBACxBC,QAAQC,aAAa,KAAM,GAAIL,EAAIpE,YACnClO,SAASg8D,YAGgB/uC,GAAS,KAAM,wBAC3CsU,MAAM,KACsB7T,GAAU,KAAM,oCAEjD,OAEA,CACF,EAvEMozE,CAAclqF,GACdmqF,GAAsBnqF,KAG1Bi9D,KAGK5uD,GAAMg9B,QACT8+C,GAAsBnqF,GAIxBhW,SAASusC,cAAc,IAAIC,YAAY,qBAEhCnoB,GAAM/O,WACf,CA4EA,SAAS6qF,GAAsBnqF,GAC7B,GAAK02D,KAAoBroD,GAAM87D,gBAAmBxP,KAClD,IACEjlE,QAAAL,UAAAwV,KAAA,KAAA8rD,KAAAC,KAAqB/rD,KAAK,EAAGyoC,wBACvBA,KAOV,SAAsBtzC,GACpB,GAAK02D,GACL,IACEhhE,QAAAL,UAAAwV,KAAA,KAAA8rD,KAAAC,KAAqB/rD,KAAK,EAAG0oC,oBAC3BA,EAAc,CACZvzC,cACAV,YAAa+O,GAAM/O,YACnB8/B,YAAagrD,KACbjvF,SAAUkT,GAAMlT,SAChBu5C,iBAAkB,CAACvjD,EAAsBa,KAIvC,GAHKqc,GAAMlT,WAAUkT,GAAMlT,SAAW,CAAC,GACvCkT,GAAMlT,SAAShK,GAAgBa,EAE3Bqc,GAAMiY,OAAQ,CAChB,IAAMi4D,EAAOlwE,GAAMiY,OAAOtmB,aAAe,GACzC29D,GAAWtvD,GAAM/O,aACjB,IAAMk/E,EAAajI,GAAwBgI,EAAM,CAC/C7iF,IAAKtS,SAASuS,KACd8T,WAAYpB,GAAMiY,OAAO7W,YAAc,CAAC,EACxCgG,OAAQpH,GAAMoH,OACd4tB,eAAgBs3B,KAChB6W,gBAAiBnjE,GAAMiY,OAAOkrD,kBAEhCnjE,GAAM/O,YAAck/E,EAAWl/E,YAC/B+O,GAAM07C,sBAAsB/pD,YAAcw+E,EAAWp/C,YACrD0+B,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAC1C7pB,GAAM0vD,wBAA0BrlC,GAAoBrqB,GAAM/O,aAE1D5J,QAAAL,UAAAwV,KAAA,KAAA8rD,KAAAC,KAAqB/rD,KAAK,EAAG0oC,cAAe82C,MAC1CA,EAAQ,CACNrqF,YAAau+E,EACbj/E,YAAa+O,GAAM/O,YACnB8/B,YAAagrD,KACbjvF,SAAUkT,GAAMlT,SAChBu5C,iBAAkB,WAEnB/pB,MAAM,OACX,KAGyBtU,GAAS,OAAQ,4BACjBogD,GAAM,OAAQ,8BAC1C9rC,MAAM,KACsB7T,GAAU,OAAQ,kCAEnD,OAEA,CACF,CAvD+BwzE,CAAatqF,KACrC2qB,MAAM,OACX,OAEA,CACF,CAoDO,SAAS4/D,GAAKjkE,GACnB,UAAWp6B,OAAW,KhC3oMjB,SAA+Bs+F,EAAmCt+F,QACvE,OAAOs+F,EAAWrwF,OAASke,EAC7B,CgCyoMuCoyE,CAAsBv+F,QACzD,OAAA6wB,KACAntB,IACO,GAET,GhCngMK,SAA+B0Z,GAUpC,GAAoB,SAAhBiP,GAAwB,OAAO,EACnC,IAAMmyE,EA/GD,SACLC,EAA6BvhG,SAC7BwhG,EAA2B9uF,SAE3B,IAAK6uF,EAAajhF,MAAQihF,EAAajhF,KAAKre,OAAS,EAAG,OAAO,KAC/D,IAAMT,EAAS,IAAIC,gBAAgB8/F,EAAajhF,KAAK/X,MAAM,IACrDk5F,EAAejgG,EAAOM,IAAIitB,IAChC,IAAK0yE,EAAc,OAAO,KAE1B,IAAM30E,EAAQ20E,EAAav8F,OACrBw8F,EA1BD,SAAiC50E,GACtC,IAAM60E,EAAiB70E,EAAM7d,MAAM,IAAK,GAAG,GAC3C,IAAK0yF,EAAgB,OAAO,KAC5B,IAAMC,EAxBR,SAAyB55F,GACvB,IACE,IAAM2G,EAAa3G,EAAM4G,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KACpDc,EAASf,EAAa,IAAIgB,QAAQ,EAAKhB,EAAW1M,OAAS,GAAM,GACvE,OAAO2N,KAAKF,EACd,OACE,OAAO,IACT,CACF,CAgBkBmyF,CAAgBF,GAChC,IAAKC,EAAS,OAAO,KACrB,IACE,IAAMh/D,EAAUthC,KAAKC,MAAMqgG,GACrBE,EAA6B,iBAAhBl/D,EAAQk/D,IAAmBl/D,EAAQk/D,IAAI58F,OAAS,GAC7D68F,EAnBV,SAA4B/5F,GAC1B,GAAqB,iBAAVA,IAAuBA,EAAM9C,OAAQ,OAAO,KACvD,IACE,IAAMoN,EAAM,IAAIxR,IAAIkH,GACpB,MAAqB,WAAjBsK,EAAI0vF,UAA0C,UAAjB1vF,EAAI0vF,SAA6B,KAC3D1vF,EAAIrS,MACb,OACE,OAAO,IACT,CACF,CAUsBgiG,CAAmBr/D,EAAQm/D,WAAan/D,EAAQs/D,YAClE,MAAoB,yBAAhBt/D,EAAQu/D,KAAmCL,GAAQC,EAChD,CAAED,MAAKC,aAD2D,IAE3E,OACE,OAAO,IACT,CACF,CAYeK,CAAwBt1E,GACrCtrB,EAAOiR,OAAOsc,IAEd,IACE,IAAMhvB,EAAW,IAAIe,IAAIygG,EAAahvF,MAChC8vF,EAAgB7gG,EAAO0M,WAC7BnO,EAASugB,KAAO+hF,EAAgB,IAAIA,IAAkB,GACtDb,EAAY7uF,aAAa6uF,EAAYv8E,OAAS,KAAM,GAAIllB,EAASmO,WACnE,OACE,OAAO,IACT,CAEA,OAAOwzF,EAAO,CAAE50E,WAAU40E,GAAS,IACrC,CAwFiBY,CAA4BpiF,EAAMqhF,aAAcrhF,EAAMshF,aACrE,IAAKF,EAAQ,OAAO,EAEpBnyE,GAAc,WACdjP,EAAMqiF,iBACN,IAAMC,EA3FD,SAAgCtiF,GAKrC,IAAMuiF,EAAUviF,EAAMwiF,WAAaxiF,EAAMyiF,QACzC,GAAIziF,EAAM0iF,cACR,IACE,IAAMtwF,EAAM,IAAIxR,IAAIof,EAAM0iF,cAAeH,GACzC,MAAwB,WAAjBnwF,EAAI0vF,UAA0C,UAAjB1vF,EAAI0vF,SAAuB1vF,EAAIpE,WAAa,IAClF,OACE,OAAO,IACT,CAEF,IAAKgS,EAAMwiF,UAAW,OAAO,KAC7B,IACE,IAAMG,EAAY,IAAI/hG,IAAIof,EAAMwiF,UAAWxiF,EAAMyiF,SACjD,MAAI,4BAA4BvzF,KAAKyzF,EAAU3iG,WAEpC,2CAA2CkP,KAAKyzF,EAAU3iG,UADnE2iG,EAAU3iG,SAAW2iG,EAAU3iG,SAAS0O,QAAQ,aAAcogB,IAI9D6zE,EAAU3iG,SAAW,IAAI8uB,KAE3B6zE,EAAUnhG,OAAS,GACnBmhG,EAAUviF,KAAO,GACVuiF,EAAU30F,UACnB,OACE,OAAO,IACT,CACF,CA6DoB40F,CAAuB,CACvCF,cAAe1iF,EAAM6iF,oBACrBL,UAAWxiF,EAAMwiF,UACjBC,QAASziF,EAAMyiF,UAEX3+B,EAAO,KACX70C,GAAc,OACdjP,EAAM8iF,aAER,OAAKR,IAKUtiF,EAAM+iF,YAAA,CAAgB3wF,GAzEhC,SACLkwF,EACAU,EAAyBtiG,SACzB8D,EAAY,KAEZ,OAAO,IAAI4H,QAAQ,CAACL,EAASq+D,KACV44B,EAAan+F,eAAemqB,KACnCzpB,SAEV,IAAM2wB,EAAS8sE,EAAar9F,cAAc,UAC1CuwB,EAAOtwB,GAAKopB,GACZkH,EAAOkiC,IAAMkqC,EACbpsE,EAAOlN,OAAQ,EACfkN,EAAO+sE,YAAc,YAErB,IAAMx5E,EAAUtjB,WAAW,KACzB+vB,EAAO3wB,SACP6kE,EAAO,IAAIttC,MAAM,kCAChBt4B,GACG8G,EAAU8kB,IAEd,GADAjsB,aAAaslB,GACT2G,EAGF,OAFA8F,EAAO3wB,cACP6kE,EAAOh6C,GAGT,IAAM8yE,EAAep8F,WACf81B,EAAMsmE,EAAaC,WACzB,IACED,EAAaC,gBAAa,CAC5B,OAAS,CACJvmE,GAA4B,mBAAdA,EAAIpoB,MAIvBzI,EAAQ6wB,GAHNwtC,EAAO,IAAIttC,MAAM,mDAKrB5G,EAAOu4D,OAAS,IAAMnjF,IACtB4qB,EAAOw4D,QAAU,IAAMpjF,EAAO,IAAIwxB,MAAM,kCACvCkmE,EAAah9F,MAAQg9F,EAAatgG,iBAAiBuD,YAAYiwB,IAEpE,CAgCuDktE,CAAiBhxF,KAC/DkwF,GACJ/gF,KAAMqb,GAAQA,EAAIpoB,MAAM4sF,IACxB7/E,KAAMlL,IACDA,EAAQ4Y,GAAc,SACrB60C,MAENziC,MAAMyiC,IACF,IAZL13D,QAAQL,UAAUwV,KAAKuiD,IAChB,EAYX,CgC49LMu/B,CAAsB,CACxBR,oBAAqB7lE,EAAOsmE,gBAC5Bd,UAAWe,GACXd,eAAgB3iG,SAAa,IAAcA,SAASuS,UAAO,EAC3DgwF,aAAc,KACZ5uE,KACAntB,KAEFw8F,UAAW,KACT7B,GAAKjkE,MAGP,MAAO,GAGT,IAAM24D,EAAcjqB,KACd83B,EAAuBzyB,GAAuB/zC,GAC9CymE,EAAsBvyB,GAAsBl0C,EAAQwmE,GACpDE,EAA6B/1B,GAAkB3wC,GAC/C2mE,EAAsBv3E,GAAeo3E,EAAsBC,EAAqBC,GACtFt1F,GAAyBu1F,EAAsB3mE,EAAO4wC,eAAiB,IAAM5wC,EAAO4wC,gBAAkB,CAAC,EAAIt/D,YAAa,WACxH,IAAMs1F,EAAc5mE,EAAO7Q,QAAU,KAGrC,GAFAD,GAAe8Q,EAAOsrD,MAAOsb,EAAa,CAAEx3E,eAAgBu3E,I7ChrMvD78F,WAAuCu1B,SAC3Cv1B,WAAuCu1B,QAAS,EAC1C,G6CgrMY,CACjBtX,GAAMoX,gBAAkBqnE,EACxBz+E,GAAMqX,eAAiBqnE,EACvB1+E,GAAM2oD,sBAAwBg2B,EAC9B3+E,GAAM87D,eAAiBpwE,KACvB,IAAMqvE,EAAeN,KACfqkB,EAA0BtkB,GAAeviD,EAAO0iD,eAAgB,iBACtE,OACEI,GACGA,EAAaJ,iBAAmBmkB,GAvsHzC,WACE,IAAMC,EAAgBh9F,WACtB,OAAoD,IAAhDg9F,EAAcC,MAClBD,EAAcC,KAAgC,GACvC,EACT,CAmsHSC,IAEHpjB,GAAoB5jD,EAAQ,uBAAwB,CAClD2jD,sBAAuBb,EAAaJ,eACpCukB,0BAA2BJ,GAC1BD,GAEE,EACT,CAEA,GA9tHF,SAAqC5mE,GACnC,IAAMknE,EAAQ,CACZxkB,eAAgBH,GAAeviD,EAAO0iD,eAAgB,iBACtDC,WAAYJ,GAAeviD,EAAO2iD,YAClCC,eAAgBL,GAAeviD,EAAO4iD,eAAgB,SAElDkkB,EAAgBh9F,WACtBg9F,EAAcrkB,IAA6BykB,SACpCJ,EAAcC,GAEvB,CAmtHEI,CAA4BnnE,G7CjtMrBrqB,GAAOzD,KAAK+oC,UAAUQ,W6CktMd,OAA6B1rB,GAAS,QAAS,yBAAuDogD,GAAM,QAAS,yBAAiC,GACrK,IAAKnwC,EAAO2R,KAAKy1D,c7ChtMZ,WACL,IACE,OAAOxhG,OAAOyhG,OAASzhG,OAAO0uC,GAChC,OACE,OAAO,CACT,CACF,C6C0sMmCgzD,GAAc,OAA6Bv3E,GAAS,QAAS,4BAA0DogD,GAAM,QAAS,4BAAoC,GAC3M,G7CnsMK,SAAoB/7D,GACzB,IAAMgb,GAA6C,IAA5Bhb,GAASgb,eAC1B1b,EAAQ,IAAInP,gBAAgBzB,SAAS0B,QAAQI,IAAI,eACvD,GAAc,SAAV8O,EAAkB,CACpB,GAAI0b,EACF,IACErlB,aAAa/E,QAAQ,cAAe,IACtC,OAAS,CAEX,OAAO,CACT,CACA,GAAc,UAAV0O,EAAmB,CACrB,GAAI0b,EACF,IACErlB,aAAamL,WAAW,cAC1B,OAAS,CAEX,OAAO,CACT,CACA,IAAKka,EAAgB,OAAO,EAC5B,IACE,MAA+C,MAAxCrlB,aAAa5F,QAAQ,cAC9B,OACE,OAAO,CACT,CACF,C6C0qMMojG,CAAW,CAAEn4E,eAAgBu3E,IAA0B,OAA6B52E,GAAS,QAAS,sBAAoDogD,GAAM,QAAS,sBAA8B,IAtxH7M,SAA8B4Q,EAAQ,QACpC,IAAM19E,EAAMD,KAAKC,MACjB0kB,GAAM+4D,KAAO,CACXC,QACAjT,UAAWzqE,EACX2iB,UAAW3iB,EACX49E,kBAAmB,OACnBC,oBAAqB,EACrBQ,iBAAkB,EAClBE,gBAAiB,GAEnBjB,IACF,CA4wHE6mB,CAAqB,QACrB,IAAM1O,EAAgB9pB,GAAqBhvC,GAQ3C,GAPA6uC,GAAa8pB,EAAa,mBAAoBA,EAAY7qB,WAEtD9tC,EAAOynE,KAAKC,SACdjhF,GAAiB,cAAeuZ,EAAOynE,IAAIC,QAAS,QAIlB,SAAhC5O,EAAc7pB,cAChB,SA9tL0B,IADlBnlE,WACD69F,wBA8tL4Bz3E,QAAY,KAC7CA,QAAQO,KAAK,kFAER,GAKT,GAAI/lB,MAAMC,QAAQq1B,EAAOtmB,aACvB,OAAIsmB,EAAOnK,Q3BrlMR,SAA8BxkB,GACnC,SAAKvH,WAAWhH,WAAa2yB,GAAepkB,GAAUtM,SACvC,IAAInB,IAAIkG,WAAWhH,SAASuS,MAAMC,aAAa1Q,IAAIuwB,GAAU9jB,IAC9E,C2BklMyBu2F,CAAqB5nE,EAAOg4C,mBAC1CpiD,GACHoK,EAAOg4C,iBACPh4C,EAAOnK,OACNjG,GAAUkoD,GAA6B93C,EAAQpQ,IAChDrL,KAAMo2E,GAAajC,GAAoB14D,EAAQA,EAAOtmB,YAAc,SAAUi/E,EAAagC,IACtF,IAEFjC,GAAoB14D,EAAQA,EAAOtmB,YAAa,SAAUi/E,GAInE,GAAI34D,EAAOnK,QAAUmK,EAAOmB,SAAU,CACpCpZ,GAAMoX,gBAAkBqnE,EACxBz+E,GAAMqX,eAAiBqnE,EACvB1+E,GAAM2oD,sBAAwBg2B,EAC9B,IAAM7xF,EAAWV,GAAgB,CAAEE,eAAgBsyF,IAC7C5hD,EAAStwC,GAAS,CAAEJ,eAAgBsyF,IACpC9iB,EAAiBpwE,KACjBo0F,EAl6FV,SAA2BhzF,GACzB,OAAKA,EACEhQ,OAAO6B,QAAQmO,GACnBd,IAAI,EAAElJ,EAAca,KAAiB,GAAGb,KAAgBa,KACxDxD,KAAK,KAHc,EAIxB,CA65F+B21D,CAAkBhpD,GACvCm2E,EAAiBhrD,EAAO8jD,cAAcC,WAAa,aACnD+jB,EAAY,IAAIlkG,IAAIg0E,GAAkB53C,EAAOmB,UAAY,WAK/D,GAJA2mE,EAAUxyF,aAAa4G,IAAI,SAAU8jB,EAAOnK,QACrB,eAAnBm1D,GACF8c,EAAUxyF,aAAa4G,IAAI,MAAO8uE,IAE/BjmC,GAAU8+B,IAAmBgkB,EAAoB,CACpDC,EAAUxyF,aAAa4G,IAAI,UAAW,KACtC4rF,EAAUxyF,aAAa4G,IAAI,aAAc2rF,GACzC,IAAME,EAAe,IAAIxjG,gBAAgBzB,SAAS0B,QAAQI,IAAI,gBAC1DmjG,GACFD,EAAUxyF,aAAa4G,IAAI,eAAgB6rF,EAE/C,CACA,IAAMC,EAAiBrB,IAA8C,IAAvB3mE,EAAOioE,gBAA4BljD,GAAU8+B,IAAmBgkB,GACxGK,EA5kGV,SAA6BloE,GAC3B,IAAM1K,EAAM0K,EAAO2rD,iBACnB,MAAmB,iBAARr2D,GAAoB5rB,OAAOC,SAAS2rB,IAAQA,EAAM,EAAUA,EAChE6yE,EACT,CAwkGuBC,CAAoBpoE,GACjCxN,EAASw1E,EAvkGnB,SACEnyE,EACA9Q,EACAimE,GAEA,IACE,IAAMxgF,EAAMT,aAAa5F,QAAQ4mF,GAAkBl1D,EAAQm1D,IAC3D,IAAKxgF,EAAK,OAAO,KACjB,IAAMC,EAASrG,KAAKC,MAAMmG,GAa1B,OAHKC,GAAsC,iBAArBA,EAAOg1F,YAA2B/0F,MAAMC,QAAQF,EAAOiP,cAGzEtW,KAAKC,MAAQoH,EAAOg1F,UAAY16E,EAAc,KAC3C,CACLrL,YAAajP,EAAOiP,YACpBwxE,gBAAiBxgF,MAAMC,QAAQF,EAAOygF,iBAClCzgF,EAAOygF,qBACP,EACJh6C,QAASzmC,EAAOymC,QAChBzV,QAAShxB,EAAOgxB,QAChBrV,QAAS1b,MAAMC,QAAQF,EAAO2b,SAAW3b,EAAO2b,aAAU,EAC1D60D,SAAUxwE,EAAOwwE,SACjB73D,KAA6B,iBAAhB3Y,EAAO2Y,KAAoB3Y,EAAO2Y,KAAO,GAE1D,OACE,OAAO,IACT,CACF,CAoiGQilF,CAAsBroE,EAAOnK,OAAQqyE,EAAYld,GACjD,KACEsd,EAAkB1yE,GACtBoK,EAAOg4C,iBACPh4C,EAAOnK,OACNjG,GAAUkoD,GAA6B93C,EAAQpQ,IAGlD,GAAI4C,EAAQ,CACVsvD,GAAsB,CACpBf,MAAO,mBACPE,kBAAmB,SAErB,IAAMsnB,EAAe/1E,EAAOiJ,QACxB0vD,GAAoBnrD,EAAQxN,EAAOiJ,QAASjJ,EAAO0e,SACnD,IAAKlR,EAAQkR,QAAS1e,EAAO0e,SAAWlR,EAAOkR,SAK7Cs3D,EAC8B,oBAAlCD,EAAa52D,KAAKgtD,aAAqC9iE,KACnD4sE,EAAoB7P,GAAwEF,GAChG,IACK6P,EACHp5B,gBAAiBq5B,EAAsBD,EAAap5B,gBAAkB,MACtE+b,gBAAiB14D,EAAO04D,gBACxB9kE,QAASoM,EAAOpM,SAAW4Z,EAAO5Z,QAClC60D,SAAUzoD,EAAOyoD,UAEnBzoD,EAAO9Y,YACP,QACAi/E,EACAC,GAEG0P,EAAgB/jF,KAAKkkF,EAC5B,CAKA,IAAMC,GAA8Bl2E,GAA4C,QAAlCsmE,EAAc3pB,gBACxDu5B,GAKFphG,EAHoC,WAAlCwxF,EAAc3pB,kBAAiCpqB,GAAU8+B,IAAmBgkB,EACxE,OACA/O,EAAc3pB,gBAGlB2pB,EAAczpB,0BACd,EACAypB,EAAc/oB,sBAIlB,IAAM44B,EAAuBvlG,KAAKC,MAC7BmvB,IAAQmmE,EAAY/pB,qBAAsB,GAC/C,IAAMg6B,EAA2BF,EAC7BnjG,KAAKC,IAAIszF,EAAczpB,qBAAsB,KAC7C,KACEw5B,EAAkD,OAA7BD,EACvBD,EAAuBC,EACvB,KACJ,OAAA9mB,GAAsB,CACpBf,MAAO,uBACP4nB,uBACAznB,oBAAqB,EACrBD,kBAAmB,YAGrB1T,GAAeu6B,EAAU92F,WAAY,EAAG,IAAK,CAC3CxJ,UAAWmmE,GACXC,sBAAoD,OAA7Bg7B,EACnBrjG,KAAKmmB,IAAIiiD,GAAiCi7B,GAC1Cj7B,GACJQ,OAAQC,GACRH,eAAiBJ,IACfiU,GAAsB,CACpBf,MAAO,uBACP4nB,uBACAznB,oBAAqBrT,EACrBoT,kBAA+B,IAAZpT,EAAgB,UAAY9lD,GAAM+4D,KAAKG,qBAG9D/S,OAAQ,EAAGL,UAASQ,gBAClByT,GAAsB,CACpBf,MAAO,oBACP4nB,uBACAznB,oBAAqBrT,EACrBuT,cAAeh+E,KAAKC,MAAQslG,EAC5B1nB,kBAAmB,SAEQzwD,GAAU,OAAQ,wBAAwBq9C,mBAAyBQ,QAElGC,aAAepwB,IACb4jC,GAAsB,CACpBf,MAAO,gCACP4nB,uBACAznB,oBAAqBhjC,EAAK2vB,QAC1BuT,cAAeh+E,KAAKC,MAAQslG,EAC5B1nB,kBAAmB/iC,EAAKnhB,SAAW,UAAYhV,GAAM+4D,KAAKG,kBAC1DkB,sBAAuBjkC,EAAKtlC,OAC5BkwF,iBAAkB5qD,EAAK9qB,WAI1B7O,KAAM6hC,IACL,IAAKA,EAAI3hC,GAAI,MAAM,IAAIqb,MAAM,2BAA6BsmB,EAAIxtC,QAC9D,OAAOwtC,EAAI3gC,SAEZlB,KAAKyH,UASJ,IAAM4sE,QAAyB0P,EACzBS,EAAyB3lG,KAAKC,MACpCy+E,GAAsB,CACpBf,MAAO,wBACP4nB,uBACAI,yBACA3nB,cAAe2nB,EAAyBJ,EACxC1nB,kBAAmB,OAErB,IAAMvnE,EAAcnT,EAAKmT,aAAe,GAClCwxE,EAAkBxgF,MAAMC,QAAQpE,EAAK2kF,iBACvC3kF,EAAK2kF,qBACL,EACEh6C,EAAU3qC,EAAK2qC,QACfzV,EAAUl1B,EAAKk1B,QACfrV,EAAU1b,MAAMC,QAAQpE,EAAK6f,SAAW7f,EAAK6f,QAAU4Z,EAAO5Z,QAG9D60D,EAAW10E,EAAK00E,SAChBwsB,EAAMlhG,EAAKkhG,IACXuB,KACJvB,GAAKC,SAAWxhF,GAAiB,CAAEC,iBAAiB,IAAS,iBAAmBshF,EAAIC,SAElFD,GAAKC,SAASjhF,GAAiB,cAAeghF,EAAIC,QAAS,QAC/D,IAAMuB,EAAoB,IACrB9d,GAAoBnrD,EAAQvE,EAASyV,GACxCg6C,kBACA9kE,UACA60D,YAEIiuB,EAAyBn1B,GAAuBk1B,GAChDE,EAAwB/5E,GAC5B85E,EACAh1B,GAAsB+0B,EAAmBC,GACzCv4B,GAAkBs4B,IAEhBjB,GAAkBmB,GAvqG9B,SACEtzE,EACAnc,EACAwxE,EACAh6C,EACAzV,EACArV,EACA60D,EACA+P,GAEA,IACE,IAAMtlD,EAAU,CACd+5D,UAAWr8F,KAAKC,MAChB+f,KAAM6nE,GACJvxE,EACAwxE,EACAh6C,EACAzV,EACArV,EACA60D,GAEFvhE,cACAwxE,kBACAh6C,UACAzV,UACArV,UACA60D,YAEFlxE,aAAa/E,QAAQ+lF,GAAkBl1D,EAAQm1D,GAAiB5mF,KAAKa,UAAUygC,GACjF,OAEA,CACF,CAwoGU0jE,CACEppE,EAAOnK,OACPnc,EACAwxE,EACAh6C,EACAzV,EACArV,EACA60D,EACA+P,GAGJ,IAAMqe,EAAepe,GACnBvxE,EACAwxE,EACAh6C,EACAzV,EACArV,EACA60D,GAGF,GADuBzoD,GAAUA,EAAOpP,MAAQoP,EAAOpP,OAASimF,IAAiBL,IAC1DpQ,EAKrB,YADK7wE,GAAMshE,qBAAqB//E,KAGlC,IAAMggG,GAAqBvkD,GAAU8+B,IAAmBgkB,EACpD,QACA7nE,EAAOspE,kBAAoB,OAE/B,GADkD,OAAvBT,GAA+BE,EAAyBF,GACpC,SAArBS,EAA6B,CACrD,IAAMj7B,EAAY06B,EAAyBJ,EAU3C,OATA7mB,GAAsB,CACpBf,MAAO,mBACP4nB,uBACAI,yBACA3nB,cAAe/S,EACf4S,kBAAmB,OAEQ9Q,GAAM,OAAQ,mBAAoB,CAAE9B,mBACjE/kE,GAEF,CAIAA,IACAovF,GACEuQ,EACAvvF,EACA,UACA8Y,EAASk8C,KAA0BiqB,EACnCC,KAGHv0D,MAAOxE,IACN,IAAMkpE,EAAyB3lG,KAAKC,MAC9B+vB,EAAQyM,aAAeC,MAAQD,EAAI5P,QAAUpY,OAAOgoB,GAC1DiiD,GAAsB,CACpBf,MAAO,sBACP4nB,uBACAI,yBACA3nB,cAAe2nB,EAAyBJ,EACxC1nB,kBAAoD,YAAjCl5D,GAAM+4D,KAAKG,kBAAkC,UAAY,SAC5E6nB,iBAAkB11E,WAETlD,QAAY,KACrBA,QAAQkD,MAAM,sCAAuCyM,GAp7H/D,SACEG,EACAz5B,EACA4oB,GAEAy0D,GAAoB5jD,EAAQ,WAAYz5B,EAAM4oB,EAChD,CAg7HQo6E,CAAmBvpE,EAAQ,CACzBuhD,oBAAqB,EACrB6D,gBAAiB/yC,KACjBlB,SAAUJ,GAAgB/Q,GAC1BslD,cAAe9yD,EAAS,QAAU,OAClCwuD,oBAAqBj5D,GAAM+4D,KAAKG,kBAChCI,gBAAiBt5D,GAAM+4D,KAAKM,cAC5BD,sBAAuBp5D,GAAM+4D,KAAKI,oBAClCsoB,mBAAoBp2E,EACpBmyD,gBAAiB7zC,GAAsB1R,GACvCkmD,eAAgD,iBAAzBlmD,EAAOmmD,cAA6BnmD,EAAOmmD,mBAAgB,EAClFC,oBAAyD,iBAA7BpmD,EAAOqmD,kBAAiCrmD,EAAOqmD,uBAAoB,GAC9FugB,GAGE7+E,GAAMshE,qBAAqB//E,MAG7B,EACT,CAGA,OAAOovF,GAAoB14D,EAAQ,GAAI,OAAQ24D,EACjD,CAEO,SAASntE,GACd9b,EACAnJ,EACAsE,EACAa,GAGA,GADIqc,GAAM87D,gBACNpT,KAAmB,OACvB,GAAI1oD,GAAMshE,oBAOR,YAHKthE,GAAMshE,oBAAoB9kE,KAAK,KAClCiH,GAAM9b,EAAMnJ,EAAMsE,EAAca,KAMpC,GA7oLF,SAAqCgE,EAAcnJ,GACjD,IAAKwhB,GAAMiY,SAAWq0C,KAA4B,OAClD,IAAMK,EAAc3sD,GAAMiY,OAAO5Z,SAAW,GAC5C,GAAKsuD,EAAY3vE,QAAWwB,EAE5B,QAAWouE,KAAcD,EAAa,CACpC,IAAMzgD,EAAU0gD,EAAW1gD,QAE3B,GADsB,mBAAlBA,GAAS1sB,OACR0sB,EAAQilD,YAAcjlD,EAAQE,UAAYF,EAAQilD,YAAcxpE,EAAM,SAC3E,IAAM5E,EAAQwpE,GAAkB/tE,EAAK0tB,EAAQE,UAAWwgD,EAAWJ,gBACnD,IAAVzpE,GAAqBgb,GAAgB6uD,EAAWloE,IAAK3B,EAAO6pE,EAAW5uD,QAAS,iBACxF,CACF,CA+nLE0jF,CAA4B/5F,EAAMnJ,GAClCukF,MACK/iE,GAAMg4D,QACT,OAEF,IAAM2pB,EAAmB3hF,GAAM/O,YAAYjU,OAAS,EAAIgjB,GAAM/O,YAAY,GAAK,KACzE2wF,EAAuB9+F,GAAgB6+F,GAAkB7+F,aACzD++F,EAAsBl+F,GAAeg+F,GAAkBh+F,YAChCqkB,GAAS,QAAS,GAAGrgB,IAAQ,CAAE7E,aAAc8+F,EAAsBj+F,YAAak+F,EAAqBrjG,SACrG4pE,GAAM,QAAS,GAAGzgE,IAAQ,CAAE7E,aAAc8+F,EAAsBj+F,YAAak+F,KAAwBrjG,IAClI,IAAMkd,EAAoB,CACxB/T,OACAnJ,KAAMg6E,GAAwBh6E,EAAMojG,EAAsBC,GAC1Dx0F,IAAKvS,IACLgI,aAAc8+F,EACdj+F,YAAak+F,GAEf7hF,GAAMg4D,QAAQv0D,MAAM/H,GACP,SAAT/T,GAAmBqY,GAAMiY,Q5Bj4MxB,SACLk5C,EACAlgE,EACAU,EACAnT,GAEA,IAAK2yE,EAAW,OAChB,IAAMwG,EAAS,IAAI1hE,IAAItE,EAAY3F,IAAKof,GAAM,CAACA,EAAEvqB,GAAIuqB,KACrD,QAAWxZ,KAAcX,EAAa,CACpC,IAAMgd,EAAM0pD,EAAO96E,IAAI+U,EAAW9O,cAClC,GAAKmrB,GAAKkzB,MACV,QAAWz1B,KAAQuC,EAAIkzB,MACH,WAAdz1B,EAAK/jB,MAAqB+jB,EAAKylD,YAAcA,GAC/C1lD,GAASC,EAAM9Z,EAAYpT,EAGjC,CACF,C4Bi3MIsjG,CAAqBn6F,EAAMqY,GAAM/O,YAAa+O,GAAMiY,OAAOtmB,aAAe,GAAInT,EAElF,CA0BO,SAASujG,GAAUj2F,EAActN,GACtC,IAAMwjG,EAAWl2F,EAAK7L,OAAOqD,MAAM,EAAG,KAEtC,IADK0+F,GACDhiF,GAAM87D,gBAAkBpT,KAAmB,OAC/C,GAAI1oD,GAAMshE,oBAOR,YAHKthE,GAAMshE,oBAAoB9kE,KAAK,KAClCulF,GAAUC,EAAUxjG,KAIxB,IAAKwhB,GAAMg4D,QAAS,OAEpB,IA/BF,SAA+BgqB,EAAkBlzC,GAC/C,IAAKA,UAAyB3yD,eAAmB,IAAa,OAAO,EACrE,IAAMuI,EAVR,SAA8Bs9F,GAK5B,MAAO,2BAHEjnG,SAAa,IAChB,GAAGA,SAASC,QAAU,KAAKD,SAASE,UAAY,KAChD,aAC6B+mG,IAAW1+F,MAAM,EAAG,IACzD,CAIc2+F,CAAqBD,GACjC,IACE,GAAoC,MAAhC7lG,eAAeC,QAAQsI,GAAc,OAAO,EAChDvI,eAAec,QAAQyH,EAAK,IAC9B,OACE,OAAO,CACT,CACA,OAAO,CACT,CAqBOw9F,CAAsBF,GADqB,IAAzBxjG,GAAMswD,gBACyB,OACtD,IAAMnxB,EAAU,IAAMn/B,GAAQ,CAAC,UACxBm/B,EAAQmxB,eACfrrC,GAAM,cAAe,IAChBka,EACHhnB,OAAQ,eACRwrF,UAAWH,EACXvjG,YAAa1D,SAAa,IAAcA,SAASE,cAAW,GAEhE,CAEO,SAAS6yC,GAAUliB,EAAgBptB,GACxC,IAAIwhB,GAAM87D,iBACNpT,MACC1oD,GAAMiY,OACX,IAAIjY,GAAMshE,oBAMR,YAHKthE,GAAMshE,oBAAoB9kE,KAAK,KAClCsxB,GAAUliB,EAAQptB,KAIOwpB,GAAS,OAAQ,oBAAoB4D,IAAUptB,GAC/C4pE,GAAM,OAAQ,SAASx8C,IAAUptB,G5Bp9MzD,SACLotB,EACA3a,EACAU,EACAnT,GAEA,IAAMm5E,EAAS,IAAI1hE,IAAItE,EAAY3F,IAAKof,GAAM,CAACA,EAAEvqB,GAAIuqB,KACrD,QAAWxZ,KAAcX,EAAa,CACpC,IAAMgd,EAAM0pD,EAAO96E,IAAI+U,EAAW9O,cAClC,IAAKmrB,GAAKkzB,MAAO,SACjB,IAAMz1B,EAAOuC,EAAIkzB,MAAMtvC,KAAMwvC,GAAMA,EAAExgD,KAAO+qB,GACxCF,GAAMD,GAASC,EAAM9Z,EAAYpT,EACvC,CACF,C4Bw8ME4jG,CAAYx2E,EAAQ5L,GAAM/O,YAAa+O,GAAMiY,OAAOtmB,aAAe,GAAInT,EAAI,CAC7E,CAEO,SAASutE,GAAWs2B,GACzBriF,GAAMqX,iBAAyBgrE,EAvmLjC,SAA4BA,GAC1B,GAAKtgG,WAAWpG,SAChB,IACEoG,WAAWpG,SAASyG,OAASigG,EACzB,GAAGj2B,+CACH,GAAGA,sCACT,OAEA,CACF,CA+lLEk2B,CAAmBtiF,GAAMqX,gBACpBrX,GAAMqX,gBACTs2C,KAGG3tD,GAAMiY,SAnjLb,WA/DA,IAAoCA,EAgE7BjY,GAAMiY,SACX5uB,IAjEkC4uB,EAiEkBjY,GAAMiY,OAhEtDq0C,KAAmCr0C,EAAO4wC,eACvC,IAAM5wC,EAAO4wC,gBAAkB,CAAC,EAAIt/D,YAAa,YAgEpD+iE,MAA8BtsD,GAAMoH,QACtC5b,GAAYwU,GAAMoH,QAEtB,CA8iLEm7E,GACAC,KACIxiF,GAAMqX,iBACR2qD,KACAW,MAEJ,CAEO,SAAS8f,KACd,QtB5mNS1uE,EsB6mNX,CAEO,SAAS2uE,KACd,OtB5mNA3uE,GAAQv2B,KAAKC,IAAI,EAAGs2B,GAAQ,KAChB1V,GAAQ3E,QAASsL,GAAWA,KACjC+O,EsB2mNT,CAEO,SAAS4uE,KACd3uE,IACF,CAEO,SAASwuE,KACd,IAAKxiF,GAAMiY,OAAQ,OACnB,IAAMtmB,EAAcqO,GAAMiY,OAAOtmB,aAAe,GAC1C6vE,EAAuD,kBAAhCxhE,GAAMiY,OAAO4iD,gBACrC76D,GAAMgqB,UAAUe,sBACrB/qB,GAAMuhE,wBAA0BC,GAAwBoO,GAAgB5vE,GAAMiY,QACzEupD,GAAsBkB,GAAmC1iE,GAAMiY,QACpEo6C,GAAsB,iBAElB3J,MAAsB1oD,GAAMuhE,wBAKJ,SAAxBvhE,GAAMynD,cACRmb,GAAuB5iE,GAAMiY,OAAQtmB,GAErC0vE,GAAoBrhE,GAAMiY,OAAQtmB,GAPlCm+E,IASJ,CAEO,SAAS5hD,GAAOC,GAAe,GACpC,IAAMl9B,EAAcohE,GAAsB,SAAUlkC,GACpD,OAAAnuB,GAAMy/D,0BAA4B,GAClCz/D,GAAM0/D,4BAAyB,EAC3B1/D,GAAMiY,QAAQygD,GAA4B14D,GAAMiY,QAC7ChnB,CACT,CAgBO,SAASugE,GAAajX,EAAiB/7D,GAC5C,GAAuB,iBAAZ+7D,IAAyB54D,OAAOC,SAAS24D,IAAYA,EAAU,EAIxE,mBAHWpyC,QAAY,KACrBA,QAAQO,KAAK,wFAKjB,GADI1I,GAAM87D,gBACNpT,KAAmB,OACvB,GAAI1oD,GAAMshE,oBAOR,YAHKthE,GAAMshE,oBAAoB9kE,KAAK,KAClCg1D,GAAajX,EAAS/7D,KAI1B,IAAKwhB,GAAMg4D,QAAS,OACpB,IAAMtG,EAAY,IAAKlzE,EAAM+7D,WAC7B,GAAI/7D,GAAQ,aAAcA,EAAM,CAC9B,IAAM6S,EA3BV,SAAkCtO,GAChC,GAAqB,iBAAVA,EAAoB,OAC/B,IAAMsO,EAAWtO,EAAM9C,OAAOusB,cAC9B,MAAO,aAAariB,KAAKkH,GAAYA,OAAW,CAClD,CAuBqBuxF,CAAyBpkG,EAAK6S,UAC3CA,EACFqgE,EAAUrgE,SAAWA,SAEdqgE,EAAUrgE,QAErB,CAEA,QAAWjO,KAAK4c,GAAM/O,YACpBwS,GAAM,OAAQ,IAAKiuD,EAAW9lD,OAAQ,eAAiBxoB,EAAEN,aAAcM,EAAEO,YAE7E,CAEO,SAASqpC,KACd,GAAIhtB,GAAM87D,eAAgB,OAAOz0E,QAAQL,UACzC,IAAM67F,EAAe7iF,GAAMshE,oBAC3B,OAAIuhB,EAIKA,EAAarmF,KAAK,IAAMwwB,OAEjC+1C,KACO/iE,GAAMg4D,QAAUh4D,GAAMg4D,QAAQhrC,QAAU3lC,QAAQL,UACzD,CAEO,SAAS87F,KACd,OAAO9iF,GAAM/O,WACf,CAEO,SAAS8xF,KACd,IAAM9nF,EAAQ4yE,KACd,OAAO5yE,EAAQ8gB,GAA0B9gB,GAAS,EACpD,CAEA,SAAS+nF,GAA4BjgG,GACnC,GAAqB,iBAAVA,EAAoB,OAAO,KACtC,IAAMk3B,EAAel3B,EAAM9C,OAAO+J,MAAM,IAAK,GAAG,IAAM,GAChD6d,EAAQoS,EAAazvB,WAAW,uBAClCyvB,EAAa32B,MAAM,IACnB22B,EACJ,OAAOpS,EAAM7qB,OAAS,GAAK6qB,EAAM7qB,QAAU,KAAO6qB,EAAQ,IAC5D,CAcA5D,eAAsBg/E,GACpBtpE,GAEA,IAAMupE,EAAoBhZ,KACpBjvE,EAAQ4yE,GAAkCqV,GAChD,IAAKjoF,EAAO,MAAO,GACnB,IAAMkoF,EAh4DCvU,KAAmC,CACxCn0D,WAAY,EACZo0D,qBAAqB,EACrB1lE,QAAS,MA83DLsR,IAAe0oE,EAAS1oE,WAG9Bs0D,IAA6B,EAC7BoU,EAAStU,oBAAsBqU,EAC/BC,EAASh6E,QAAU,KACf+5E,IACFljF,GAAMozD,+BAA+BxsD,QACrC5G,GAAMszD,kCAAkC1sD,QA1kJ5C,WACE,IAAM3S,EAAW+L,GAAMwzD,+BACvB,IAAKv/D,GAA8B,IAAlBA,EAASwB,KAAY,OACtC,IAAMq+D,EAAoB,IAAItiE,IAC5BwO,GAAMiY,QAAQi7C,UAAU56C,QAAQoL,eAAer/B,eAAiB,IAE5D++F,EAAgBpjF,GAAM/O,YAAYiB,KAAMN,GAC5CkiE,EAAkBvhE,IAAIX,EAAW9O,eACjCmR,EAAS1B,IAAIygE,GAAgCphE,KAC7C8hE,GAAiC9hE,IACnCoO,GAAMwzD,+BAAiC,IAAIhiE,IACvC4xF,IAGF9zB,GAAWtvD,GAAM/O,aACjBw+D,GAAiBzvD,GAAM/O,YAAa+O,GAAM6pB,gBAE9C,CA8jJIw5D,GACArjF,GAAM8uE,oBAAsB,CAC1Bt0B,GAAIn/D,KAAKC,MACTuV,OAAQ,UACRo+E,gBAAiBjvE,GAAM/O,YAAYjU,QAErC+T,KACA8U,MAEF,IAAI8Y,EAAqC,GACrC2kE,EAAwC,GACxC5jE,EAAsC,GACtCrE,EAAqD,KACnD18B,QlB3qLRslB,eACEhJ,GAEA,IAAMwf,IAAeD,GACfkJ,QAAsBxI,GAA6BjgB,EAAOwf,GAChE,GAAIA,IAAeD,KAAyBkJ,EAAcvI,UAAW,MAAO,GAM5E,GALIuI,EAAcrI,2BAGhBpgB,EAAMsoF,iCAAiC7/D,EAAcrI,2BAEnDzC,GAAiC3d,GAAQ,CAC3C,IAAMsgB,EAA6BI,GACjC+H,EAAc7b,MACd,IAAIrW,IAAIyJ,EAAM4d,oBAAsB,KAEtC,IAAK0C,EAA4B,MAAO,GACxCtgB,EAAM6f,mCAAmCS,EAC3C,CACA,GAAItC,GAAoChe,GAAQ,CAC9C,IAAMugB,EAAgCI,GACpC8H,EAAc7b,MACdmR,GAAsB/d,KACnB,GACLA,EAAM8f,sCAAsCS,EAC9C,CACA,GAAI1C,GAAkC7d,GAAQ,CAC5C,IAAMwgB,EAA8BI,GAClC6H,EAAc7b,MACdkR,GAAoB9d,KACjB,GACLA,EAAM+f,oCAAoCS,EAC5C,CACA,OAAOM,GACL,IAAK9gB,EAAOhK,YAAayyB,EAAczyB,aACvCyyB,EAAc7b,MAElB,CkBsoLwB27E,CAAgC,IACjDvoF,EACH0e,YACAmB,iCAAmC7pB,IACjC0tB,EAAmB1tB,GAErB8pB,oCAAsC9pB,IACpCqyF,EAAsBryF,GAExB+pB,kCAAoC/pB,IAClCyuB,EAAoBzuB,GAEtBsyF,+BAAiCtyF,IAC/BoqB,EAA4BpqB,KAGhC,GAAIwpB,IAAe0oE,EAAS1oE,WAAY,MAAO,GAC/C,IAAMgpE,EAAsBT,GAA4BrpE,GACxD,OAAuB,IAAnBh7B,EAAQ3B,QAAgBkmG,GAC1BC,EAAStU,qBAAsB,EAC/B7uE,GAAM8uE,oBAAsB,CAC1Bt0B,GAAIn/D,KAAKC,MACTuV,OAAQ,SACRmlB,OAAQ,uBACRi5D,gBAAiBjvE,GAAM/O,YAAYjU,QAErC0d,GACEsF,GAAMiY,QAAQi7C,UAAUh9D,MACxB8zE,KACAl5E,QACA,EACAmiE,IAEFrtD,GACE5F,GAAMiY,QAAQi7C,UAAU76C,SACxBrY,GAAM/O,YAAYQ,OAAO4hE,IACzBU,IAEK,KAELp1E,EAAQ3B,OAAS,GAAKkmG,GAAqBO,IAC7CN,EAASh6E,QAAU,CACjBsR,aACAd,UAAW8pE,EACX9kE,mBACA2kE,sBACA5jE,oBACArE,6BAIF3gB,GACEsF,GAAMiY,QAAQi7C,UAAUh9D,MACxB8zE,KACAl5E,QACA,EACAmiE,IAEFrtD,GACE5F,GAAMiY,QAAQi7C,UAAU76C,SACxBrY,GAAM/O,YAAYQ,OAAO4hE,IACzBU,KAGGp1E,EACT,CAeO,SAAS+kG,GAA6B/pE,GAC3C,IAAM8pE,EAAsBT,GAA4BrpE,GAClDwpE,EAAWvU,GACXzlE,EAAUg6E,GAAUh6E,QAC1B,SACGs6E,GACAN,GACAh6E,GACDA,EAAQsR,aAAe0oE,EAAS1oE,YAChCtR,EAAQwQ,YAAc8pE,KAUtBt6E,EAAQkS,4BACPsyD,GAAoCxkE,EAAQkS,4BAE7Crb,GAAM8uE,oBAAsB,CAC1Bt0B,GAAIn/D,KAAKC,MACTuV,OAAQ,SACRmlB,OAAQ,yBACRi5D,gBAAiBjvE,GAAM/O,YAAYjU,SAE9B,IAETmmG,EAASh6E,QAAU,KACnBg6E,EAAStU,qBAAsB,EAC/B7uE,GAAMozD,8BAAgC,IAAI5hE,IACxC2X,EAAQwV,iBAAiB3yB,IAAIgnE,KAE/BhzD,GAAMszD,iCAAmC,IAAI9hE,IAC3C2X,EAAQm6E,oBAAoBt3F,IAAIgnE,KAKlCa,GAAgC1qD,EAAQuW,mBACxC1f,GAAM8uE,oBAAsB,CAC1Bt0B,GAAIn/D,KAAKC,MACTuV,OAAQ,OACRo+E,gBAAiBjvE,GAAM/O,YAAYjU,QAErC0d,GACEsF,GAAMiY,QAAQi7C,UAAUh9D,MACxB8zE,KACAl5E,QACA,EACAmiE,IAEFrtD,GACE5F,GAAMiY,QAAQi7C,UAAU76C,SACxBrY,GAAM/O,YAAYQ,OAAO4hE,IACzBU,IAEE/zD,GAAMg0D,kBAAoBh0D,GAAMiY,SAAWywC,MAC7CuL,GAAuBj0D,GAAMiY,SAExB,GACT,CAEO,SAAS0rE,KACd,OAAO3jF,GAAMiY,QAAQtmB,aAAe,EACtC,CAuBO,SAASiyF,GAAgBl/F,GAC9B,OAAQA,GACN,IAAK,QACH,OAAO8pE,KACT,IAAK,cACH,OAAOm1B,KACT,IAAK,QACH,OA5BN,WACE,IAAMnlF,EAAO,IAAIhN,IACX2vC,EAAgB,GACtB,QAAWz/C,KAAciiG,KACvB,QAAWj4E,KAAQhqB,EAAWy/C,OAAS,GACjC3iC,EAAKjM,IAAImZ,EAAK7qB,MAClB2d,EAAKzd,IAAI2qB,EAAK7qB,IACdsgD,EAAMxuC,KAAK+Y,IAGf,OAAOy1B,CACT,CAiBa0iD,GACT,IAAK,cAEL,IAAK,oBACH,OAAOf,KACT,IAAK,sBACH,OArBN,WACE,IAAMlgE,EAA8B,CAAC,EACrC,QAAWhxB,KAAcoO,GAAM/O,YAC7B2xB,EAAIhxB,EAAW9O,cAAgB8O,EAAWjO,YAE5C,OAAOi/B,CACT,CAeakhE,GACT,IAAK,mBAGH,OAAI9jF,GAAM87D,gBAAkBpT,KACnB,CAAEv6C,UAAW,GAAIld,YAAa,IAEhC,CACLkd,UAAWnO,GAAMoH,QAAU,GAC3BnW,YAAaquE,MAEjB,IAAK,UACH,OAAOtS,GAAiB,CAAE5uD,iBAAiB,IAC7C,IAAK,cACH,OAAO29E,KACT,IAAK,OACH,MAAO,CACLvgG,cAAqBwkB,GAAMiY,OAC3BnK,OAAQ9N,GAAMiY,QAAQnK,QAAU,KAChCi2E,kBAAmB/jF,GAAMiY,QAAQtmB,aAAa3U,QAAU,GAE5D,QACE,OAEN,CAEO,SAASwxE,KACd,OAAOjjC,GAAuB,CAC5B5vC,gBAAiBA,SAAa,IAAcA,cAAW,EACvDkC,cAAeA,OAAW,IAAcA,YAAS,EACjD9C,gBAAiBA,SAAa,IAAcA,cAAW,EACvD0oB,SACAqqB,aACA9oB,OAAQ+nD,GACR7+B,UACArxC,IAAK+mG,IAET,CAEA,SAASI,GACP7sE,GAEA,IAAM9pB,EAAM8pB,GAAS9pB,aAAetS,SAAa,IAAcA,SAASuS,KAAO,IAC/E,MAAO,CACLD,MACA+T,WAAYyzB,GACV,IAAM70B,GAAMiY,QAAQ7W,YAAc,CAAC,KAAQ+V,GAAS/V,YAAc,CAAC,GACnE/T,EACA,CAAE2nC,eAAgBs3B,OAEpBllD,OAAQ+P,GAAS/P,QAAUpH,GAAMoH,aAAU,EAE/C,CAEO,SAAS68E,GACd9hD,EACAhrB,GAEA,OVl/NK,SACLgrB,EACAxwC,EACAwlB,GAEA,IAAMz1B,EAAaiQ,EAAYE,KAAMuZ,GAAMA,EAAEvqB,KAAOshD,GACpD,IAAKzgD,EAAY,OAAO,EAExB,IAAM2L,EAAM8pB,GAAS9pB,aAAetS,SAAa,IAAcA,SAASuS,KAAO,IACzE8T,EAAayzB,GAAyB1d,GAAS/V,YAAc,CAAC,EAAG/T,GAEvE,IAAKqrC,GAAiBh3C,EAAWywC,UAAW,CAAE9kC,MAAK+T,eACjD,OAAO,EAGT,IAAMgG,EAASjc,GAAUgsB,GAAS/P,QAC5BpiB,EAAYiD,GAAYvG,EAAWb,GAAIumB,GAE7C,IAAKriB,EAAoBC,EAAWtD,EAAWw/C,mBAAqB,GAClE,OAAO,EAIT,IAGMxxC,EAAQxK,GAJKxD,EAAWw/C,mBAAqB,IAEnC,EAAIl8C,EAAY4D,GAAqBlH,EAAWb,GAAIumB,GACpD1lB,EAAWk/C,WAAW50C,IAAKpP,GAAMA,EAAEmkD,SAEnD,QAAIrxC,EAAQ,GAAKA,GAAShO,EAAWk/C,WAAW5jD,QAE9B0E,EAAWk/C,WAAWlxC,GACtBgD,UACpB,CUm9NSuxF,CAA4B9hD,EAAQwhD,KAAkBK,GAAiB7sE,GAChF,CAEO,SAAS+qB,GACdC,EACAhrB,GAEA,OAAO+qB,GACLC,EACAwhD,KACAK,GAAiB7sE,GAErB,CAEO,SAAS+sE,GACd/hD,EACA1tB,EACA0C,GAEA,OVv6NK,SACLgrB,EACAxwC,EACAwlB,EACA1C,GAEA,IAAM7iB,EAAaswC,GAAuBC,EAAQxwC,EAAawlB,GAC/D,OAAKvlB,OACuB,IAArBA,EAAW7O,MAAsB0xB,EAAW7iB,EAAW7O,MADtC0xB,CAE1B,CU85NSyvE,CACL/hD,EACAwhD,KACAK,GAAiB7sE,GACjB1C,EAEJ,CAEO,SAASsnE,KACd,IAAM9jE,EAASjY,GAAMiY,OACf84D,EAAgB/wE,GAAM+wE,cACtBxnF,EAAc0uB,GAAQ4wC,gBAAgBt/D,aAAe,eACrD46F,ExCx5ND,SAA8B93F,EAAyC,CAAC,GAE7E,MAAO,CACLwS,OAFaV,GAAW9R,GAGxBo/D,QAAS,IAAKvtD,IAElB,CwCk5N4BkmF,CAAqB,CAAEhmF,gBAAiBkuD,OAC5Dv7B,EAA8B,CAClCvxC,KAAM,SACNhE,cAAqBy8B,EACrBnK,OAAQmK,GAAQnK,QAAU,KAC1Bu2E,gBAAuBrkF,GAAMoH,OAC7BnW,YAAa+O,GAAM/O,YAAYjF,IAAK4F,IAClC,IAAM8d,EACJ9d,EAAW8d,OACV9d,EAAWmhE,gBACR,kBACAnhE,EAAW0wC,YACT,eACA,cACR,MAAO,CACLx/C,aAAc8O,EAAW9O,aACzBa,YAAaiO,EAAWjO,YACxB+rB,OACAhd,UAAWd,EAAWc,UACtBmqE,cAAejrE,EAAWwhB,UAAUp2B,OACpCsnG,eAAgB1yF,EAAW0wC,aAAa59C,IACxC6/F,mBAAoB3yF,EAAWmhE,iBAAiBruE,IAChD8/F,sBAAuB5yF,EAAWmhE,iBAAiBoC,OACnDsvB,4BAA6B7yF,EAAWmhE,iBAAiBsC,aACzDqvB,uBAAwB9yF,EAAWmhE,iBAAiBwC,QACpDovB,2BAA4B/yF,EAAWmhE,iBAAiB0C,YACxDmvB,wBAAyBhzF,EAAWmhE,iBAAiBnhD,SACrDizE,8BAA+BjzF,EAAWmhE,iBAAiB4S,eAC3D5iF,MAAO6O,EAAW7O,SAGtBghG,kBAAmB9rE,GAAQtmB,aAAa3U,QAAU,EAClDg3E,iBAAkBh0D,GAAMg0D,iBACxBrgB,iBAAwB3zC,GAAMg4D,QAC9BrxB,WAAY3mC,GAAM07C,sBAClB1e,OAAQh9B,GAAMg9B,OACdC,YAAaj9B,GAAMi9B,YACnB6+B,eAAgB97D,GAAM87D,eACtBpoB,aAAc1zC,GAAM0zC,aACpBqlB,KAAM,IAAK/4D,GAAM+4D,MACjB3vC,SAAUppB,GAAMopB,SAChBsoD,WAAY1xE,GAAM0xE,WAClB7nD,eAAgB7pB,GAAM6pB,eACtBllC,QAAS,CACPnF,KAAM+J,EACNkrD,sBAAuBpD,GAAiB,gBACxCqD,wBAAyBrD,GAAiB,kBAC1CyzC,sBAAuB5xD,UAAc,MAA0C,IAA5BA,UAAUshB,eAE/D9gC,QAAS,CACP0zC,gBAAiB2pB,GAAe3pB,gBAChCE,qBAAsBypB,GAAezpB,qBACrCG,cAAespB,GAAetpB,cAC9BS,gBAAiBloD,GAAMkoD,gBACvBJ,eAAgBipB,GAAejpB,eAC/Bi9B,wBAAyB9sE,GAAQg4C,kBAAkBtiD,SAAW,GAC9DN,mBAAoB4K,GAAQg4C,kBAAkB5iD,oBAAsB,cACpEI,sBAAuBwK,GAAQg4C,kBAAkBxiD,sBACjDu3E,iBAAsD,IAArC/sE,GAAQ0rD,gBAAgBz8E,SACzC+9F,kBAAmBhtE,GAAQ0rD,gBAAgBuhB,YAE7Ct7D,IAAK,CACHgwD,QAAS55E,GAAM45E,QACfoB,gBAAiBh7E,GAAMg7E,sBAAmB,EAC1C9pB,qBAAsBlxD,GAAMkxD,2BAAwB,EACpDke,0BAA2BpvE,GAAMovE,gCAA6B,EAC9DN,oBAAqB9uE,GAAM8uE,0BAAuB,GAEpDzwE,QAAS,CACPQ,OAAQslF,EAAkBtlF,OAC1B4sD,QAAS04B,EAAkB14B,SAE7B05B,aAAc,CACZxvB,qBAAsB31D,GAAMuyD,iCAIhC,OAAIxqD,OACFgpB,EAAYvxC,KAAO,QACnBuxC,EAAY23B,gBAAkBA,KAC9B33B,EAAY43B,sBAAwB3oD,GAAM2oD,sBAC1C53B,EAAYwwC,wBAA0BvhE,GAAMuhE,wBAC5CxwC,EAAY3Z,gBAAkBpX,GAAMoX,gBACpC2Z,EAAY1Z,eAAiBrX,GAAMqX,eACnC0Z,EAAY4hD,mBAAqB3yE,GAAM2yE,oBAGlC5hD,CACT,CAqBA,SAASq0D,GAAeC,GACtB,OAAQA,EAAI19F,MACV,IAAK,OACHu0F,GAAKmJ,EAAIptE,QACT,MACF,IAAK,QACHxU,GAAM4hF,EAAI3pF,MAAO2pF,EAAI7mG,MACrB,MACF,IAAK,OACHujG,GAAUsD,EAAIv5F,KAAMu5F,EAAI7mG,MACxB,MACF,IAAK,YACHsvC,GAAUu3D,EAAIz5E,OAAQy5E,EAAI7mG,MAC1B,MACF,IAAK,eACHgzE,GAAa6zB,EAAI9qC,QAAS8qC,EAAI7mG,MAC9B,MACF,IAAK,SACHuuE,GAAgBs4B,EAAI3gG,IAAK2gG,EAAItiG,MAAOsiG,EAAIrnF,SACxC,MACF,IAAK,cACHkvD,GAAYm4B,EAAIl4B,QAASk4B,EAAI/zF,QAC7B,MACF,IAAK,kBACH0N,GAAgBqmF,EAAIj1F,QAASi1F,EAAIrnF,SACjC,MACF,IAAK,UACHqB,GAAe,CAAEC,UAAW+lF,EAAI/lF,UAAWC,WAAY8lF,EAAI9lF,YAAc8lF,EAAIrnF,SAC7E,MACF,IAAK,YACHwB,GAAgB6lF,EAAI5lF,MAAO4lF,EAAIrnF,SAC/B,MACF,IAAK,aACH+tD,GAAWs5B,EAAIhD,SACf,MACF,IAAK,OACHI,KACA,MACF,IAAK,UACHC,KACA,MACF,IAAK,WACHC,KACA,MACF,IAAK,SACHz0D,IAAqB,IAAdm3D,EAAI9qE,OACX,MACF,IAAK,uBACHioE,KAGN,CA5tOA/8C,EAAAyf,GAAA,CAAA/J,4BAAA,IAAAA,GAAApC,gCAAA,IAAAA,GAAAsC,wBAAA,IAAAA,GAAAjB,8BAAA,IAAAA,GAAAkrC,OAAA,IAAAA,GAAA5B,6BAAA,IAAAA,GAAAn4D,uBAAA,IAAAA,GAAAiV,iBAAA,IAAAA,GAAAsB,kBAAA,IAAAA,GAAAU,qBAAA,IAAAA,GAAAylC,SAAA,IAAAA,GAAAgc,aAAA,IAAAA,GAAA/hD,uBAAA,IAAAA,GAAAgiD,kBAAA,IAAAA,GAAAl3D,MAAA,IAAAA,GAAA81D,eAAA,IAAAA,GAAAC,kBAAA,IAAAA,GAAAhH,eAAA,IAAAA,GAAA4H,eAAA,IAAAA,GAAAn1B,gBAAA,IAAAA,GAAAo1B,gBAAA,IAAAA,GAAAzlF,WAAA,IAAAA,GAAA8kF,wBAAA,IAAAA,GAAAR,KAAA,IAAAA,GAAAE,SAAA,IAAAA,GAAAzG,KAAA,IAAAA,GAAAhuD,OAAA,IAAAA,GAAAs0D,qBAAA,IAAAA,GAAAE,QAAA,IAAAA,GAAA1jF,gBAAA,IAAAA,GAAAK,eAAA,IAAAA,GAAA0sD,WAAA,IAAAA,GAAAvsD,gBAAA,IAAAA,GAAAzB,UAAA,IAAAA,GAAA0F,MAAA,IAAAA,GAAAqqB,UAAA,IAAAA,GAAA0jC,aAAA,IAAAA,GAAAuwB,UAAA,IAAAA,KAAA,IAoKMzG,GACAjzB,GACA0xB,GACAhiB,GACAhJ,GACAyvB,GA+BA54B,GACAS,GAgFAyH,GACAsyB,GACA54B,GACAK,GACAV,GACAQ,GACAI,GACAqE,GACAwS,GACAS,GACAL,GACAG,GAqGAzY,GAoVA6tB,GACAC,GACAH,GAgwBAxlB,GAEA7uD,GAsFFkvD,GACAC,GACA+c,GA+MEha,GAuIFwE,GAolBEgE,GACAskB,GAqOApxB,GACA+Q,GACAD,GAgsBAmD,GA6mCAyN,GACFtC,GAQA5C,GA+XA2E,GAcAH,GAuBEh2D,GACAK,GACAH,GA63EOwsE,G,GApyObtnC,GAAAh/D,EAAA,KAAAD,IACAyC,IACAgD,IAQAM,IACAa,IACAqC,KACAiG,KAKA6M,KAWAiM,KAOAC,KACA2B,KACAa,KACAK,KACAM,KACAgD,KACAtf,KACApC,KACAgjB,KACAE,KACApD,KACA+E,KACAlH,KACAyM,KACAxF,KACA8F,KACAa,KACAkB,KACA8I,KAUAjkB,KACA4rB,KAOApnB,KACAopB,KAYA4G,KAKAnD,KACA2M,KACAr7B,KAYAojC,KAoDAsB,KA6nOApC,KACAc,KACApjC,KAOA0uB,KA9nOMktD,IAAa,EACbjzB,IAAmB,EACnB0xB,IAAgB,EAChBhiB,IAAkB,EAClBhJ,IAAkB,EAClByvB,UACG7iG,SAAa,IACfA,SAAS4pG,eAA4ClyC,SACtD,EA4BAuS,GAAkC,KAClCS,GAA+B,KAgF/ByH,GAA0B,YAC1BsyB,GAA8B,IAC9B54B,GAAkC,KAClCK,GAAmC,IACnCV,GAAwC,OACxCQ,GAAwC,OACxCI,GAAoC,SACpCqE,GAAsB,eACtBwS,GAA+B,WAC/BS,GAA0C,OAC1CL,GAA4C,KAC5CG,GAAsB,WAqGtBzY,GAAuB,IAoVvB6tB,GAAkC,IAClCC,GAA6B,IAC7BH,GAAiC,IAAI7iF,IAAI,CAAC,WAAY,eAAgB,YAAa,UxCtqBvF4L,GwCwvBgC,KAAMkvD,OxCxvBXr0B,MAAoB,GwCs6C3C42B,GAA8B,IAAIr9D,IAElCwO,GAAkB,CACtBiY,OAAQ,KACR7Q,OAAQ,KACR4wD,QAAS,KACT/mE,YAAa,GACbwiF,aAAc,KACdC,gBAAiB,KACjBC,aAAc,KACd1b,kBAAmB,KACnBK,mBAAoB,KACpBxrE,SAAU,KACVknE,kBAAkB,EAClBvM,cAAe,OACfG,sBAAuBC,GACvBzwC,iBAAiB,EACjBC,gBAAgB,EAChBs7D,oBAAoB,EACpBpR,yBAAyB,EACzBkO,0BAA0B,EAC1B/zB,sBAAuB,CACrBhV,QAAS,CAAE/N,MAAO,IAClBhnC,YAAa,IAEfg3D,uBAAuB,EACvBwH,mBAAoB,KACpBG,gBAAiB,KACjBtzB,QAAQ,EACRC,YAAa,GACb6+B,gBAAgB,EAChB1yC,SAAU,OACVsoD,WAAY,UACZ7nD,eAAgB,WAChBG,UAAWF,GAAc,CAAC,GAC1BqoD,aAAc,CAAE1zF,MAAM,EAAOhC,QAAQ,EAAO4e,MAAM,GAClDu+E,QAAS,GACTlqB,wBAAyB,OACzBwK,YAAa,KACbxmB,aAAc,OACdq9B,cAAe,KACf7oB,gBAAiB,SACjB0rB,mBAAoB,KACpBC,mBAAoB,KACpBC,qBAAsB,KACtBC,sBAAuB,KACvBC,qBAAsB,KACtB/J,4BAA6B,KAC7B+Q,gBAAiB,KACjB9pB,qBAAsB,KACtBke,0BAA2B,KAC3BN,oBAAqB,KACrBvc,+BAAgC,GAChCuC,sBAAuB,IAAItjE,IAC3B4hE,8BAA+B,KAC/BE,iCAAkC,KAClCE,+BAAgC,KAChCpC,yBAAyB,EACzBkQ,oBAAqB,KACrB0O,cAAe,KACf2K,yBAA0B,EAC1BpR,0BAA2B,EAC3BtH,sBAAuB,GACvBlJ,KAAM,CAAEC,MAAO,OAAQE,kBAAmB,QAC1C8H,sBAAuB,IAAIxvE,IAC3BiuE,0BAA2B,GAC3BC,4BAAwB,GAsBtBxQ,GAAkC,KAClCC,GAAiB,GACjB+c,IAA6B,EA+M3Bha,GAAmC,IAAI1gE,IAAI,CAC/C,UACA,SACA,iBACA,UACA,WACA,OACA,SACA,WA+HEklE,IAAqB,EA2XzB77D,GACEk5D,IAwNI2G,GAA4B,4BAC5BskB,GAA+B,sCAqO/BpxB,GAA6B,iBAC7B+Q,GAA6B,GAC7BD,GAAwB,OAgsBxBmD,GAAgC,IAAIn2C,QA6mCpC4jD,GAAoC,CAAC,EAAG,IAAK,IAAM,MACrDtC,GAAwC,GAQxC5C,GAA+D,KA+X/D2E,GAA4B,EAc5BH,GAAwE,KAuBtEh2D,GAAmC,IAAM01D,GAA4B,SACrEr1D,GAAsC,IAAMq1D,GAA4B,YACxEx1D,GAAoC,IAAMw1D,GAA4B,UAuzE5E,WACE,IAAM/oF,EAAIxD,WACJonB,EAAU5jB,EAAEigG,KAClB,GAAI7iG,MAAMC,QAAQumB,GAChB,QAAWk8E,KAAOl8E,EAChBi8E,GAAeC,GAInB,IAAMxtE,EAAM/6B,OAAOwhB,OAAQmnF,GACT,SAAZA,EAA2BhD,KACf,YAAZgD,EAA8B/C,KAClB,aAAZ+C,EAA+B9C,UACNl6E,GAAU,MAAO,oBAAoBg9E,KACjE,CACDvJ,QACAz4E,SACAiiF,KAAM3D,GACNj0D,aACA0jC,gBACAzF,cACA02B,QACAC,WACAC,YACAz0D,UACAs0D,wBACAx1D,SACAi7C,YACAgc,gBACA/hD,0BACAgiD,qBACAl/E,OAAQ+nD,GACRG,eACAluD,mBACA2mF,QAAStmF,GACTumF,UAAWpmF,GACXrB,WAAY6uD,GACZ81B,kBACAC,qBACAE,2BACAS,gCACAC,kBACAkC,SAAUr3B,GACV3xE,IAAK+mG,GACL7H,kBACAx0D,yBACAc,oBACA,IAAA11B,CAAK0yF,GACHD,GAAeC,EACjB,IAEF9/F,EAAEigG,KAAO3tE,EACTtyB,EAAEugG,KAAOjuE,EACTtyB,EAAEqyC,UAAY42B,IAChB,CAGAu3B,GAaaT,GAAS,CACpBngC,oBACAK,kBACAwd,qBACAvU,0BACAxB,wBACAC,eACAkW,0BACF,OAAA4iB,K,GAAAC,G,+MAAA,E","ignoreList":[]}
|