{"version":3,"file":"static/js/7276.3c8f4017.chunk.js","mappings":"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","sources":["webpack:///./src/auth/authorization.hook.ts","webpack:///./src/auth/user-info.hooks.ts","webpack:///./src/config/build-config/BuildConfigProvider.tsx","webpack:///./src/config/build-config/build-config-context.ts","webpack:///./src/config/build-config/useBuildConfig.ts","webpack:///./src/config/site-config/SiteConfigProvider.tsx","webpack:///./src/config/site-config/site-config-context.ts","webpack:///./src/config/site-config/useFullStoryConfig.ts","webpack:///./src/config/site-config/useSiteConfig.ts","webpack:///./src/config/usePageTitle.ts","webpack:///./src/config/xvantage-iframe/useIM360Origin.ts","webpack:///./src/config/xvantage-iframe/useInX4AFrame.ts","webpack:///./src/config/xvantage-iframe/usePostToX4A.ts","webpack:///./src/config/xvantage-iframe/utils.ts","webpack:///./src/query/query-consts.ts","webpack:///./src/query/utils.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { AuthState } from '@okta/okta-auth-js';\nimport jwt_decode from 'jwt-decode';\n\nfunction getAuthState() {\n return ((window as any).ImAuthState as AuthState | null) || null;\n}\n\nfunction getToken() {\n const authState = getAuthState();\n return authState?.accessToken;\n}\n\n/** The header `authorization` (Bearer token) for api requests. */\nexport function getAuthorizationHeader() {\n const token = getToken();\n return token ? `${token.tokenType} ${token.accessToken}` : undefined;\n}\n\n// The content of the Token\nexport function useDecodedToken() {\n const token = getToken();\n return useMemo(() => {\n const accessToken = token?.accessToken;\n if (accessToken) {\n return jwt_decode(accessToken) as TokenContent;\n }\n }, [token]);\n}\n\nexport function useRoles() {\n const decodedToken = useDecodedToken();\n return decodedToken?.role;\n}\n\nexport type Segments = {\n resellerPersonalization: string[];\n userAdbutler: string[];\n userPersonalization: string[];\n};\n\nexport type TokenContent = {\n acr: string;\n appName: string;\n aud: string;\n azureAd: string;\n cid: string;\n email: string;\n environment: string;\n exp: number;\n firstName: string;\n iat: number;\n imoProfile: {\n displayUserName: string;\n distributionChannel: string;\n division: string;\n emailAddress: string;\n firstName: string;\n impersonationMode: false;\n lastName: string;\n originalResellerId: string;\n originalUserName: string;\n resellerId: string;\n salesOrganization: string;\n userId: string;\n userName: string;\n userType: string; // 10\"\n };\n iss: string;\n jti: string;\n lastName: string;\n login: string;\n resellerId: string;\n resellerProspect?: boolean;\n role: string[];\n scp: string[];\n segments: Segments;\n senderId: string;\n siteCode: string;\n sub: string;\n uid: string;\n userId: string;\n ver: number;\n whiteListedFeatures: string[];\n};\n","import { useOktaAuth } from '@okta/okta-react';\nimport { useDecodedToken } from './authorization.hook';\n\ntype UserInfo = {\n email: string;\n family_name: string;\n given_name: string;\n name: string;\n preferred_username: string;\n};\n\nexport function useUserInfo() {\n const decodedToken = useDecodedToken();\n if (decodedToken) {\n return {\n email: decodedToken.email,\n family_name: decodedToken.lastName,\n given_name: decodedToken.firstName,\n name: `${decodedToken.firstName} ${decodedToken.lastName}`,\n preferred_username: decodedToken.login,\n } as UserInfo;\n }\n}\n\nexport function useIsAuthenticated() {\n const oktaContext = useOktaAuth();\n return oktaContext?.authState?.isAuthenticated === true;\n}\n\nexport function useIsTokenExpired() {\n const tokenExpiry = useDecodedToken()?.exp;\n return (\n tokenExpiry !== undefined &&\n tokenExpiry !== 0 &&\n tokenExpiry < Math.round(Date.now() / 1000)\n );\n}\n\nexport async function fetchIpAdrress(): Promise {\n const response = await fetch('/Site/ExternalHost/GetClientIp', {\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n });\n if (response.ok) {\n const data = await response.json();\n return data['ClientIp'];\n }\n return '';\n}\n","import React, { ReactNode, useMemo } from 'react';\nimport { MFOutlet } from '@im/ui-lib/mf-utils';\nimport {\n EnvVars,\n buildConfigContext,\n createBuildConfig,\n} from './build-config-context';\n\ntype Props = {\n children: ReactNode;\n envVars: EnvVars;\n mfOutlets: MFOutlet[];\n};\n\nexport function BuildConfigProvider(props: Props) {\n const { children, envVars = {}, mfOutlets } = props;\n\n const buildConfig = useMemo(() => {\n return createBuildConfig(envVars, mfOutlets);\n }, [envVars, mfOutlets]);\n\n const { Provider } = buildConfigContext;\n return {children};\n}\n","import { createContext } from 'react';\nimport { MFOutlet } from '@im/ui-lib/mf-utils';\n\nexport type EnvVars = { [k: string]: string };\n\nconst CEP_PREFIX = 'CEP__';\nconst INGRAM_PREFIX = 'INGRAM__';\n\ntype BuildEnvironment =\n | 'development'\n | 'production'\n | 'productionbeta'\n | 'productionbetax'\n | 'staging'\n | 'staging2'\n | 'stagingx'\n | 'test';\nconst buildEnvironments = [\n 'development',\n 'production',\n 'productionbeta',\n 'productionbetax',\n 'staging',\n 'staging2',\n 'stagingx',\n 'test',\n];\n\ntype RequiredKey = 'API_BASE';\ntype OptionalKey = 'DEV_PROXY_HOSTNAME' | 'API_GCP_BASE' | 'API_EU_GCP_BASE';\nconst requiredKeys = ['API_BASE'];\n\ntype RawBuildConfig = {\n buildEnvironment: BuildEnvironment;\n} & { [rk in RequiredKey]: string } & Partial<{\n [ok in OptionalKey]: string;\n }> & { [k: string]: string };\n\nexport type BuildConfig = {\n /** @deprecated */\n mfOutlets: MFOutlet[];\n vars: Readonly;\n};\n\nexport const buildConfigContext = createContext(\n undefined\n);\n\nexport function createBuildConfig(\n envVars: EnvVars,\n mfOutlets: MFOutlet[]\n): BuildConfig {\n const config: Partial = {};\n\n Object.entries(envVars).forEach(([key, value]) => {\n if (key.startsWith(CEP_PREFIX)) {\n config[key.substring(CEP_PREFIX.length)] = value;\n } else if (key.startsWith(INGRAM_PREFIX)) {\n config[key.substring(INGRAM_PREFIX.length)] = value;\n } else if (key === 'NODE_ENV') {\n config.buildEnvironment = value as BuildEnvironment;\n }\n });\n\n // Validate\n const buildEnvironment = config.buildEnvironment || '';\n if (!buildEnvironments.includes(buildEnvironment)) {\n throw new Error(\n `[BuildConfig] invalid NODE_ENV=${buildEnvironment}; Must be one of: ${JSON.stringify(\n buildEnvironments\n )}.`\n );\n }\n\n requiredKeys.forEach((key) => {\n if (!config[key]) {\n throw new Error(`[BuildConfig] ${key} not set.`);\n }\n });\n\n return {\n mfOutlets,\n // Freeze to prevent modifications.\n vars: Object.freeze(config as RawBuildConfig),\n };\n}\n","import { useContext } from 'react';\nimport { buildConfigContext } from './build-config-context';\n\nexport function useBuildConfig() {\n const buildConfig = useContext(buildConfigContext);\n if (!buildConfig) {\n throw new Error(\n 'buildConfigContext value is undefined. Make sure you use the BuildConfigProvider before using the context.'\n );\n }\n return buildConfig;\n}\n\nexport function useBuildVars() {\n return useBuildConfig().vars;\n}\n\n/** @deprecated */\nexport function useMfOutlets() {\n return useBuildConfig().mfOutlets;\n}\n","import React, { ReactNode, useEffect, useState } from 'react';\nimport wretch from 'wretch';\nimport { useBuildVars } from '../build-config';\nimport { SiteConfig, siteConfigContext } from './site-config-context';\nimport { getSameOriginApiBasePath } from '../../query/utils';\nimport { disableSameOriginRequests } from '../../query/query-consts';\n\nconst apiWretcher = wretch(undefined).options({\n // https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\n // credentials: 'include',\n credentials: 'same-origin', // Default\n\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Request/mode\n mode: 'cors',\n});\n\ntype Props = {\n children: ReactNode;\n};\n\nexport function SiteConfigProvider(props: Props) {\n const { children } = props;\n\n const buildVars = useBuildVars();\n\n // TODO: Same-origin Config API cannot be enabled per country as config call contains siteCode.\n // This logic should be removed once once same-origin APIs is rollouted to ALL countries.\n const shouldUseSameOriginApis =\n buildVars.buildEnvironment !== 'production' &&\n buildVars.buildEnvironment !== 'productionbeta' &&\n buildVars.buildEnvironment !== 'development' &&\n localStorage.getItem(disableSameOriginRequests) !== 'true';\n\n const [value, setValue] = useState(undefined);\n\n useEffect(() => {\n let active = true;\n\n /**\n * Config API response is being cached. The 'ver' query param would be used to invalidate cache if necessary\n */\n const queryParams: { [key: string]: string | undefined } = {\n ver: buildVars['CONFIG_API_VERSION'],\n };\n\n (async () => {\n let wretcher = apiWretcher.url(\n `${\n shouldUseSameOriginApis\n ? getSameOriginApiBasePath()\n : buildVars.API_BASE\n }/imonline-k8s-cep/cwc/config/v1/config`\n );\n // TODO: When same-origin APIs is rolled out to all countries on prod, the above wretcher definition\n // can be replaced with the below code to enable it for all envs, all countries.\n // let wretcher = apiWretcher.url(\n // `${getSameOriginApiBasePath()/imonline-k8s-cep/cwc/config/v1/config`\n // );\n\n if (globalThis.location.origin.indexOf('://local') > -1) {\n /**\n * Note: hostname query param is always needed when running locally.\n * Even when running stage and production builds locally in express or ngnix.\n */\n queryParams['hostname'] = buildVars.DEV_PROXY_HOSTNAME;\n }\n\n wretcher = wretcher.query(queryParams);\n\n const siteConfig = await wretcher.get().json();\n\n if (active) {\n setValue(siteConfig);\n }\n })();\n\n return () => {\n active = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buildVars, setValue]);\n\n if (!value) {\n return null;\n }\n\n const { Provider } = siteConfigContext;\n return {children};\n}\n","import { createContext } from 'react';\n\nexport type SiteConfig = {\n /** OKTA issuer */\n authServer: string;\n\n /** OKTA clientId */\n clientId: string;\n\n /** Default locale like: \"en-CA\".\n * Defaults to first locale in `Accept-Language` header that exists in `supportedLocales`.\n * If not found; (`Accept-Language` header missing or no locale in header exist in `supportedLocales`)\n * then returns the first locale in `supportedLocales`.\n */\n defaultLocale: string;\n\n /** Server environment like: \"stage1\" */\n environment: string;\n\n /** fullstory enabled like: true or false */\n fullStoryEnabled: boolean;\n\n //** redirect to IDP web site to login */\n idpLogin: boolean;\n\n /** authorization code flow vs interaction code flow */\n interactionCodeFlow: boolean;\n\n /** Site code like: \"ca\" */\n siteCode: string;\n\n /** Supported locales like: [\"en-CA\",\"fr-CA\"] */\n supportedLocales: string[];\n};\n\nexport const siteConfigContext = createContext(\n undefined\n);\n","import { useSiteConfig } from './useSiteConfig';\nimport { init as fullStoryInit } from '@fullstory/browser';\nimport { useEffect } from 'react';\n\nexport function useFullStory() {\n const siteConfig = useSiteConfig();\n useEffect(() => {\n if (siteConfig.fullStoryEnabled) {\n fullStoryInit({\n debug: false, //Enables FullStory debug messages\n host: 'fullstory.com', //Host name path of fullstory\n namespace: 'FS', //Sets the global identifier for FullStory when conflicts with FS arise\n orgId: 'P9XEH', //Sets your FullStory Org Id\n recordCrossDomainIFrames: true, //Capture Cross Domain IFrame conetnt\n recordOnlyThisIFrame: true, //Tells FullStory that the IFrame is the \"root\" of the recording and should be its own session\n script: 'edge.fullstory.com/s/fs.js', //script path\n });\n }\n }, [siteConfig]);\n}\n","import { useContext } from 'react';\nimport { siteConfigContext } from './site-config-context';\n\nexport function useSiteConfig() {\n const siteConfig = useContext(siteConfigContext);\n if (!siteConfig) {\n throw new Error(\n 'siteConfigContext value is undefined. Make sure you use the SiteConfigProvider before using the context.'\n );\n }\n return siteConfig;\n}\n","import { useEffect, useState } from 'react';\n\nconst DEFAULT_PAGE_TITLE = 'Xvantage';\n\n/** updatePageTitle: Sets page title for the consuming View component as the input string.\n * For setting page title on iFramed pages, see:\n * https://imonline.atlassian.net/wiki/spaces/DigitalT/pages/3070820435/X4C+Page+Titles#iFramed-Pages */\nexport function usePageTitle() {\n const [pageTitle, setPageTitle] = useState(DEFAULT_PAGE_TITLE);\n\n const updatePageTitle = (newPageTitle: string) => {\n if (newPageTitle && pageTitle !== newPageTitle) {\n setPageTitle(newPageTitle);\n }\n };\n\n useEffect(() => {\n document.title = pageTitle;\n return () => {\n document.title = DEFAULT_PAGE_TITLE;\n };\n }, [pageTitle]);\n\n return { pageTitle, updatePageTitle };\n}\n","import { useMemo } from 'react';\nimport { useBuildVars } from '../build-config';\nimport { useSearchParams } from 'react-router-dom';\n\nexport enum IM360Regions {\n AMER = 'AMER',\n ANZ = 'ANZ',\n APAC = 'APAC',\n EMEA = 'EMEA',\n}\n\nconst useIM360Origin = () => {\n const {\n IM360_ORIGIN_AMER,\n IM360_ORIGIN_ANZ,\n IM360_ORIGIN_APAC,\n IM360_ORIGIN_EMEA,\n } = useBuildVars();\n\n const [queryParams] = useSearchParams();\n const im360Region = queryParams.get('region');\n\n const IM360_ORIGIN = useMemo(() => {\n switch (im360Region) {\n case IM360Regions.AMER:\n return IM360_ORIGIN_AMER;\n case IM360Regions.EMEA:\n return IM360_ORIGIN_EMEA;\n case IM360Regions.APAC:\n return IM360_ORIGIN_APAC;\n case IM360Regions.ANZ:\n return IM360_ORIGIN_ANZ;\n default:\n return IM360_ORIGIN_EMEA;\n }\n }, [\n im360Region,\n IM360_ORIGIN_AMER,\n IM360_ORIGIN_EMEA,\n IM360_ORIGIN_APAC,\n IM360_ORIGIN_ANZ,\n ]);\n\n return IM360_ORIGIN;\n};\n\nexport default useIM360Origin;\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useLocalizationContext } from '@im/react-localization';\n\nimport { usePostToX4A } from './usePostToX4A';\nimport { useIsAuthenticated } from '../../auth/user-info.hooks';\nimport { useDecodedToken } from '../../auth/authorization.hook';\nimport { FRAME_ID, isValidOrigin } from './utils';\nimport useIM360Origin from './useIM360Origin';\n\nconst FRAME_STYLE_ID = 'x4a-frame-style';\n\ntype ObjectMap = {\n [key: string]: any;\n};\n\n/** Use Xvantage frame: Identify if X4C is currently loaded in an X4A iframe\n * and handles configurations received from the parent application. */\nexport function useInX4AFrame() {\n const isAuthenticated = useIsAuthenticated();\n const decodedToken = useDecodedToken();\n const context = useLocalizationContext();\n const navigate = useNavigate();\n const { postMessageToX4A } = usePostToX4A();\n\n const isFrame = window.self !== window.top;\n const ancestors = window.location.ancestorOrigins;\n const IM360_Origin = useIM360Origin();\n\n const [isInIM360Frame] = useState(\n isFrame && ancestors.contains(IM360_Origin)\n );\n\n const [isInX4AFrame, setIsInX4AFrame] = useState(isFrame);\n\n const listeningForPostMsg = useRef(false);\n const x4cMounted = useRef(false);\n\n const [hideFooter, setHideFooter] = useState(isFrame);\n const [hideHeader, setHideHeader] = useState(isFrame);\n const [hideSideNav, setHideSideNav] = useState(isFrame);\n const [searchParams, setSearchParams] = useState({});\n\n const [selectedLocale, setSelectedLocale] = useState('');\n\n const onPostMsgReceived = (event: MessageEvent) => {\n //Messages from invalid origins should not be processed!\n if (!isValidOrigin(event.origin)) return;\n //Xv frame post messages should always contain xv-frame frameId\n if (!event || event.data?.frameId !== FRAME_ID) return;\n const {\n action,\n hideFooter,\n hideHeader,\n hideSideNav,\n locale,\n searchParams,\n styles,\n } = event.data;\n\n if (!listeningForPostMsg.current && action === 'post-msg-ping') {\n postMessageToX4A('post-msg-ready', { origin: window.location.origin });\n listeningForPostMsg.current = true;\n }\n\n if (action === 'update-config') {\n setHideFooter(hideFooter ?? true);\n setHideHeader(hideHeader ?? true);\n setHideSideNav(hideSideNav ?? true);\n\n if (searchParams && Object.keys(searchParams)?.length > 0) {\n setSearchParams(searchParams);\n }\n\n setIsInX4AFrame(true);\n\n if (locale) {\n if (!context.supportedLocales.includes(locale)) {\n console.warn(\n `Locale \"${locale}\" received from X4A frame config is not supported. Language not set. Supported locales: ${context.supportedLocales.toString()}`\n );\n } else {\n setSelectedLocale(locale);\n }\n }\n\n if (styles) {\n const styleEle = document.getElementById(FRAME_STYLE_ID);\n if (!styleEle) {\n const ele = document.createElement('style');\n ele.id = FRAME_STYLE_ID;\n document.head.append(ele);\n }\n if (styleEle && styles !== styleEle.textContent)\n styleEle.textContent = styles;\n }\n }\n\n if (action === 'navigate-x4c-to') {\n if (event.data?.route) {\n navigate(event.data?.route);\n return;\n }\n }\n };\n\n useEffect(() => {\n if (isAuthenticated && isInX4AFrame && !x4cMounted.current) {\n //Inform parent that X4C has mounted\n postMessageToX4A('x4c-mounted', {\n origin: window.location.origin,\n x4cUser: decodedToken?.imoProfile.userName,\n });\n x4cMounted.current = true;\n\n //Listener receives post messages from X4A\n window.addEventListener('message', onPostMsgReceived);\n return () => window.removeEventListener('message', onPostMsgReceived);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isAuthenticated]);\n\n useEffect(() => {\n const currLocale = context.locale;\n if (selectedLocale && currLocale !== selectedLocale) {\n context.setLocale(selectedLocale);\n }\n }, [context, selectedLocale]);\n\n return useMemo(() => {\n return {\n isInIM360Frame,\n isInX4AFrame,\n xvFrameConfig: {\n hideFooter,\n hideHeader,\n hideSideNav,\n searchParams,\n },\n };\n }, [\n hideFooter,\n hideHeader,\n hideSideNav,\n isInIM360Frame,\n isInX4AFrame,\n searchParams,\n ]);\n}\n","import { useBuildVars } from '../build-config';\nimport useIM360Origin from './useIM360Origin';\nimport { FRAME_ID } from './utils';\n\nexport function usePostToX4A() {\n const { X4A_ORIGIN } = useBuildVars();\n const IM360_ORIGIN = useIM360Origin();\n const postMessageToX4A = (\n action: string,\n payload?: { [key: string]: any },\n isIM360 = false\n ) => {\n window.parent.postMessage(\n {\n action,\n frameId: FRAME_ID,\n ...payload,\n },\n isIM360 ? IM360_ORIGIN : X4A_ORIGIN\n );\n };\n /** Updates the reseller context in X4A by calling impersonation API with the specified BCN. */\n const updateImpersonatedReseller = (resellerId: string) => {\n postMessageToX4A('impersonate-reseller', { resellerId });\n };\n\n /** Ends impersonation of the current reseller in X4A. */\n const disableImpersonation = () => {\n postMessageToX4A('disable-impersonation');\n };\n\n /** Re-renders the X4C iframe with the newly specified path. */\n const updateX4CFramePath = (newPath: string, isInIM360Frame = false) => {\n postMessageToX4A('update-frame-path', { newPath }, isInIM360Frame);\n };\n\n /** Navigates X4C app to the specified route or route. Open in new tab is false by default. */\n const navigateToInX4A = (navOptions: {\n countryCode?: string;\n openInNewTab?: boolean;\n url?: string;\n x4aRoute?: string;\n }) => {\n postMessageToX4A('navigate-x4a-to', { navOptions });\n };\n\n return {\n disableImpersonation,\n navigateToInX4A,\n postMessageToX4A,\n updateImpersonatedReseller,\n updateX4CFramePath,\n };\n}\n","export const FRAME_ID = 'xv-frame';\n\n/** Returns true if the given string matches the https://subdomain.ingrammicro.com structure.\n * Subdomains and port number are optional, otherwise the string must match exactly. */\nexport function isValidOrigin(origin: string) {\n const originRegEx =\n /^(https:\\/\\/)([A-Za-z0-9-]*\\.){0,1}(ingrammicro\\.com){1}(:{1}[0-9]{0,8}){0,1}$/;\n return originRegEx.test(origin);\n}\n","export const disableSameOriginRequests = 'disableSameOriginRequests';\n","/* eslint-disable no-console */\nimport { useCallback } from 'react';\nimport { useBuildVars } from '../config/build-config';\nimport { disableSameOriginRequests } from './query-consts';\n// import { useSiteConfig } from '../config/site-config/useSiteConfig';\n\nconst win = window as any;\n\nwin.toggleSameOriginApis = () => {\n const isDisabled = localStorage.getItem(disableSameOriginRequests);\n const newVal = isDisabled === 'true' ? 'false' : 'true';\n localStorage.setItem(disableSameOriginRequests, newVal);\n console.log(\n `[cross origin requests] ${\n newVal === 'true' ? 'enabled' : 'disabled'\n } - refresh page to see changes`\n );\n};\n\nexport const getSameOriginApiBasePath = () => {\n return `/api`;\n};\n\n// Controls whether to use same origin APIs or not. NOTE: Config API call is\n// out of scope of QueryClient and handled separately in SiteConfigProvider.tsx.\nexport const useSameOriginApis = () => {\n const buildVars = useBuildVars();\n // const { siteCode } = useSiteConfig();\n\n const shouldUseSameOriginApis = useCallback(() => {\n if (buildVars.buildEnvironment === 'development') return false;\n if (localStorage.getItem(disableSameOriginRequests) === 'true')\n return false;\n // if (siteCode === 'us') return true;\n return (\n buildVars.buildEnvironment !== 'production' &&\n buildVars.buildEnvironment !== 'productionbeta' &&\n localStorage.getItem(disableSameOriginRequests) !== 'true'\n );\n }, [buildVars.buildEnvironment]);\n\n return shouldUseSameOriginApis;\n};\n"],"names":["getToken","authState","window","ImAuthState","accessToken","getAuthorizationHeader","token","tokenType","undefined","useDecodedToken","useMemo","jwt_decode","useRoles","decodedToken","role","useUserInfo","email","family_name","lastName","given_name","firstName","name","preferred_username","login","useIsAuthenticated","oktaContext","useOktaAuth","isAuthenticated","useIsTokenExpired","tokenExpiry","exp","Math","round","Date","now","async","fetchIpAdrress","response","fetch","headers","Accept","method","ok","json","BuildConfigProvider","props","children","envVars","mfOutlets","buildConfig","createBuildConfig","Provider","buildConfigContext","React","value","CEP_PREFIX","INGRAM_PREFIX","buildEnvironments","requiredKeys","createContext","config","Object","entries","forEach","key","startsWith","substring","length","buildEnvironment","includes","Error","JSON","stringify","vars","freeze","useBuildConfig","useContext","useBuildVars","useMfOutlets","apiWretcher","wretch","options","credentials","accept","mode","SiteConfigProvider","buildVars","shouldUseSameOriginApis","localStorage","getItem","disableSameOriginRequests","setValue","useState","useEffect","active","queryParams","ver","wretcher","url","getSameOriginApiBasePath","API_BASE","globalThis","location","origin","indexOf","DEV_PROXY_HOSTNAME","query","siteConfig","get","siteConfigContext","useFullStory","useSiteConfig","fullStoryEnabled","fullStoryInit","debug","host","namespace","orgId","recordCrossDomainIFrames","recordOnlyThisIFrame","script","DEFAULT_PAGE_TITLE","usePageTitle","pageTitle","setPageTitle","document","title","updatePageTitle","newPageTitle","IM360Regions","useIM360Origin","IM360_ORIGIN_AMER","IM360_ORIGIN_ANZ","IM360_ORIGIN_APAC","IM360_ORIGIN_EMEA","useSearchParams","im360Region","AMER","EMEA","APAC","ANZ","FRAME_STYLE_ID","useInX4AFrame","context","useLocalizationContext","navigate","useNavigate","postMessageToX4A","usePostToX4A","isFrame","self","top","ancestors","ancestorOrigins","IM360_Origin","isInIM360Frame","contains","isInX4AFrame","setIsInX4AFrame","listeningForPostMsg","useRef","x4cMounted","hideFooter","setHideFooter","hideHeader","setHideHeader","hideSideNav","setHideSideNav","searchParams","setSearchParams","selectedLocale","setSelectedLocale","onPostMsgReceived","event","isValidOrigin","data","frameId","FRAME_ID","action","locale","styles","current","keys","supportedLocales","console","warn","toString","styleEle","getElementById","ele","createElement","id","head","append","textContent","route","x4cUser","imoProfile","userName","addEventListener","removeEventListener","currLocale","setLocale","xvFrameConfig","X4A_ORIGIN","IM360_ORIGIN","payload","isIM360","parent","postMessage","disableImpersonation","navigateToInX4A","navOptions","updateImpersonatedReseller","resellerId","updateX4CFramePath","newPath","test","toggleSameOriginApis","newVal","setItem","log","useSameOriginApis","useCallback"],"sourceRoot":""}