{"version":3,"sources":["services/network.ts","constants/environments.ts","services/flagr.ts","constants/logSources.ts","services/logger.ts","services/useragent.ts","redux/modules/native.ts","redux/modules/caliper.ts","services/caliperService.ts","constants/authSources.ts","services/serializable.ts","services/jwt.ts","services/auth.ts","redux/selectors/loginForm.ts","constants/portalUrls.ts","hooks/useFlagr.ts","constants/loginTypes.ts","redux/selectors/app.ts","services/http.ts","redux/modules/webCam.ts","constants/products.ts","services/password.ts","redux/modules/resetPassword.ts","App.tsx","redux/root.ts","redux/configureStore.ts","serviceWorker.ts","index.tsx","constants/urls.ts","services/queryStringParameters.ts","constants/apiServices.ts","constants/flags.ts","constants/productDisabledReasons.ts","constants/productNames.ts","constants/fakeProducts.ts","services/permissions.ts","services/pendo.ts","services/pendoSnippet.js","services/analyticsUser.ts","redux/modules/productSelection.ts","redux/modules/loginForm.ts","redux/modules/productLauncher.ts","constants/nativeUrls.ts","services/productLaunch.ts","redux/selectors/productSelection.ts","services/oidc.ts","redux/modules/oidc.ts","redux/modules/app.ts","constants/assessmentProviders.ts","constants/assessmentStatuses.ts","components/Loader/Loader.tsx"],"names":["getSiteCode","sitecode","split","slice","shift","getInferredEnvironment","host","process","REACT_APP_DEV_AUTH_ENV","env","matches","match","length","toLowerCase","Environment","Development","Production","inferredEnvironemnt","getEnvironment","window","location","urlMap","getUrl","urls","service","environment","versionMap","getServiceVersion","VERSIONS","getAuthUrl","ApiServices","Auth","getManagerUrl","Manager","getAuthorityUrl","Authority","getRedirectUrl","REACT_APP_DEV_REDIRECT_URI","Redirect","getPostLogoutRedirect","PostLogoutRedirect","getFlagrUrl","Flagr","getLoggerUrl","Logger","getImlpUrl","Imlp","getImlp2Url","Imlp2","API_TIMEOUT_MS","evaluateUserBatch","context","id","flagKeys","Object","values","UserFlags","EMPTY","url","body","entities","entityId","entityType","entityContext","enableDebug","bodyText","JSON","stringify","http","contentType","post","evaluateGlobalBatch","GlobalFlags","siteCode","LogSources","version","baseUrl","log","logSource","Metrics","neededMetaData","Source","TimeStamp","Date","toISOString","Array","isArray","map","item","UserAgentEnum","determineUseNativeBehavior","role","evaluationResults","userAgent","info","parse","navigator","os","name","platform","model","maxTouchPoints","IOS","test","vendor","KINDLE","browser","ANDROID","HTML5","parseUserAgent","enableNativeAppFlag","find","flagKey","EnableNativeApp","enableNativeApp","variantKey","determineUseNativeAppBehavior","isIlMobileWebView","includes","caliperSessionEvent","createAction","product","addQuery","productQueryStrings","isStudent","payload","reducer","createReducer","caliperEventWasSent","builder","addCase","state","caliperSessionEventEpic","action$","state$","pipe","ofType","type","withLatestFrom","switchMap","getLaunchUrl","studentId","selectUser","token","selectAccessToken","selectRole","userId","productUrl","actor","createStudent","Caliper","uuid","createInstructor","createUser","productSelectionUrl","URLS","settings","applicationUri","sensor","Sensor","edApp","createSoftwareApplication","validationEnabled","URL","origin","object","event","createEvent","createSessionEvent","action","CaliperAction","Launched","eventTime","toJSON","push","ContextEnvironment","envelope","createEnvelope","data","caliperUrl","bearer","launchProductEvent","timeout","successful","requestId","launchProductAfterCaliper","catchError","error","a","console","AuthSource","serializable","obj","keys","getOwnPropertyNames","sort","getPrototypeOf","reduce","o","key","stringifyError","errorObj","replace","decodeJwt","jwt","claims","decode","email","grade","organizationIds","tenant","sites","userName","userProducts","filter","p","enabled","productName","impersonation","impersonatingUserId","impersonated_by","impersonatingUserName","user","undefined","impersonatedUserName","ssoConnectionType","username","requestedProduct","ilOrgs","getUsername","isEducator","code","selectAuthProvider","source","ILAuth","localStorage","setItem","removeItem","IMLP2","getAuthProvider","getItem","IMLP","lookupSiteCode","header","requestOneTimeToken","encryptedtoken","throwError","Error","validateSiteCode","baseSitecode","get","logoutCallback","selectImlpProvider","selectImlp2Provider","selectIlAuthProvider","selectAutoFillValues","loginForm","autoFillValues","selectError","selectForgotSiteCodeError","forgotSiteCodeError","selectForgotSiteCodeLoading","forgotSiteCodeLoading","selectInvalidCredentials","invalidCredentials","selectTooManyAttempts","tooManyAttempts","selectDurationSecs","durationSecs","selectIsEducator","selectSiteCode","selectLoginType","loginType","selectSiteCodeEditable","siteCodeEditable","selectUsername","selectForgotSiteCodeNoValues","createSelector","selectForgotSiteCodeRawValues","selectForgotSiteCodeValues","forgotSiteCodeValues","PORTAL_URLS","Products","ILE","Spanish","Galileo","Reader","Lectura","MyPathMath","MyPathReading","Traverse","Science","Purpose","MyPathPortal","Robotify","IPA","DrSeuss","Test","Rc","useFlagr","userFlags","useSelector","selectUserFlagEvaluationResults","globalFlags","selectGlobalFlagEvaluationResults","useMemo","LoginTypes","app","access_token","selectProductQueryStrings","selectReturnUrl","returnUrl","selectEnvironment","selectTenant","selectStudentId","selectUserName","selectGlobalFlagsLoaded","flagsLoaded","Http","_body","_headers","_query","_url","this","content","headers","isEmpty","httpRequest","fullUrl","method","value","encoded","URLSearchParams","forEach","append","toString","query","params","param","indexOf","options","fromFetch","response","ok","text","err","serialized","json","cameraChanged","camerasEnumerated","closed","loaded","facingMode","videoDeviceCount","LoggingProducts","sendEmailError","sendResetEmail","sendEmailSuccess","setPasswordComplete","setPasswordError","callback","meta","setPassword","password","setPasswordSuccess","validateResetToken","tokenId","validateResetTokenCallbackComplete","validateTokenIdError","validateTokenIdSuccess","resetSubmitted","resetSuccess","resetTokenInvalid","sendEmailSubmitted","resetError","setPasswordEpic","Password","getErrorPayload","setPasswordCompleteEpic","tap","sendResetEmailEpic","status","of","validateResetTokenEpic","validateResetTokenCallbackEpic","Response","message","stack","ErrorScreen","lazy","ForgotPassword","ForgotSiteCode","Login","ProductSelectionScreen","ResetPassword","SignOut","connect","accessToken","dispatch","flagrActions","bindActionCreators","initialize","fetchingGlobalFlags","useEffect","EnableReadOnlyILSiteAdminRedirectToMaestro","useFlag","launchUrl","href","Loader","Maestro","fallback","path","component","to","rootEpic","combineEpics","completeSigninEpic","getUserFlagsEpic","analyticsIdentifyUserEpic","analyticsUpdateOptionsEpic","getProductsAfterFlagsEpic","handlePostLogoutEpic","launchProductAtUrlEpic","launchProductEpic","lookupSiteCodeEpic","requestOneTimeTokenEpic","signinErrorEpic","validateSiteCodeEpic","getGlobalFlagsEpic","launchProductAfterCaliperEpic","rootReducer","combineReducers","persistReducer","storage","whitelist","oidc","productLauncher","productSelection","resetPassword","webCam","caliperReducer","analyticsMiddleware","createAnalyticsMiddleware","epicMiddleware","createEpicMiddleware","defaultMiddleware","getDefaultMiddleware","serializableCheck","ignoredActions","analyticsError","loginFormError","productPermissionsError","signinError","middleware","reduxStore","configureStore","run","Boolean","hostname","persistor","persistStore","store","storeRehydrated","history","createBrowserHistory","ReactDOM","render","document","getElementById","Modal","setAppElement","serviceWorker","ready","then","registration","unregister","ILU","Permissions","Import","CustomerToolsUI","Registration","parseUrlPart","queryString","accumulator","kvPairString","index","substring","decodeURIComponent","parseQueryString","search","parseHashString","hash","ProductDisabledReasons","PRODUCT_NAMES","IM","IMF","FakeProducts","description","assessmentLockout","provider","AdaptiveAssessment","initSnippet","apiKey","e","n","d","v","w","x","y","z","_q","m","concat","call","arguments","createElement","async","src","getElementsByTagName","parentNode","insertBefore","pendoSnippet","getStudentInfo","analyticsUser","organization","organizations","visitor","firstName","lastName","userType","gradeLevel","products","realm","ssoid","osVersion","account","getEducatorInfo","resetDate","getUserInfo","toUpperCase","getAnalyticsUser","osName","getProducts","productPermissionsAssessmentRecommendedReceived","productPermissionsProductsReceived","productPermissionsSetupHelpReceived","productPermissionsSuccess","fetchingUserFlags","flagEvaluationComplete","analyticsCleanup","analyticsIdentifyUser","analyticsUpdateOptions","analyticsUserUpdated","analyticsInitialize","analyticsUserIdentified","canceller","loading","setupRequired","analyticsInitialized","productsError","allProducts","sortBy","prod","disabledReason","sortOrder","assessmentStatus","assessmentUrl","assessmentRequired","NotRosteredWithNWEA","PendingAssessmentLockout","NotEnrolledWithProviderProduct","OrganizationNotLicensedForProviderProduct","AssessmentStatuses","Complete","Exempt","assessmentProvider","AssessmentProviders","NWEA","rosterDashboard","scheduleDashboard","recommendedAssessmentProvider","recommendedAssessmentUrl","enableRobotifyFlag","EnableRobotify","enableRobotify","forceDisplayLicensedRobotifyFlag","ForceDisplayLicensedRobotify","forceDisplayLicensedRobotify","filterByAgentILMobileWebViewFlag","FilterByAgentILMobileWebView","filterByAgentILMobileWebView","userExcludedProducts","adminExcludedProducts","from","REACT_APP_BYPASS_PRODUCT_PERMISSIONS","REACT_APP_SHOW_PRODUCTS","fakeProducts","getProductPermissions","setupHelp","assessmentRecommended","productEnumVals","ProductHidden","allowedProducts","actions","emptyResults","retryTimeout","args","tryIdentify","count","instance","pendo","setTimeout","clearTimeout","pendoIdentify","selectProducts","updateOptions","pendoUpdateOptions","cancellers","next","fn","clearAutoFillValues","clearError","editSiteCode","forgotSiteCodeReceived","revertSiteCode","setAutoFillValues","setInvalidCredentials","setTooManyAttempts","setDurationSecs","setIsEducator","updateSiteCode","updateLoginType","updateUsername","sitecodes","launchProduct","launchProductAtUrl","launchProductAtUrlComplete","requestOneTimeTokenComplete","requestOneTimeTokenError","requestingOneTimeToken","Cookies","loginInfo","Username","Type","SsoConnectionType","LoginType","SSO","Product","SiteCode","UserType","isNativeAppUser","IEBenchmarkPlayerLink","nativeLaunchUrl","getNativeLaunchUrl","Code","NATIVE_URLS","queryStrings","prototype","hasOwnProperty","queryParams","selectedProduct","authSource","Url","set","redirectUrl","redirecturl","encodeURIComponent","selectProductsLoading","selectRosterDashboard","selectScheduleDashboard","selectSetupRequired","selectAssessmentProviders","uniq","selectDefaultAssessmentProvider","providers","defaultProvider","current","ATI","selectDefaultAssessmentStatusAndUrl","defaultAssessmentProvider","assessment","None","InProgress","selectDefaultAssessmentStatus","statusAndUrl","selectDefaultAssessmentUrl","selectHasLockedProducts","some","selectNweaRosteringError","selectNotLicensedProducts","OrganizationNotLicensed","scopes","imlpScopes","getDevOptions","metadata","jwks_uri","auth","issuer","authorization_endpoint","token_endpoint","end_session_endpoint","UniversalLoginOidc","createDefaultUserManager","Log","logger","level","DEBUG","ERROR","devOptions","defaultOptions","response_type","loadUserInfo","authority","client_id","post_logout_redirect_uri","redirect_uri","scope","join","clockSkew","UserManager","createImlpUserManager","imlpUrl","imlpDefaultOptions","staleStateAge","monitorSession","__getUserManager","imlpUserManager","imlp2UserManager","defaultUserManager","getExtraQueryParams","extraQueryParams","useImlp2","useImlp","completeSignin","handlePostLogout","logoutCallbackUrl","resumeUrl","handlePostLogoutComplete","signinInProgress","signinErrorHandled","signinSubmitted","signinSuccess","isInProgress","isSubmitted","userManager","signinRedirectCallback","tokenReceived","finalize","extraParams","signinRedirect","signOut","signoutRedirect","startSignin","removeIlAuthFallback","returnUrlParts","useIlAuth","handleSignin","controller","AbortController","signal","launch","force","sessionStorage","abort","fetch","pragma","catch","toPromise","finally","clearStaleState","appError","loadedSiteCode","setReturnUrl","storeProductQueryParams","globalFlagEvaluationComplete","clearReturnUrl","expires","now","color","className","classnames","margin"],"mappings":"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","file":"static/js/main.24bd4faf.chunk.js","sourcesContent":["import { ApiServices } from '../constants/apiServices';\nimport { Environment } from '../constants/environments';\nimport urls, { VERSIONS } from '../constants/urls';\nimport { UrlMap } from '../types/urlMap';\nimport { VersionMap } from '../types/versionMap';\n\nexport function getSiteCode(sitecode: string) {\n\tconst parts = (sitecode || '').split('@');\n\tconst newSiteCode = parts.slice(0, 1).shift();\n\treturn newSiteCode || null;\n}\n\nexport function getInferredEnvironment(host?: string) {\n\t// Allow override from environment variable\n\tif (process.env.REACT_APP_DEV_AUTH_ENV) {\n\t\tconst env = process.env.REACT_APP_DEV_AUTH_ENV as Environment;\n\t\tif (env) {\n\t\t\treturn env;\n\t\t}\n\t}\n\n\t// Check current URL\n\tconst matches = (host || '').match(/^(local|lvh|test|rc|load|demo)/i);\n\tif (matches && matches.length > 1) {\n\t\tconst match = matches[1].toLowerCase();\n\t\tif (match === 'local' || match === 'lvh') {\n\t\t\treturn Environment.Development;\n\t\t}\n\t\treturn match as Environment;\n\t}\n\treturn Environment.Production;\n}\n\nexport function getEnvironmentFn(inferredEnvironemnt?: Environment) {\n\treturn (sitecode?: string) => {\n\t\tconst parts = (sitecode || '').split('@');\n\t\tconst env = parts.slice(1, 2).shift();\n\t\treturn (env as Environment) || inferredEnvironemnt || Environment.Production;\n\t};\n}\n\nexport const getEnvironment = getEnvironmentFn(getInferredEnvironment(window.location.host));\n\nexport function getUrlFromMap(urlMap: UrlMap) {\n\treturn (service: string, environment?: Environment) => {\n\t\tconst env = environment || Environment.Production;\n\t\treturn (urlMap[env] || urlMap[Environment.Production])[service];\n\t};\n}\n\nexport const getUrl = getUrlFromMap(urls);\n\nexport function getServiceVersionFromMap(versionMap: VersionMap) {\n\treturn (service: string, environment?: Environment) => {\n\t\tconst env = environment || Environment.Production;\n\t\treturn (versionMap[env] || versionMap[Environment.Production])[service];\n\t};\n}\n\nexport const getServiceVersion = getServiceVersionFromMap(VERSIONS);\n\nexport function getAuthUrl(environment: Environment) {\n\treturn getUrl(ApiServices.Auth, environment);\n}\n\nexport function getManagerUrl(environment: Environment) {\n\treturn getUrl(ApiServices.Manager, environment);\n}\n\nexport function getAuthorityUrl(environment: Environment) {\n\treturn getUrl(ApiServices.Authority, environment);\n}\n\nexport function getRedirectUrl(environment: Environment) {\n\treturn process.env.REACT_APP_DEV_REDIRECT_URI || getUrl(ApiServices.Redirect, environment);\n}\n\nexport function getPostLogoutRedirect(environment: Environment) {\n\treturn getUrl(ApiServices.PostLogoutRedirect, environment);\n}\n\nexport function getIluUrl(environment: Environment) {\n\treturn getUrl(ApiServices.ILU, environment);\n}\n\nexport function getFlagrUrl(environment: Environment) {\n\treturn getUrl(ApiServices.Flagr, environment);\n}\n\nexport function getLoggerUrl(environment: Environment) {\n\treturn getUrl(ApiServices.Logger, environment);\n}\n\nexport function getImlpUrl(environment: Environment) {\n\treturn getUrl(ApiServices.Imlp, environment);\n}\n\nexport function getImlp2Url(environment: Environment) {\n\treturn getUrl(ApiServices.Imlp2, environment);\n}\n","export enum Environment {\n\tDevelopment = 'development',\n\tTest = 'test',\n\tRc = 'rc',\n\tProduction = 'production'\n}\n","import http from './http';\nimport { UserFlags, GlobalFlags } from '../constants/flags';\nimport { EMPTY, Observable } from 'rxjs';\nimport { getFlagrUrl, getEnvironment } from './network';\nimport { Environment } from '../constants/environments';\n\nexport const API_TIMEOUT_MS = 3000;\n\nexport interface EntityContext<T> {\n\t[Key: string]: T;\n}\n\nexport interface EvaluateBatchResponse {\n\tevaluationResults: EvaluationResult[];\n}\n\nexport interface EvaluationResult {\n\tflagID: number;\n\tflagKey: string;\n\tsegmentID: number;\n\tvariantAttachment: string;\n\tvariantID: number;\n\tvariantKey: string;\n}\n\nexport function evaluateUserBatch(context: EntityContext<string>, id?: string, sitecode?: string): Observable<EvaluateBatchResponse> {\n\tconst flagKeys = Object.values(UserFlags);\n\tif (flagKeys.length === 0) return EMPTY;\n\n\tconst url = `${getFlagrUrl(getEnvironment(sitecode))}api/v1/evaluation/batch`;\n\tconst body = {\n\t\tentities: [{ entityId: id, entityType: 'student', entityContext: context }],\n\t\tenableDebug: true,\n\t\tflagKeys: flagKeys\n\t};\n\n\tconst bodyText = JSON.stringify(body);\n\treturn http(url)\n\t\t.body(bodyText)\n\t\t.contentType('application/json')\n\t\t.post();\n}\n\nexport function evaluateGlobalBatch(): Observable<EvaluateBatchResponse> {\n\tconst flagKeys = Object.values(GlobalFlags);\n\tif (flagKeys.length === 0) return EMPTY;\n\n\tconst env = getEnvironment();\n\tconst url = `${getFlagrUrl(env)}api/v1/evaluation/batch`;\n\tconst body = {\n\t\tentities: [{ siteCode: 'any' }],\n\t\tenableDebug: env !== Environment.Production,\n\t\tflagKeys: flagKeys\n\t};\n\n\tconst bodyText = JSON.stringify(body);\n\treturn http(url)\n\t\t.body(bodyText)\n\t\t.contentType('application/json')\n\t\t.post();\n}\n","export enum LogSources {\n\tMetrics = 'Metrics'\n}\n","import { Observable } from 'rxjs';\nimport { ApiServices } from '../constants/apiServices';\nimport { LogSources } from '../constants/logSources';\nimport http from './http';\nimport { getEnvironment, getLoggerUrl, getServiceVersion } from './network';\n\nconst environment = getEnvironment();\nconst version = getServiceVersion(ApiServices.Logger, environment);\nconst baseUrl = `${getLoggerUrl(environment)}/${version}/logs/`;\n\nexport function log(log: object | object[], logSource: LogSources = LogSources.Metrics) {\n\tconst neededMetaData = { Source: logSource, TimeStamp: new Date().toISOString() };\n\tconst body = Array.isArray(log) ? log.map(item => ({ ...item, ...neededMetaData })) : [{ ...log, ...neededMetaData }];\n\tconst bodyText = JSON.stringify(body);\n\treturn http(baseUrl)\n\t\t.body(bodyText)\n\t\t.post();\n}\n","import { parse } from 'bowser';\n\nexport enum UserAgentEnum {\n\tIOS = 'ios',\n\tKINDLE = 'kindle',\n\tANDROID = 'android',\n\tHTML5 = 'html5'\n}\n\nexport function parseUserAgent(): UserAgentEnum {\n\tconst info = parse(window.navigator.userAgent);\n\tif (\n\t\tinfo.os?.name?.match(/ios/i) ||\n\t\tinfo.platform?.model?.match(/ipad/i) ||\n\t\tinfo.platform?.model?.match(/iphone/i) ||\n\t\t// iPadOS 13.4 and later report as Mac. Detect touch screen devices\n\t\t(info.os?.name?.match(/mac/i) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2)\n\t) {\n\t\treturn UserAgentEnum.IOS;\n\t}\n\tif (/(amazon)/i.test(info.platform?.vendor ?? '') || /(kindle)/i.test(info.platform?.model ?? '')) {\n\t\treturn UserAgentEnum.KINDLE;\n\t}\n\tif (/(android)/i.test(info.os?.name ?? '') || /(android)/i.test(info.browser?.name ?? '')) {\n\t\treturn UserAgentEnum.ANDROID;\n\t}\n\treturn UserAgentEnum.HTML5;\n}\n","import { UserFlags } from '../../constants/flags';\nimport { EvaluationResult } from '../../services/flagr';\nimport { UserAgentEnum, parseUserAgent } from '../../services/useragent';\n\nexport function determineUseNativeBehavior(role: string | undefined, evaluationResults: EvaluationResult[] | undefined) {\n\tconst userAgent = parseUserAgent();\n\tconst enableNativeAppFlag = evaluationResults?.find(({ flagKey }) => flagKey === UserFlags.EnableNativeApp);\n\tconst enableNativeApp = enableNativeAppFlag?.variantKey === 'on';\n\tconst isNative =\n\t\trole === 'Student' &&\n\t\tenableNativeApp &&\n\t\t(userAgent === UserAgentEnum.IOS || userAgent === UserAgentEnum.ANDROID || userAgent === UserAgentEnum.KINDLE);\n\treturn isNative;\n}\n\nexport function determineUseNativeAppBehavior(role: string | undefined) {\n\tconst isIlMobileWebView = window.navigator.userAgent.includes('ILMobileWebView');\n\tconst isNativeApp = role === 'Student' && isIlMobileWebView;\n\treturn isNativeApp;\n}\n","import { PayloadAction, createAction, createReducer } from '@reduxjs/toolkit';\nimport { RootStateOrAny } from 'react-redux';\nimport { ofType, StateObservable } from 'redux-observable';\nimport { Observable } from 'rxjs';\nimport { catchError, map, switchMap, timeout, withLatestFrom } from 'rxjs/operators';\nimport { launchProductEvent } from '../../services/caliperService';\nimport { selectAccessToken, selectRole, selectUser } from '../selectors/app';\nimport { Products } from '../../constants/products';\nimport { UrlMap } from '../../types/urlMap';\nimport { Environment } from '../../constants/environments';\nimport { Dictionary } from '../../types/dictionary';\nimport getLaunchUrl from '../../services/productLaunch';\nimport { launchProductAfterCaliper } from './productLauncher';\n\n/**\n * Action creators\n */\n\nexport const caliperSessionEvent = createAction(\n\t'universal-login-page/caliper/CALIPER_SESSION_EVENT',\n\t(\n\t\tproduct: Products | string,\n\t\turls: UrlMap,\n\t\tenvironment: Environment,\n\t\taddQuery: boolean,\n\t\tproductQueryStrings: Dictionary<string>,\n\t\tisStudent: boolean\n\t) => ({\n\t\tpayload: {\n\t\t\tproduct,\n\t\t\turls,\n\t\t\tenvironment,\n\t\t\taddQuery,\n\t\t\tproductQueryStrings,\n\t\t\tisStudent\n\t\t}\n\t})\n);\n\n/**\n * Reducer\n */\n\nexport interface CaliperState {\n\tcaliperEventWasSent: boolean;\n}\n\nconst initialState: CaliperState = {\n\tcaliperEventWasSent: false\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder.addCase(caliperSessionEvent, state => ({\n\t\t...state,\n\t\tcaliperEventWasSent: true\n\t}))\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport const missingDataError = 'missing required data to send event';\n\nexport function caliperSessionEventEpic(\n\taction$: Observable<\n\t\tPayloadAction<{\n\t\t\tproduct: Products;\n\t\t\turls: UrlMap;\n\t\t\tenvironment: Environment;\n\t\t\taddQuery: boolean;\n\t\t\tproductQueryStrings: Dictionary<string>;\n\t\t\tisStudent: boolean;\n\t\t}>\n\t>,\n\tstate$: StateObservable<RootStateOrAny>\n) {\n\treturn action$.pipe(\n\t\tofType(caliperSessionEvent.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([{ payload }, state]) => {\n\t\t\tconst { addQuery, environment, isStudent, product, productQueryStrings, urls } = payload;\n\n\t\t\tconst url = getLaunchUrl(product, urls, environment as Environment, addQuery, productQueryStrings) ?? '';\n\t\t\tconst { studentId } = selectUser(state) || {};\n\t\t\tconst token = selectAccessToken(state) ?? '';\n\t\t\tconst role = selectRole(state) ?? '';\n\n\t\t\treturn launchProductEvent(studentId!, product, url, token!, isStudent, role).pipe(\n\t\t\t\ttimeout(3000),\n\t\t\t\tmap(({ successful, requestId }) =>\n\t\t\t\t\tlaunchProductAfterCaliper(product, urls, environment, addQuery, productQueryStrings, isStudent)\n\t\t\t\t),\n\t\t\t\tcatchError(async error => {\n\t\t\t\t\tconsole.error('event send error:', error);\n\t\t\t\t\treturn launchProductAfterCaliper(product, urls, environment, addQuery, productQueryStrings, isStudent);\n\t\t\t\t})\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport const CALIPER_EPICS = [caliperSessionEventEpic];\n","import {\n\tCaliper,\n\tCaliperAction,\n\tcreateInstructor,\n\tcreateSessionEvent,\n\tcreateSoftwareApplication,\n\tcreateStudent,\n\tcreateUser,\n\tSensor\n} from '@imaginelearning/caliper-ts';\nimport URLS, { VERSIONS } from './../constants/urls';\nimport { Environment } from '../constants/environments';\nimport { getEnvironment } from './network';\nimport { ApiServices } from '../constants/apiServices';\nimport { Observable } from 'rxjs';\nimport http from './http';\nimport { Products } from '../constants/products';\n\nexport interface CaliperEventResponse {\n\tfailed: any;\n\trequestId: any;\n\tsuccessful: any;\n}\n\nexport function launchProductEvent(\n\tuserId: string,\n\tproduct: Products,\n\tproductUrl: string,\n\ttoken: string,\n\tisStudent: boolean,\n\trole: string\n): Observable<CaliperEventResponse> {\n\tlet actor;\n\tif (isStudent) {\n\t\tactor = createStudent({\n\t\t\tid: Caliper.uuid(userId)\n\t\t});\n\t} else if (role === 'Teacher') {\n\t\tactor = createInstructor({\n\t\t\tid: Caliper.uuid(userId)\n\t\t});\n\t} else {\n\t\tactor = createUser({\n\t\t\tid: Caliper.uuid(userId)\n\t\t});\n\t}\n\n\tconst productSelectionUrl = URLS[getEnvironment()][ApiServices.Redirect];\n\tCaliper.settings.applicationUri = productSelectionUrl;\n\tlet sensor = new Sensor(productSelectionUrl, {\n\t\tedApp: createSoftwareApplication({\n\t\t\tid: productSelectionUrl\n\t\t}),\n\t\tvalidationEnabled: true\n\t});\n\n\t// Replace every queryParam after the .com/, append the product name at the end.\n\tproductUrl = new URL(productUrl).origin + `/${product}`;\n\n\tconst object = createSoftwareApplication({\n\t\tid: productUrl\n\t});\n\n\tconst event = sensor.createEvent(createSessionEvent, {\n\t\tactor,\n\t\taction: CaliperAction.Launched,\n\t\tobject\n\t});\n\tevent.eventTime = new Date().toJSON();\n\n\tevent['@context'].push(\n\t\t`${URLS[getEnvironment()][ApiServices.ContextEnvironment]}session-launched/${\n\t\t\tVERSIONS[getEnvironment()][ApiServices.ContextEnvironment]\n\t\t}`\n\t);\n\n\tconst envelope = sensor.createEnvelope({\n\t\tdata: [event]\n\t});\n\n\tconst caliperUrl = URLS[getEnvironment() || Environment.Production][ApiServices.Caliper];\n\tconst response = http(caliperUrl)\n\t\t.body(envelope)\n\t\t.bearer(token)\n\t\t.contentType('application/json')\n\t\t.post<CaliperEventResponse>();\n\n\treturn response;\n}\n","export enum AuthSource {\n\tIMLP = 'IMLP', // IMLP Edgenuity domain\n\tIMLP2 = 'IMLP2', // IMLP ImagineLearning domain\n\tILAuth = 'ILAuth'\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function serializable<T>(obj: any) {\n\tif (typeof obj !== 'object') {\n\t\treturn obj as T;\n\t}\n\tlet keys = Object.getOwnPropertyNames(obj).sort();\n\tif (!keys.length) {\n\t\tkeys = Object.getOwnPropertyNames(Object.getPrototypeOf(obj)).sort();\n\t}\n\tif (keys.length) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\treturn keys.reduce((o, key) => ({ ...o, [key]: (obj as any)[key] }), {}) as T;\n\t}\n\treturn JSON.parse(JSON.stringify(obj)) as T;\n}\n\nexport function stringifyError(error: Error | object | string) {\n\tif (!error) {\n\t\treturn '';\n\t}\n\tif (typeof error === 'object') {\n\t\tconst errorObj = serializable(error);\n\t\treturn JSON.stringify(errorObj, null, ' ').replace(/\\\\n/g, '\\n');\n\t}\n\treturn error;\n}\n","import decode from 'jwt-decode';\nimport { User } from '../types/user';\n\nexport interface IlJwt {\n\temail: string;\n\t'http://il/env': string;\n\t'http://il/grade': string;\n\tOrganizations?: string;\n\ttenant?: string;\n\trole: string;\n\t'http://il/sites': string;\n\t'http://il/id': string;\n\tname: string;\n\t'http://il/products'?: { enabled: boolean; productName: string }[];\n\t'http://il/impersonation'?: { name: string; id: string }[];\n\t'http://il/sso'?: string;\n\t'http://il/username'?: string;\n\t'http://il/requestedProduct'?: string;\n\t'http://il/orgs'?: string;\n\timpersonated_by?: string;\n}\n\nexport default function decodeJwt(jwt: string | any): User {\n\tconst claims = decode(jwt) as IlJwt;\n\tconst email = claims['email'];\n\tconst environment = claims['http://il/env'];\n\tconst grade = claims['http://il/grade'];\n\tconst organizationIds = (claims['Organizations'] || '').split(',');\n\tconst tenant = claims['tenant'];\n\tconst role = claims['role'];\n\tconst sites = claims['http://il/sites'];\n\tconst studentId = claims['http://il/id'];\n\tconst userName = claims['name'];\n\tconst userProducts = (claims['http://il/products'] || [])\n\t\t.filter((p: { enabled: boolean }) => p.enabled)\n\t\t.map((p: { productName: string }) => p.productName);\n\tconst impersonation = claims['http://il/impersonation'];\n\tconst impersonatingUserId = claims.impersonated_by;\n\tconst impersonatingUserName =\n\t\timpersonation && impersonation.length === 2 ? impersonation.find(user => user.id === impersonatingUserId)?.name : undefined;\n\tconst impersonatedUserName =\n\t\timpersonation && impersonation.length === 2 ? impersonation.find(user => user.id !== impersonatingUserId)?.name : undefined;\n\tconst ssoConnectionType = claims['http://il/sso'];\n\tconst username = claims['http://il/username'];\n\tconst requestedProduct = claims['http://il/requestedProduct'];\n\tconst ilOrgs = (claims['http://il/orgs'] || '').split(','); //Added since the 'organizationIds' above are not really taking the orgs from the JWT. (?)\n\n\treturn {\n\t\temail,\n\t\tenvironment,\n\t\tgrade,\n\t\torganizationIds,\n\t\ttenant,\n\t\trole,\n\t\tsites,\n\t\tstudentId,\n\t\tuserName,\n\t\tuserProducts,\n\t\timpersonatingUserId,\n\t\timpersonatingUserName,\n\t\timpersonatedUserName,\n\t\tssoConnectionType,\n\t\tusername,\n\t\trequestedProduct,\n\t\tilOrgs\n\t};\n}\n","import { throwError } from 'rxjs';\nimport http from './http';\nimport { getAuthUrl, getEnvironment, getImlp2Url, getImlpUrl, getManagerUrl, getSiteCode } from './network';\nimport { AuthSource } from '../constants/authSources';\n\nexport function getUsername(username: string, sitecode: string, isEducator: boolean = false) {\n\tconst code = (sitecode || '').split('@').shift();\n\treturn isEducator ? username : `${username}@${code}`;\n}\n\nexport function lookupSiteCode(username: string) {\n\tconst environment = getEnvironment();\n\t// This is staying on ILAuth for the moment. ReCAPTCHA have been removed but IMLP does not support sitecodelookup by user email yet.\n\t// We need to port it to IMLP and implement a replacement for ReCAPTCHA.\n\tconst url = `${getAuthUrl(environment)}/v1.0/sitecodelookup`;\n\treturn http(url)\n\t\t.body({ username })\n\t\t.header('Accept', 'application/json')\n\t\t.post<{ sitecodes: string[] }>();\n}\n\nexport function requestOneTimeToken(encryptedtoken?: string, sitecode?: string) {\n\tif (!encryptedtoken) {\n\t\treturn throwError(new Error('Missing parameter: encryptedtoken not specified'));\n\t}\n\tconst environment = getEnvironment(sitecode);\n\tlet url;\n\tif (getAuthProvider() === AuthSource.ILAuth) {\n\t\turl = getAuthUrl(environment);\n\t} else if (getAuthProvider() === AuthSource.IMLP2) {\n\t\turl = `${getImlp2Url(environment)}/transfer/initiate`;\n\t} else {\n\t\turl = `${getImlpUrl(environment)}/transfer/initiate`;\n\t}\n\n\treturn http(url)\n\t\t.body('')\n\t\t.contentType('application/x-www-form-urlencoded')\n\t\t.bearer(encryptedtoken)\n\t\t.post<{ Code: string }>();\n}\n\nexport function validateSiteCode(sitecode: string) {\n\tconst baseSitecode = getSiteCode(sitecode);\n\tconst environment = getEnvironment(sitecode);\n\tconst url = `${getManagerUrl(environment)}/v2.2/sitecodes/` + baseSitecode;\n\treturn http(url).get();\n}\n\n// Handle back-channel logouts\nexport function logoutCallback(url: string) {\n\treturn http(url).get();\n}\n\nfunction selectAuthProvider(source: AuthSource) {\n\tif (source === AuthSource.ILAuth) {\n\t\tlocalStorage.setItem('oidcUseIlAuth', 'true');\n\t\tlocalStorage.removeItem('oidcUseIMLP2');\n\t} else if (source === AuthSource.IMLP2) {\n\t\tlocalStorage.setItem('oidcUseIMLP2', 'true');\n\t\tlocalStorage.removeItem('oidcUseIlAuth');\n\t} else {\n\t\tlocalStorage.removeItem('oidcUseIlAuth');\n\t\tlocalStorage.removeItem('oidcUseIMLP2');\n\t}\n}\n\nexport function selectImlpProvider() {\n\tselectAuthProvider(AuthSource.IMLP);\n}\n\nexport function selectImlp2Provider() {\n\tselectAuthProvider(AuthSource.IMLP2);\n}\n\nexport function selectIlAuthProvider() {\n\tselectAuthProvider(AuthSource.ILAuth);\n}\n\nexport function getAuthProvider() {\n\tif (localStorage.getItem('oidcUseIlAuth') === 'true') {\n\t\treturn AuthSource.ILAuth;\n\t}\n\tif (localStorage.getItem('oidcUseIMLP2') === 'true') {\n\t\treturn AuthSource.IMLP2;\n\t}\n\n\treturn AuthSource.IMLP;\n}\n\n// Define the service\nconst Auth = {\n\tlookupSiteCode,\n\trequestOneTimeToken,\n\tvalidateSiteCode,\n\tlogoutCallback,\n\tselectImlpProvider,\n\tselectImlp2Provider,\n\tselectIlAuthProvider,\n\tgetAuthProvider\n};\n\nexport default Auth;\n","import { RootState } from '../root';\nimport { createSelector } from '@reduxjs/toolkit';\n\nexport function selectAutoFillValues(state: RootState) {\n\treturn state.loginForm.autoFillValues;\n}\n\nexport function selectError(state: RootState) {\n\treturn state.loginForm.error;\n}\n\nexport function selectForgotSiteCodeError(state: RootState) {\n\treturn state.loginForm.forgotSiteCodeError;\n}\n\nexport function selectForgotSiteCodeLoading(state: RootState) {\n\treturn state.loginForm.forgotSiteCodeLoading;\n}\n\nexport function selectInvalidCredentials(state: RootState) {\n\treturn state.loginForm.invalidCredentials;\n}\n\nexport function selectTooManyAttempts(state: RootState) {\n\treturn state.loginForm.tooManyAttempts;\n}\n\nexport function selectDurationSecs(state: RootState) {\n\treturn state.loginForm.durationSecs;\n}\n\nexport function selectIsEducator(state: RootState) {\n\treturn state.loginForm.isEducator;\n}\n\nexport function selectSiteCode(state: RootState) {\n\treturn state.loginForm.siteCode;\n}\n\nexport function selectLoginType(state: RootState) {\n\treturn state.loginForm.loginType;\n}\n\nexport function selectSiteCodeEditable(state: RootState) {\n\treturn state.loginForm.siteCodeEditable;\n}\n\nexport function selectUsername(state: RootState) {\n\treturn state.loginForm.username;\n}\n\nexport const selectForgotSiteCodeNoValues = createSelector([selectForgotSiteCodeRawValues], values => values === false);\n\nexport const selectForgotSiteCodeValues = createSelector([selectForgotSiteCodeRawValues], values =>\n\tvalues === false ? undefined : (values as string[])\n);\n\n/**\n * Private selectors\n */\n\nfunction selectForgotSiteCodeRawValues(state: RootState) {\n\treturn state.loginForm.forgotSiteCodeValues;\n}\n","import { Dictionary } from '../types/dictionary';\nimport { Environment } from './environments';\nimport { Products } from './products';\n\n// Staff URLS\nconst PORTAL_URLS: Dictionary<Dictionary<string>> = {\n\t[Environment.Development]: {\n\t\t[Products.ILE]: 'https://test.my.imaginelearning.com/signin?selectedProduct=ILE',\n\t\t[Products.Spanish]: 'https://test.my.imaginelearning.com/signin?selectedProduct=Spanish',\n\t\t[Products.Galileo]: 'https://aws-dev.ati-online.com/StudentCenter/ILToGalileoRedirect/Index',\n\t\t[Products.Reader]: 'https://test.my.imaginelearning.com/signin?selectedProduct=Lectura',\n\t\t[Products.Lectura]: 'https://local.my.imaginelearning.com:50000/lectura',\n\t\t[Products.MyPathMath]: 'https://app.dev.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.MyPathReading]: 'https://app.dev.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.Traverse]: 'https://app.traverse-test.com/api/il-launch',\n\t\t[Products.Science]: 'https://app.dev.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.Purpose]: 'https://app.dev.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.MyPathPortal]: 'https://app.dev.edgenuityapp.com',\n\t\t[Products.Robotify]: 'https://robotify.robo-dev.il-consumer.com/oauth/initiate_readiness_sso',\n\t\t[Products.IPA]: 'https://testassessment.imaginelearning.com',\n\t\t[Products.DrSeuss]: 'https://test.my.imaginelearning.com/signin?selectedProduct=DrSeuss'\n\t},\n\t[Environment.Test]: {\n\t\t[Products.ILE]: 'https://test.my.imaginelearning.com/signin?selectedProduct=ILE',\n\t\t[Products.Spanish]: 'https://test.my.imaginelearning.com/signin?selectedProduct=Spanish',\n\t\t[Products.Galileo]: 'https://aws-dev.ati-online.com/StudentCenter/ILToGalileoRedirect/Index',\n\t\t[Products.Reader]: 'https://test.my.imaginelearning.com/signin?selectedProduct=Reader',\n\t\t[Products.Lectura]: 'https://test.my.imaginelearning.com/signin?selectedProduct=Lectura',\n\t\t[Products.MyPathMath]: 'https://app.qa.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.MyPathReading]: 'https://app.qa.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.Traverse]: 'https://app.traverse-test.com/api/il-launch',\n\t\t[Products.Science]: 'https://app.qa.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.Purpose]: 'https://app.qa.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.MyPathPortal]: 'https://app.qa.edgenuityapp.com',\n\t\t[Products.Robotify]: 'https://robotify.robo-dev.il-consumer.com/oauth/initiate_readiness_sso',\n\t\t[Products.IPA]: 'https://testassessment.imaginelearning.com',\n\t\t[Products.DrSeuss]: 'https://test.my.imaginelearning.com/signin?selectedProduct=DrSeuss'\n\t},\n\t[Environment.Rc]: {\n\t\t[Products.ILE]: 'https://rc.my.imaginelearning.com/signin?selectedProduct=ILE',\n\t\t[Products.Spanish]: 'https://rc.my.imaginelearning.com/signin?selectedProduct=Spanish',\n\t\t[Products.Galileo]: 'https://galileodev.ati-online.com/StudentCenter/ILToGalileoRedirect/Index',\n\t\t[Products.Reader]: 'https://rc.my.imaginelearning.com/signin?selectedProduct=Reader',\n\t\t[Products.Lectura]: 'https://rc.my.imaginelearning.com/signin?selectedProduct=Lectura',\n\t\t[Products.MyPathMath]: 'https://app.staging.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.MyPathReading]: 'https://app.staging.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.Traverse]: 'https://app.traverse-staging.com/api/il-launch',\n\t\t[Products.Science]: 'https://app.staging.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.Purpose]: 'https://app.staging.edgenuityapp.com/launch?appfrom=mpp',\n\t\t[Products.MyPathPortal]: 'https://app.staging.edgenuityapp.com',\n\t\t[Products.Robotify]: 'https://robotify.robo-staging.il-consumer.com/oauth/initiate_readiness_sso',\n\t\t[Products.IPA]: 'https://rcassessment.imaginelearning.com',\n\t\t[Products.DrSeuss]: 'https://rc.my.imaginelearning.com/signin?selectedProduct=DrSeuss'\n\t},\n\t[Environment.Production]: {\n\t\t[Products.ILE]: 'https://my.imaginelearning.com/signin?selectedProduct=ILE',\n\t\t[Products.Spanish]: 'https://my.imaginelearning.com/signin?selectedProduct=Spanish',\n\t\t[Products.Galileo]: 'https://www.assessmenttechnology.com/StudentCenter/ILToGalileoRedirect/Index',\n\t\t[Products.Reader]: 'https://my.imaginelearning.com/signin?selectedProduct=Reader',\n\t\t[Products.Lectura]: 'https://my.imaginelearning.com/signin?selectedProduct=Lectura',\n\t\t[Products.MyPathMath]: 'https://app.edgenuity.com/launch?appfrom=mpp',\n\t\t[Products.MyPathReading]: 'https://app.edgenuity.com/launch?appfrom=mpp',\n\t\t[Products.Traverse]: 'https://learn.traverse-app.com/api/il-launch',\n\t\t[Products.Science]: 'https://app.edgenuity.com/launch?appfrom=mpp',\n\t\t[Products.Purpose]: 'https://app.edgenuity.com/launch?appfrom=mpp',\n\t\t[Products.MyPathPortal]: 'https://app.edgenuity.com',\n\t\t[Products.Robotify]: 'https://edu.robotify.com/oauth/initiate_readiness_sso',\n\t\t[Products.IPA]: 'https://assessment.imaginelearning.com',\n\t\t[Products.DrSeuss]: 'https://my.imaginelearning.com/signin?selectedProduct=DrSeuss'\n\t}\n};\n\nexport default PORTAL_URLS;\n","import { useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectUserFlagEvaluationResults } from '../redux/selectors/productSelection';\nimport { selectGlobalFlagEvaluationResults } from '../redux/selectors/app';\n\nfunction useFlagr(key: string) {\n\tconst userFlags = useSelector(selectUserFlagEvaluationResults);\n\tconst globalFlags = useSelector(selectGlobalFlagEvaluationResults);\n\tconst flag = useMemo(() => userFlags?.find(({ flagKey }) => flagKey === key) ?? globalFlags?.find(({ flagKey }) => flagKey === key), [\n\t\tuserFlags,\n\t\tglobalFlags,\n\t\tkey\n\t]);\n\treturn flag || null;\n}\n\nexport default useFlagr;\n","export enum LoginTypes {\n\tSSO = 'SSO',\n\tPassword = 'Manual',\n\tQRCode = 'QR'\n}\n","import { createSelector } from '@reduxjs/toolkit';\nimport { Environment } from '../../constants/environments';\nimport decodeJwt from '../../services/jwt';\nimport { RootState } from '../root';\n\nexport function selectAccessToken(state: RootState) {\n\treturn state.app.access_token;\n}\n\nexport function selectError(state: RootState) {\n\treturn state.app.error;\n}\n\nexport function selectParams(state: RootState) {\n\treturn state.app.params;\n}\n\nexport function selectProductQueryStrings(state: RootState) {\n\treturn state.app.productQueryStrings;\n}\n\nexport function selectReturnUrl(state: RootState) {\n\treturn state.app.returnUrl;\n}\n\nexport const selectUser = createSelector([selectAccessToken], token => {\n\tif (!token) {\n\t\treturn undefined;\n\t}\n\treturn decodeJwt(token);\n});\n\nexport const selectEnvironment = createSelector([selectUser], user => {\n\tconst env = user?.environment;\n\tif (!env) {\n\t\treturn Environment.Development;\n\t}\n\tswitch (env) {\n\t\tcase 'dev':\n\t\tcase 'qa':\n\t\t\treturn Environment.Test;\n\t\tcase 'staging':\n\t\t\treturn Environment.Rc;\n\t\tcase 'prod':\n\t\t\treturn Environment.Production;\n\t\tdefault:\n\t\t\treturn env as Environment;\n\t}\n});\n\nexport const selectRole = createSelector([selectUser], user => user?.role);\n\nexport const selectTenant = createSelector([selectUser], user => user?.tenant);\n\nexport const selectStudentId = createSelector([selectUser], user => user?.studentId);\n\nexport const selectUserName = createSelector([selectUser], user => user?.userName);\n\nexport function selectGlobalFlagEvaluationResults(state: RootState) {\n\treturn state.app.evaluationResults;\n}\n\nexport function selectGlobalFlagsLoaded(state: RootState) {\n\treturn state.app.flagsLoaded;\n}\n","import isEmpty from 'lodash-es/isEmpty';\nimport { fromFetch } from 'rxjs/fetch';\nimport { switchMap } from 'rxjs/operators';\nimport { Dictionary } from '../types/dictionary';\nimport { serializable } from './serializable';\n\nexport class Http {\n\tprivate _body?: object | string;\n\tprivate _headers: Dictionary<string> = {};\n\tprivate _query?: string;\n\tprivate _url?: string;\n\n\tconstructor(url?: string) {\n\t\tthis._url = url;\n\t}\n\n\tprivate get fullUrl() {\n\t\tlet url = this._url || '';\n\t\tif (this._query) {\n\t\t\turl += url.indexOf('?') < 0 ? '?' : '&';\n\t\t\turl += this._query;\n\t\t}\n\t\treturn url;\n\t}\n\n\tbearer(token?: string) {\n\t\tif (!token) {\n\t\t\treturn this;\n\t\t}\n\t\tthis._headers['Authorization'] = `Bearer ${token}`;\n\t\treturn this;\n\t}\n\n\tbody(content: object | string) {\n\t\tthis._body = content;\n\t\treturn this;\n\t}\n\n\tcontentType(type: string) {\n\t\tthis._headers['Content-Type'] = type;\n\t\treturn this;\n\t}\n\n\tget<T>() {\n\t\tconst headers = isEmpty(this._headers) ? undefined : this._headers;\n\t\treturn httpRequest<T>(this.fullUrl, { headers, method: 'GET' });\n\t}\n\n\theader(name: string, value: string) {\n\t\tthis._headers[name] = value;\n\t\treturn this;\n\t}\n\n\tpost<T>() {\n\t\tconst headers = isEmpty(this._headers) ? {} : this._headers;\n\t\tif (!headers['Content-Type']) {\n\t\t\theaders['Content-Type'] = 'application/json';\n\t\t}\n\t\tlet body = '';\n\t\tif (this._body && typeof this._body === 'object') {\n\t\t\tif (this._headers['Content-Type'] === 'application/x-www-form-urlencoded') {\n\t\t\t\tconst encoded = new URLSearchParams();\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\tObject.keys(this._body).forEach(key => encoded.append(key, (this._body as any)[key]));\n\t\t\t\tbody = encoded.toString();\n\t\t\t} else {\n\t\t\t\tbody = JSON.stringify(this._body);\n\t\t\t}\n\t\t} else if (this._body && typeof this._body === 'string') {\n\t\t\tbody = this._body;\n\t\t}\n\t\treturn httpRequest<T>(this.fullUrl, { body, headers, method: 'POST' });\n\t}\n\n\tquery(query: URLSearchParams | Dictionary<string | string[] | boolean> | string) {\n\t\tif (query instanceof URLSearchParams) {\n\t\t\tthis._query = (query as URLSearchParams).toString();\n\t\t} else if (typeof query === 'string') {\n\t\t\tthis._query = query;\n\t\t} else {\n\t\t\tconst params = new URLSearchParams();\n\t\t\tObject.keys(query).forEach(key => {\n\t\t\t\tif (Array.isArray(query[key])) {\n\t\t\t\t\t(query[key] as string[]).forEach(param => {\n\t\t\t\t\t\tparams.append(key, param);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(key, query[key] as string);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis._query = params.toString();\n\t\t}\n\t\treturn this;\n\t}\n\n\turl(url: string) {\n\t\tthis._url = url;\n\t\treturn this;\n\t}\n}\n\nexport default function http(url: string) {\n\treturn new Http(url);\n}\n\n/**\n * HTTP functions using fromFetch\n */\n\nfunction httpRequest<T>(url: string, options?: RequestInit) {\n\treturn fromFetch(url, options).pipe(\n\t\tswitchMap(async response => {\n\t\t\tif (!response.ok) {\n\t\t\t\ttry {\n\t\t\t\t\tconst body = await response.text();\n\t\t\t\t\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\t\t\t\t\tconst err = new Error(body) as any;\n\t\t\t\t\tconst serialized = serializable<any>(response);\n\t\t\t\t\t/* eslint-enable */\n\t\t\t\t\tObject.keys(serialized).forEach(key => {\n\t\t\t\t\t\terr[key] = serialized[key];\n\t\t\t\t\t});\n\t\t\t\t\terr.body = body;\n\t\t\t\t\tthrow err;\n\t\t\t\t} catch {\n\t\t\t\t\tthrow response;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst text = await response.text();\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(text);\n\t\t\t\treturn json as T;\n\t\t\t} catch {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\treturn (text as any) as T;\n\t\t\t}\n\t\t})\n\t);\n}\n","import { createAction, createReducer } from '@reduxjs/toolkit';\n\n/**\n * Action creators\n */\n\nexport const cameraChanged = createAction<'user' | 'environment' | undefined>('universal-login-page/webCam/WEBCAM_CAMERA_CHANGED');\nexport const camerasEnumerated = createAction<number>('universal-login-page/webCam/WEBCAM_CAMERAS_ENUMERATED');\nexport const closed = createAction('universal-login-page/webCam/WEBCAM_CLOSED');\nexport const error = createAction<string>('universal-login-page/webCam/WEBCAM_ERROR_OCCURRED');\nexport const loaded = createAction('universal-login-page/webCam/WEBCAM_LOADED');\n\n/**\n * Reducer\n */\n\nexport interface WebCamState {\n\tenabled: boolean;\n\terror?: string;\n\tfacingMode?: 'user' | 'environment';\n\tvideoDeviceCount: number;\n}\n\nconst initialState: WebCamState = {\n\tenabled: true,\n\tfacingMode: 'user',\n\tvideoDeviceCount: 0\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(error, (state, action) => ({\n\t\t\t...state,\n\t\t\terror: action.payload,\n\t\t\tenabled: false\n\t\t}))\n\t\t.addCase(camerasEnumerated, (state, action) => ({\n\t\t\t...state,\n\t\t\tvideoDeviceCount: action.payload,\n\t\t\tfacingMode: action.payload > 1 ? 'environment' : 'user',\n\t\t\tenabled: true\n\t\t}))\n\t\t.addCase(cameraChanged, (state, action) => ({\n\t\t\t...state,\n\t\t\tfacingMode: action.payload\n\t\t}))\n\t\t.addCase(loaded, state => ({\n\t\t\t...state,\n\t\t\tenabled: true,\n\t\t\terror: ''\n\t\t}))\n\t\t.addCase(closed, state => ({\n\t\t\t...state,\n\t\t\tenabled: true,\n\t\t\terror: ''\n\t\t}))\n);\n\nexport default reducer;\n","export enum Products {\n\tILE = 'ILE',\n\tSpanish = 'Spanish',\n\tIM = 'IM',\n\tIMF = 'IMF',\n\tReader = 'Reader',\n\tGalileo = 'Galileo',\n\tAdaptiveAssessment = 'AdaptiveAssessment',\n\tLectura = 'Lectura',\n\tMyPathMath = 'MyPathMath',\n\tMyPathReading = 'MyPathReading',\n\tScience = 'Science',\n\tPurpose = 'Purpose',\n\tTraverse = 'Traverse',\n\tMyPathPortal = 'MyPathPortal',\n\tRobotify = 'Robotify',\n\tIPA = 'IPA',\n\tIEBenchmarkPlayerLink = 'IEBenchmarkPlayerLink', // Not a real product, but the IE Benchmark - Link Player Assessment\n\tDrSeuss = 'DrSeuss' // Product dependant on ILE. If ILE is enabled, DrSeuss will be enabled (data from Permissions API)\n}\n\nexport enum LoggingProducts {\n\tILE = 'LandL',\n\tSpanish = 'Espanol',\n\tReader = 'Reader',\n\tLectura = 'Lectura',\n\tGalileo = 'Galileo'\n}\n","import { ApiServices } from '../constants/apiServices';\nimport http from './http';\nimport { getEnvironment, getManagerUrl, getServiceVersion } from './network';\n\nconst environment = getEnvironment();\nconst version = getServiceVersion(ApiServices.Manager, environment);\nconst baseUrl = `${getManagerUrl(environment)}/${version}/passwordReset`;\n\nexport function setPassword(token: string, password: string) {\n\treturn http(`${baseUrl}/${token}`)\n\t\t.body({ password })\n\t\t.post();\n}\n\nexport function sendResetEmail(username: string) {\n\treturn http(baseUrl)\n\t\t.body({ username })\n\t\t.post();\n}\n\nexport function validateResetToken(token: string) {\n\treturn http(`${baseUrl}/${token}`).get<{ username: string }>();\n}\n","import { createAction, createReducer, PayloadAction } from '@reduxjs/toolkit';\nimport { ofType } from 'redux-observable';\nimport { Observable, of } from 'rxjs';\nimport { catchError, filter, map, switchMap, tap } from 'rxjs/operators';\nimport * as Password from '../../services/password';\nimport { serializable } from '../../services/serializable';\n\n/**\n * Action creators\n */\n\nexport const sendEmailError = createAction<Response | Error | object>('universal-login-page/resetPassword/RESET_PASSWORD_SEND_EMAIL_ERROR');\nexport const sendResetEmail = createAction<string>('universal-login-page/resetPassword/RESET_PASSWORD_SEND_EMAIL_REQUEST');\nexport const sendEmailSuccess = createAction('universal-login-page/resetPassword/RESET_PASSWORD_SEND_EMAIL_SUCCESS');\nexport const setPasswordComplete = createAction('universal-login-page/resetPassword/RESET_PASSWORD_SET_PASSWORD_COMPLETE');\nexport const setPasswordError = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_SET_PASSWORD_ERROR',\n\t(error: Response | Error | object, callback: () => void) => ({ meta: callback, payload: error })\n);\nexport const setPassword = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_SET_PASSWORD_REQUEST',\n\t(token: string, password: string, callback: () => void) => ({\n\t\tmeta: callback,\n\t\tpayload: { token, password }\n\t})\n);\nexport const setPasswordSuccess = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_SET_PASSWORD_SUCCESS',\n\t(callback: () => void) => ({ meta: callback, payload: undefined })\n);\nexport const validateResetToken = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_VALIDATE_TOKENID_REQUEST',\n\t(tokenId: string, callback?: () => void) => ({ meta: callback, payload: tokenId })\n);\nexport const validateResetTokenCallbackComplete = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_VALIDATE_TOKENID_CALLBACK_COMPLETE'\n);\nexport const validateTokenIdError = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_VALIDATE_TOKENID_ERROR',\n\t(error: Response | Error | object, callback: () => void) => ({ meta: callback, payload: error })\n);\nexport const validateTokenIdSuccess = createAction(\n\t'universal-login-page/resetPassword/RESET_PASSWORD_VALIDATE_TOKENID_SUCCESS',\n\t(username: string, callback: () => void) => ({ meta: callback, payload: username })\n);\n\n/**\n * Reducer\n */\n\nexport interface ResetPasswordState {\n\tresetError?: Response | Error | object;\n\tresetSubmitted: boolean;\n\tresetSuccess: boolean;\n\tresetTokenInvalid: boolean;\n\tsendEmailError?: Response | Error | object;\n\tsendEmailSubmitted: boolean;\n\tsendEmailSuccess: boolean;\n}\n\nconst initialState: ResetPasswordState = {\n\tresetSubmitted: false,\n\tresetSuccess: false,\n\tresetTokenInvalid: false,\n\tsendEmailSubmitted: false,\n\tsendEmailSuccess: false\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(sendEmailError, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tsendEmailError: payload\n\t\t}))\n\t\t.addCase(sendResetEmail, (state, action) => ({\n\t\t\t...state,\n\t\t\tsendEmailSubmitted: true\n\t\t}))\n\t\t.addCase(sendEmailSuccess, (state, action) => ({\n\t\t\t...state,\n\t\t\tsendEmailSuccess: true\n\t\t}))\n\t\t.addCase(setPasswordError, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tresetError: payload\n\t\t}))\n\t\t.addCase(setPasswordSuccess, (state, action) => ({\n\t\t\t...state,\n\t\t\tresetSuccess: true\n\t\t}))\n\t\t.addCase(validateTokenIdError, (state, action) => ({\n\t\t\t...state,\n\t\t\tresetTokenInvalid: true\n\t\t}))\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport function setPasswordEpic(action$: Observable<PayloadAction<{ token: string; password: string }> & { meta: () => void }>) {\n\treturn action$.pipe(\n\t\tofType(setPassword.type),\n\t\tswitchMap(({ meta: callback, payload }) => {\n\t\t\tconst { token, password } = payload;\n\t\t\treturn Password.setPassword(token, password).pipe(\n\t\t\t\tmap(() => setPasswordSuccess(callback)),\n\t\t\t\tcatchError(err => getErrorPayload(err).pipe(map(error => setPasswordError(error, callback))))\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function setPasswordCompleteEpic(action$: Observable<PayloadAction & { meta: () => void }>) {\n\treturn action$.pipe(\n\t\tfilter(({ type }) => type === setPasswordSuccess.type || type === setPasswordError.type),\n\t\ttap(({ meta: callback }) => callback && callback()),\n\t\tmap(() => setPasswordComplete())\n\t);\n}\n\nexport function sendResetEmailEpic(action$: Observable<PayloadAction<string>>) {\n\treturn action$.pipe(\n\t\tofType(sendResetEmail.type),\n\t\tswitchMap(({ payload: email }) => {\n\t\t\treturn Password.sendResetEmail(email).pipe(\n\t\t\t\tmap(() => sendEmailSuccess()),\n\t\t\t\tcatchError(err =>\n\t\t\t\t\terr?.status === 404 ? of(sendEmailSuccess()) : getErrorPayload(err).pipe(map(payload => sendEmailError(payload)))\n\t\t\t\t)\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function validateResetTokenEpic(action$: Observable<PayloadAction<string> & { meta: () => void }>) {\n\treturn action$.pipe(\n\t\tofType(validateResetToken.type),\n\t\tswitchMap(({ meta: callback, payload: tokenId }) =>\n\t\t\tPassword.validateResetToken(tokenId).pipe(\n\t\t\t\tmap(({ username }) => validateTokenIdSuccess(username, callback)),\n\t\t\t\tcatchError(err => getErrorPayload(err).pipe(map(payload => validateTokenIdError(payload, callback))))\n\t\t\t)\n\t\t)\n\t);\n}\n\nexport function validateResetTokenCallbackEpic(action$: Observable<PayloadAction & { meta: () => void }>) {\n\treturn action$.pipe(\n\t\tfilter(({ type }) => type === validateTokenIdSuccess.type || type === validateTokenIdError.type),\n\t\ttap(({ meta: callback }) => {\n\t\t\tcallback && callback();\n\t\t}),\n\t\tmap(() => validateResetTokenCallbackComplete())\n\t);\n}\n\n/**\n * Helper functions\n */\n\nfunction getErrorPayload(error: Response | Error | object) {\n\tif (error instanceof Response) {\n\t\treturn of({ message: error.body, status: error.status });\n\t}\n\tif (error instanceof Error) {\n\t\treturn of({ message: error.message, stack: error.stack });\n\t}\n\treturn of(serializable<object>(error));\n}\n","import React, { lazy, Suspense, useEffect } from 'react';\nimport { connect } from 'react-redux';\nimport { Redirect, Route, Switch } from 'react-router-dom';\nimport { bindActionCreators, Dispatch } from 'redux';\nimport './App.scss';\nimport Loader from './components/Loader/Loader';\nimport { fetchingGlobalFlags } from './redux/modules/app';\nimport { RootState } from './redux/root';\nimport { selectAccessToken, selectGlobalFlagsLoaded, selectRole, selectTenant } from './redux/selectors/app';\nimport getLaunchUrl from './services/productLaunch';\nimport { Products } from './constants/products';\nimport PORTAL_URLS from './constants/portalUrls';\nimport { getEnvironment } from './services/network';\nimport URLS from './constants/urls';\nimport { Environment } from './constants/environments';\nimport { ApiServices } from './constants/apiServices';\nimport { UserFlags } from './constants/flags';\nimport useFlag from './hooks/useFlagr';\n\n// Lazy load components\nconst ErrorScreen = lazy(() => import('./components/ErrorScreen/ErrorScreen'));\nconst ForgotPassword = lazy(() => import('./components/ForgotPassword/ForgotPassword'));\nconst ForgotSiteCode = lazy(() => import('./components/ForgotSiteCode/ForgotSiteCode'));\nconst Login = lazy(() => import('./components/Login/Login'));\nconst ProductSelectionScreen = lazy(() => import('./components/ProductSelectionScreen/ProductSelectionScreen'));\nconst ResetPassword = lazy(() => import('./components/ResetPassword/ResetPassword'));\nconst SignOut = lazy(() => import('./components/SignOut/SignOut'));\n\ninterface AppProps {\n\taccessToken?: string;\n\tflagrActions: {\n\t\tinitialize: () => void;\n\t};\n\trole?: string;\n\ttenant?: string;\n\tflagsLoaded: boolean;\n}\n\nfunction App({ accessToken, flagrActions, role, tenant, flagsLoaded }: AppProps) {\n\tuseEffect(() => {\n\t\tlocalStorage.removeItem('oidcSessionId');\n\t}, []);\n\n\tuseEffect(() => {\n\t\tflagrActions.initialize();\n\t}, [flagrActions]);\n\n\tconst EnableReadOnlyILSiteAdminRedirectToMaestro = useFlag(UserFlags.EnableReadOnlyILSiteAdminRedirectToMaestro)?.variantKey === 'on';\n\tlocalStorage.removeItem('oidcSessionId');\n\n\t//redirect ALA tenant users\n\tif (tenant && tenant === 'Tenant.ALA') {\n\t\tconst launchUrl = getLaunchUrl(Products.MyPathPortal, PORTAL_URLS, getEnvironment(), false, undefined);\n\t\tif (launchUrl !== undefined) {\n\t\t\twindow.location.href = launchUrl;\n\t\t\treturn <Loader />;\n\t\t}\n\t}\n\n\tif (EnableReadOnlyILSiteAdminRedirectToMaestro) {\n\t\tif (accessToken && role === 'ReadOnlyILSiteAdmin') {\n\t\t\tconst launchUrl = URLS[getEnvironment() || Environment.Production][ApiServices.Maestro];\n\t\t\tif (launchUrl) {\n\t\t\t\twindow.location.href = launchUrl;\n\t\t\t\treturn <Loader />;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (accessToken && role && /^il/i.test(role)) {\n\t\t// ILSiteAdmin or ILAdmin roles.\n\t\tconst launchUrl = getLaunchUrl(Products.ILE, PORTAL_URLS, getEnvironment(), false, undefined);\n\t\tif (launchUrl !== undefined) {\n\t\t\twindow.location.href = launchUrl;\n\t\t\treturn <Loader />;\n\t\t}\n\t}\n\n\tif (!flagsLoaded) {\n\t\treturn <Loader />; // Wait for flags to load. This is so we can use RemoveIlAuthFallback flag from first \"real\" render of login screen.\n\t}\n\n\treturn (\n\t\t<Suspense fallback={<Loader />}>\n\t\t\t<Switch>\n\t\t\t\t<Route path=\"/error\" component={ErrorScreen} />\n\t\t\t\t<Route path=\"/forgotSiteCode\" component={ForgotSiteCode} />\n\t\t\t\t<Route path=\"/productSelection\" component={ProductSelectionScreen} />\n\t\t\t\t<Route path=\"/resetPassword/:token\" component={ResetPassword} />\n\t\t\t\t<Route path=\"/resetPassword\" component={ForgotPassword} />\n\t\t\t\t<Route path=\"/signin\" component={Login} />\n\t\t\t\t<Route path=\"/signout\" component={SignOut} />\n\t\t\t\t<Route path=\"/\">\n\t\t\t\t\t<Redirect to=\"/signin\" />\n\t\t\t\t</Route>\n\t\t\t</Switch>\n\t\t</Suspense>\n\t);\n}\n\nconst mapStateToProps = (state: RootState) => ({\n\taccessToken: selectAccessToken(state),\n\trole: selectRole(state),\n\ttenant: selectTenant(state),\n\tflagsLoaded: selectGlobalFlagsLoaded(state)\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n\tflagrActions: bindActionCreators({ initialize: fetchingGlobalFlags }, dispatch)\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(App);\n","import { combineReducers } from 'redux';\nimport { combineEpics } from 'redux-observable';\nimport { persistReducer } from 'redux-persist';\nimport storage from 'redux-persist/lib/storage';\nimport app, { getGlobalFlagsEpic } from './modules/app';\nimport loginForm, { lookupSiteCodeEpic, validateSiteCodeEpic } from './modules/loginForm';\nimport oidc, { completeSigninEpic, handlePostLogoutEpic, signinErrorEpic } from './modules/oidc';\nimport productLauncher, {\n\tlaunchProductAfterCaliperEpic,\n\tlaunchProductAtUrlEpic,\n\tlaunchProductEpic,\n\trequestOneTimeTokenEpic\n} from './modules/productLauncher';\nimport productSelection, {\n\tgetProductsAfterFlagsEpic,\n\tgetUserFlagsEpic,\n\tanalyticsIdentifyUserEpic,\n\tanalyticsUpdateOptionsEpic\n} from './modules/productSelection';\nimport resetPassword, {\n\tsendResetEmailEpic,\n\tsetPasswordCompleteEpic,\n\tsetPasswordEpic,\n\tvalidateResetTokenCallbackEpic,\n\tvalidateResetTokenEpic\n} from './modules/resetPassword';\nimport webCam from './modules/webCam';\nimport caliperReducer, { caliperSessionEventEpic } from './modules/caliper';\n\nexport const rootEpic = combineEpics(\n\tcompleteSigninEpic,\n\tgetUserFlagsEpic,\n\tanalyticsIdentifyUserEpic,\n\tanalyticsUpdateOptionsEpic,\n\tgetProductsAfterFlagsEpic,\n\thandlePostLogoutEpic,\n\tlaunchProductAtUrlEpic,\n\tlaunchProductEpic,\n\tlookupSiteCodeEpic,\n\trequestOneTimeTokenEpic,\n\tsendResetEmailEpic,\n\tsetPasswordCompleteEpic,\n\tsetPasswordEpic,\n\tsigninErrorEpic,\n\tvalidateResetTokenEpic,\n\tvalidateResetTokenCallbackEpic,\n\tvalidateSiteCodeEpic,\n\tgetGlobalFlagsEpic,\n\tcaliperSessionEventEpic,\n\tlaunchProductAfterCaliperEpic\n);\n\nexport const rootReducer = combineReducers({\n\tapp: persistReducer(\n\t\t{\n\t\t\tkey: 'app',\n\t\t\tstorage,\n\t\t\twhitelist: ['productQueryStrings', 'returnUrl']\n\t\t},\n\t\tapp\n\t),\n\tloginForm: persistReducer(\n\t\t{\n\t\t\tkey: 'loginForm',\n\t\t\tstorage,\n\t\t\twhitelist: ['isEducator', 'siteCode', 'loginType']\n\t\t},\n\t\tloginForm\n\t),\n\toidc,\n\tproductLauncher,\n\tproductSelection,\n\tresetPassword,\n\twebCam,\n\tcaliperReducer\n});\n\nexport type RootState = ReturnType<typeof rootReducer>;\n\nexport default rootReducer;\n","import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit';\nimport { createEpicMiddleware } from 'redux-observable';\nimport { error as loginFormError, lookupSiteCode } from './modules/loginForm';\nimport { signinError } from './modules/oidc';\nimport { analyticsError, createAnalyticsMiddleware, productPermissionsError } from './modules/productSelection';\nimport {\n\tsetPassword,\n\tsetPasswordError,\n\tsetPasswordSuccess,\n\tvalidateResetToken,\n\tvalidateTokenIdError,\n\tvalidateTokenIdSuccess\n} from './modules/resetPassword';\nimport { rootEpic, rootReducer } from './root';\n\nconst analyticsMiddleware = createAnalyticsMiddleware();\nconst epicMiddleware = createEpicMiddleware();\nconst defaultMiddleware = getDefaultMiddleware({\n\tserializableCheck: {\n\t\tignoredActions: [\n\t\t\t// 👇 These are from a 3rd party library, so we'll just have to ignore them.\n\t\t\t'persist/PERSIST',\n\t\t\t'persist/REHYDRATE',\n\t\t\t// 👇 These contain a callback used by middleware, but not serialized in the store.\n\t\t\tlookupSiteCode.type,\n\t\t\tsetPassword.type,\n\t\t\tsetPasswordError.type,\n\t\t\tsetPasswordSuccess.type,\n\t\t\tvalidateResetToken.type,\n\t\t\tvalidateTokenIdError.type,\n\t\t\tvalidateTokenIdSuccess.type,\n\t\t\t// 👇 These may contain an error object.\n\t\t\tanalyticsError.type,\n\t\t\tloginFormError.type,\n\t\t\tproductPermissionsError.type,\n\t\t\tsigninError.type\n\t\t]\n\t}\n});\nconst middleware = [analyticsMiddleware, epicMiddleware, ...defaultMiddleware];\n\nconst reduxStore = configureStore({\n\treducer: rootReducer,\n\tmiddleware\n});\n\nepicMiddleware.run(rootEpic);\n\nexport default reduxStore;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n\twindow.location.hostname === 'localhost' ||\n\t\t// [::1] is the IPv6 localhost address.\n\t\twindow.location.hostname === '[::1]' ||\n\t\t// 127.0.0.0/8 are considered localhost for IPv4.\n\t\twindow.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\ntype Config = {\n\tonSuccess?: (registration: ServiceWorkerRegistration) => void;\n\tonUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n\tif (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n\t\t// The URL constructor is available in all browsers that support SW.\n\t\tconst publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n\t\tif (publicUrl.origin !== window.location.origin) {\n\t\t\t// Our service worker won't work if PUBLIC_URL is on a different origin\n\t\t\t// from what our page is served on. This might happen if a CDN is used to\n\t\t\t// serve assets; see https://github.com/facebook/create-react-app/issues/2374\n\t\t\treturn;\n\t\t}\n\n\t\twindow.addEventListener('load', () => {\n\t\t\tconst swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n\t\t\tif (isLocalhost) {\n\t\t\t\t// This is running on localhost. Let's check if a service worker still exists or not.\n\t\t\t\tcheckValidServiceWorker(swUrl, config);\n\n\t\t\t\t// Add some additional logging to localhost, pointing developers to the\n\t\t\t\t// service worker/PWA documentation.\n\t\t\t\tnavigator.serviceWorker.ready.then(() => {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'This web app is being served cache-first by a service ' + 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Is not localhost. Just register service worker\n\t\t\t\tregisterValidSW(swUrl, config);\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n\tnavigator.serviceWorker\n\t\t.register(swUrl)\n\t\t.then(registration => {\n\t\t\tregistration.onupdatefound = () => {\n\t\t\t\tconst installingWorker = registration.installing;\n\t\t\t\tif (installingWorker == null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tinstallingWorker.onstatechange = () => {\n\t\t\t\t\tif (installingWorker.state === 'installed') {\n\t\t\t\t\t\tif (navigator.serviceWorker.controller) {\n\t\t\t\t\t\t\t// At this point, the updated precached content has been fetched,\n\t\t\t\t\t\t\t// but the previous service worker will still serve the older\n\t\t\t\t\t\t\t// content until all client tabs are closed.\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t'New content is available and will be used when all ' +\n\t\t\t\t\t\t\t\t\t'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// Execute callback\n\t\t\t\t\t\t\tif (config && config.onUpdate) {\n\t\t\t\t\t\t\t\tconfig.onUpdate(registration);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// At this point, everything has been precached.\n\t\t\t\t\t\t\t// It's the perfect time to display a\n\t\t\t\t\t\t\t// \"Content is cached for offline use.\" message.\n\t\t\t\t\t\t\tconsole.log('Content is cached for offline use.');\n\n\t\t\t\t\t\t\t// Execute callback\n\t\t\t\t\t\t\tif (config && config.onSuccess) {\n\t\t\t\t\t\t\t\tconfig.onSuccess(registration);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\t\t})\n\t\t.catch(error => {\n\t\t\tconsole.error('Error during service worker registration:', error);\n\t\t});\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n\t// Check if the service worker can be found. If it can't reload the page.\n\tfetch(swUrl, {\n\t\theaders: { 'Service-Worker': 'script' }\n\t})\n\t\t.then(response => {\n\t\t\t// Ensure service worker exists, and that we really are getting a JS file.\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n\t\t\t\t// No service worker found. Probably a different app. Reload the page.\n\t\t\t\tnavigator.serviceWorker.ready.then(registration => {\n\t\t\t\t\tregistration.unregister().then(() => {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Service worker found. Proceed as normal.\n\t\t\t\tregisterValidSW(swUrl, config);\n\t\t\t}\n\t\t})\n\t\t.catch(() => {\n\t\t\tconsole.log('No internet connection found. App is running in offline mode.');\n\t\t});\n}\n\nexport function unregister() {\n\tif ('serviceWorker' in navigator) {\n\t\tnavigator.serviceWorker.ready.then(registration => {\n\t\t\tregistration.unregister();\n\t\t});\n\t}\n}\n","import './polyfills'; // MUST BE FIRST LINE\nimport { createBrowserHistory } from 'history';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport Modal from 'react-modal';\nimport { Provider } from 'react-redux';\nimport { Router } from 'react-router';\nimport { persistStore } from 'redux-persist';\nimport { PersistGate } from 'redux-persist/integration/react';\nimport App from './App';\nimport './fonts/fonts.scss';\nimport './index.scss';\nimport store from './redux/configureStore';\nimport { storeRehydrated } from './redux/modules/loginForm';\nimport { unregister } from './serviceWorker';\n\nconst persistor = persistStore(store, undefined, () => store.dispatch(storeRehydrated()));\n\nconst history = createBrowserHistory();\n\nReactDOM.render(\n\t<Provider store={store}>\n\t\t<PersistGate persistor={persistor}>\n\t\t\t<Router history={history}>\n\t\t\t\t<App />\n\t\t\t</Router>\n\t\t</PersistGate>\n\t</Provider>,\n\tdocument.getElementById('root')\n);\n\nModal.setAppElement('#root');\n\nunregister();\n","import { UrlMap } from '../types/urlMap';\nimport { VersionMap } from '../types/versionMap';\nimport { ApiServices } from './apiServices';\nimport { Environment } from './environments';\n\nconst URLS: UrlMap = {\n\t[Environment.Development]: {\n\t\t[ApiServices.Auth]: 'https://testapi.imaginelearning.com',\n\t\t[ApiServices.Manager]: 'https://testmanager.my.imaginelearning.com',\n\t\t[ApiServices.Authority]: 'https://testapi.imaginelearning.com',\n\t\t[ApiServices.Redirect]: 'https://localhost:5001/productSelection',\n\t\t[ApiServices.PostLogoutRedirect]: 'https://localhost:5001/signin',\n\t\t[ApiServices.ILU]: 'https://university.test.imaginelearning.com/',\n\t\t[ApiServices.Permissions]: 'https://testapi.imaginelearning.com',\n\t\t[ApiServices.Flagr]: 'https://admin.imlp-dev.edgenuityapp.com/api/flags/',\n\t\t[ApiServices.Logger]: 'https://testlogger.my.imaginelearning.com',\n\t\t[ApiServices.Imlp]: 'https://identity.qa.edgenuityapp.com/api',\n\t\t[ApiServices.Imlp2]: 'https://identity-qa.imaginelearning.com/api',\n\t\t[ApiServices.Import]: 'https://test.my.imaginelearning.com/import',\n\t\t[ApiServices.Caliper]: 'https://events.qa.edgenuityapp.com/api/caliper/v1/caliper/event',\n\t\t[ApiServices.ContextEnvironment]: 'http://edgenuity.com/events/',\n\t\t[ApiServices.CustomerToolsUI]: 'https://usermanagement.dev.imaginelearning.com',\n\t\t[ApiServices.Registration]: 'https://registration-api.readiness-qa-app.wna.cloud/api/v2.2',\n\t\t[ApiServices.Maestro]: 'https://maestro.readiness-dev-app.wna.cloud'\n\t},\n\t[Environment.Test]: {\n\t\t[ApiServices.Auth]: 'https://testapi.imaginelearning.com',\n\t\t[ApiServices.Manager]: 'https://testmanager.my.imaginelearning.com',\n\t\t[ApiServices.Authority]: 'https://testapi.imaginelearning.com',\n\t\t[ApiServices.Redirect]: 'https://testapi.imaginelearning.com/productSelection',\n\t\t[ApiServices.PostLogoutRedirect]: 'https://testapi.imaginelearning.com/signin',\n\t\t[ApiServices.ILU]: 'https://university.test.imaginelearning.com/',\n\t\t[ApiServices.Permissions]: 'https://testapi.imaginelearning.com',\n\t\t[ApiServices.Flagr]: 'https://admin.imlp-qa.edgenuityapp.com/api/flags/',\n\t\t[ApiServices.Logger]: 'https://testlogger.my.imaginelearning.com',\n\t\t[ApiServices.Imlp]: 'https://identity.qa.edgenuityapp.com/api',\n\t\t[ApiServices.Imlp2]: 'https://identity-qa.imaginelearning.com/api',\n\t\t[ApiServices.Import]: 'https://test.my.imaginelearning.com/import',\n\t\t[ApiServices.Caliper]: 'https://events.qa.edgenuityapp.com/api/caliper/v1/caliper/event',\n\t\t[ApiServices.ContextEnvironment]: 'http://edgenuity.com/events/',\n\t\t[ApiServices.CustomerToolsUI]: 'https://usermanagement.qa.imaginelearning.com',\n\t\t[ApiServices.Registration]: 'https://registration-api.readiness-qa-app.wna.cloud/api/v2.2',\n\t\t[ApiServices.Maestro]: 'https://maestro.readiness-qa-app.wna.cloud'\n\t},\n\t[Environment.Rc]: {\n\t\t[ApiServices.Auth]: 'https://rcapi.imaginelearning.com',\n\t\t[ApiServices.Manager]: 'https://rcmanager.my.imaginelearning.com',\n\t\t[ApiServices.Authority]: 'https://rcapi.imaginelearning.com',\n\t\t[ApiServices.Redirect]: 'https://rcapi.imaginelearning.com/productSelection',\n\t\t[ApiServices.PostLogoutRedirect]: 'https://rcapi.imaginelearning.com/signin',\n\t\t[ApiServices.ILU]: 'https://university.test.imaginelearning.com/',\n\t\t[ApiServices.Permissions]: 'https://rcapi.imaginelearning.com',\n\t\t[ApiServices.Flagr]: 'https://admin.imlp-staging.edgenuityapp.com/api/flags/',\n\t\t[ApiServices.Logger]: 'https://rclogger.my.imaginelearning.com',\n\t\t[ApiServices.Imlp]: 'https://identity.staging.edgenuityapp.com/api',\n\t\t[ApiServices.Imlp2]: 'https://identity-staging.imaginelearning.com/api',\n\t\t[ApiServices.Import]: 'https://rc.my.imaginelearning.com/import/',\n\t\t[ApiServices.Caliper]: 'https://events.staging.edgenuityapp.com/api/caliper/v1/caliper/event',\n\t\t[ApiServices.ContextEnvironment]: 'http://edgenuity.com/events/',\n\t\t[ApiServices.CustomerToolsUI]: 'https://usermanagement.staging.imaginelearning.com',\n\t\t[ApiServices.Registration]: 'https://registration-api.readiness-staging-app.wna.cloud/api/v2.2',\n\t\t[ApiServices.Maestro]: 'https://maestro.readiness-staging-app.wna.cloud'\n\t},\n\t[Environment.Production]: {\n\t\t[ApiServices.Auth]: 'https://api.imaginelearning.com',\n\t\t[ApiServices.Manager]: 'https://manager.my.imaginelearning.com',\n\t\t[ApiServices.Authority]: 'https://api.imaginelearning.com',\n\t\t[ApiServices.Redirect]: 'https://api.imaginelearning.com/productSelection',\n\t\t[ApiServices.PostLogoutRedirect]: 'https://api.imaginelearning.com/signin',\n\t\t[ApiServices.ILU]: 'https://university.imaginelearning.com/',\n\t\t[ApiServices.Permissions]: 'https://api.imaginelearning.com',\n\t\t[ApiServices.Flagr]: 'https://identity.imaginelearning.com/api/flags/',\n\t\t[ApiServices.Logger]: 'https://logger.my.imaginelearning.com',\n\t\t[ApiServices.Imlp]: 'https://identity.app.edgenuity.com/api',\n\t\t[ApiServices.Imlp2]: 'https://identity.imaginelearning.com/api',\n\t\t[ApiServices.Import]: 'https://my.imaginelearning.com/import/',\n\t\t[ApiServices.Caliper]: 'https://events.imaginelearning.com/api/caliper/v1/caliper/event',\n\t\t[ApiServices.ContextEnvironment]: 'http://edgenuity.com/events/',\n\t\t[ApiServices.CustomerToolsUI]: 'https://usermanagement.imaginelearning.com',\n\t\t[ApiServices.Registration]: 'https://registration-api.readiness-prod-app.wna.cloud/api/v2.2',\n\t\t[ApiServices.Maestro]: 'https://maestro.readiness-prod-app.wna.cloud/'\n\t}\n};\n\nexport default URLS;\n\nexport const LEGACY_APP = 'https://go.imaginelearning.com';\n\nexport const VERSIONS: VersionMap = {\n\t[Environment.Development]: {\n\t\t[ApiServices.Manager]: 'vLatest',\n\t\t[ApiServices.Permissions]: 'v1.0',\n\t\t[ApiServices.Logger]: 'v0.2',\n\t\t[ApiServices.ContextEnvironment]: '0-0-1'\n\t},\n\t[Environment.Test]: {\n\t\t[ApiServices.Manager]: 'v2.2',\n\t\t[ApiServices.Permissions]: 'v1.0',\n\t\t[ApiServices.Logger]: 'v0.2',\n\t\t[ApiServices.ContextEnvironment]: '0-0-1'\n\t},\n\t[Environment.Rc]: {\n\t\t[ApiServices.Manager]: 'v2.2',\n\t\t[ApiServices.Permissions]: 'v1.0',\n\t\t[ApiServices.Logger]: 'v0.2',\n\t\t[ApiServices.ContextEnvironment]: '0-0-1'\n\t},\n\t[Environment.Production]: {\n\t\t[ApiServices.Manager]: 'v2.2',\n\t\t[ApiServices.Permissions]: 'v1.0',\n\t\t[ApiServices.Logger]: 'v0.2',\n\t\t[ApiServices.ContextEnvironment]: '0-0-1'\n\t}\n};\n","import { Dictionary } from '../types/dictionary';\n\nexport function parseUrlPart(queryString: string) {\n\tif (!queryString) {\n\t\treturn {};\n\t}\n\n\t// Replace leading '?'\n\tconst cleanedStr = queryString.replace(/^(\\?|#)/, '');\n\n\t// Split into individual key-value pairs\n\tconst kvPairs = cleanedStr.split('&');\n\n\treturn kvPairs.reduce((accumulator, kvPairString) => {\n\t\tconst index = kvPairString.indexOf('=');\n\t\tlet key: string;\n\t\tlet value = '';\n\t\tif (index < 0) {\n\t\t\tkey = kvPairString;\n\t\t} else {\n\t\t\tkey = kvPairString.substring(0, index);\n\t\t\tvalue = kvPairString.substring(index + 1);\n\t\t}\n\t\tkey = decodeURIComponent(key);\n\t\tvalue = decodeURIComponent(value);\n\n\t\treturn {\n\t\t\t...accumulator,\n\t\t\t[key]: value\n\t\t};\n\t}, {} as Dictionary<string>);\n}\n\nexport const parseQueryString = parseUrlPart(window.location.search);\nexport const parseHashString = parseUrlPart(window.location.hash);\n","export enum ApiServices {\n\tAuth = 'auth',\n\tManager = 'manager',\n\tAuthority = 'authority',\n\tRedirect = 'redirect',\n\tPostLogoutRedirect = 'postLogoutRedirect',\n\tILU = 'ilu',\n\tPermissions = 'permissions',\n\tFlagr = 'flagr',\n\tLogger = 'logger',\n\tImlp = 'imlp',\n\tImlp2 = 'imlp2',\n\tImport = 'import',\n\tCaliper = 'caliper',\n\tContextEnvironment = 'contextenvironment',\n\tCustomerToolsUI = 'customerToolsUI',\n\tRegistration = 'registration',\n\tMaestro = 'maestro'\n}\n","export enum UserFlags {\n\tAutoLaunchGalileo = 'kd9jy5cfn9i47y613', //Auto-Launch-Assessment in Flagr\n\tRedirectSpanishWhenPendingAssessment = 'RedirectSpanishWhenPendingAssessment',\n\tEnableRobotify = 'EnableRobotify',\n\tEnableNativeApp = 'EnableNativeApp',\n\tEnableReadOnlyILSiteAdminRedirectToMaestro = 'EnableReadOnlyILSiteAdminRedirectToMaestro',\n\tNavbarImpersonationAndLogoutRevamp = 'NavbarImpersonationAndLogoutRevamp',\n\tForceDisplayLicensedRobotify = 'ForceDisplayLicensedRobotify',\n\tTurnOffAssessmentBanner = 'TurnOffAssessmentBanner',\n\tFilterByAgentILMobileWebView = 'FilterByAgentILMobileWebView',\n\tDisableLangLit20thAnniversary = 'DisableLangLit20thAnniversary'\n}\n\nexport enum GlobalFlags {\n\tEnableRobotify = 'EnableRobotify',\n\tExtendedEducatorsErrorOnInvalidLogin = 'ExtendedEducatorsErrorOnInvalidLogin',\n\tRemoveIlAuthFallback = 'RemoveIlAuthFallback'\n}\n","export enum ProductDisabledReasons {\n\tNotRosteredWithNWEA = 'NotRosteredWithNWEA',\n\tOrganizationNotLicensed = 'OrganizationNotLicensed',\n\tPendingAssessmentLockout = 'PendingAssessmentLockout',\n\tProductHidden = 'ProductHidden',\n\tNotEnrolledWithProviderProduct = 'NotEnrolledWithProviderProduct',\n\tOrganizationNotLicensedForProviderProduct = 'OrganizationNotLicensedForProviderProduct'\n}\n","import { Dictionary } from '../types/dictionary';\nimport { Products } from './products';\n\nexport const PRODUCT_NAMES: Dictionary<string> = {\n\t[Products.Galileo]: 'Imagine Assessment: Galileo',\n\t[Products.ILE]: 'Imagine Language & Literacy',\n\t[Products.IM]: 'Imagine Math',\n\t[Products.IMF]: 'Imagine Math Facts',\n\t[Products.Reader]: 'Imagine Reading',\n\t[Products.Spanish]: 'Imagine Español',\n\t[Products.Lectura]: 'Imagine Lectura',\n\t[Products.MyPathMath]: 'Imagine MyPath Math',\n\t[Products.MyPathReading]: 'Imagine MyPath Reading',\n\t[Products.Science]: 'Imagine MyPath Science',\n\t[Products.Purpose]: 'Imagine Purpose Prep',\n\t[Products.Traverse]: 'Imagine Traverse',\n\t[Products.Robotify]: 'Robotify',\n\t[Products.IPA]: 'Imagine+ Assessment'\n};\n","import { ProductPermissionsProduct } from '../services/permissions';\nimport { Dictionary } from '../types/dictionary';\nimport { PRODUCT_NAMES } from './productNames';\nimport { Products } from './products';\n\nexport interface FakeProduct extends ProductPermissionsProduct {\n\tdescription: string;\n}\n\nexport const FakeProducts: Dictionary<FakeProduct> = {\n\t[Products.ILE]: {\n\t\tproduct: Products.ILE,\n\t\tdescription: PRODUCT_NAMES.ILE,\n\t\tstatus: 'Enabled',\n\t\tassessmentLockout: {\n\t\t\tstatus: 'None',\n\t\t\tprovider: 'ATI',\n\t\t\turl: 'https://aws-dev.ati-online.com/StudentCenter/ILToGalileoRedirect/Index'\n\t\t}\n\t} as FakeProduct,\n\t[Products.Spanish]: {\n\t\tproduct: Products.Spanish,\n\t\tdescription: PRODUCT_NAMES.Spanish,\n\t\tstatus: 'Disabled',\n\t\tassessmentLockout: {\n\t\t\tstatus: 'None',\n\t\t\tprovider: 'ATI',\n\t\t\turl: 'https://aws-dev.ati-online.com/StudentCenter/ILToGalileoRedirect/Index'\n\t\t}\n\t} as FakeProduct,\n\t[Products.Reader]: {\n\t\tproduct: Products.Reader,\n\t\tdescription: PRODUCT_NAMES.Reader,\n\t\tstatus: 'Enabled'\n\t} as FakeProduct,\n\t[Products.AdaptiveAssessment]: {\n\t\tproduct: Products.AdaptiveAssessment,\n\t\tdescription: PRODUCT_NAMES.AdaptiveAssessment,\n\t\tstatus: 'Enabled'\n\t} as FakeProduct,\n\t[Products.MyPathMath]: {\n\t\tproduct: Products.MyPathMath,\n\t\tdescription: PRODUCT_NAMES.MyPathMath,\n\t\tstatus: 'Enabled'\n\t} as FakeProduct,\n\t[Products.MyPathReading]: {\n\t\tproduct: Products.MyPathReading,\n\t\tdescription: PRODUCT_NAMES.MyPathReading,\n\t\tstatus: 'Enabled'\n\t} as FakeProduct,\n\t[Products.Traverse]: {\n\t\tproduct: Products.Traverse,\n\t\tdescription: PRODUCT_NAMES.Traverse,\n\t\tstatus: 'Enabled'\n\t} as FakeProduct\n};\n\nexport default FakeProducts;\n","import { Observable } from 'rxjs';\nimport { ApiServices } from '../constants/apiServices';\nimport { AssessmentProviders } from '../constants/assessmentProviders';\nimport { ProductDisabledReasons } from '../constants/productDisabledReasons';\nimport { Products } from '../constants/products';\nimport http from './http';\nimport { getEnvironment, getServiceVersion, getUrl } from './network';\n\nconst environment = getEnvironment();\nconst version = getServiceVersion(ApiServices.Permissions, environment);\nconst baseUrl = `${getUrl(ApiServices.Permissions, environment)}/${version}/permissions`;\n\nexport interface AssessmentLockout {\n\tstatus?: string;\n\tprovider?: AssessmentProviders;\n\turl?: string;\n}\n\nexport interface ProductPermissionsAssessmentRecommended {\n\tprovider: AssessmentProviders;\n\turl: string;\n}\n\nexport interface ProductPermissionsProduct {\n\tassessmentLockout?: AssessmentLockout;\n\tdisabledReason?: ProductDisabledReasons;\n\tproduct: string;\n\tstatus?: string;\n\turl?: string;\n\tsortOrder?: number;\n}\n\nexport interface ProductPermissionsResponse {\n\tassessmentRecommended?: ProductPermissionsAssessmentRecommended;\n\tproducts: ProductPermissionsProduct[];\n\tsetupHelp?: ProductPermissionsSetupHelp;\n}\n\nexport interface ProductPermissionsSetupHelp {\n\trosterDashboard: Products;\n\tscheduleDashboard: Products;\n}\n\nexport function getProductPermissions(userId: string, token: string): Observable<ProductPermissionsResponse> {\n\tconst url = `${baseUrl}/user/${userId}/products`;\n\treturn http(url)\n\t\t.bearer(token)\n\t\t.get<ProductPermissionsResponse>();\n}\n","import { AnalyticsUser, Organization } from '../types/analyticsUser';\nimport { PendoConfig } from '../types/pendo';\nimport { Product } from '../types/product';\nimport pendoSnippet from './pendoSnippet';\n\nexport function initSnippet(apiKey?: string) {\n\tif (!apiKey) {\n\t\treturn false;\n\t}\n\n\tpendoSnippet(apiKey)(window, document, 'script', 'pendo');\n\n\treturn true;\n}\n\nexport const initStudentSnippet = () => initSnippet(process.env.REACT_APP_PENDO_API_KEY_STUDENT);\n\nexport const initEducatorSnippet = () => initSnippet(process.env.REACT_APP_PENDO_API_KEY_EDUCATOR);\n\nfunction getStudentInfo(analyticsUser: AnalyticsUser): PendoConfig {\n\tconst organization =\n\t\tanalyticsUser && analyticsUser.organizations && analyticsUser.organizations.length\n\t\t\t? analyticsUser.organizations[0]\n\t\t\t: ({} as Organization);\n\treturn {\n\t\tvisitor: {\n\t\t\tid: analyticsUser.id,\n\t\t\tfirstName: '',\n\t\t\tlastName: '',\n\t\t\tuserName: '',\n\t\t\tsource: analyticsUser.source,\n\t\t\trole: analyticsUser.userType || 'Student',\n\t\t\tgradeLevel: analyticsUser.gradeLevel,\n\t\t\tproducts: analyticsUser.userProducts || [],\n\t\t\trealm: analyticsUser.realm || '',\n\t\t\tssoid: analyticsUser.ssoid || '',\n\t\t\tosVersion: analyticsUser.osVersion || ''\n\t\t},\n\t\taccount: {\n\t\t\tid: organization.id,\n\t\t\tsiteCode: analyticsUser.sites || ''\n\t\t}\n\t};\n}\n\nfunction getEducatorInfo(analyticsUser: AnalyticsUser, products: Product[], resetDate?: string): PendoConfig {\n\tconst organization =\n\t\tanalyticsUser && analyticsUser.organizations && analyticsUser.organizations.length\n\t\t\t? analyticsUser.organizations[0]\n\t\t\t: ({} as Organization);\n\treturn {\n\t\tvisitor: {\n\t\t\tid: analyticsUser.id,\n\t\t\tfirstName: analyticsUser.firstName,\n\t\t\tlastName: analyticsUser.lastName,\n\t\t\tuserName: analyticsUser.username,\n\t\t\tsource: analyticsUser.source,\n\t\t\trole: analyticsUser.userType || 'Teacher',\n\t\t\t//educators don't have userProducts, so we use the products passed in\n\t\t\tproducts: products?.filter(p => p.enabled)?.map(p => p.id) || [],\n\t\t\trealm: analyticsUser.realm || '',\n\t\t\tssoid: analyticsUser.ssoid || '',\n\t\t\tosVersion: analyticsUser.osVersion || '',\n\t\t\tresetDate\n\t\t},\n\t\taccount: {\n\t\t\tid: organization.id,\n\t\t\tsiteCode: organization.siteCode || analyticsUser.sites || ''\n\t\t}\n\t};\n}\n\nfunction getUserInfo(analyticsUser: AnalyticsUser, products: Product[] = [], resetDate?: string) {\n\tif (!analyticsUser) {\n\t\treturn undefined;\n\t}\n\n\treturn analyticsUser.userType && analyticsUser.userType.toUpperCase() === 'STUDENT'\n\t\t? getStudentInfo(analyticsUser)\n\t\t: getEducatorInfo(analyticsUser, products, resetDate);\n}\n\nexport function identify(analyticsUser: AnalyticsUser, products: Product[] = [], resetDate?: string) {\n\tconst args = getUserInfo(analyticsUser, products, resetDate);\n\n\tlet retryTimeout: NodeJS.Timeout;\n\tconst tryIdentify = (count = 0) => {\n\t\tconst instance = window.pendo;\n\t\tif (instance) {\n\t\t\tinstance.initialize(args);\n\t\t} else if (count < 5) {\n\t\t\tretryTimeout = setTimeout(() => tryIdentify(count + 1), 100 * count);\n\t\t} else {\n\t\t\tconsole.error('Unable to obtain global instance of pendo');\n\t\t}\n\t};\n\ttryIdentify();\n\n\treturn () => clearTimeout(retryTimeout);\n}\n\nexport function updateOptions(analyticsUser: AnalyticsUser, products: Product[] = [], resetDate?: string) {\n\tconst args = getUserInfo(analyticsUser, products, resetDate);\n\tconst instance = window.pendo;\n\tif (instance) {\n\t\tinstance.updateOptions(args);\n\t}\n}\n","/* eslint-disable */\nexport default function(apiKey) {\n\treturn (p, e, n, d, o) => {\n\t\tvar v, w, x, y, z;\n\t\to = p[d] = p[d] || {};\n\t\to._q = [];\n\t\tv = ['initialize', 'identify', 'updateOptions', 'pageLoad'];\n\t\tfor (w = 0, x = v.length; w < x; ++w)\n\t\t\t(function(m) {\n\t\t\t\to[m] =\n\t\t\t\t\to[m] ||\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\to._q[m === v[0] ? 'unshift' : 'push']([m].concat([].slice.call(arguments, 0)));\n\t\t\t\t\t};\n\t\t\t})(v[w]);\n\t\ty = e.createElement(n);\n\t\ty.async = !0;\n\t\ty.src = 'https://content.readiness.imaginelearning.com/agent/static/' + apiKey + '/pendo.js';\n\t\tz = e.getElementsByTagName(n)[0];\n\t\tz.parentNode.insertBefore(y, z);\n\t};\n}\n","import { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ApiServices } from '../constants/apiServices';\nimport { AnalyticsUser } from '../types/analyticsUser';\nimport http from './http';\nimport jwt from './jwt';\nimport { getEnvironment, getManagerUrl, getServiceVersion } from './network';\nimport { osVersion, osName } from 'react-device-detect';\n\nconst environment = getEnvironment();\nconst version = getServiceVersion(ApiServices.Manager, environment);\nconst baseUrl = `${getManagerUrl(environment)}/${version}`;\n\nexport function getAnalyticsUser(token: string): Observable<AnalyticsUser> {\n\tconst user = jwt(token);\n\tconst role = user.role.toUpperCase();\n\n\t// Currently organization info is only used for analytics,\n\t// so we can exlude ILAdmins and ILSiteAdmins\n\tif (/^IL/.test(role)) {\n\t\treturn of({} as AnalyticsUser);\n\t}\n\n\treturn http(`${baseUrl}/${role === 'STUDENT' ? 'students' : 'users'}/${user.studentId}?additionalfields=organizations`)\n\t\t.bearer(token)\n\t\t.get<AnalyticsUser>()\n\t\t.pipe(\n\t\t\tmap(analyticsUser => {\n\t\t\t\tanalyticsUser.sites = user.sites;\n\t\t\t\tanalyticsUser.userProducts = user.userProducts;\n\t\t\t\tanalyticsUser.userType = user.role;\n\t\t\t\tanalyticsUser.osVersion = osName + osVersion;\n\t\t\t\treturn analyticsUser;\n\t\t\t})\n\t\t);\n}\n","import { Action, Middleware, PayloadAction, createAction, createReducer } from '@reduxjs/toolkit';\nimport sortBy from 'lodash-es/sortBy';\nimport { ofType, StateObservable } from 'redux-observable';\nimport { RootStateOrAny } from 'react-redux';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, switchMap, map, withLatestFrom, timeout } from 'rxjs/operators';\nimport { AssessmentProviders } from '../../constants/assessmentProviders';\nimport { AssessmentStatuses } from '../../constants/assessmentStatuses';\nimport fakeProducts from '../../constants/fakeProducts';\nimport { ProductDisabledReasons } from '../../constants/productDisabledReasons';\nimport { PRODUCT_NAMES } from '../../constants/productNames';\nimport { Products } from '../../constants/products';\nimport {\n\tAssessmentLockout,\n\tgetProductPermissions,\n\tProductPermissionsAssessmentRecommended,\n\tProductPermissionsProduct,\n\tProductPermissionsSetupHelp\n} from '../../services/permissions';\nimport { selectAccessToken, selectEnvironment, selectRole, selectUser } from '../../redux/selectors/app';\nimport { Product } from '../../types/product';\nimport { API_TIMEOUT_MS, EntityContext, evaluateUserBatch, EvaluationResult } from '../../services/flagr';\nimport { User } from '../../types/user';\nimport { UserFlags } from '../../constants/flags';\nimport { selectProducts, selectUserFlagEvaluationResults } from '../selectors/productSelection';\nimport {\n\tidentify as pendoIdentify,\n\tupdateOptions as pendoUpdateOptions,\n\tinitEducatorSnippet,\n\tinitStudentSnippet\n} from '../../services/pendo';\nimport { getAnalyticsUser } from '../../services/analyticsUser';\nimport { determineUseNativeAppBehavior } from './native';\n/**\n * Action creators\n */\n\nexport const getProducts = createAction('universal-login-page/productSelection/PRODUCT_PERMISSIONS_REQUEST');\nexport const productPermissionsAssessmentRecommendedReceived = createAction<ProductPermissionsAssessmentRecommended>(\n\t'universal-login-page/productSelection/PRODUCT_PERMISSIONS_ASSESSMENT_RECOMMENDED_RECEIVED'\n);\nexport const productPermissionsError = createAction<Response | Error | object>(\n\t'universal-login-page/productSelection/PRODUCT_PERMISSIONS_ERROR'\n);\nexport const productPermissionsProductsReceived = createAction<ProductPermissionsProduct[]>(\n\t'universal-login-page/productSelection/PRODUCT_PERMISSIONS_PRODUCTS_RECEIVED'\n);\nexport const productPermissionsSetupHelpReceived = createAction<ProductPermissionsSetupHelp>(\n\t'universal-login-page/productSelection/PRODUCT_PERMISSIONS_SETUP_HELP_RECEIVED'\n);\nexport const productPermissionsSuccess = createAction('universal-login-page/productSelection/PRODUCT_PERMISSIONS_SUCCESS');\nexport const fetchingUserFlags = createAction('universal-login-page/productSelection/FETCHING_USER_FLAGS');\nexport const flagEvaluationComplete = createAction<EvaluationResult[]>('universal-login-page/productSelection/FLAG_EVALUATION_COMPLETE');\n\nexport const analyticsCleanup = createAction('universal-login-page/productSelection/ANALYTICS_CLEANUP');\nexport const analyticsError = createAction<Error | object>('universal-login-page/productSelection/ANALYTICS_ERROR');\nexport const analyticsIdentifyUser = createAction(\n\t'universal-login-page/productSelection/ANALYTICS_IDENTIFY_USER',\n\t(token: string, resetDate?: string) => ({\n\t\tpayload: {\n\t\t\ttoken,\n\t\t\tresetDate\n\t\t}\n\t})\n);\nexport const analyticsUpdateOptions = createAction(\n\t'universal-login-page/productSelection/ANALYTICS_UPDATE_OPTIONS',\n\t(token: string, resetDate?: string) => ({\n\t\tpayload: {\n\t\t\ttoken,\n\t\t\tresetDate\n\t\t}\n\t})\n);\nexport const analyticsUserUpdated = createAction('universal-login-page/productSelection/ANALYTICS_USER_UPDATED');\nexport const analyticsInitialize = createAction('universal-login-page/productSelection/ANALYTICS_INITIALIZED', role => {\n\tconst payload = role.toUpperCase() === 'STUDENT' ? initStudentSnippet() : initEducatorSnippet();\n\treturn { payload };\n});\nexport const analyticsUserIdentified = createAction('universal-login-page/productSelection/ANALYTICS_USER_IDENTIFIED', canceller => ({\n\tpayload: [canceller]\n}));\n/**\n * Reducer\n */\n\nexport interface ProductSelectionState {\n\tloading: boolean;\n\tflagsLoaded: boolean;\n\tproducts?: Product[];\n\tproductsError?: Response | Error | object;\n\trecommendedAssessmentProvider?: AssessmentProviders;\n\trecommendedAssessmentUrl?: string;\n\tevaluationResults?: EvaluationResult[];\n\trosterDashboard?: Products;\n\tscheduleDashboard?: Products;\n\tsetupRequired: boolean;\n\tanalyticsInitialized: boolean;\n\tanalyticsUserIdentified: boolean;\n}\n\nconst initialState: ProductSelectionState = {\n\tloading: false,\n\tflagsLoaded: false,\n\tsetupRequired: false,\n\tanalyticsInitialized: false,\n\tanalyticsUserIdentified: false\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(productPermissionsError, (state, action) => ({\n\t\t\t...state,\n\t\t\tloading: false,\n\t\t\tproductsError: action.payload\n\t\t}))\n\t\t.addCase(productPermissionsProductsReceived, (state, action) => {\n\t\t\tconst allProducts = action.payload || [];\n\t\t\tconst products = sortBy(\n\t\t\t\tallProducts\n\t\t\t\t\t// Filter out IM and IMF, that don't use universal login yet.\n\t\t\t\t\t.filter(({ product }) => product !== Products.IM && product !== Products.IMF)\n\t\t\t\t\t// Then transform into a model that fits product selection:\n\t\t\t\t\t// { id, name, enabled, assessmentRequired, assessmentProvider, assessmentUrl }\n\t\t\t\t\t.map(prod => {\n\t\t\t\t\t\tconst { assessmentLockout, disabledReason, product, status, sortOrder } = prod;\n\t\t\t\t\t\tconst { status: assessmentStatus, provider, url: assessmentUrl } = assessmentLockout || ({} as AssessmentLockout);\n\t\t\t\t\t\tconst enabled = /enabled/i.test(status || '');\n\t\t\t\t\t\tconst assessmentRequired =\n\t\t\t\t\t\t\t!enabled &&\n\t\t\t\t\t\t\tproduct !== Products.Spanish &&\n\t\t\t\t\t\t\t(disabledReason === ProductDisabledReasons.NotRosteredWithNWEA ||\n\t\t\t\t\t\t\t\tdisabledReason === ProductDisabledReasons.PendingAssessmentLockout ||\n\t\t\t\t\t\t\t\tdisabledReason === ProductDisabledReasons.NotEnrolledWithProviderProduct ||\n\t\t\t\t\t\t\t\tdisabledReason === ProductDisabledReasons.OrganizationNotLicensedForProviderProduct) &&\n\t\t\t\t\t\t\tassessmentStatus !== AssessmentStatuses.Complete &&\n\t\t\t\t\t\t\tassessmentStatus !== AssessmentStatuses.Exempt;\n\t\t\t\t\t\tconst assessmentProvider =\n\t\t\t\t\t\t\tprovider ||\n\t\t\t\t\t\t\t(disabledReason === ProductDisabledReasons.NotRosteredWithNWEA ? AssessmentProviders.NWEA : undefined);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tassessmentProvider,\n\t\t\t\t\t\t\tassessmentRequired,\n\t\t\t\t\t\t\tassessmentStatus,\n\t\t\t\t\t\t\tassessmentUrl,\n\t\t\t\t\t\t\tdisabledReason,\n\t\t\t\t\t\t\tenabled,\n\t\t\t\t\t\t\tid: product as Products,\n\t\t\t\t\t\t\tname: PRODUCT_NAMES[product] || product,\n\t\t\t\t\t\t\tproduct,\n\t\t\t\t\t\t\tsortOrder: sortOrder\n\t\t\t\t\t\t} as Product;\n\t\t\t\t\t}),\n\t\t\t\t(prod: Product) => prod.name.toLowerCase()\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tproducts\n\t\t\t};\n\t\t})\n\t\t.addCase(getProducts, state => ({\n\t\t\t...state,\n\t\t\tloading: true\n\t\t}))\n\t\t.addCase(productPermissionsSetupHelpReceived, (state, action) => {\n\t\t\tconst setupRequired = !!action.payload;\n\t\t\tconst { rosterDashboard, scheduleDashboard } = action.payload || {};\n\t\t\treturn { ...state, rosterDashboard, scheduleDashboard, setupRequired };\n\t\t})\n\t\t.addCase(productPermissionsAssessmentRecommendedReceived, (state, action) => {\n\t\t\tconst { provider: recommendedAssessmentProvider, url: recommendedAssessmentUrl } = action.payload || {};\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\trecommendedAssessmentProvider,\n\t\t\t\trecommendedAssessmentUrl\n\t\t\t};\n\t\t})\n\t\t.addCase(productPermissionsSuccess, state => ({\n\t\t\t...state,\n\t\t\tloading: false\n\t\t}))\n\t\t.addCase(fetchingUserFlags, state => ({\n\t\t\t...state,\n\t\t\tflagsLoaded: false\n\t\t}))\n\t\t.addCase(flagEvaluationComplete, (state, action) => {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tflagsLoaded: true,\n\t\t\t\tevaluationResults: action.payload\n\t\t\t};\n\t\t})\n\t\t.addCase(analyticsInitialize, (state, action) => ({\n\t\t\t...state,\n\t\t\tanalyticsInitialized: action.payload\n\t\t}))\n\t\t.addCase(analyticsUserIdentified, (state, action) => ({\n\t\t\t...state,\n\t\t\tanalyticsUserIdentified: true\n\t\t}))\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport function getProductsAfterFlagsEpic(action$: Observable<Action>, state$: StateObservable<RootStateOrAny>) {\n\treturn action$.pipe(\n\t\tofType(flagEvaluationComplete.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([_, state]) => {\n\t\t\tconst token = selectAccessToken(state) ?? '';\n\t\t\tconst role = selectRole(state) ?? '';\n\t\t\tconst { studentId: userId } = selectUser(state) || ({} as User);\n\n\t\t\tconst evaluationResults = selectUserFlagEvaluationResults(state);\n\t\t\tconst enableRobotifyFlag = evaluationResults?.find(({ flagKey }) => flagKey === UserFlags.EnableRobotify);\n\t\t\tconst enableRobotify = enableRobotifyFlag?.variantKey === 'on';\n\t\t\tconst forceDisplayLicensedRobotifyFlag = evaluationResults?.find(\n\t\t\t\t({ flagKey }) => flagKey === UserFlags.ForceDisplayLicensedRobotify\n\t\t\t);\n\t\t\tconst forceDisplayLicensedRobotify = forceDisplayLicensedRobotifyFlag?.variantKey === 'on';\n\t\t\tconst filterByAgentILMobileWebViewFlag = evaluationResults?.find(\n\t\t\t\t({ flagKey }) => flagKey === UserFlags.FilterByAgentILMobileWebView\n\t\t\t);\n\t\t\tconst filterByAgentILMobileWebView = filterByAgentILMobileWebViewFlag?.variantKey === 'on';\n\n\t\t\tlet userExcludedProducts = !enableRobotify ? [Products.Robotify] : [];\n\n\t\t\t// Filter by agent ILMobileWebView, this will exist when the student is on the native app.\n\t\t\tif (filterByAgentILMobileWebView && role === 'Student') {\n\t\t\t\tconst isNativeAppUser = determineUseNativeAppBehavior(role);\n\t\t\t\tif (isNativeAppUser) {\n\t\t\t\t\tuserExcludedProducts = Object.values(Products).filter(\n\t\t\t\t\t\tproduct => product !== Products.ILE && product !== Products.Spanish\n\t\t\t\t\t); // Exclude everything but ILE and Spanish\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst adminExcludedProducts = userExcludedProducts.concat(Products.AdaptiveAssessment);\n\n\t\t\t// Retrieving products for ILAdmin and ILSiteAdmin users is too expensive.\n\t\t\t// We'll just give them all of them.\n\t\t\tif (/il(site)?admin/i.test(role)) {\n\t\t\t\tconst products = Object.values(Products)\n\t\t\t\t\t// Not including AdaptiveAssessment right now to keep it on the DL\n\t\t\t\t\t.filter(product => !adminExcludedProducts.includes(product))\n\t\t\t\t\t.map(prod => ({ product: prod, status: 'Enabled' } as ProductPermissionsProduct));\n\t\t\t\treturn from([productPermissionsSuccess(), productPermissionsProductsReceived(products)]);\n\t\t\t}\n\n\t\t\t// Bypass permissions service for development/testing\n\t\t\tif (/true|yes|on|1/i.test(process.env.REACT_APP_BYPASS_PRODUCT_PERMISSIONS || '')) {\n\t\t\t\tconst productNames = JSON.parse(process.env.REACT_APP_SHOW_PRODUCTS || '') || Object.keys(fakeProducts);\n\t\t\t\tconst products = productNames.map((prod: string) => fakeProducts[prod] as ProductPermissionsProduct);\n\t\t\t\treturn from([productPermissionsSuccess(), productPermissionsProductsReceived(products)]);\n\t\t\t}\n\n\t\t\treturn getProductPermissions(userId, token).pipe(\n\t\t\t\tswitchMap(({ products, setupHelp, assessmentRecommended }) => {\n\t\t\t\t\t//filter out products that dont exist in enum Products\n\t\t\t\t\tconst productEnumVals: string[] = Object.values(Products);\n\t\t\t\t\tproducts = products.filter(p => productEnumVals.includes(p.product));\n\n\t\t\t\t\tif (forceDisplayLicensedRobotify) {\n\t\t\t\t\t\tproducts = products.map(product => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tproduct.product === Products.Robotify &&\n\t\t\t\t\t\t\t\tproduct.status === 'Disabled' &&\n\t\t\t\t\t\t\t\tproduct.disabledReason === ProductDisabledReasons.ProductHidden\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tproduct.status = 'Enabled';\n\t\t\t\t\t\t\t\tproduct.disabledReason = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn product;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst allowedProducts = products.filter(p => !userExcludedProducts.includes(p.product as Products));\n\t\t\t\t\tconst actions: Action[] = [productPermissionsSuccess(), productPermissionsProductsReceived(allowedProducts)];\n\t\t\t\t\tif (setupHelp) {\n\t\t\t\t\t\tactions.push(productPermissionsSetupHelpReceived(setupHelp));\n\t\t\t\t\t}\n\t\t\t\t\tif (assessmentRecommended) {\n\t\t\t\t\t\tactions.push(productPermissionsAssessmentRecommendedReceived(assessmentRecommended));\n\t\t\t\t\t}\n\t\t\t\t\treturn from(actions);\n\t\t\t\t}),\n\t\t\t\tcatchError(err => of(productPermissionsError(err)))\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function getUserFlagsEpic(action$: Observable<Action>, state$: StateObservable<RootStateOrAny>) {\n\treturn action$.pipe(\n\t\tofType(getProducts.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([_, state]) => {\n\t\t\tconst { sites, studentId: userId, userName } = selectUser(state) || ({} as User);\n\t\t\tconst env = selectEnvironment(state);\n\t\t\tconst role = selectRole(state);\n\t\t\t// Append environment if necessary.\n\t\t\tconst sitecode = env && env !== 'production' ? `${sites}@${env}` : sites;\n\n\t\t\t// The entity context is the information about the user that might be relevant.\n\t\t\tconst entityContext = {\n\t\t\t\tsitecode: sitecode,\n\t\t\t\tuserId: userId,\n\t\t\t\tuserName: userName,\n\t\t\t\trole: role\n\t\t\t} as EntityContext<string>;\n\n\t\t\t// Failure to evaluate is actually okay, and shouldn't block progress at all.\n\t\t\treturn evaluateUserBatch(entityContext, userId, sitecode).pipe(\n\t\t\t\ttimeout(API_TIMEOUT_MS),\n\t\t\t\tmap(({ evaluationResults }) => flagEvaluationComplete(evaluationResults)),\n\t\t\t\tcatchError(async error => {\n\t\t\t\t\tconst emptyResults: EvaluationResult[] = [];\n\t\t\t\t\tconsole.error('error retrieving flags');\n\t\t\t\t\treturn flagEvaluationComplete(emptyResults);\n\t\t\t\t})\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function analyticsIdentifyUserEpic(\n\taction$: Observable<PayloadAction<{ token: string; resetDate?: string }>>,\n\tstate$: StateObservable<RootStateOrAny>\n) {\n\treturn action$.pipe(\n\t\tofType(analyticsIdentifyUser.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([{ payload: { token, resetDate } }, state]) =>\n\t\t\tgetAnalyticsUser(token).pipe(\n\t\t\t\tmap(analyticsUser => {\n\t\t\t\t\tconst products = selectProducts(state);\n\t\t\t\t\tconst canceller = pendoIdentify(analyticsUser, products, resetDate);\n\t\t\t\t\treturn analyticsUserIdentified(canceller);\n\t\t\t\t}),\n\t\t\t\tcatchError(err => of(analyticsError(err)))\n\t\t\t)\n\t\t)\n\t);\n}\n\nexport function analyticsUpdateOptionsEpic(\n\taction$: Observable<PayloadAction<{ token: string; resetDate?: string }>>,\n\tstate$: StateObservable<RootStateOrAny>\n) {\n\treturn action$.pipe(\n\t\tofType(analyticsUpdateOptions.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([{ payload: { token, resetDate } }, state]) =>\n\t\t\tgetAnalyticsUser(token).pipe(\n\t\t\t\tmap(analyticsUser => {\n\t\t\t\t\tconst products = selectProducts(state);\n\t\t\t\t\tpendoUpdateOptions(analyticsUser, products, resetDate);\n\t\t\t\t\treturn analyticsUserUpdated();\n\t\t\t\t}),\n\t\t\t\tcatchError(err => of(analyticsError(err)))\n\t\t\t)\n\t\t)\n\t);\n}\n\n/**\n * Middleware\n */\n\nexport function createAnalyticsMiddleware(): Middleware {\n\tlet cancellers: Array<() => void> = [];\n\n\treturn store => next => action => {\n\t\tif (action.type === analyticsUserIdentified.type) {\n\t\t\tcancellers.push(action.payload);\n\t\t\treturn next(analyticsUserIdentified(undefined));\n\t\t}\n\t\tif (action.type === analyticsCleanup.type) {\n\t\t\tcancellers.forEach(fn => fn());\n\t\t\tcancellers = [];\n\t\t} else if (action.type === analyticsError.type) {\n\t\t\tconsole.error('Analytics error:', action.payload);\n\t\t}\n\t\treturn next(action);\n\t};\n}\n","import { createAction, createReducer, PayloadAction } from '@reduxjs/toolkit';\nimport { ofType } from 'redux-observable';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, switchMap, tap } from 'rxjs/operators';\nimport Auth from '../../services/auth';\n\n/**\n * Action creators\n */\n\nexport const clearAutoFillValues = createAction('universal-login-page/loginForm/FORM_CLEAR_AUTO_FILL_VALUES');\nexport const clearError = createAction('universal-login-page/loginForm/FORM_CLEAR_ERROR');\nexport const editSiteCode = createAction('universal-login-page/loginForm/FORM_EDIT_SITECODE');\nexport const error = createAction<Error | object>('universal-login-page/loginForm/FORM_ERROR');\nexport const forgotSiteCodeError = createAction<Response | Error>('universal-login-page/loginForm/FORGOT_SITECODE_ERROR');\nexport const forgotSiteCodeReceived = createAction<{ sitecodes: string[] | null }>(\n\t'universal-login-page/loginForm/FORGOT_SITECODE_RECEIVED'\n);\nexport const lookupSiteCode = createAction(\n\t'universal-login-page/loginForm/FORGOT_SITECODE_REQUEST',\n\t(email: string, callback?: () => void) => {\n\t\treturn { payload: { email }, meta: callback };\n\t}\n);\nexport const revertSiteCode = createAction('universal-login-page/loginForm/FORM_REVERT_SITECODE');\nexport const setAutoFillValues = createAction(\n\t'universal-login-page/loginForm/FORM_SET_AUTO_FILL_VALUES',\n\t(username: string, password: string, siteCode: string) => ({\n\t\tpayload: { username, password, siteCode }\n\t})\n);\nexport const setInvalidCredentials = createAction<boolean>('universal-login-page/loginForm/FORM_INVALID_CREDENTIALS');\nexport const setTooManyAttempts = createAction<boolean>('universal-login-page/loginForm/FORM_TOO_MANY_ATTEMPTS');\nexport const setDurationSecs = createAction<number>('universal-login-page/loginForm/FORM_DURATION_SECS');\nexport const setIsEducator = createAction<boolean>('universal-login-page/loginForm/FORM_SET_IS_EDUCATOR');\nexport const storeRehydrated = createAction('universal-login-page/loginForm/STORE_REHYDRATED');\nexport const updateSiteCode = createAction<string>('universal-login-page/loginForm/FORM_UPDATE_SITECODE');\nexport const updateLoginType = createAction<string>('universal-login-page/loginForm/FORM_UPDATE_LOGIN_TYPE');\nexport const updateUsername = createAction<string>('universal-login-page/loginForm/FORM_UPDATE_USERNAME');\nexport const validateSiteCode = createAction('universal-login-page/loginForm/FORM_VALIDATE_SITECODE');\n\n/**\n * Reducer\n */\n\nexport interface LoginFormState {\n\tautoFillValues?: { password: string; siteCode: string; username: string };\n\terror?: Error | object;\n\tforgotSiteCodeError?: Response | Error | object;\n\tforgotSiteCodeLoading: boolean;\n\tforgotSiteCodeValues?: string[] | boolean;\n\tinvalidCredentials: boolean;\n\ttooManyAttempts: boolean;\n\tdurationSecs: number;\n\tisEducator: boolean;\n\tsiteCode?: string;\n\tsiteCodeEditable: boolean;\n\tusername?: string;\n\tloginType?: string;\n}\n\nconst initialState: LoginFormState = {\n\tforgotSiteCodeLoading: false,\n\tinvalidCredentials: false,\n\ttooManyAttempts: false,\n\tdurationSecs: 0,\n\tisEducator: false,\n\tsiteCodeEditable: true\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(clearAutoFillValues, state => ({ ...state, autoFillValues: undefined }))\n\t\t.addCase(storeRehydrated, (state, action) => {\n\t\t\tconst siteCodeEditable = !state.siteCode;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tsiteCodeEditable\n\t\t\t};\n\t\t})\n\t\t.addCase(lookupSiteCode, (state, action) => ({\n\t\t\t...state,\n\t\t\tforgotSiteCodeError: undefined,\n\t\t\tforgotSiteCodeLoading: true,\n\t\t\tforgotSiteCodeValues: undefined\n\t\t}))\n\t\t.addCase(forgotSiteCodeError, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tforgotSiteCodeLoading: false,\n\t\t\tforgotSiteCodeError: payload\n\t\t}))\n\t\t.addCase(forgotSiteCodeReceived, (state, { payload }) => {\n\t\t\tconst { sitecodes } = payload;\n\t\t\tconst forgotSiteCodeValues = sitecodes && sitecodes.length ? sitecodes : false;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tforgotSiteCodeLoading: false,\n\t\t\t\tforgotSiteCodeValues\n\t\t\t};\n\t\t})\n\t\t.addCase(error, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\terror: payload\n\t\t}))\n\t\t.addCase(clearError, (state, action) => ({\n\t\t\t...state,\n\t\t\terror: undefined\n\t\t}))\n\t\t.addCase(editSiteCode, (state, action) => ({\n\t\t\t...state,\n\t\t\terror: undefined,\n\t\t\tsiteCodeEditable: true\n\t\t}))\n\t\t.addCase(updateSiteCode, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tsiteCode: payload,\n\t\t\tsiteCodeEditable: false\n\t\t}))\n\t\t.addCase(updateLoginType, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tloginType: payload\n\t\t}))\n\t\t.addCase(revertSiteCode, (state, action) => ({\n\t\t\t...state,\n\t\t\tsiteCodeEditable: false\n\t\t}))\n\t\t.addCase(setAutoFillValues, (state, { payload: autoFillValues }) => ({\n\t\t\t...state,\n\t\t\tautoFillValues,\n\t\t\tisEducator: false\n\t\t}))\n\t\t.addCase(setIsEducator, (state, { payload }) => {\n\t\t\tconst isEducator = payload;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\terror: undefined,\n\t\t\t\tisEducator\n\t\t\t};\n\t\t})\n\t\t.addCase(setInvalidCredentials, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tinvalidCredentials: payload\n\t\t}))\n\t\t.addCase(setTooManyAttempts, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\ttooManyAttempts: payload\n\t\t}))\n\t\t.addCase(setDurationSecs, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tdurationSecs: payload\n\t\t}))\n\t\t.addCase(updateUsername, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\tusername: payload\n\t\t}))\n\t\t.addCase(validateSiteCode, state => ({\n\t\t\t...state,\n\t\t\terror: undefined\n\t\t}))\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport function lookupSiteCodeEpic(action$: Observable<PayloadAction<{ email: string }> & { meta: () => void }>) {\n\treturn action$.pipe(\n\t\tofType(lookupSiteCode.type),\n\t\tswitchMap(({ meta: callback, payload }) => {\n\t\t\tconst { email } = payload;\n\t\t\treturn Auth.lookupSiteCode(email).pipe(\n\t\t\t\tmap(response => forgotSiteCodeReceived(response)),\n\t\t\t\ttap(() => {\n\t\t\t\t\tcallback && callback();\n\t\t\t\t})\n\t\t\t);\n\t\t\tcatchError(error => of(forgotSiteCodeError(error)));\n\t\t})\n\t);\n}\n\nexport function validateSiteCodeEpic(action$: Observable<PayloadAction<string>>) {\n\treturn action$.pipe(\n\t\tofType(validateSiteCode.type),\n\t\tswitchMap(({ payload: sitecode }) =>\n\t\t\tAuth.validateSiteCode(sitecode).pipe(\n\t\t\t\tmap(() => updateSiteCode(sitecode)),\n\t\t\t\tcatchError(err => {\n\t\t\t\t\tconst { body, status } = err;\n\t\t\t\t\tif (status !== 400 && status !== 404 && (!body || body.error !== 'invalid_grant')) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t}\n\t\t\t\t\treturn of(\n\t\t\t\t\t\terror({\n\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t)\n\t\t)\n\t);\n}\n","import { createAction, createReducer, PayloadAction } from '@reduxjs/toolkit';\nimport { ofType, StateObservable } from 'redux-observable';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators';\nimport { Environment } from '../../constants/environments';\nimport { Products } from '../../constants/products';\nimport Auth from '../../services/auth';\nimport { getLaunchUrl, getNativeLaunchUrl } from '../../services/productLaunch';\nimport { log } from '../../services/logger';\nimport { Dictionary } from '../../types/dictionary';\nimport { UrlMap } from '../../types/urlMap';\nimport { selectUser } from '../selectors/app';\nimport { AppState } from './app';\nimport { LoggingProducts } from '../../constants/products';\nimport { LoginTypes } from '../../constants/loginTypes';\nimport { selectSiteCode, selectLoginType } from '../selectors/loginForm';\nimport { RootStateOrAny } from 'react-redux';\nimport Cookies from 'js-cookie';\nimport { caliperSessionEvent } from './caliper';\nimport { selectUserFlagEvaluationResults } from '../selectors/productSelection';\nimport { determineUseNativeAppBehavior, determineUseNativeBehavior } from './native';\n\n/**\n * Action creators\n */\n\nexport const abortLaunchUnityProduct = createAction('universal-login-page/productLauncher/ABORT_LAUNCH_UNITY_PRODUCT');\nexport const launchProduct = createAction(\n\t'universal-login-page/productLauncher/LAUNCH_PRODUCT_REQUEST_BEFORE_CALIPER',\n\t(\n\t\tproduct: Products | string,\n\t\turls: UrlMap,\n\t\tenvironment: Environment,\n\t\taddQuery: boolean,\n\t\tproductQueryStrings: Dictionary<string>,\n\t\tisStudent: boolean\n\t) => ({\n\t\tpayload: {\n\t\t\tproduct,\n\t\t\turls,\n\t\t\tenvironment,\n\t\t\taddQuery,\n\t\t\tproductQueryStrings,\n\t\t\tisStudent\n\t\t}\n\t})\n);\nexport const launchProductAfterCaliper = createAction(\n\t'universal-login-page/productLauncher/LAUNCH_PRODUCT_REQUEST_AFTER_CALIPER',\n\t(\n\t\tproduct: Products | string,\n\t\turls: UrlMap,\n\t\tenvironment: Environment,\n\t\taddQuery: boolean,\n\t\tproductQueryStrings: Dictionary<string>,\n\t\tisStudent: boolean\n\t) => ({\n\t\tpayload: {\n\t\t\tproduct,\n\t\t\turls,\n\t\t\tenvironment,\n\t\t\taddQuery,\n\t\t\tproductQueryStrings,\n\t\t\tisStudent\n\t\t}\n\t})\n);\nexport const launchProductAtUrl = createAction<string | undefined>('universal-login-page/productLauncher/LAUNCH_PRODUCT_AT_URL');\nexport const launchProductAtUrlComplete = createAction('universal-login-page/productLauncher/LAUNCH_PRODUCT_AT_URL_COMPLETE');\nexport const requestOneTimeToken = createAction<string>('universal-login-page/productLauncher/REQUEST_OTT');\nexport const requestOneTimeTokenComplete = createAction('universal-login-page/productLauncher/REQUEST_OTT_COMPLETE');\nexport const requestOneTimeTokenError = createAction<Response | Error | object>('universal-login-page/productLauncher/REQUEST_OTT_ERROR');\n/**\n * Reducer\n */\n\nexport interface ProductLauncherState {\n\trequestingOneTimeToken: boolean;\n\trequestOneTimeTokenError?: Response | Error | object;\n}\n\nconst initialState: ProductLauncherState = {\n\trequestingOneTimeToken: false\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(requestOneTimeToken, (state, action) => ({\n\t\t\t...state,\n\t\t\trequestingOneTimeToken: true,\n\t\t\trequestOneTimeTokenError: undefined\n\t\t}))\n\t\t.addCase(requestOneTimeTokenComplete, (state, action) => ({\n\t\t\t...state,\n\t\t\trequestingOneTimeToken: false\n\t\t}))\n\t\t.addCase(requestOneTimeTokenError, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\trequestingOneTimeToken: false,\n\t\t\trequestOneTimeTokenError: payload\n\t\t}))\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport function launchProductAtUrlEpic(action$: Observable<PayloadAction<string>>) {\n\treturn action$.pipe(\n\t\tofType(launchProductAtUrl.type),\n\t\ttap(({ payload: url }) => {\n\t\t\twindow.location.href = url;\n\t\t}),\n\t\tmap(() => launchProductAtUrlComplete())\n\t);\n}\n\nexport function launchProductEpic(\n\taction$: Observable<\n\t\tPayloadAction<{\n\t\t\tproduct: Products;\n\t\t\turls: UrlMap;\n\t\t\tenvironment: Environment;\n\t\t\taddQuery: boolean;\n\t\t\tproductQueryStrings: Dictionary<string>;\n\t\t\tisStudent: boolean;\n\t\t}>\n\t>,\n\tstate$: StateObservable<RootStateOrAny>\n) {\n\treturn action$.pipe(\n\t\tofType(launchProduct.type),\n\t\twithLatestFrom(state$),\n\t\tmap(([{ payload }, state]) => {\n\t\t\tconst { addQuery, environment, isStudent, product, productQueryStrings, urls } = payload;\n\t\t\treturn caliperSessionEvent(product, urls, environment, addQuery, productQueryStrings, isStudent);\n\t\t})\n\t);\n}\n\nexport function launchProductAfterCaliperEpic(\n\taction$: Observable<\n\t\tPayloadAction<{\n\t\t\tproduct: Products;\n\t\t\turls: UrlMap;\n\t\t\tenvironment: Environment;\n\t\t\taddQuery: boolean;\n\t\t\tproductQueryStrings: Dictionary<string>;\n\t\t\tisStudent: boolean;\n\t\t}>\n\t>,\n\tstate$: StateObservable<RootStateOrAny>\n) {\n\treturn action$.pipe(\n\t\tofType(launchProductAfterCaliper.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([{ payload }, state]) => {\n\t\t\tconst { addQuery, environment, isStudent, product, productQueryStrings, urls } = payload;\n\t\t\tconst loginType = selectLoginType(state);\n\t\t\tconst siteCode = selectSiteCode(state);\n\t\t\tconst { username, role } = selectUser(state) || {};\n\t\t\tconst ssoConnectionType = Cookies.get('ssoConnectionType');\n\t\t\tconst loginInfo = {\n\t\t\t\tUsername: username,\n\t\t\t\tType: 'Login',\n\t\t\t\tSsoConnectionType: ssoConnectionType,\n\t\t\t\tLoginType: ssoConnectionType ? LoginTypes.SSO : loginType,\n\t\t\t\tProduct: LoggingProducts[product as keyof typeof LoggingProducts],\n\t\t\t\tSiteCode: siteCode,\n\t\t\t\tUserType: role\n\t\t\t};\n\t\t\treturn log(loginInfo).pipe(\n\t\t\t\tcatchError(err => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\treturn of(); // Return empty observable so the chain can continue\n\t\t\t\t}),\n\t\t\t\tmap(() => {\n\t\t\t\t\tlet url = getLaunchUrl(product, urls, environment as Environment, addQuery, productQueryStrings);\n\n\t\t\t\t\tconst isNativeAppUser = determineUseNativeAppBehavior(role);\n\n\t\t\t\t\tconst takeBenchmark = product === Products.IEBenchmarkPlayerLink;\n\n\t\t\t\t\t// Ensure the user is not redirected to the native app for benchmark products if they are not a native app user\n\t\t\t\t\tif (takeBenchmark && !isNativeAppUser) {\n\t\t\t\t\t\treturn launchProductAtUrl(url);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst evaluationResults = selectUserFlagEvaluationResults(state);\n\n\t\t\t\t\tconst isNative = determineUseNativeBehavior(role, evaluationResults);\n\n\t\t\t\t\t// Update URL if native behavior is enabled and a native launch URL is available\n\t\t\t\t\tif (isNative) {\n\t\t\t\t\t\tconst nativeLaunchUrl = getNativeLaunchUrl(product, urls, environment, true, productQueryStrings);\n\t\t\t\t\t\tif (nativeLaunchUrl) {\n\t\t\t\t\t\t\turl = nativeLaunchUrl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn launchProductAtUrl(url);\n\t\t\t\t})\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function requestOneTimeTokenEpic(action$: Observable<PayloadAction<string>>, state$: StateObservable<{ app: AppState }>) {\n\treturn action$.pipe(\n\t\tofType(requestOneTimeToken.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([action, state]) => {\n\t\t\tconst { payload: url } = action;\n\t\t\treturn Auth.requestOneTimeToken(state.app.access_token).pipe(\n\t\t\t\tswitchMap(({ Code: token }) => from([requestOneTimeTokenComplete(), launchProductAtUrl(`${url}&ott=${token}`)])),\n\t\t\t\tcatchError(error => {\n\t\t\t\t\tconsole.error('Failed to receive OTT:', error);\n\t\t\t\t\treturn of(requestOneTimeTokenError(error));\n\t\t\t\t})\n\t\t\t);\n\t\t})\n\t);\n}\n","import { Dictionary } from '../types/dictionary';\nimport { Environment } from './environments';\nimport { Products } from './products';\n\n// Student URLS\nconst NATIVE_URLS: Dictionary<Dictionary<string>> = {\n\t[Environment.Development]: {\n\t\t[Products.ILE]: 'imaginelearning://?loginstep=productselected&product=ILL',\n\t\t[Products.Spanish]: 'imaginelearning://?loginstep=productselected&product=IE',\n\t\t[Products.IEBenchmarkPlayerLink]: 'imaginelearning://?loginstep=benchmarkrequired&redirecturl={benchmarkUrl}'\n\t},\n\t[Environment.Test]: {\n\t\t[Products.ILE]: 'imaginelearning://?loginstep=productselected&product=ILL',\n\t\t[Products.Spanish]: 'imaginelearning://?loginstep=productselected&product=IE',\n\t\t[Products.IEBenchmarkPlayerLink]: 'imaginelearning://?loginstep=benchmarkrequired&redirecturl={benchmarkUrl}'\n\t},\n\t[Environment.Rc]: {\n\t\t[Products.ILE]: 'imaginelearning://?loginstep=productselected&product=ILL',\n\t\t[Products.Spanish]: 'imaginelearning://?loginstep=productselected&product=IE',\n\t\t[Products.IEBenchmarkPlayerLink]: 'imaginelearning://?loginstep=benchmarkrequired&redirecturl={benchmarkUrl}'\n\t},\n\t[Environment.Production]: {\n\t\t[Products.ILE]: 'imaginelearning://?loginstep=productselected&product=ILL',\n\t\t[Products.Spanish]: 'imaginelearning://?loginstep=productselected&product=IE',\n\t\t[Products.IEBenchmarkPlayerLink]: 'imaginelearning://?loginstep=benchmarkrequired&redirecturl={benchmarkUrl}'\n\t}\n};\n\nexport default NATIVE_URLS;\n","import Url from 'url-parse';\nimport { AuthSource } from '../constants/authSources';\nimport { Environment } from '../constants/environments';\nimport { Products } from '../constants/products';\nimport { Dictionary } from '../types/dictionary';\nimport { UrlMap } from '../types/urlMap';\nimport { parseUrlPart } from './queryStringParameters';\nimport Auth from './auth';\nimport NATIVE_URLS from '../constants/nativeUrls';\n\nexport function getLaunchUrl(\n\tproduct: Products,\n\turls: UrlMap,\n\tenvironment?: Environment | null,\n\taddQuery = true,\n\tqueryStrings?: Dictionary<string>\n) {\n\tconst env = environment || Environment.Production;\n\tconst queryString =\n\t\tqueryStrings && Object.prototype.hasOwnProperty.call(queryStrings, product) ? decodeURIComponent(queryStrings[product]) : '';\n\tconst queryParams = parseUrlPart(queryString);\n\n\tif (addQuery && (product === Products.ILE || product === Products.Spanish)) {\n\t\tqueryParams.selectedProduct = product;\n\t\tqueryParams.env = env;\n\t}\n\n\tqueryParams.authSource = Auth.getAuthProvider();\n\n\tconst baseUrl = urls[env][product];\n\tif (!baseUrl) {\n\t\treturn undefined;\n\t}\n\tconst url = new Url(baseUrl, true);\n\turl.set('query', {\n\t\t...url.query,\n\t\t...queryParams\n\t});\n\treturn url.toString();\n}\n\nexport function getNativeLaunchUrl(\n\tproduct: Products,\n\turls: UrlMap,\n\tenvironment?: Environment | null,\n\taddQuery = true,\n\tqueryStrings?: Dictionary<string>\n) {\n\tconst env = environment || Environment.Production;\n\n\tconst baseUrl = NATIVE_URLS[env][product];\n\tif (!baseUrl) {\n\t\treturn undefined;\n\t}\n\tconst url = new Url(baseUrl, true);\n\tconst queryString =\n\t\tqueryStrings && Object.prototype.hasOwnProperty.call(queryStrings, product) ? decodeURIComponent(queryStrings[product]) : '';\n\tconst queryParams = parseUrlPart(queryString);\n\n\tif (addQuery && product === Products.IEBenchmarkPlayerLink) {\n\t\tconst redirectUrl = urls[env][Products.IEBenchmarkPlayerLink];\n\t\turl.query.redirecturl = encodeURIComponent(redirectUrl);\n\t}\n\n\turl.set('query', {\n\t\t...url.query,\n\t\t...queryParams\n\t});\n\treturn url.toString();\n}\n\nexport default getLaunchUrl;\n","import { createSelector } from '@reduxjs/toolkit';\nimport some from 'lodash-es/some';\nimport uniq from 'lodash-es/uniq';\nimport { AssessmentProviders } from '../../constants/assessmentProviders';\nimport { AssessmentStatuses } from '../../constants/assessmentStatuses';\nimport { ProductDisabledReasons } from '../../constants/productDisabledReasons';\nimport { RootState } from '../root';\n\nexport function selectProducts(state: RootState) {\n\treturn state.productSelection.products;\n}\n\nexport function selectProductsError(state: RootState) {\n\treturn state.productSelection.productsError;\n}\n\nexport function selectProductsLoading(state: RootState) {\n\treturn state.productSelection.loading || !state.productSelection.flagsLoaded;\n}\n\nexport function selectRecommendedAssessmentProvider(state: RootState) {\n\treturn state.productSelection.recommendedAssessmentProvider;\n}\n\nexport function selectRecommendedAssessmentUrl(state: RootState) {\n\treturn state.productSelection.recommendedAssessmentUrl;\n}\n\nexport function selectRosterDashboard(state: RootState) {\n\treturn state.productSelection.rosterDashboard;\n}\n\nexport function selectScheduleDashboard(state: RootState) {\n\treturn state.productSelection.scheduleDashboard;\n}\n\nexport function selectSetupRequired(state: RootState) {\n\treturn state.productSelection.setupRequired;\n}\n\nexport const selectAssessmentProviders = createSelector([selectProducts], products =>\n\tuniq((products || []).filter(product => !!product.assessmentProvider).map(product => product.assessmentProvider))\n);\n\nexport const selectAssessmentRecommended = createSelector([selectRecommendedAssessmentProvider], provider => !!provider);\n\nexport const selectDefaultAssessmentProvider = createSelector([selectAssessmentProviders], providers =>\n\t(providers || []).reduce((defaultProvider, current) => {\n\t\tswitch (current) {\n\t\t\tcase AssessmentProviders.NWEA:\n\t\t\tcase AssessmentProviders.ATI:\n\t\t\tcase AssessmentProviders.IPA:\n\t\t\t\treturn current;\n\t\t\tdefault:\n\t\t\t\treturn defaultProvider;\n\t\t}\n\t}, AssessmentProviders.ILE)\n);\n\nconst selectDefaultAssessmentStatusAndUrl = createSelector(\n\t[selectProducts, selectDefaultAssessmentProvider],\n\t(products, defaultAssessmentProvider) =>\n\t\t(products || [])\n\t\t\t.filter(prod => prod.assessmentProvider === defaultAssessmentProvider)\n\t\t\t.map(({ assessmentStatus, assessmentUrl }) => ({\n\t\t\t\tstatus: assessmentStatus,\n\t\t\t\turl: assessmentUrl\n\t\t\t}))\n\t\t\t.reduce((accumulator, assessment) => {\n\t\t\t\tif (\n\t\t\t\t\tassessment.status === AssessmentStatuses.None ||\n\t\t\t\t\t(assessment.status === AssessmentStatuses.InProgress && accumulator.status !== AssessmentStatuses.None)\n\t\t\t\t) {\n\t\t\t\t\treturn assessment;\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, {} as { status?: AssessmentStatuses; url?: string })\n);\n\nexport const selectDefaultAssessmentStatus = createSelector([selectDefaultAssessmentStatusAndUrl], statusAndUrl => statusAndUrl?.status);\n\nexport const selectDefaultAssessmentUrl = createSelector([selectDefaultAssessmentStatusAndUrl], statusAndUrl => statusAndUrl?.url);\n\nexport const selectHasLockedProducts = createSelector([selectProducts], products => some(products, prod => prod.assessmentRequired));\n\nexport const selectNweaRosteringError = createSelector([selectProducts], products =>\n\tsome(products, ({ disabledReason }) => disabledReason === ProductDisabledReasons.NotRosteredWithNWEA)\n);\n\nexport const selectNotLicensedProducts = createSelector([selectProducts], products =>\n\tsome(products, ({ disabledReason }) => disabledReason === ProductDisabledReasons.OrganizationNotLicensed)\n);\n\nexport function selectUserFlagEvaluationResults(state: RootState) {\n\treturn state.productSelection.evaluationResults;\n}\n\nexport function selectAnalyticsInitialized(state: RootState) {\n\treturn state.productSelection.analyticsInitialized;\n}\n\nexport function selectAnalyticsUserIdentified(state: RootState) {\n\treturn state.productSelection.analyticsUserIdentified;\n}\n","import { Log } from 'oidc-client/src/Log';\nimport { UserManager } from 'oidc-client/src/UserManager';\nimport { Environment } from '../constants/environments';\nimport URLS from '../constants/urls';\nimport {\n\tgetAuthorityUrl,\n\tgetImlp2Url,\n\tgetImlpUrl,\n\tgetInferredEnvironment,\n\tgetPostLogoutRedirect,\n\tgetRedirectUrl\n} from '../services/network';\nimport { AuthSource } from '../constants/authSources';\n\nexport const scopes = [\n\t'api.transfer', // Need this to redeem and create one time tokens (session transfer fron Android and iOS)\n\t'api.assessment', // Need this to check lockout status, to control when user gets to L&L, and/or reader\n\t'api.manager', // Assessment makes manager API calls, and re-uses the bearer token for the user\n\t'api.permissions', // api.assessment depends on this scope.\n\t'openid' // Need this to get an id_token, so we can do a single sign out\n];\n\nexport const imlpScopes = ['Scope.IL.Auth.Transfer', 'Scope.IL.Assessment', 'Scope.IL.Registration', 'Scope.IL.Permissions', 'openid'];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getDevOptions(environment?: Environment): any {\n\tconst urls = environment && URLS[environment];\n\treturn !urls\n\t\t? {}\n\t\t: {\n\t\t\t\t/* eslint-disable @typescript-eslint/camelcase */\n\t\t\t\tmetadata: {\n\t\t\t\t\t// This block will help hit test auth.\n\t\t\t\t\tjwks_uri: `${urls.auth}/.well-known/openid-configuration/jwks`,\n\t\t\t\t\tissuer: urls.auth,\n\t\t\t\t\tauthorization_endpoint: `${urls.auth}/connect/authorize`,\n\t\t\t\t\ttoken_endpoint: `${urls.auth}/connect/token`,\n\t\t\t\t\tend_session_endpoint: `${urls.auth}/connect/endsession`\n\t\t\t\t}\n\t\t\t\t/* eslint-enable */\n\t\t };\n}\n\nfunction createDefaultUserManager() {\n\tconst env = getInferredEnvironment(window.location.host);\n\n\tLog.logger = console;\n\tLog.level = env === Environment.Development ? Log.DEBUG : Log.ERROR;\n\n\tconst devOptions = getDevOptions(process.env.REACT_APP_DEV_AUTH_ENV as Environment);\n\n\t/* eslint-disable @typescript-eslint/camelcase */\n\tconst defaultOptions = {\n\t\tresponse_type: 'code', // We need both kinds of tokens to make api calls and also single signout\n\t\tloadUserInfo: false,\n\t\tauthority: getAuthorityUrl(env),\n\t\tclient_id: 'DirectLoginClientPKCE', // Hardcoded. We never hand-initiate a login unless it is this client so we are ok here?\n\t\tpost_logout_redirect_uri: getPostLogoutRedirect(env),\n\t\tredirect_uri: getRedirectUrl(env),\n\t\tscope: scopes.join(' '),\n\t\tclockSkew: 11100 // in seconds (3h 5m). Default is 300s (5m). Token validation should account for client time or timezone being off +/- a few.\n\n\t\t// Uncomment for local dev proxy CORS fixes\n\t\t// run locally with the following CLI to get it to work:\n\t\t// HOST=lvh.me HTTPS=true yarn run start\n\t\t// If you want to run locally AND want to hit a local auth server, don't run with HTTPS.\n\t\t// metadata: { // This block will help hit test auth.\n\t\t// \tjwks_uri: 'https://lvh.me:5001/.well-known/openid-configuration/jwks',\n\t\t// \tissuer: 'https://testapi.imaginelearning.com',\n\t\t// \tauthorization_endpoint: 'https://testapi.imaginelearning.com/connect/authorize',\n\t\t// \ttoken_endpoint: 'https://testapi.imaginelearning.com/connect/token',\n\t\t// \tend_session_endpoint: 'https://testapi.imaginelearning.com/connect/endsession'\n\t\t// }\n\t\t// metadata: { // This block will help hit a local auth.\n\t\t// \tjwks_uri: 'http://localhost:5000/.well-known/openid-configuration/jwks',\n\t\t// \tissuer: 'http://localhost:5000',\n\t\t// \tauthorization_endpoint: 'http://localhost:5000/connect/authorize',\n\t\t// \ttoken_endpoint: 'http://localhost:5000/connect/token',\n\t\t// \tend_session_endpoint: 'http://localhost:5000/connect/endsession'\n\t\t// }\n\t};\n\t/* eslint-enable */\n\n\tconst userManager = new UserManager({ ...defaultOptions, ...devOptions });\n\treturn userManager;\n}\n\nfunction createImlpUserManager(authSource: AuthSource) {\n\tconst env = getInferredEnvironment(window.location.host);\n\tconst imlpUrl = authSource === AuthSource.IMLP ? getImlpUrl(env) : getImlp2Url(env);\n\n\tLog.logger = console;\n\tLog.level = env === Environment.Development ? Log.DEBUG : Log.ERROR;\n\n\tconst devOptions = getDevOptions(process.env.REACT_APP_DEV_AUTH_ENV as Environment);\n\n\t/* eslint-disable @typescript-eslint/camelcase */\n\tconst imlpDefaultOptions = {\n\t\tresponse_type: 'code', // We need both kinds of tokens to make api calls and also single signout\n\t\tloadUserInfo: false,\n\t\tauthority: imlpUrl,\n\t\tclient_id: 'DirectLoginClientPKCE',\n\t\tpost_logout_redirect_uri: getPostLogoutRedirect(env),\n\t\tredirect_uri: getRedirectUrl(env),\n\t\tscope: imlpScopes.join(' '),\n\t\tstaleStateAge: 900,\n\t\tmonitorSession: false,\n\t\tclockSkew: 11100\n\t};\n\t/* eslint-enable */\n\n\tconst userManager = new UserManager({ ...imlpDefaultOptions, ...devOptions });\n\treturn userManager;\n}\n\n// Define the service\nconst UniversalLoginOidc = {\n\tcreateDefaultUserManager,\n\tcreateImlpUserManager\n};\n\nexport default UniversalLoginOidc;\n","import { Action, createAction, createReducer, PayloadAction } from '@reduxjs/toolkit';\nimport { ofType } from 'redux-observable';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, finalize, map, switchMap, tap } from 'rxjs/operators';\nimport Auth from '../../services/auth';\nimport { getImlp2Url, getImlpUrl, getInferredEnvironment } from '../../services/network';\nimport UniversalLoginOidc from '../../services/oidc';\nimport { parseQueryString, parseUrlPart } from '../../services/queryStringParameters';\nimport { tokenReceived } from './app';\nimport { log } from '../../services/logger';\nimport { AuthSource } from '../../constants/authSources';\n\n// Export for testing purposes\nexport function __getUserManager() {\n\treturn Auth.getAuthProvider() === AuthSource.IMLP\n\t\t? imlpUserManager\n\t\t: Auth.getAuthProvider() === AuthSource.IMLP2\n\t\t? imlp2UserManager\n\t\t: defaultUserManager;\n}\n\nfunction getExtraQueryParams(authSource: AuthSource) {\n\treturn authSource === AuthSource.IMLP2\n\t\t? { extraQueryParams: { useImlp2: 'true' } }\n\t\t: authSource === AuthSource.IMLP\n\t\t? { extraQueryParams: { useImlp: 'true' } }\n\t\t: {};\n}\n\nconst defaultUserManager = UniversalLoginOidc.createDefaultUserManager();\nconst imlpUserManager = UniversalLoginOidc.createImlpUserManager(AuthSource.IMLP);\nconst imlp2UserManager = UniversalLoginOidc.createImlpUserManager(AuthSource.IMLP2);\n\n/**\n * Action creators\n */\n\nexport const completeSignin = createAction('universal-login-page/oidc/COMPLETE_SIGNIN');\nexport const handlePostLogout = createAction(\n\t'universal-login-page/oidc/HANDLE_POST_LOGOUT',\n\t(logoutCallbackUrl: string, resumeUrl: string) => ({\n\t\tpayload: { logoutCallbackUrl, resumeUrl }\n\t})\n);\nexport const handlePostLogoutComplete = createAction('universal-login-page/oidc/HANDLE_POST_LOGOUT_COMPLETE');\nexport const signinInProgress = createAction<string>('universal-login-page/oidc/SIGNIN_IN_PROGRESS');\nexport const signinError = createAction<Error | object>('universal-login-page/oidc/SIGNIN_ERROR');\nexport const signinErrorHandled = createAction<Error | object>('universal-login-page/oidc/SIGNIN_ERROR_HANDLED');\nexport const signinSubmitted = createAction('universal-login-page/oidc/SIGNIN_SUBMITTED');\nexport const signinSuccess = createAction('universal-login-page/oidc/SIGNIN_SUCCESS');\n\n/**\n * Reducer\n */\n\nexport interface OidcState {\n\tisInProgress: boolean;\n\tisSubmitted: boolean;\n\treturnUrl?: string;\n\terror?: Error | object;\n}\n\nconst initialState: OidcState = {\n\tisInProgress: false,\n\tisSubmitted: false\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(signinInProgress, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\treturnUrl: payload,\n\t\t\tisInProgress: true\n\t\t}))\n\t\t.addCase(signinSubmitted, state => ({\n\t\t\t...state,\n\t\t\tisInProgress: false,\n\t\t\tisSubmitted: true\n\t\t}))\n\t\t.addCase(signinSuccess, state => ({\n\t\t\t...state,\n\t\t\tisInProgress: false,\n\t\t\tisSubmitted: false\n\t\t}))\n\t\t.addCase(signinError, (state, { payload }) => ({\n\t\t\t...state,\n\t\t\terror: payload\n\t\t}))\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport function completeSigninEpic(action$: Observable<Action>) {\n\treturn action$.pipe(\n\t\tofType(completeSignin.type),\n\t\tswitchMap(() => {\n\t\t\tconst userManager = __getUserManager();\n\t\t\treturn from(userManager.signinRedirectCallback()).pipe(\n\t\t\t\tswitchMap(user => {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\t\tconst { access_token: accessToken } = user as any;\n\t\t\t\t\treturn from([tokenReceived(accessToken), signinSuccess()]);\n\t\t\t\t}),\n\t\t\t\tcatchError(err => of(signinError(err)))\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function handlePostLogoutEpic(action$: Observable<PayloadAction<{ resumeUrl: string; logoutCallbackUrl: string }>>) {\n\treturn action$.pipe(\n\t\tofType(handlePostLogout.type),\n\t\tswitchMap(({ payload }) => {\n\t\t\t// /signin is default if no location was specified\n\t\t\tconst { resumeUrl = '/signin', logoutCallbackUrl } = payload || {};\n\t\t\treturn Auth.logoutCallback(logoutCallbackUrl).pipe(\n\t\t\t\tmap(() => handlePostLogoutComplete()),\n\t\t\t\tcatchError(err => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\treturn of(handlePostLogoutComplete());\n\t\t\t\t}),\n\t\t\t\tfinalize(() => {\n\t\t\t\t\t// If you were impersonating, go back from whence you came\n\t\t\t\t\twindow.location.replace(resumeUrl);\n\t\t\t\t})\n\t\t\t);\n\t\t})\n\t);\n}\n\nexport function signinErrorEpic(action$: Observable<PayloadAction<Error | object>>) {\n\treturn action$.pipe(\n\t\tofType(signinError.type),\n\t\ttap(({ payload: error }) => {\n\t\t\tconsole.error(error);\n\t\t\tconst userManager = __getUserManager();\n\t\t\tconst message = error instanceof Error ? error?.message : '';\n\t\t\t// Only re-trigger signinRedirect if it's the \"No matching state\" error\n\t\t\tconsole.log(message);\n\t\t\tif (/no matching state.*/i.test(message)) {\n\t\t\t\tconst extraParams = getExtraQueryParams(Auth.getAuthProvider());\n\t\t\t\tuserManager.signinRedirect(extraParams);\n\t\t\t}\n\t\t}),\n\t\tmap(({ payload }) => signinErrorHandled(payload))\n\t);\n}\n\n/**\n * Thunks\n */\n\nexport function signOut() {\n\treturn () => {\n\t\tconst userManager = __getUserManager();\n\t\tconst extraParams = getExtraQueryParams(Auth.getAuthProvider());\n\t\tuserManager.signoutRedirect(extraParams);\n\t};\n}\n\nexport function startSignin(removeIlAuthFallback: boolean) {\n\treturn () => {\n\t\tconst returnUrl = parseQueryString['returnUrl'];\n\t\tif (returnUrl) {\n\t\t\tconst returnUrlParts = parseUrlPart(returnUrl);\n\t\t\tconst useImlp2 = /true|(^$)/i.test(parseQueryString['useImlp2']) || /true|(^$)/i.test(returnUrlParts['useImlp2']);\n\t\t\tconst useIlAuth = /true|(^$)/i.test(parseQueryString['useIlAuth']) || /true|(^$)/i.test(returnUrlParts['useIlAuth']);\n\t\t\thandleSignin(removeIlAuthFallback, useIlAuth ? AuthSource.ILAuth : useImlp2 ? AuthSource.IMLP2 : AuthSource.IMLP);\n\t\t} else {\n\t\t\tconst useIlAuth = /true|(^$)/i.test(parseQueryString['useIlAuth']);\n\t\t\tconst useImlp2 = /true|(^$)/i.test(parseQueryString['useImlp2']);\n\t\t\thandleSignin(removeIlAuthFallback, useIlAuth ? AuthSource.ILAuth : useImlp2 ? AuthSource.IMLP2 : AuthSource.IMLP);\n\t\t}\n\t};\n}\n\nfunction handleSignin(removeIlAuthFallback: boolean, authSource: AuthSource) {\n\tconst env = getInferredEnvironment(window.location.host);\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\tconst { launch, force } = parseQueryString;\n\tif (launch) {\n\t\twindow.sessionStorage.setItem('requestedProduct', launch);\n\t\tif (force) {\n\t\t\twindow.sessionStorage.setItem('requestedProductAutoLaunch', 'force');\n\t\t}\n\t}\n\n\tif (authSource === AuthSource.IMLP) {\n\t\tif (removeIlAuthFallback) {\n\t\t\tconst extraParams = getExtraQueryParams(AuthSource.IMLP);\n\t\t\tAuth.selectImlpProvider();\n\t\t\timlpUserManager.signinRedirect(extraParams);\n\t\t} else {\n\t\t\tconst imlpUrl = getImlpUrl(env);\n\t\t\tAuth.selectImlpProvider();\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tcontroller.abort();\n\t\t\t\tAuth.selectIlAuthProvider();\n\t\t\t\tdefaultUserManager.signinRedirect();\n\t\t\t\tconsole.error(`Timed out while loading ${imlpUrl}`);\n\t\t\t}, 5000);\n\t\t\tfetch(imlpUrl + '/.well-known/openid-configuration', {\n\t\t\t\theaders: { 'Cache-control': 'no-cache', pragma: 'no-cache' },\n\t\t\t\tsignal\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\tconst extraParams = getExtraQueryParams(AuthSource.IMLP);\n\t\t\t\t\t\tAuth.selectImlpProvider();\n\t\t\t\t\t\timlpUserManager.signinRedirect(extraParams);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tAuth.selectIlAuthProvider();\n\t\t\t\t\t\tdefaultUserManager.signinRedirect();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tconsole.error(`Failed to load ${imlpUrl}: ${error}`);\n\t\t\t\t\tlog({ error: 'failure trying to load IMLP. Fell back to IL Auth.' })\n\t\t\t\t\t\t.toPromise()\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tAuth.selectIlAuthProvider();\n\t\t\t\t\t\t\tdefaultUserManager.signinRedirect();\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t} else if (authSource === AuthSource.IMLP2) {\n\t\tif (removeIlAuthFallback) {\n\t\t\tconst extraParams = getExtraQueryParams(AuthSource.IMLP2);\n\t\t\tAuth.selectImlp2Provider();\n\t\t\timlp2UserManager.signinRedirect(extraParams);\n\t\t} else {\n\t\t\tconst imlpUrl = getImlp2Url(env);\n\t\t\tAuth.selectImlp2Provider();\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tcontroller.abort();\n\t\t\t\tAuth.selectIlAuthProvider();\n\t\t\t\tdefaultUserManager.signinRedirect();\n\t\t\t\tconsole.error(`Timed out while loading ${imlpUrl}`);\n\t\t\t}, 5000);\n\t\t\tfetch(imlpUrl + '/.well-known/openid-configuration', {\n\t\t\t\theaders: { 'Cache-control': 'no-cache', pragma: 'no-cache' },\n\t\t\t\tsignal\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\tconst extraParams = getExtraQueryParams(AuthSource.IMLP2);\n\t\t\t\t\t\tAuth.selectImlp2Provider();\n\t\t\t\t\t\timlp2UserManager.signinRedirect(extraParams);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tAuth.selectIlAuthProvider();\n\t\t\t\t\t\tdefaultUserManager.signinRedirect();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tconsole.error(`Failed to load ${imlpUrl}: ${error}`);\n\t\t\t\t\tlog({ error: 'failure trying to load IMLP. Fell back to IL Auth.' })\n\t\t\t\t\t\t.toPromise()\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tAuth.selectIlAuthProvider();\n\t\t\t\t\t\t\tdefaultUserManager.signinRedirect();\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t} else {\n\t\tAuth.selectIlAuthProvider();\n\t\tdefaultUserManager.signinRedirect();\n\t}\n}\n\nexport function clearStaleState() {\n\treturn () => {\n\t\tdefaultUserManager.clearStaleState();\n\t\timlpUserManager.clearStaleState();\n\t\timlp2UserManager.clearStaleState();\n\t\tlocalStorage.removeItem('oidcSessionId');\n\t};\n}\n","import { createAction, createReducer, PayloadAction } from '@reduxjs/toolkit';\nimport { ofType, StateObservable } from 'redux-observable';\nimport { Observable } from 'rxjs';\nimport { catchError, map, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { Dictionary } from '../../types/dictionary';\nimport { ReturnUrl } from '../../types/returnUrl';\nimport { evaluateGlobalBatch, EvaluationResult } from '../../services/flagr';\nimport { RootStateOrAny } from 'react-redux';\n\n/**\n * Action creators\n */\n\nexport const appError = createAction('universal-login-page/app/ERROR');\nexport const loadedSiteCode = createAction('universal-login-page/app/LOADED_SITECODE');\nexport const selectedProduct = createAction('universal-login-page/app/SELECTED_PRODUCT');\nexport const setReturnUrl = createAction<string | undefined>('universal-login-page/app/SET_RETURN_URL');\nexport const storeProductQueryParams = createAction('universal-login-page/app/HAD_PRODUCT_QUERY_STRING');\nexport const tokenReceived = createAction<string>('universal-login-page/app/TOKEN_RECEIVED');\nexport const fetchingGlobalFlags = createAction('universal-login-page/app/FETCHING_GLOBAL_FLAGS');\nexport const globalFlagEvaluationComplete = createAction<EvaluationResult[]>('universal-login-page/app/GLOBAL_FLAG_EVALUATION_COMPLETE');\n\nexport function clearReturnUrl() {\n\treturn setReturnUrl();\n}\n\n/**\n * Reducer\n */\n\nexport interface AppState {\n\taccess_token?: string;\n\terror?: Error | object;\n\tparams?: Dictionary<string | undefined>;\n\tproductQueryStrings?: Dictionary<string>;\n\treturnUrl?: ReturnUrl;\n\tflagsLoaded: boolean;\n\tevaluationResults?: EvaluationResult[];\n}\n\nconst initialState: AppState = {\n\tflagsLoaded: false\n};\n\nconst reducer = createReducer(initialState, builder =>\n\tbuilder\n\t\t.addCase(tokenReceived, (state, action) => ({\n\t\t\t...state,\n\t\t\t// eslint-disable-next-line @typescript-eslint/camelcase\n\t\t\taccess_token: action.payload\n\t\t}))\n\t\t.addCase(selectedProduct, (state, action) => ({\n\t\t\t...state,\n\t\t\tselectedProduct: action.payload\n\t\t}))\n\t\t.addCase(appError, (state, action) => ({\n\t\t\t...state,\n\t\t\terror: action.payload\n\t\t}))\n\t\t.addCase(loadedSiteCode, (state, action) => {\n\t\t\t// If sitecode is already set, just ignore this\n\t\t\tif (state.params && state.params.sitecode) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst sitecode = action.payload;\n\t\t\tconst params: Dictionary<string | undefined> = state.params\n\t\t\t\t? {\n\t\t\t\t\t\t...state.params,\n\t\t\t\t\t\tsitecode\n\t\t\t\t }\n\t\t\t\t: { sitecode };\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tparams\n\t\t\t};\n\t\t})\n\t\t.addCase(storeProductQueryParams, (state, action) => ({\n\t\t\t...state,\n\t\t\tproductQueryStrings: action.payload || {}\n\t\t}))\n\t\t.addCase(setReturnUrl, (state, action) => {\n\t\t\tconst url = action.payload;\n\t\t\tconst returnUrl = (url && { url, expires: Date.now() + 30000 }) || undefined;\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\treturnUrl\n\t\t\t};\n\t\t})\n\t\t.addCase(fetchingGlobalFlags, state => ({\n\t\t\t...state,\n\t\t\tflagsLoaded: false\n\t\t}))\n\t\t.addCase(globalFlagEvaluationComplete, (state, action) => {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tflagsLoaded: true,\n\t\t\t\tevaluationResults: action.payload\n\t\t\t};\n\t\t})\n);\n\nexport default reducer;\n\n/**\n * Epics\n */\n\nexport function getGlobalFlagsEpic(action$: Observable<PayloadAction<{}>>, state$: StateObservable<RootStateOrAny>) {\n\treturn action$.pipe(\n\t\tofType(fetchingGlobalFlags.type),\n\t\twithLatestFrom(state$),\n\t\tswitchMap(([_, state]) => {\n\t\t\t// Failure to evaluate is actually okay, and shouldn't block progress at all.\n\t\t\treturn evaluateGlobalBatch().pipe(\n\t\t\t\tmap(({ evaluationResults }) => globalFlagEvaluationComplete(evaluationResults)),\n\t\t\t\tcatchError(async error => {\n\t\t\t\t\tconst emptyResults: EvaluationResult[] = [];\n\t\t\t\t\tconsole.error('error retrieving flags');\n\t\t\t\t\treturn globalFlagEvaluationComplete(emptyResults);\n\t\t\t\t})\n\t\t\t);\n\t\t})\n\t);\n}\n","export enum AssessmentProviders {\n\tATI = 'ATI',\n\tILE = 'ILE',\n\tNWEA = 'NWEA',\n\tSpanish = 'Spanish',\n\tUnknown = 'Unknown',\n\tIPA = 'IPA'\n}\n","export enum AssessmentStatuses {\n\tComplete = 'Complete',\n\tExempt = 'Exempt',\n\tInProgress = 'InProgress',\n\tNone = 'None'\n}\n","import classnames from 'classnames';\nimport React from 'react';\nimport PulseLoader from 'react-spinners/PulseLoader';\n\ninterface LoaderProps {\n\tcolor?: string;\n\tclassName?: string;\n\tloading?: boolean;\n}\n\nfunction Loader({ color = '#0096d9', className, loading }: LoaderProps) {\n\treturn loading === true ? (\n\t\t<div className={classnames('Loader', className)}>\n\t\t\t<PulseLoader color={color} margin={'5px'} loading={true} />\n\t\t</div>\n\t) : null;\n}\n\nexport default Loader;\n"],"sourceRoot":""}