From 4ccef1b8a11ca5643c11eb9586e45f8e45398e8c Mon Sep 17 00:00:00 2001 From: Hector Morales Date: Wed, 5 Jul 2023 16:31:22 -0700 Subject: [PATCH] Make claims-based caching configurable (#6163) This PR: - Sets ability to cache based on requested claims as a configurable option under `CacheOptions.claimsBasedCachinEnabled` - Changes default behavior so in v3 claims-based caching is off by default and any request containing claims will go to the network - Provides a mitigation to the issue where requesting different claims results in a cache miss and a cached token accumulation with no practical way to clear unused tokens - Backport for LTS packages (msal-node v1/msal-browser v2) in progress --- ...-b9572127-f4c0-473a-a120-61bb7d2850c6.json | 7 + ...-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json | 7 + ...-44b62ae5-8011-430c-aca4-e7230b9845e9.json | 7 + lib/msal-browser/docs/configuration.md | 113 ++--- lib/msal-browser/docs/v2-migration.md | 19 + .../src/cache/BrowserCacheManager.ts | 1 + lib/msal-browser/src/config/Configuration.ts | 7 +- .../src/controllers/StandardController.ts | 6 +- .../BaseInteractionClient.ts | 20 +- .../StandardInteractionClient.ts | 4 + .../test/app/PublicClientApplication.spec.ts | 422 ++++++++++++++++-- .../test/cache/BrowserCacheManager.spec.ts | 17 +- .../test/cache/TokenCache.spec.ts | 1 + .../test/config/Configuration.spec.ts | 3 + .../interaction_client/RedirectClient.spec.ts | 8 +- lib/msal-browser/tsconfig.build.tsbuildinfo | 2 +- .../src/client/SilentFlowClient.ts | 10 + .../src/config/ClientConfiguration.ts | 17 + lib/msal-common/src/index.ts | 1 + .../test/client/SilentFlowClient.spec.ts | 114 +++++ .../test/config/ClientConfiguration.spec.ts | 9 + lib/msal-node/package.json | 1 + lib/msal-node/src/client/ClientApplication.ts | 13 +- lib/msal-node/src/config/Configuration.ts | 5 +- .../client/PublicClientApplication.spec.ts | 274 ++++++++---- lib/msal-node/test/utils/TestConstants.ts | 17 +- 26 files changed, 895 insertions(+), 210 deletions(-) create mode 100644 change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json create mode 100644 change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json create mode 100644 change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json diff --git a/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json b/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json new file mode 100644 index 0000000000..43babf4a75 --- /dev/null +++ b/change/@azure-msal-browser-b9572127-f4c0-473a-a120-61bb7d2850c6.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make claims-based caching configurable #6163", + "packageName": "@azure/msal-browser", + "email": "hemoral@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json b/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json new file mode 100644 index 0000000000..0055944ab3 --- /dev/null +++ b/change/@azure-msal-common-b6ff22a1-1e2b-4000-ab22-1f1eec784b62.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make claims-based caching configurable #6163", + "packageName": "@azure/msal-common", + "email": "hemoral@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json b/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json new file mode 100644 index 0000000000..cea34ff003 --- /dev/null +++ b/change/@azure-msal-node-44b62ae5-8011-430c-aca4-e7230b9845e9.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Make claims-based caching configurable #6163", + "packageName": "@azure/msal-node", + "email": "hemoral@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/lib/msal-browser/docs/configuration.md b/lib/msal-browser/docs/configuration.md index d7ad7e27b3..839d06d6c5 100644 --- a/lib/msal-browser/docs/configuration.md +++ b/lib/msal-browser/docs/configuration.md @@ -18,17 +18,22 @@ const msalConfig = { redirectUri: "enter_redirect_uri_here", postLogoutRedirectUri: "enter_postlogout_uri_here", navigateToLoginRequestUrl: true, - clientCapabilities: ["CP1"] + clientCapabilities: ["CP1"], }, cache: { cacheLocation: "sessionStorage", temporaryCacheLocation: "sessionStorage", storeAuthStateInCookie: false, - secureCookies: false + secureCookies: false, + claimsBasedCachingEnabled: true, }, system: { loggerOptions: { - loggerCallback: (level: LogLevel, message: string, containsPii: boolean): void => { + loggerCallback: ( + level: LogLevel, + message: string, + containsPii: boolean + ): void => { if (containsPii) { return; } @@ -47,19 +52,19 @@ const msalConfig = { return; } }, - piiLoggingEnabled: false + piiLoggingEnabled: false, }, windowHashTimeout: 60000, iframeHashTimeout: 6000, loadFrameTimeout: 0, - asyncPopups: false + asyncPopups: false, }, telemetry: { application: { appName: "My Application", - appVersion: "1.0.0" - } - } + appVersion: "1.0.0", + }, + }, }; const msalInstance = new PublicClientApplication(msalConfig); @@ -69,69 +74,71 @@ const msalInstance = new PublicClientApplication(msalConfig); ### Auth Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `clientId` | App ID of your application. Can be found in your [portal registration](../README#prerequisites). | UUID/GUID | None. This parameter is required in order for MSAL to perform any actions. | -| `authority` | URI of the tenant to authenticate and authorize with. Usually takes the form of `https://{uri}/{tenantid}` (see [Authority](../../msal-common/docs/authority.md)) | String in URI format with tenant - `https://{uri}/{tenantid}` | `https://login.microsoftonline.com/common` | -| `knownAuthorities` | An array of URIs that are known to be valid. Used in B2C scenarios. | Array of strings in URI format | Empty array `[]` | -| `cloudDiscoveryMetadata` | A string containing the cloud discovery response. Used in AAD scenarios. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | -| `authorityMetadata` | A string containing the .well-known/openid-configuration endpoint response. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | -| `redirectUri` | URI where the authorization code response is sent back to. Whatever location is specified here must have the MSAL library available to handle the response. | String in absolute or relative URI format | Login request page (`window.location.href` of page which made auth request) | -| `postLogoutRedirectUri` | URI that is redirected to after a logout() call is made. | String in absolute or relative URI format. Pass `null` to disable post logout redirect. | Login request page (`window.location.href` of page which made auth request) | -| `navigateToLoginRequestUrl` | If `true`, will navigate back to the original request location before processing the authorization code response. If the `redirectUri` is the same as the original request location, this flag should be set to false. | boolean | `true` | -| `clientCapabilities` | Array of capabilities to be added to all network requests as part of the `xms_cc` claims request (see: [Client capability in MSAL](../../msal-common/docs/client-capability.md)) | Array of strings | [] | -| `protocolMode` | Enum representing the protocol mode to use. If `"AAD"`, will function on the OIDC-compliant AAD v2 endpoints; if `"OIDC"`, will function on other OIDC-compliant endpoints. | string | `"AAD"` | -| `azureCloudOptions` | A defined set of azure cloud options for developers to default to their specific cloud authorities, for specific clouds supported please refer to the [AzureCloudInstance](https://aka.ms/msaljs/azure_cloud_instance) | [AzureCloudOptions](https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#azurecloudoptions) | [AzureCloudInstance.None](msaljs/azure_cloud_instance) | -| `skipAuthorityMetadataCache` | A flag to choose whether to use the local metadata cache during authority initialization. Metadata cache would be used if no authority metadata is provided and after a network call for metadata has failed (see [Authority](../../msal-common/docs/authority.md)) | boolean | `false` | +| Option | Description | Format | Default Value | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | +| `clientId` | App ID of your application. Can be found in your [portal registration](../README#prerequisites). | UUID/GUID | None. This parameter is required in order for MSAL to perform any actions. | +| `authority` | URI of the tenant to authenticate and authorize with. Usually takes the form of `https://{uri}/{tenantid}` (see [Authority](../../msal-common/docs/authority.md)) | String in URI format with tenant - `https://{uri}/{tenantid}` | `https://login.microsoftonline.com/common` | +| `knownAuthorities` | An array of URIs that are known to be valid. Used in B2C scenarios. | Array of strings in URI format | Empty array `[]` | +| `cloudDiscoveryMetadata` | A string containing the cloud discovery response. Used in AAD scenarios. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | +| `authorityMetadata` | A string containing the .well-known/openid-configuration endpoint response. See [Performance](../../msal-common/docs/performance.md) for more info | string | Empty string `""` | +| `redirectUri` | URI where the authorization code response is sent back to. Whatever location is specified here must have the MSAL library available to handle the response. | String in absolute or relative URI format | Login request page (`window.location.href` of page which made auth request) | +| `postLogoutRedirectUri` | URI that is redirected to after a logout() call is made. | String in absolute or relative URI format. Pass `null` to disable post logout redirect. | Login request page (`window.location.href` of page which made auth request) | +| `navigateToLoginRequestUrl` | If `true`, will navigate back to the original request location before processing the authorization code response. If the `redirectUri` is the same as the original request location, this flag should be set to false. | boolean | `true` | +| `clientCapabilities` | Array of capabilities to be added to all network requests as part of the `xms_cc` claims request (see: [Client capability in MSAL](../../msal-common/docs/client-capability.md)) | Array of strings | [] | +| `protocolMode` | Enum representing the protocol mode to use. If `"AAD"`, will function on the OIDC-compliant AAD v2 endpoints; if `"OIDC"`, will function on other OIDC-compliant endpoints. | string | `"AAD"` | +| `azureCloudOptions` | A defined set of azure cloud options for developers to default to their specific cloud authorities, for specific clouds supported please refer to the [AzureCloudInstance](https://aka.ms/msaljs/azure_cloud_instance) | [AzureCloudOptions](https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#azurecloudoptions) | [AzureCloudInstance.None](msaljs/azure_cloud_instance) | +| `skipAuthorityMetadataCache` | A flag to choose whether to use the local metadata cache during authority initialization. Metadata cache would be used if no authority metadata is provided and after a network call for metadata has failed (see [Authority](../../msal-common/docs/authority.md)) | boolean | `false` | ### Cache Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `cacheLocation` | Location of token cache in browser. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | -| `temporaryCacheLocation` | Location of temporary cache in browser. This option should only be changed for specific edge cases. Please refer to [caching](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/caching.md#cached-artifacts) for more. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | -| `storeAuthStateInCookie` | If true, stores cache items in cookies as well as browser cache. Should be set to true for use cases using IE. | boolean | `false` | -| `secureCookies` | If true and `storeAuthStateInCookies` is also enabled, MSAL adds the `Secure` flag to the browser cookie so it can only be sent over HTTPS. | boolean | `false` | -| `cacheMigrationEnabled` | If true, cache entries from older versions of MSAL will be updated to conform to the latest cache schema on startup. If your application has not been recently updated to a new version of MSAL.js you can safely turn this off. In the event old cache entries are not migrated it may result in a cache miss when attempting to retrieve accounts or tokens and affected users may need to re-authenticate to get up to date. | boolean | `true` when using `localStorage`, `false` otherwise | +| Option | Description | Format | Default Value | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | +| `cacheLocation` | Location of token cache in browser. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | +| `temporaryCacheLocation` | Location of temporary cache in browser. This option should only be changed for specific edge cases. Please refer to [caching](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/caching.md#cached-artifacts) for more. | String value that must be one of the following: `"sessionStorage"`, `"localStorage"`, `"memoryStorage"` | `sessionStorage` | +| `storeAuthStateInCookie` | If true, stores cache items in cookies as well as browser cache. Should be set to true for use cases using IE. | boolean | `false` | +| `secureCookies` | If true and `storeAuthStateInCookies` is also enabled, MSAL adds the `Secure` flag to the browser cookie so it can only be sent over HTTPS. | boolean | `false` | +| `cacheMigrationEnabled` | If true, cache entries from older versions of MSAL will be updated to conform to the latest cache schema on startup. If your application has not been recently updated to a new version of MSAL.js you can safely turn this off. In the event old cache entries are not migrated it may result in a cache miss when attempting to retrieve accounts or tokens and affected users may need to re-authenticate to get up to date. | boolean | `true` when using `localStorage`, `false` otherwise | +| `claimsBasedCachingEnabled` | If `true`, access tokens will be cached under a key containing the hash of the requested claims string, resulting in a cache miss and new network token request when the same token request is made with different or missing claims. If set to `false`, tokens will be cached without claims, but all requests containing claims will go to the network and overwrite any previously cached token with the same scopes. | boolean | `false` | See [Caching in MSAL](./caching.md) for more. ### System Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `loggerOptions` | Config object for logger. | See [below](#logger-config-options). | See [below](#logger-config-options). | -| `windowHashTimeout` | Timeout in milliseconds to wait for popup operations to resolve. | integer (milliseconds) | `60000` | -| `iframeHashTimeout` | Timeout in milliseconds to wait for iframe operations to resolve. | integer (milliseconds) | `6000` | -| `loadFrameTimeout` | Timeout in milliseconds to wait for iframe/popup operations resolve. If provided, will set default values for `windowHashTimeout` and `iframeHashTimeout`. | integer (milliseconds) | `undefined` | -| `navigateFrameWait ` | Delay in milliseconds to wait for the iframe to load in the window. | integer (milliseconds) | In IE or Edge: `500`, in all other browsers: `0` | -| `asyncPopups` | Sets whether popups are opened asynchronously. When set to false, blank popups are opened before anything else happens. When set to true, popups are opened when making the network request. Can be set to true for scenarios where `about:blank` is not supported, e.g. desktop apps or progressive web apps | boolean | `false` | -| `allowRedirectInIframe` | By default, MSAL will not allow redirect operations to be initiated when the application is inside an iframe. Set this flag to `true` to remove this check. | boolean | `false` | -| `cryptoOptions` | Config object for crypto operations in the browser. | See [below](#crypto-config-options.) | See [below](#crypto-config-options.) | -| `pollIntervalMilliseconds` | Interval of time in milliseconds between polls of popup URL hash during authenticaiton. | integer (milliseconds) | `30` | +| Option | Description | Format | Default Value | +| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ------------------------------------------------ | +| `loggerOptions` | Config object for logger. | See [below](#logger-config-options). | See [below](#logger-config-options). | +| `windowHashTimeout` | Timeout in milliseconds to wait for popup operations to resolve. | integer (milliseconds) | `60000` | +| `iframeHashTimeout` | Timeout in milliseconds to wait for iframe operations to resolve. | integer (milliseconds) | `6000` | +| `loadFrameTimeout` | Timeout in milliseconds to wait for iframe/popup operations resolve. If provided, will set default values for `windowHashTimeout` and `iframeHashTimeout`. | integer (milliseconds) | `undefined` | +| `navigateFrameWait ` | Delay in milliseconds to wait for the iframe to load in the window. | integer (milliseconds) | In IE or Edge: `500`, in all other browsers: `0` | +| `asyncPopups` | Sets whether popups are opened asynchronously. When set to false, blank popups are opened before anything else happens. When set to true, popups are opened when making the network request. Can be set to true for scenarios where `about:blank` is not supported, e.g. desktop apps or progressive web apps | boolean | `false` | +| `allowRedirectInIframe` | By default, MSAL will not allow redirect operations to be initiated when the application is inside an iframe. Set this flag to `true` to remove this check. | boolean | `false` | +| `cryptoOptions` | Config object for crypto operations in the browser. | See [below](#crypto-config-options.) | See [below](#crypto-config-options.) | +| `pollIntervalMilliseconds` | Interval of time in milliseconds between polls of popup URL hash during authenticaiton. | integer (milliseconds) | `30` | #### Logger Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `loggerCallback` | Callback function which handles the logging of MSAL statements. | Function - `loggerCallback: (level: LogLevel, message: string, containsPii: boolean): void` | See [above](#using-the-config-object). | -| `piiLoggingEnabled` | If true, personally identifiable information (PII) is included in logs. | boolean | `false` | +| Option | Description | Format | Default Value | +| ------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------- | +| `loggerCallback` | Callback function which handles the logging of MSAL statements. | Function - `loggerCallback: (level: LogLevel, message: string, containsPii: boolean): void` | See [above](#using-the-config-object). | +| `piiLoggingEnabled` | If true, personally identifiable information (PII) is included in logs. | boolean | `false` | #### Crypto Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `useMsrCrypto` | Whether to use [MSR Crypto](https://github.com/microsoft/MSR-JavaScript-Crypto) if available in the browser (and other crypto interfaces are not available). | boolean | `false` -| `entropy` | Cryptographically strong random values used to seed MSR Crypto (e.g. `crypto.randomBytes(48)` from Node). 48 bits of entropy is recommended. Required if `useMsrCrypto` is enabled. | `Uint8Array` | `undefined` | + +| Option | Description | Format | Default Value | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------- | +| `useMsrCrypto` | Whether to use [MSR Crypto](https://github.com/microsoft/MSR-JavaScript-Crypto) if available in the browser (and other crypto interfaces are not available). | boolean | `false` | +| `entropy` | Cryptographically strong random values used to seed MSR Crypto (e.g. `crypto.randomBytes(48)` from Node). 48 bits of entropy is recommended. Required if `useMsrCrypto` is enabled. | `Uint8Array` | `undefined` | ### Telemetry Config Options -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | +| Option | Description | Format | Default Value | +| ------------- | ------------------------------------------------ | ----------------------------------- | ----------------------------------- | | `application` | Telemetry options for applications using MSAL.js | See [below](#application-telemetry) | See [below](#application-telemetry) | #### Application Telemetry -| Option | Description | Format | Default Value | -| ------ | ----------- | ------ | ------------- | -| `appName` | Unique string name of an application | string | Empty string "" | +| Option | Description | Format | Default Value | +| ------------ | ------------------------------------- | ------ | --------------- | +| `appName` | Unique string name of an application | string | Empty string "" | | `appVersion` | Version of the application using MSAL | string | Empty string "" | diff --git a/lib/msal-browser/docs/v2-migration.md b/lib/msal-browser/docs/v2-migration.md index 2816e2559f..9ceed52f55 100644 --- a/lib/msal-browser/docs/v2-migration.md +++ b/lib/msal-browser/docs/v2-migration.md @@ -59,6 +59,25 @@ const msalConfig = { const msalInstance = await msal.PublicClientApplication.createPublicClientApplication(msalConfig); ``` +### Claims-based caching + +In MSAL v2.x, adding claims to a request will result in a hash of the requested claims string being added to the token cache key by default. This implies that MSAL 2.x caches and matches tokens based on claims by default. In MSAL v3.x, this behavior is no longer the default. MSAL v3.x default behavior is to go to the network to refresh a token every time claims are requested, regardless of whether the token has been cached previously and is still valid. Then, after going to the network, the token received overwrites the cached token in case a silent request without claims is executed later. In order to enable claims-based caching in MSAL v3.x to maintain the same behavior as in MSAL v2.x, developers must use the `cacheOptions.claimsBasedCachingEnabled` configuration flag set to true in the Client Application configuration object: + +```typescript +const msalConfig = { + auth: { + ... + }, + ... + cache: { + claimsBasedCachingEnabled: true + } +} + +const msalInstance = new msal.PublicClientApplication(msalConfig); +await msalInstance.initialize(); +``` + All other APIs are backward compatible with [MSAL v2.x](../../msal-browser/). It is recommended to take a look at the [default sample](../../../samples/msal-browser-samples/VanillaJSTestApp2.0) to see a working example of MSAL v3.0. ### Crypto diff --git a/lib/msal-browser/src/cache/BrowserCacheManager.ts b/lib/msal-browser/src/cache/BrowserCacheManager.ts index 54980db351..aadd7addb3 100644 --- a/lib/msal-browser/src/cache/BrowserCacheManager.ts +++ b/lib/msal-browser/src/cache/BrowserCacheManager.ts @@ -1891,6 +1891,7 @@ export const DEFAULT_BROWSER_CACHE_MANAGER = ( storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; return new BrowserCacheManager( clientId, diff --git a/lib/msal-browser/src/config/Configuration.ts b/lib/msal-browser/src/config/Configuration.ts index f8c805c1c5..abf6bd784c 100644 --- a/lib/msal-browser/src/config/Configuration.ts +++ b/lib/msal-browser/src/config/Configuration.ts @@ -108,6 +108,10 @@ export type CacheOptions = { * If set, MSAL will attempt to migrate cache entries from older versions on initialization. By default this flag is set to true if cacheLocation is localStorage, otherwise false. */ cacheMigrationEnabled?: boolean; + /** + * Flag that determines whether access tokens are stored based on requested claims + */ + claimsBasedCachingEnabled?: boolean; }; export type BrowserSystemOptions = SystemOptions & { @@ -255,6 +259,7 @@ export function buildConfiguration( userInputCache.cacheLocation === BrowserCacheLocation.LocalStorage ? true : false, + claimsBasedCachingEnabled: false, }; // Default logger options for browser @@ -290,7 +295,7 @@ export function buildConfiguration( nativeBrokerHandshakeTimeout: userInputSystem?.nativeBrokerHandshakeTimeout || DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS, - pollIntervalMilliseconds: BrowserConstants.DEFAULT_POLL_INTERVAL_MS + pollIntervalMilliseconds: BrowserConstants.DEFAULT_POLL_INTERVAL_MS, }; const providedSystemOptions: BrowserSystemOptions = { diff --git a/lib/msal-browser/src/controllers/StandardController.ts b/lib/msal-browser/src/controllers/StandardController.ts index 8e4f8611dd..95e5fbd8d9 100644 --- a/lib/msal-browser/src/controllers/StandardController.ts +++ b/lib/msal-browser/src/controllers/StandardController.ts @@ -198,10 +198,7 @@ export class StandardController implements IController { // Initialize the crypto class. this.browserCrypto = this.isBrowserEnvironment - ? new CryptoOps( - this.logger, - this.performanceClient - ) + ? new CryptoOps(this.logger, this.performanceClient) : DEFAULT_CRYPTO_IMPLEMENTATION; this.eventHandler = new EventHandler(this.logger, this.browserCrypto); @@ -226,6 +223,7 @@ export class StandardController implements IController { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; this.nativeInternalStorage = new BrowserCacheManager( this.config.auth.clientId, diff --git a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts index 81726b6353..6415f2896b 100644 --- a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts @@ -178,8 +178,13 @@ export abstract class BaseInteractionClient { ); } - // Set requested claims hash if claims were requested - if (request.claims && !StringUtils.isEmpty(request.claims)) { + // Set requested claims hash if claims-based caching is enabled and claims were requested + if ( + this.config.cache.claimsBasedCachingEnabled && + request.claims && + // Checks for empty stringified object "{}" which doesn't qualify as requested claims + !StringUtils.isEmptyObj(request.claims) + ) { validatedRequest.requestedClaimsHash = await this.browserCrypto.hashString(request.claims); } @@ -210,10 +215,15 @@ export abstract class BaseInteractionClient { * If authority provided in the request does not match environment/authority specified * in the account or MSAL config, we throw an error. */ - async validateRequestAuthority(authority: string, account: AccountInfo): Promise { - const discoveredAuthority = await this.getDiscoveredAuthority(authority); + async validateRequestAuthority( + authority: string, + account: AccountInfo + ): Promise { + const discoveredAuthority = await this.getDiscoveredAuthority( + authority + ); - if(!discoveredAuthority.isAlias(account.environment)) { + if (!discoveredAuthority.isAlias(account.environment)) { throw ClientConfigurationError.createAuthorityMismatchError(); } } diff --git a/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts b/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts index 1123752af6..8ae353e856 100644 --- a/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/StandardInteractionClient.ts @@ -278,6 +278,10 @@ export abstract class StandardInteractionClient extends BaseInteractionClient { logLevel: logger.logLevel, correlationId: this.correlationId, }, + cacheOptions: { + claimsBasedCachingEnabled: + this.config.cache.claimsBasedCachingEnabled, + }, cryptoInterface: this.browserCrypto, networkInterface: this.networkClient, storageInterface: this.browserStorage, diff --git a/lib/msal-browser/test/app/PublicClientApplication.spec.ts b/lib/msal-browser/test/app/PublicClientApplication.spec.ts index 5d18f599ab..7156545b5e 100644 --- a/lib/msal-browser/test/app/PublicClientApplication.spec.ts +++ b/lib/msal-browser/test/app/PublicClientApplication.spec.ts @@ -101,6 +101,7 @@ const cacheConfig = { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; let testAppConfig = { @@ -189,23 +190,33 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { afterEach(() => { sinon.restore(); - }) + }); it("handles concurrent calls", async () => { const config = { auth: { - clientId: TEST_CONFIG.MSAL_CLIENT_ID + clientId: TEST_CONFIG.MSAL_CLIENT_ID, }, system: { - allowNativeBroker: true - } + allowNativeBroker: true, + }, }; const concurrency = 5; - const postMessageSpy: sinon.SinonSpy = sinon.spy(window, "postMessage"); - const initSpy: sinon.SinonSpy = sinon.spy(PublicClientApplication.prototype, "initialize"); + const postMessageSpy: sinon.SinonSpy = sinon.spy( + window, + "postMessage" + ); + const initSpy: sinon.SinonSpy = sinon.spy( + PublicClientApplication.prototype, + "initialize" + ); // @ts-ignore - const handshakeSpy: sinon.SinonSpy = sinon.spy(NativeMessageHandler.prototype, "sendHandshakeRequest"); + const handshakeSpy: sinon.SinonSpy = sinon.spy( + NativeMessageHandler.prototype, + // @ts-ignore + "sendHandshakeRequest" + ); let ports: Set = new Set(); let handledMessages = 0; @@ -220,8 +231,8 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { responseId: request.responseId, body: { method: "HandshakeResponse", - version: 3 - } + version: 3, + }, }; // Fan out messages to all registered ports to validate that responses are getting filtered out properly. @@ -252,8 +263,10 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { for (let i = 0; i < apps.length; i++) { // @ts-ignore expect(apps[i].controller.initialized).toBeTruthy(); - // @ts-ignore - expect(apps[i].controller.getNativeExtensionProvider()).toBeInstanceOf(NativeMessageHandler); + expect( + // @ts-ignore + apps[i].controller.getNativeExtensionProvider() + ).toBeInstanceOf(NativeMessageHandler); } } finally { for (const port of ports) { @@ -267,18 +280,27 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { it("handles concurrent calls with native handshake timeouts", async () => { const config = { auth: { - clientId: TEST_CONFIG.MSAL_CLIENT_ID + clientId: TEST_CONFIG.MSAL_CLIENT_ID, }, system: { - allowNativeBroker: true - } + allowNativeBroker: true, + }, }; const concurrency = 6; - const postMessageSpy: sinon.SinonSpy = sinon.spy(window, "postMessage"); - const initSpy: sinon.SinonSpy = sinon.spy(PublicClientApplication.prototype, "initialize"); + const postMessageSpy: sinon.SinonSpy = sinon.spy( + window, + "postMessage" + ); + const initSpy: sinon.SinonSpy = sinon.spy( + PublicClientApplication.prototype, + "initialize" + ); // @ts-ignore - const createProviderSpy: sinon.SinonSpy = sinon.spy(NativeMessageHandler, "createProvider"); + const createProviderSpy: sinon.SinonSpy = sinon.spy( + NativeMessageHandler, + "createProvider" + ); let ports: Set = new Set(); let handledMessages = 0; @@ -293,8 +315,8 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { responseId: request.responseId, body: { method: "HandshakeResponse", - version: 3 - } + version: 3, + }, }; // Time out the second half of the handshakes. @@ -330,8 +352,12 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { for (let i = 0; i < apps.length; i++) { // @ts-ignore expect(apps[i].controller.initialized).toBeTruthy(); - // @ts-ignore - nativeProviders += apps[i].controller.getNativeExtensionProvider() ? 1 : 0; + nativeProviders += apps[ + i + // @ts-ignore + ].controller.getNativeExtensionProvider() + ? 1 + : 0; } expect(nativeProviders).toEqual(concurrency / 2); } finally { @@ -805,7 +831,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { it("doesnt mutate request correlation id", async () => { const request: RedirectRequest = { scopes: [], - onRedirectNavigate: () => false // Skip the navigation + onRedirectNavigate: () => false, // Skip the navigation }; await pca.loginRedirect(request).catch(() => null); @@ -1102,7 +1128,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { it("doesnt mutate request correlation id", async () => { const request: RedirectRequest = { scopes: [], - onRedirectNavigate: () => false // Skip the navigation + onRedirectNavigate: () => false, // Skip the navigation }; await pca.acquireTokenRedirect(request).catch(() => null); @@ -1325,7 +1351,10 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { scopes: [], }; - jest.spyOn(PopupClient.prototype, "initiateAuthRequest").mockImplementation(() => { + jest.spyOn( + PopupClient.prototype, + "initiateAuthRequest" + ).mockImplementation(() => { throw "Request object has been built at this point, no need to continue"; }); @@ -1696,7 +1725,10 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { scopes: [], }; - jest.spyOn(PopupClient.prototype, "initiateAuthRequest").mockImplementation(() => { + jest.spyOn( + PopupClient.prototype, + "initiateAuthRequest" + ).mockImplementation(() => { throw "Request object has been built at this point, no need to continue"; }); @@ -2446,13 +2478,9 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { code: "123", }; - await pca - .acquireTokenByCode(request) - .catch(() => null); + await pca.acquireTokenByCode(request).catch(() => null); - await pca - .acquireTokenByCode(request) - .catch(() => null); + await pca.acquireTokenByCode(request).catch(() => null); expect(request.correlationId).toBe(undefined); }); @@ -2952,13 +2980,9 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { scopes: [], }; - await pca - .acquireTokenSilent(request) - .catch(() => null); + await pca.acquireTokenSilent(request).catch(() => null); - await pca - .acquireTokenSilent(request) - .catch(() => null); + await pca.acquireTokenSilent(request).catch(() => null); expect(request.correlationId).toBe(undefined); }); @@ -3099,6 +3123,112 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }); it("makes one network request with multiple parallel silent requests with same request", async () => { + const testServerTokenResponse = { + token_type: TEST_CONFIG.TOKEN_TYPE_BEARER, + scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), + expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + ext_expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + access_token: TEST_TOKENS.ACCESS_TOKEN, + refresh_token: TEST_TOKENS.REFRESH_TOKEN, + id_token: TEST_TOKENS.IDTOKEN_V2, + }; + const testIdTokenClaims: TokenClaims = { + ver: "2.0", + iss: "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", + sub: "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ", + name: "Abe Lincoln", + preferred_username: "AbeLi@microsoft.com", + oid: "00000000-0000-0000-66f3-3332eca7ea81", + tid: "3338040d-6c67-4c5b-b112-36a304b66dad", + nonce: "123523", + }; + const testAccount: AccountInfo = { + homeAccountId: TEST_DATA_CLIENT_INFO.TEST_HOME_ACCOUNT_ID, + localAccountId: TEST_DATA_CLIENT_INFO.TEST_UID, + environment: "login.windows.net", + tenantId: testIdTokenClaims.tid || "", + username: testIdTokenClaims.preferred_username || "", + }; + const testTokenResponse: AuthenticationResult = { + authority: TEST_CONFIG.validAuthority, + uniqueId: testIdTokenClaims.oid || "", + tenantId: testIdTokenClaims.tid || "", + scopes: [...TEST_CONFIG.DEFAULT_SCOPES, "User.Read"], + idToken: testServerTokenResponse.id_token, + idTokenClaims: testIdTokenClaims, + accessToken: testServerTokenResponse.access_token, + fromCache: false, + correlationId: RANDOM_TEST_GUID, + expiresOn: new Date( + Date.now() + testServerTokenResponse.expires_in * 1000 + ), + account: testAccount, + tokenType: AuthenticationScheme.BEARER, + }; + sinon + .stub(CryptoOps.prototype, "createNewGuid") + .returns(RANDOM_TEST_GUID); + sinon + .stub(CryptoOps.prototype, "hashString") + .resolves(TEST_CRYPTO_VALUES.TEST_SHA256_HASH); + const atsSpy = sinon.spy( + StandardController.prototype, + "acquireTokenSilentAsync" + ); + const silentATStub = sinon + .stub( + RefreshTokenClient.prototype, + "acquireTokenByRefreshToken" + ) + .resolves(testTokenResponse); + const tokenRequest: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.BEARER, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedTokenRequest: CommonSilentFlowRequest = { + ...tokenRequest, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + const silentRequest1 = pca.acquireTokenSilent(tokenRequest); + const silentRequest2 = pca.acquireTokenSilent(tokenRequest); + const silentRequest3 = pca.acquireTokenSilent(tokenRequest); + const parallelResponse = await Promise.all([ + silentRequest1, + silentRequest2, + silentRequest3, + ]); + + expect(silentATStub.calledWith(expectedTokenRequest)).toBeTruthy(); + expect(atsSpy.calledOnce).toBe(true); + expect(silentATStub.callCount).toEqual(1); + expect(parallelResponse[0]).toEqual(testTokenResponse); + expect(parallelResponse[1]).toEqual(testTokenResponse); + expect(parallelResponse[2]).toEqual(testTokenResponse); + expect(parallelResponse).toHaveLength(3); + }); + + it("makes one network request with multiple parallel silent requests with same request including claims when claimsBasedCaching is enabled", async () => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowNativeBroker: false, + }, + cache: { + claimsBasedCachingEnabled: true, + }, + }); + + await pca.initialize(); const testServerTokenResponse = { token_type: TEST_CONFIG.TOKEN_TYPE_BEARER, scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), @@ -3358,6 +3488,224 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { forceRefresh: false, }; + const silentRequest1 = pca.acquireTokenSilent(tokenRequest1); + const silentRequest2 = pca.acquireTokenSilent(tokenRequest1); + const silentRequest3 = pca.acquireTokenSilent(tokenRequest2); + const popSilentRequest1 = pca.acquireTokenSilent(popTokenRequest1); + const popSilentRequest2 = pca.acquireTokenSilent(popTokenRequest1); + const popSilentRequest3 = pca.acquireTokenSilent(popTokenRequest2); + const sshCertSilentRequest1 = + pca.acquireTokenSilent(sshCertRequest1); + const sshCertSilentRequest2 = + pca.acquireTokenSilent(sshCertRequest1); + const sshCertSilentRequest3 = + pca.acquireTokenSilent(sshCertRequest2); + await Promise.all([ + silentRequest1, + silentRequest2, + silentRequest3, + popSilentRequest1, + popSilentRequest2, + popSilentRequest3, + sshCertSilentRequest1, + sshCertSilentRequest2, + sshCertSilentRequest3, + ]); + + expect(silentATStub.calledWith(expectedTokenRequest1)).toBeTruthy(); + expect(silentATStub.calledWith(expectedTokenRequest2)).toBeTruthy(); + expect( + silentATStub.calledWith(expectedPopTokenRequest1) + ).toBeTruthy(); + expect( + silentATStub.calledWith(expectedPopTokenRequest2) + ).toBeTruthy(); + expect( + silentATStub.calledWith(expectedSshCertificateRequest1) + ).toBeTruthy(); + expect( + silentATStub.calledWith(expectedSshCertificateRequest2) + ).toBeTruthy(); + expect(silentATStub.callCount).toEqual(6); + }); + + it("makes network requests for each distinct request including claims when acquireTokenSilent is called in parallel with claimsBasedCaching is enabled", async () => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowNativeBroker: false, + }, + cache: { + claimsBasedCachingEnabled: true, + }, + }); + + await pca.initialize(); + const testServerTokenResponse = { + token_type: TEST_CONFIG.TOKEN_TYPE_BEARER, + scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), + expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + ext_expires_in: TEST_TOKEN_LIFETIMES.DEFAULT_EXPIRES_IN, + access_token: TEST_TOKENS.ACCESS_TOKEN, + refresh_token: TEST_TOKENS.REFRESH_TOKEN, + id_token: TEST_TOKENS.IDTOKEN_V2, + }; + const testIdTokenClaims: TokenClaims = { + ver: "2.0", + iss: "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", + sub: "AAAAAAAAAAAAAAAAAAAAAIkzqFVrSaSaFHy782bbtaQ", + name: "Abe Lincoln", + preferred_username: "AbeLi@microsoft.com", + oid: "00000000-0000-0000-66f3-3332eca7ea81", + tid: "3338040d-6c67-4c5b-b112-36a304b66dad", + nonce: "123523", + }; + const testAccount: AccountInfo = { + homeAccountId: TEST_DATA_CLIENT_INFO.TEST_HOME_ACCOUNT_ID, + localAccountId: TEST_DATA_CLIENT_INFO.TEST_UID, + environment: "login.windows.net", + tenantId: testIdTokenClaims.tid || "", + username: testIdTokenClaims.preferred_username || "", + }; + const testTokenResponse: AuthenticationResult = { + authority: TEST_CONFIG.validAuthority, + uniqueId: testIdTokenClaims.oid || "", + tenantId: testIdTokenClaims.tid || "", + scopes: [...TEST_CONFIG.DEFAULT_SCOPES, "User.Read"], + idToken: testServerTokenResponse.id_token, + idTokenClaims: testIdTokenClaims, + accessToken: testServerTokenResponse.access_token, + fromCache: false, + correlationId: RANDOM_TEST_GUID, + expiresOn: new Date( + Date.now() + testServerTokenResponse.expires_in * 1000 + ), + account: testAccount, + tokenType: AuthenticationScheme.BEARER, + }; + sinon + .stub(CryptoOps.prototype, "createNewGuid") + .returns(RANDOM_TEST_GUID); + sinon + .stub(CryptoOps.prototype, "hashString") + .resolves(TEST_CRYPTO_VALUES.TEST_SHA256_HASH); + const silentATStub = sinon + .stub( + RefreshTokenClient.prototype, + "acquireTokenByRefreshToken" + ) + .resolves(testTokenResponse); + // Beaerer requests + const tokenRequest1: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.BEARER, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedTokenRequest1: CommonSilentFlowRequest = { + ...tokenRequest1, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + const tokenRequest2: CommonSilentFlowRequest = { + scopes: ["Mail.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.BEARER, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedTokenRequest2: CommonSilentFlowRequest = { + ...tokenRequest1, + scopes: ["Mail.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + // PoP requests + const popTokenRequest1: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.POP, + resourceRequestMethod: "GET", + resourceRequestUri: "https://testUri.com/user.read", + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + + const popTokenRequest2: CommonSilentFlowRequest = { + scopes: ["Mail.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.POP, + resourceRequestMethod: "GET", + resourceRequestUri: "https://testUri.com/mail.read", + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + const expectedPopTokenRequest1: CommonSilentFlowRequest = { + ...popTokenRequest1, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + const expectedPopTokenRequest2: CommonSilentFlowRequest = { + ...popTokenRequest2, + scopes: ["Mail.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + // SSH Certificate requests + const sshCertRequest1: CommonSilentFlowRequest = { + scopes: ["User.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.SSH, + sshJwk: TEST_SSH_VALUES.ENCODED_SSH_JWK, + sshKid: TEST_SSH_VALUES.SSH_KID, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + + const sshCertRequest2: CommonSilentFlowRequest = { + scopes: ["Mail.Read"], + account: testAccount, + authority: TEST_CONFIG.validAuthority, + authenticationScheme: AuthenticationScheme.SSH, + sshJwk: TEST_SSH_VALUES.ALTERNATE_ENCODED_SSH_JWK, + sshKid: TEST_SSH_VALUES.ALTERNATE_SSH_KID, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + }; + + const expectedSshCertificateRequest1: CommonSilentFlowRequest = { + ...sshCertRequest1, + scopes: ["User.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + + const expectedSshCertificateRequest2: CommonSilentFlowRequest = { + ...sshCertRequest2, + scopes: ["Mail.Read"], + authority: `${Constants.DEFAULT_AUTHORITY}`, + correlationId: RANDOM_TEST_GUID, + forceRefresh: false, + }; + // Requests with claims const claimsRequest1: CommonSilentFlowRequest = { scopes: ["User.Read"], diff --git a/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts b/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts index ecfb8abdaa..0eed51d02b 100644 --- a/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts +++ b/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts @@ -61,6 +61,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( @@ -247,6 +248,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -264,6 +266,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: true, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -322,6 +325,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: true, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -356,6 +360,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -371,6 +376,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: true, + claimsBasedCachingEnabled: false, }, browserCrypto, logger @@ -2127,14 +2133,14 @@ describe("BrowserCacheManager tests", () => { testObj.authorization_endpoint = // @ts-ignore DEFAULT_OPENID_CONFIG_RESPONSE.body.authorization_endpoint; - testObj.token_endpoint = + testObj.token_endpoint = // @ts-ignore DEFAULT_OPENID_CONFIG_RESPONSE.body.token_endpoint; - testObj.end_session_endpoint = + testObj.end_session_endpoint = // @ts-ignore DEFAULT_OPENID_CONFIG_RESPONSE.body.end_session_endpoint; - // @ts-ignore - testObj.issuer = DEFAULT_OPENID_CONFIG_RESPONSE.body.issuer; + // @ts-ignore + testObj.issuer = DEFAULT_OPENID_CONFIG_RESPONSE.body.issuer; // @ts-ignore testObj.jwks_uri = DEFAULT_OPENID_CONFIG_RESPONSE.body.jwks_uri; testObj.aliasesFromNetwork = false; @@ -3094,6 +3100,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( @@ -3295,6 +3302,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( @@ -3500,6 +3508,7 @@ describe("BrowserCacheManager tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( diff --git a/lib/msal-browser/test/cache/TokenCache.spec.ts b/lib/msal-browser/test/cache/TokenCache.spec.ts index df8911b947..30d9e8dac8 100644 --- a/lib/msal-browser/test/cache/TokenCache.spec.ts +++ b/lib/msal-browser/test/cache/TokenCache.spec.ts @@ -56,6 +56,7 @@ describe("TokenCache tests", () => { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; logger = new Logger({ loggerCallback: ( diff --git a/lib/msal-browser/test/config/Configuration.spec.ts b/lib/msal-browser/test/config/Configuration.spec.ts index 6f6036ffd3..fa12522510 100644 --- a/lib/msal-browser/test/config/Configuration.spec.ts +++ b/lib/msal-browser/test/config/Configuration.spec.ts @@ -49,6 +49,7 @@ describe("Configuration.ts Class Unit Tests", () => { expect(emptyConfig.cache?.storeAuthStateInCookie).toBeDefined(); expect(emptyConfig.cache?.storeAuthStateInCookie).toBe(false); expect(emptyConfig.cache?.secureCookies).toBe(false); + expect(emptyConfig.cache?.claimsBasedCachingEnabled).toBe(false); // System config checks expect(emptyConfig.system).toBeDefined(); expect(emptyConfig.system?.loggerOptions).toBeDefined(); @@ -222,6 +223,7 @@ describe("Configuration.ts Class Unit Tests", () => { cacheLocation: BrowserCacheLocation.LocalStorage, storeAuthStateInCookie: true, secureCookies: true, + claimsBasedCachingEnabled: true, }, system: { windowHashTimeout: TEST_POPUP_TIMEOUT_MS, @@ -253,6 +255,7 @@ describe("Configuration.ts Class Unit Tests", () => { expect(newConfig.cache?.storeAuthStateInCookie).not.toBeNull(); expect(newConfig.cache?.storeAuthStateInCookie).toBe(true); expect(newConfig.cache?.secureCookies).toBe(true); + expect(newConfig.cache?.claimsBasedCachingEnabled).toBe(true); // System config checks expect(newConfig.system).not.toBeNull(); expect(newConfig.system?.windowHashTimeout).not.toBeNull(); diff --git a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts index 19c7bb28e4..31714a58c3 100644 --- a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts @@ -79,6 +79,7 @@ const cacheConfig = { storeAuthStateInCookie: false, secureCookies: false, cacheMigrationEnabled: false, + claimsBasedCachingEnabled: false, }; const loggerOptions = { @@ -1870,7 +1871,12 @@ describe("RedirectClient", () => { ) ).toEqual(`${Constants.DEFAULT_AUTHORITY}`); bfCacheCallback({ persisted: true }); - expect(eventSpy.calledWith(EventType.RESTORE_FROM_BFCACHE, InteractionType.Redirect)).toBe(true); + expect( + eventSpy.calledWith( + EventType.RESTORE_FROM_BFCACHE, + InteractionType.Redirect + ) + ).toBe(true); expect(browserStorage.isInteractionInProgress()).toBe( false ); diff --git a/lib/msal-browser/tsconfig.build.tsbuildinfo b/lib/msal-browser/tsconfig.build.tsbuildinfo index 7731d99b20..19893c2097 100644 --- a/lib/msal-browser/tsconfig.build.tsbuildinfo +++ b/lib/msal-browser/tsconfig.build.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/tslib/tslib.d.ts","../msal-common/dist/utils/constants.d.ts","../msal-common/dist/network/requestthumbprint.d.ts","../msal-common/dist/authority/authoritytype.d.ts","../msal-common/dist/authority/openidconfigresponse.d.ts","../msal-common/dist/url/iuri.d.ts","../msal-common/dist/authority/protocolmode.d.ts","../msal-common/dist/cache/entities/credentialentity.d.ts","../msal-common/dist/cache/entities/idtokenentity.d.ts","../msal-common/dist/utils/msaltypes.d.ts","../msal-common/dist/request/baseauthrequest.d.ts","../msal-common/dist/crypto/signedhttprequest.d.ts","../msal-common/dist/crypto/icrypto.d.ts","../msal-common/dist/cache/entities/accesstokenentity.d.ts","../msal-common/dist/cache/entities/refreshtokenentity.d.ts","../msal-common/dist/cache/entities/appmetadataentity.d.ts","../msal-common/dist/cache/entities/cacherecord.d.ts","../msal-common/dist/account/tokenclaims.d.ts","../msal-common/dist/account/accountinfo.d.ts","../msal-common/dist/cache/entities/servertelemetryentity.d.ts","../msal-common/dist/cache/entities/throttlingentity.d.ts","../msal-common/dist/authority/clouddiscoverymetadata.d.ts","../msal-common/dist/cache/entities/authoritymetadataentity.d.ts","../msal-common/dist/cache/interface/icachemanager.d.ts","../msal-common/dist/authority/azureregion.d.ts","../msal-common/dist/authority/azureregionconfiguration.d.ts","../msal-common/dist/authority/authorityoptions.d.ts","../msal-common/dist/authority/regiondiscoverymetadata.d.ts","../msal-common/dist/logger/logger.d.ts","../msal-common/dist/telemetry/performance/performanceevent.d.ts","../msal-common/dist/telemetry/performance/iperformancemeasurement.d.ts","../msal-common/dist/telemetry/performance/iperformanceclient.d.ts","../msal-common/dist/authority/authority.d.ts","../msal-common/dist/account/authtoken.d.ts","../msal-common/dist/cache/entities/accountentity.d.ts","../msal-common/dist/request/scopeset.d.ts","../msal-common/dist/cache/utils/cachetypes.d.ts","../msal-common/dist/cache/cachemanager.d.ts","../msal-common/dist/response/serverauthorizationtokenresponse.d.ts","../msal-common/dist/network/networkmanager.d.ts","../msal-common/dist/network/inetworkmodule.d.ts","../msal-common/dist/telemetry/server/servertelemetryrequest.d.ts","../msal-common/dist/telemetry/server/servertelemetrymanager.d.ts","../msal-common/dist/cache/interface/iserializabletokencache.d.ts","../msal-common/dist/cache/persistence/tokencachecontext.d.ts","../msal-common/dist/cache/interface/icacheplugin.d.ts","../msal-common/dist/account/clientcredentials.d.ts","../msal-common/dist/config/clientconfiguration.d.ts","../msal-common/dist/account/ccscredential.d.ts","../msal-common/dist/client/baseclient.d.ts","../msal-common/dist/request/commonauthorizationurlrequest.d.ts","../msal-common/dist/request/commonauthorizationcoderequest.d.ts","../msal-common/dist/response/authenticationresult.d.ts","../msal-common/dist/request/commonendsessionrequest.d.ts","../msal-common/dist/response/authorizationcodepayload.d.ts","../msal-common/dist/client/authorizationcodeclient.d.ts","../msal-common/dist/request/commonrefreshtokenrequest.d.ts","../msal-common/dist/request/commonsilentflowrequest.d.ts","../msal-common/dist/client/refreshtokenclient.d.ts","../msal-common/dist/client/silentflowclient.d.ts","../msal-common/dist/config/apptokenprovider.d.ts","../msal-common/dist/account/clientinfo.d.ts","../msal-common/dist/authority/authorityfactory.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","../msal-common/dist/request/nativerequest.d.ts","../msal-common/dist/request/nativesignoutrequest.d.ts","../msal-common/dist/broker/nativebroker/inativebrokerplugin.d.ts","../msal-common/dist/network/throttlingutils.d.ts","../msal-common/dist/response/serverauthorizationcoderesponse.d.ts","../msal-common/dist/url/urlstring.d.ts","../msal-common/dist/crypto/iguidgenerator.d.ts","../msal-common/dist/crypto/joseheader.d.ts","../msal-common/dist/request/commonclientcredentialrequest.d.ts","../msal-common/dist/request/commononbehalfofrequest.d.ts","../msal-common/dist/response/devicecoderesponse.d.ts","../msal-common/dist/request/commondevicecoderequest.d.ts","../msal-common/dist/request/commonusernamepasswordrequest.d.ts","../msal-common/dist/request/requestparameterbuilder.d.ts","../msal-common/dist/response/externaltokenresponse.d.ts","../msal-common/dist/utils/protocolutils.d.ts","../msal-common/dist/response/responsehandler.d.ts","../msal-common/dist/request/authenticationheaderparser.d.ts","../msal-common/dist/error/autherror.d.ts","../msal-common/dist/error/interactionrequiredautherror.d.ts","../msal-common/dist/error/servererror.d.ts","../msal-common/dist/error/clientautherror.d.ts","../msal-common/dist/error/clientconfigurationerror.d.ts","../msal-common/dist/account/decodedauthtoken.d.ts","../msal-common/dist/utils/stringutils.d.ts","../msal-common/dist/utils/timeutils.d.ts","../msal-common/dist/telemetry/performance/performanceclient.d.ts","../msal-common/dist/telemetry/performance/stubperformanceclient.d.ts","../msal-common/dist/crypto/poptokengenerator.d.ts","../msal-common/dist/packagemetadata.d.ts","../msal-common/dist/index.d.ts","./src/error/browserautherror.ts","./src/request/popupwindowattributes.ts","./src/request/popuprequest.ts","./src/request/redirectrequest.ts","./src/utils/browserconstants.ts","./src/network/fetchclient.ts","./src/network/xhrclient.ts","./src/utils/browserutils.ts","./src/navigation/navigationoptions.ts","./src/navigation/inavigationclient.ts","./src/navigation/navigationclient.ts","./src/config/configuration.ts","./src/error/browserconfigurationautherror.ts","./src/cache/iwindowstorage.ts","./src/cache/browserstorage.ts","./src/cache/memorystorage.ts","./src/utils/browserprotocolutils.ts","./src/broker/nativebroker/nativerequest.ts","./src/cache/browsercachemanager.ts","./src/event/eventtype.ts","./src/event/eventmessage.ts","./src/event/eventhandler.ts","./src/request/endsessionrequest.ts","./src/request/ssosilentrequest.ts","./src/packagemetadata.ts","./src/error/nativeautherror.ts","./src/broker/nativebroker/nativemessagehandler.ts","./src/interaction_client/baseinteractionclient.ts","./src/request/authorizationurlrequest.ts","./src/interaction_client/standardinteractionclient.ts","./src/interaction_handler/interactionhandler.ts","./src/interaction_handler/redirecthandler.ts","./src/request/silentrequest.ts","./src/broker/nativebroker/nativeresponse.ts","./src/interaction_client/silentcacheclient.ts","./src/interaction_client/nativeinteractionclient.ts","./src/interaction_client/redirectclient.ts","./src/request/endsessionpopuprequest.ts","./src/interaction_client/popupclient.ts","./src/interaction_handler/silenthandler.ts","./src/interaction_client/silentiframeclient.ts","./src/interaction_client/silentrefreshclient.ts","./src/utils/mathutils.ts","./src/utils/browserstringutils.ts","./src/crypto/isubtlecrypto.ts","./src/crypto/modernbrowsercrypto.ts","./src/crypto/msrbrowsercrypto.ts","./src/crypto/msbrowsercrypto.ts","./src/crypto/browsercrypto.ts","./src/crypto/guidgenerator.ts","./src/encode/base64encode.ts","./src/encode/base64decode.ts","./src/crypto/pkcegenerator.ts","./src/cache/iasyncmemorystorage.ts","./src/cache/databasestorage.ts","./src/cache/asyncmemorystorage.ts","./src/cache/cryptokeystore.ts","./src/crypto/cryptoops.ts","./src/telemetry/browserperformancemeasurement.ts","./src/telemetry/browserperformanceclient.ts","./src/internals.ts","./src/cache/tokencache.ts","./src/cache/itokencache.ts","./src/request/authorizationcoderequest.ts","./src/app/ipublicclientapplication.ts","./src/controllers/icontroller.ts","./src/operatingcontext/baseoperatingcontext.ts","./src/operatingcontext/teamsappoperatingcontext.ts","./src/operatingcontext/standardoperatingcontext.ts","./src/interaction_client/hybridspaauthorizationcodeclient.ts","./src/interaction_client/silentauthcodeclient.ts","./src/controllers/standardcontroller.ts","./src/controllers/controllerfactory.ts","./src/app/publicclientapplication.ts","./src/crypto/signedhttprequest.ts","./src/index.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/graceful-fs/index.d.ts","./node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/@types/istanbul-reports/index.d.ts","./node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","./node_modules/jest-diff/build/cleanupsemantic.d.ts","./node_modules/pretty-format/build/types.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/jest-diff/build/types.d.ts","./node_modules/jest-diff/build/difflines.d.ts","./node_modules/jest-diff/build/printdiffs.d.ts","./node_modules/jest-diff/build/index.d.ts","./node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/@types/jest/index.d.ts","./node_modules/@types/node-fetch/node_modules/form-data/index.d.ts","./node_modules/@types/node-fetch/externals.d.ts","./node_modules/@types/node-fetch/index.d.ts","./node_modules/@types/normalize-package-data/index.d.ts","./node_modules/@types/prettier/index.d.ts","./node_modules/@types/resolve/index.d.ts","./node_modules/@types/sinon/ts3.1/index.d.ts","./node_modules/@types/stack-utils/index.d.ts","./node_modules/@types/tunnel/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/minimatch/index.d.ts","../../node_modules/@types/minimist/index.d.ts","../../node_modules/@types/parse-json/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"4576b4e61049f5ffd7c9e935cf88832e089265bdb15ffc35077310042cbbbeea","1e385a987c106de39d4b4fa26669d23c76e302c1709b084b58bf4d94246fda87","5e319fdf572349410b8cc20d220cd6618137774ff770df7ab905b628339fda50","b1c870388df5b626c5485c24319039346c8505d1e3452148086105af1bfd6171","e03f6b084efd111f060e0c13bb864cb7e1d877e35191bbb717b524ae1c7fa947","862843747fa837649bd721feacd2d936e2221a85e35790cc67e2cffbca0dd1a8","724065c2f83560a069b8eade809bb29575df50bd7a32760b1ec533dc2deb5a0c","fb2a08a552475ef4e6ba971fc6ba453bf1706b7f20fb498e30ffe4995f61473c","840c254cef4d519c91012661e23795cc57892ba809351672b72243207083bc1b","a9bab28455365db6d1abf5ac14a819804e1151db5687a82919b78212fafffa2b","9b69d80c4b586889bdaa6e5e84768c0805b9fb4df7e188cf4f8bb7bb3c4c93e3","5a2fbd4dc710310356c99ad75288f33d686e360d8ed6c1302d396058ddb61118","ed4b75e934b993346c8b48953488a42e73184d07c60eff94ea11531999a7d64a","4c858e953c401511747441083ce7ba754f8bc3fe12dde7b6e961650265aaa97a","0fd87bdcee2af2fe527752e9d7f09b15eb3d8e279a143427b29afb5d6d7dac2e","9a1effdd0b12461ce95b95e58c77930b37e299b36cf8b0e307d62c4336faa11f","fb0bd3555b8af1497b0e0acd42c467ce0a40e9a9ed743c0f7722d6fab027c4d0","5ca47328dbfc6337b525152ab88927821a2a24c554bf4d5948f221b61e80d2dd","3304867f11ff65c60da788c360eb2ff136c9d5c3dd38e6d62abbbd89aaa78489","43140e0fcffc94424c4b9c4c7173e490cfb83df68d2e8ef9a6f34a16efa4e1ac","be85fb1199efb6c24dbf3aa5b985f21d649723fce53b9a6e8cab64bb72bcdc3c","3a867a1265733103bcad7755afd47b60a9dcac60d0a5dec42e085d6dcd5c911d","c01787f732d878d85dfa154b2b38e8d37de87d42103de786a5fab48d77c47655","c3c48e4f0deebb1b123f4dd83e980582cc1ea578c40062bce92cd4889ac50fa0","6dec53b98fadb9ec4638c1567d354aee9812fd20363e18e61609a3880ce9c763","fdb8d30b8242df45d23c5a4691b923ab99ad7cf5647693b62ce5824d9f24fe4f","d5f55c52313ecd71940425793e91e2e6f1b4ae8307d6fc5de67a763b22cf84aa","9b36e35bf4f4abcca7de976c5e433f8be6910a7c674b404d2fe24d104254a8ab","d8f9503bc2f5e2b83f640311c546e4cedf4ef7bb0c2ab03e51a0e839ab66b150","b33b82c78c2f7ca8fb2b1af736e2308869d07c5c0cae4a8df81ed540ad5fb7d1","c22e784c6b2d47979cdf84bfe1b18f80532bc94265f62123870b755150067ac2","f53a6907dfc25b09496387bf53900e81740c92a015d39d7c8cf69adc168f90bc","4d8ce0d97019c307467021293b2c24b74c88692f89b103f83f15ace45803233d","0497c19904620e94359644b1b82447a57da03d520cba2e7b776c72d7829eb192","63354c3d7e63811e62243e4cf2bf1efc31f1eaa3d7f15cbac8e532986ea13772","93d77d212d03de4e0c178dfd2ca291ce5f9625ca7a4c4083cba957eadde4ac27","77207dda0cfc40edde84a390109f49fa399c90aa38dd409dd7bd2fe2f7c84c98","a4a011a1d8fe222cd7b7172d27a9d72dd278f9f054585f7896ca859c343feefb","5bdabd9e1f998ecefce8911db251da9b847e8a79dc769ab90f224dbda84038a3","bbc3b1e705969c600f86c16aeec099c3b1e76096ed8227e0050cb7049d3305b1","7cf75e284d43663adcf5fcee60dcbf8d87f0fa7eba404af34a802493dac3ac5c","d2f0b0326978533385f6256ff7ba75d6cf6fa9426d55c5bbb2a5c0d6fa892e69","e9e51d22e92e12c72c5418bec47197de38577a30cdbd5eb67efea402c2722986","dd87e240c0115e6e75635fecac4d76ca829a73c4ab5bb74bf18380b394830b39","dd93626fbc255c1439093574aed0806f3aec4baf9ce99c9867ef7951b616d89c","38c468fd15ab0b0d979625adfa3562aa3113277823f54bdc4072cf43691faf59","c7205cf438edcb87dd62562eb5586830cf57790ff3fa9c1bc6ea67e4e0a6c5f1","88e90c6527b256095681b1a89c14d9bee15dd002493730f20eca454c73ba6c78","69514537455a02e3c51c1238d821c65eee1d57b16081e379a47b22cc61b37e34","946fa0abe5336c2c8efb9aff02b4987889ba4f225b115bfa635614dfee52d4c7","9a155c2da9c111dc02dfae665fba36d0e8ae665b76f55aec87d48e1150653f28","12d918e9578ad563a64c094717e55a7a5bc738bd03476e36312d8a20f57dea18","99cef539733f3c32895e5890426a39281f533afcbf8780025d258020b30a9cab","2467ec5f8f8ca4f44b6f8af00ed1c004c91639239bdc51e79682ff0c4e348e5e","52c6c5e6a1de07b2bb5d0bb4370151506c9b9526b589793dd07338f42fc8234c","311c3d7c21065edd96c1400d79e29fbb28f87acb68d453d416f2a93114f8c7d0","9329d7590c92d3ce321d3c4de36d53528afe7bd40b79224c022b9a81eab526d8","18eac57b1c6a7525a83038562f36ba94994166ed108c134522f59926d729b703","3a610d83a35b9cafbef90aaa379cdb5fc1681e930978a8c477e74d08784bd47c","ca7b4548270f45c13b60a8b22a50fbe0b73070a60209a92f9924c2d426b9ef79","c649bebc86680273b4b8411a7eccef4613696151c3aa74b1fd4f44851dba3123","a54b5d7f8c63c389c475359d4bd776e872cbf96360b44cc75a9cbe804ffcf285","4a53c158922bf59d84d825e724c2596434f80251b6df4292cfae9ff75bff94a8","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"57b6cb95756d1fe3bfeb20205de27b0c5406e4a86e130c6dfa6bd92af641e09d","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"e193e634a99c9c1d71f1c6e4e1567a4a73584328d21ea02dd5cddbaad6693f61","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","216717f17c095cde1dc19375e1ab3af0a4a485355860c077a4f9d6ea59fab5b5","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"80473bd0dd90ca1e166514c2dfead9d5803f9c51418864ca35abbeec6e6847e1","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","e6c86d83bd526c8bdb5d0bf935b8e72ce983763d600743f74d812fdf4abf4df6","a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","7d55d78cd47cf5280643b53434b16c2d9d11d144126932759fbdd51da525eec4","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"6de4a219df57d2b27274d59b67708f13c2cbf7ed211abe57d8f9ab8b25cde776","0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"d8d555f3d607ecaa18d55de6995ea8f206342ecc93305919eac945c7c78c78c6","e2a7281a5a7aec0ceb36ea105b8b3e1c6d6758ed199301f3a10de5ebbcb6e743","7f74442d87d094f1b77bed3748dd97c1d139eb05222fb46de9d1b8402279bd7d","0d39ee91274c833749ac253a276869d9bac615224a2cd55b65502260e02da127","f2fc45586b1e881c9e9cbff4445981c9c94554088881696cfa8926c10368838e","010696076753d265a6a67bcceb9ea6e66107067be599bdc2b0619efdc08d1bc7","e475bef588275a0f2b53373b3d17c7ddeaf111c40d3ca2706bfff92d2bf19d4e","612c84d13df19cc411b683a84df4a6401587afe703facbba3fc64ca933538fba","038799d3d36cdd6a0ab716d965f587f5d8f610a5306e1993364ebf4fae069ca3","3510b344ffb66182b00c0956dff723c6ab69a314112e71dd1eb0346a92d0312c","5599f34a53ab350a54e15a81982ba1c98197430ec3e1df7edcd37d1f31fdc506","d68d14ef5a31134bf952ef96c93446ed4f0686e840d0011a071ff8f4c782a30b","d4b5dc4a29556e4a80411db80e9f7eb69c69584e0738aca09ae4a6654c93d21f","63e61c4ea896197bfcbf8c499a2409baa31ab146694a847ec606a7e74080948e","60cab134777f1131b3abbe42a3eba3003013adb8c4d8a2f882a682c796c8a11e","0c0d1eadef6a092235981c643b9b797280f5130ddb3a738d563b87780977f668","7e25b3b42add5bb8b326256318255e81b83bccbfe4eff3bbab2070dffeb94f79","25e8e09851923044013f6efda775298ea55f220965d77c58b8a33802b63284f8","c22e086a091cfc8ccea49c0a23d7f59a70e61eff979662a0094e23aca97a9dcb","eb59654ed8ce9fc95dae05812daa514c9c8e0d0a49055d0b33e651e6926b31ea","0239a0d675f381ce9ee8ad7c77ab8acf9a1936810c2cd347480ea22f0acf6a9a","c7bb3d343635262f28289a380344885cc2d1178c4f2dc11e6e52eb6ec9fabff3","35af861275f61dfdf1be3690a1d53cfd825d7936c4ae548902291900b8402208","07885dee25c5ef1a3aa8706bf5dee042d5fd8ff2aa084ad576364996558e6aac","36592459ea33688b09cc82689b506ea58ab6f9785d4d9b85dd368325801faeb5","00595ab91d01d295a2a1fa5ca7ac8a976846d59fe7ca901a50c1605a48f30db1","9585005cf0ada58ee1024cec39d99fc9993f3e0a54011cfc2eebf7cf9ca875a6","64204f5616702808166a699eac9856d511700688db9b5e9d9bdf202c72ffc2cd","f5e76f7e9150bbdda56e2160e1291c682b28c5999cb9447a62256d04b0a69a26","fcb811dca5517cd0df9e0419a167e59dc2420a3b53248384b79ad40c62148e28","09158c9a28a1cf248f56fae441d90c9ca461e3378b64da07d7bc14ba1b86eb72","fc4f66910ae04a9d92a32588f47c131f32eb3809240d11cc3c715c9521f8e51f","8b4f4b7b2090b00acd17fe62fc30b1f8e57940c28d3b6ed450c1ef855be07330","a07a778db67a89aabb04c41806d28552f8428f2fbcf0f488d1a1ffebd4c568d3","a0a079fceca9261b22e611371647f081422cf2f33f104deee7c3dbf00c938190","f4a1cf86f7f71d4e20c90fcf34193d22737499d508a88ffa2f0a94dc1cbe1f20","3ad325feb1f14d572aa67780575a31ba1e75df92e07fe762c6c605425c82727b","179c52a8c5b0db2bfdaf3695393d7157ea3b605b4b6e8fa2d421e72a7afd3840","def88db6bdfce7bcab39f5faec825d5b88389e235741130989a5158fd1ccd178","43082e738f695414514204221ea73dec8cc238a32b892cf9ef987ce7306eb733","aefdc2770c29c5630e908513c45072afea4b09420ea988d551e927e46c7c85d3","41478fcf2fd6d8f32f9a7050e3fa192140b90dde56a3503e3d3cdb34120ae6ce","6ed7ec85c2efa9901cf6ff85513304221ca7104244ed412bcc3407843048a019","be42043f7b5add250dbcc82da7199f8cc1c32ff2c4e7532216043d99ee9ee481","5cca704e3d35807b0b8bf3d29dcc3e18ee78c401e58886daec5adebd70b11503","0fce22de0933f7003e94d97060d6e0a63a397fc661030c3b41f52e75bcc88b1b","14a11fcd3ac91174a26b150d4d0c6aed0e010fa412207b65b505e5a5205182e2","ff0815582326b779a5920602f257189a3cceb7f3c26ec2e386fbbcf03dc14bab","d222d5d94b908a09c806d3c2a1b859482e22800aa29594ec327f94543df2f885","84ad1063e46bbc5314a35f8bad7798ec87b2cba274f2aa1215ffb4eeb87383ee","ca8c7e6ccc8299f51be8a63d67eb4884920e4706f942b4a060ddce304103b7ea","24ab30eda63791b3f45a398ae31b66acc0a36e2cebb1c3167db3639a01f67256","d9ba8e5c84e9686730a5a573c4394f81c39f0ee4902fc7c0d8669eebb745dab3","2a2f286378234a2cee79fc16ee97835d3cb7a67d1dfe8118b07fb36a392d89b6","0cf6f34f36515a78e185cf052db6e2cdd040ae5ad8c7c2f5cddfce150e80d7b4","57bbfe242a99fd2f6d71b62dd838f7d5d9aceaeae8221934392cc1a15eb061a0",{"version":"056c7233a21291c4d5b1971f8421512c364bc20fed90b9d1dd0d8f27b8e39d5a","signature":"d197ae9b234e6038e679a3d9c3c65414ba27664e196ef8657772b8c8d0aaf1b4"},"b3dcf1545827ca7f2300515008e324c83474fa2a5eb71082b6be97941438d2f8","de930e86262cabede8aaecd6e7f50f11c66f3ff440b443ea8be55cb7963b662e","ea0d54935a770e2b98bad78d718c75e77a6aaa129fa80a7ec5736c301c1ba1fc","e7c598a83a03cd7790650d72482628a91ef54b61a82566df70340990c07df426","db1f3026dece2e8d3a4ecd3967e17e9f270d0d9f2ef6e729f9f6a6da3c1c92ba","63b3b61803c3332cb30f22d9557266278ba35e4d5f28b5fa66c49618ccf1e5db","f2dbe29bfe06cfa1faf05036bb4d283a573ced9e65b516781d8ca444727d0785","79ac794d512663c8a40a0df96a34487f8e74539e06a5ef066ebeddf9a149ae04","8b52fd0c3e8906888df558c12fc41d09ca09210dedd977660e8b71ffe52023e3","e7523c2c128412141a6f61ac238707fda7cc1aee5f532221bbbcfc4e430b0f30","db1147d62f7093750f37a32df084a660e58c98d519652563a26df62d31c657b8","13c78ad459ab056e8632aab0004f6fd7bfd6228aa62312ca960728dac94225f6","875383df6e85ccdc3f76ee7e9a85544620035a43de51f346f31a0dddcf435a04","14f90c2402ea4d1ae2b3831b61a840fab318d0034e2e7cc0e7e3c5db41f4bde8","51a72d498a22effce0e62bd87a3efc02731569d31aeae4e5dfb8532235cf090a","986855a63ecc9c740e697db64150ee4aebdf776bf8f6bb51b7669e187dc549c1","608a7f4d3c36e979fcca86535e5ebe6040813344acbf6a8f58d6b84fafa571ae","b333c62026fe1a09474a11e0854ebd7215c125da7bd7584bd77627b3eeabe83d","64b459e59a172275dcdb235553a80115db3bd5a81f8fe629830a8f33f29b3cdf","648f83235478575ced1ec77e6af6b46bea5362bdfcfccd7291314f0f7bf1a137","172388d261e58df2b4ca3a2822cd4aa285415ab050bd027ea506dfb2f285075a",{"version":"8728a4d5320916fb4909ab29fa6cf39b37ea2a90cc984a8c953da91ff45cd63b","affectsGlobalScope":true},"7d44097bd6100a1b1c1013c8fd818e98221edfeed1f901df7d849949d4ab5c3f","f2ac7bdd535bd8ad95f1253b44488b1ad530d797b69da8003424d7ac438284a2","82c80088bf08d069c595be833b7b16aaaedca6400fc02f1ad13ef97dcd5a6579","78d8a7d7b9e461de9a361356e5962b1d297c152085afc623ec7bfca4d7ab6748","00d50fd7d4d412cc52d3b5c6106a15d202d2ae86d4232efe25b3b93ae30b65f8","1e9a4754e7bfc0e5e0d9334b2dd1ae200745e859e242a0731557372b83adcafc","7620b21e40397ce60afaae7b7dea5697e4d79838f104a891b17eed79d993319b","34a9deba807e9cc490dd85edcb07e1840267481d0fcaf81ef1282e7f46561189","c404392717f996db62d70e560eca6f85573aac2fcb0a08eb3822a44bced6c79f","73363cea4bfa7cb414cea485565891d061e8c4f273a49a57d392a5f21b8e4c31","a31e4faff48594c48f7b831a8cae3cec03209cd5f1e6defb76f26b024f35fb61","f3f0772ad14ffeb9f8540c371500a26f23da69f54658f6e796845996ba214a74","1a2d63186069bc9c246eff56e61467d0503e40941ccf5344003d1a9306f0d74e","233ad5ae44409b60b8f5a608db873ed00a410fd22e4ec094a3d4a1686eaf26c4","7c191a7830a724eeed3a3a9260104a2d8dbd8eea5fbe5a661507c01235acaa87","a3ac2beb8ec289c2bbec8d86a92aa15549c76c291381607c507f20e9d035014c","b68fedd52f606a729a3342602c0d435d8d762ab87a7863f28678a5ec9d05d3ea","b3b2ba7e8c50b4b22615a3e344fee19ec1669583cc02fd877e9f49b967307150","e8f6ca217b77ab29e9774919fe6808ca352aebdf047c76fceaa2fcc27b6f062f","3bfdd8c2d0ccf93d13a930ca7c64cb7c312156138f7a8c270832935cf1f8656b","acfe21bab40163fa684741350f52fbd4d2297face00c3e93bb601222baa9041f","9aac78f53a727d0fff57cd569003bbd30d45f7ce650ce1361f73142a66bbb934","71bbe82a64b6387c31566f738687036ceab49ffd44cb0c5fe5ded054ba1f2170","d7d6a663ab7948d1b32c2f89e0e76e5221db6a3048e182b8774e643b9e040db3","f1ada71a7e7a60eebface151f2f03283920764b31dc5620ecfee8694dc555409","5b0be434253bc1877b6101b643954537ff9c0d55fd36af2b58bbf59da49b6f1b","7520b8fd838b0fbb00c880a2ee96182d7cc3fa284a01d9e76d4d546662ac5411","86f1ba4ab86ed246250c97930abbcc6aa483ecc7112eb143ea06287bac2718ac","6dbcbb58668730105e4b77bd23cd2c564359951534de050bb90075d5712f3e7e","3078727fed04c123165efdb42deeac5dceaa42ac62216ca13cb809dc7e13415f","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","b4f76b34637d79cefad486127115fed843762c69512d7101b7096e1293699679","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","dae3d1adc67ac3dbd1cd471889301339ec439837b5df565982345be20c8fca9a","b6ddf3a46ccfa4441d8be84d2e9bf3087573c48804196faedbd4a25b60631beb","946bd1737d9412395a8f24414c70f18660b84a75a12b0b448e6eb1a2161d06dd","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","d8aab31ba8e618cc3eea10b0945de81cb93b7e8150a013a482332263b9305322","462bccdf75fcafc1ae8c30400c9425e1a4681db5d605d1a0edb4f990a54d8094","5923d8facbac6ecf7c84739a5c701a57af94a6f6648d6229a6c768cf28f0f8cb","7adecb2c3238794c378d336a8182d4c3dd2c4fa6fa1785e2797a3db550edea62","dc12dc0e5aa06f4e1a7692149b78f89116af823b9e1f1e4eae140cd3e0e674e6","1bfc6565b90c8771615cd8cfcf9b36efc0275e5e83ac7d9181307e96eb495161","8a8a96898906f065f296665e411f51010b51372fa260d5373bf9f64356703190","7f82ef88bdb67d9a850dd1c7cd2d690f33e0f0acd208e3c9eba086f3670d4f73",{"version":"ccfd8774cd9b929f63ff7dcf657977eb0652e3547f1fcac1b3a1dc5db22d4d58","affectsGlobalScope":true},"736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","c8a34d0c858532a9fab7f0b65f3cff6507df055a0cd8b965c4fd5667b5a0cf7d","3663d1b50f356656a314e5df169bb51cb9d5fd75905fa703f75db6bb32030568","6fa0008bf91a4cc9c8963bace4bba0bd6865cbfa29c3e3ccc461155660fb113a","bc88e4049153bc4dddb4503ed7e624eb141edfa9064b3659d6c86e900fe9e621","8baa5d0febc68db886c40bf341e5c90dc215a90cd64552e47e8184be6b7e3358","168435ab3390620aebf1aa0001b380983582d0849755eeb17f2c501d1fc57587","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","882057f051daf834e4d01701066e1bac2d243b0c3eda702b25874402c1e0172d","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","149ebd778196c03e9c75b630866543501e0e9e62a146c1a17ce91ade4cdfb0ba","f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","209e814e8e71aec74f69686a9506dd7610b97ab59dcee9446266446f72a76d05","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d"],"options":{"allowUnusedLabels":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"emitDeclarationOnly":false,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"module":99,"noEmitHelpers":true,"noImplicitAny":true,"noImplicitReturns":true,"outDir":"./lib","rootDir":"./src","skipLibCheck":true,"sourceMap":false,"strict":true,"suppressImplicitAnyIndexErrors":true,"target":7},"fileIdsList":[[152,267],[152],[152,267,268,269,270,271],[152,267,269],[123,152,159],[152,275],[152,276],[152,281,286],[125,151,152,159,288,289],[125,140,152,159],[106,152],[109,152],[110,115,143,152],[111,122,123,130,140,151,152],[111,112,122,130,152],[113,152],[114,115,123,131,152],[115,140,148,152],[116,118,122,130,152],[117,152],[118,119,152],[122,152],[120,122,152],[122,123,124,140,151,152],[122,123,124,137,140,143,152],[152,156],[118,125,130,140,151,152],[122,123,125,126,130,140,148,151,152],[125,127,140,148,151,152],[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[122,128,152],[129,151,152],[118,122,130,140,152],[131,152],[132,152],[109,133,152],[134,150,152,156],[135,152],[136,152],[122,137,138,152],[137,139,152,154],[110,122,140,141,142,143,152],[110,140,142,152],[140,141,152],[143,152],[144,152],[122,146,147,152],[146,147,152],[115,130,140,148,152],[149,152],[130,150,152],[110,125,136,151,152],[115,152],[140,152,153],[152,154],[152,155],[110,115,122,124,133,140,151,152,154,156],[140,152,157],[125,127,152,159],[152,297],[152,279,282],[152,279,282,283,284],[152,281],[152,278,285],[152,280],[43,152,190,193,194,195,200,202,203,213,214,223,228,253,254],[43,152,190,193,194,195,200,202,213,214,223,253,254,255,256,259,262,263],[43,152,190,191,195,202,208,216],[43,152,190,195],[43,152],[43,152,190,191,206,244,245],[43,152,190,191,195,202,204,205,206,207,208],[43,152,195,203,204],[43,152,190,246,248],[43,152,191,195,244],[43,152,190,223,252],[43,152,204],[43,152,190,191,202,209,223,253],[43,152,190,195,198,200,201],[43,152,190,202,215,256,258,259,262],[43,152,190,193,194,195,200,202,209,212,213,214,217,223,228,229,231,253,254],[43,152,190,191,193,194,195,198,200,202,203,208,209,210,211,212,213,214,215,216,217,223,225,226,227,228,229,231,232,248,250,252,253,254,256,257,259,261],[43,152,190,191,202,203,234,235,236,237,238],[43,152,190,191,202,234,239,240,241,242,243,247],[43,152,190,233,239],[43,152,195,235],[43,152,190,195,234,235],[43,152,190,191,239,241],[43,152,190,215,248],[43,152,190,234],[43,152,190],[43,152,190,191],[43,152,190,195,210,211],[43,152,190,195,210,266],[43,152,190,191,192,193,194,195,198,199,200,201,202,203,210,211,213,214,215,219,223,228,251,252,254,255,264,265],[43,152,190,193,194,195,198,200,202,209,212,213,214,215,217],[43,152,190,191,193,194,195,199,200,202,208,209,212,214,216,217,218,223,224,225],[43,152,190,191,192,193,195,198,199,200,202,209,210,211,212,217,220,221,226,228],[43,152,190,191,194,195,198,199,200,202,209,210,211,212,213,217,220,222,226],[43,152,190,191,195,200,202,209,212,217,219,220,230,254,260],[43,152,190,191,195,220,223],[43,152,190,191,195,200,202,209,212,214,217,219,220,226,230],[43,152,190,191,195,220],[43,152,190,191,193,194,195,198,207,213,214,215,218,219],[43,152,190,191,195,209],[43,152,190,191,195,199,200,209,221],[43,152,190,191,202,209,221],[43,152,195,207,208,209,212,216,217,220,222,224,225,226,227,229,231,232,248,249,250],[43,152,199],[43,152,199,200],[43,152,195],[43,152,190,191,195],[43,152,190,202,215],[43,152,257],[43,152,190,192],[43,152,190,202,239,240,249],[43,152,190,193,194],[43,152,190,191,195,196,197],[60,152],[55,60,152],[55,152],[46,47,48,49,64,66,69,70,71,74,83,90,152],[66,69,71,74,75,83,152],[49,68,152],[67,152],[44,152],[61,90,95,152,159,160,161],[51,53,55,56,57,58,59,61,62,63,65,66,71,77,79,152],[44,50,55,152],[46,55,60,61,71,75,76,152],[47,64,152],[51,56,57,58,77,152],[50,152],[51,56,57,58,59,61,62,63,65,77,79,152],[87,152],[86,152],[44,51,56,57,58,62,63,65,77,78,152],[74,90,92,93,94,95,96,97,152],[45,53,55,71,74,75,80,81,82,83,85,90,91,152],[74,90,92,95,99,100,152],[74,90,92,95,100,152],[55,69,71,75,80,83,85,86,88,89,152],[53,54,152],[55,74,152],[152,178],[152,181],[44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,67,68,69,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,152,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,184,185,186,187,188,189],[90,152],[82,152],[45,80,81,83,152],[45,53,80,81,82,152],[44,52,90,152],[52,53,91,152],[44,52,53,61,152],[53,67,89,152],[52,53,152,170],[52,61,152],[53,152],[53,91,152],[53,61,152],[52,152],[44,52,85,90,104,152],[61,152],[81,152],[53,55,59,71,74,75,76,80,81,86,88,95,97,152,164,175],[72,73,152],[71,72,73,74,90,152],[72,73,74,152,186],[44,62,70,80,84,152],[48,152,164],[152,183],[152,304,343],[152,304,328,343],[152,343],[152,304],[152,304,329,343],[152,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342],[152,329,343],[275],[276],[304,343],[304,328,343],[343],[304],[304,329,343],[304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342],[329,343]],"referencedMap":[[269,1],[267,2],[272,3],[268,1],[270,4],[271,1],[273,2],[274,5],[275,2],[276,6],[277,7],[287,8],[289,2],[290,9],[288,10],[106,11],[107,11],[109,12],[110,13],[111,14],[112,15],[113,16],[114,17],[115,18],[116,19],[117,20],[118,21],[119,21],[121,22],[120,23],[122,22],[123,24],[124,25],[108,26],[158,2],[125,27],[126,28],[127,29],[159,30],[128,31],[129,32],[130,33],[131,34],[132,35],[133,36],[134,37],[135,38],[136,39],[137,40],[138,40],[139,41],[140,42],[142,43],[141,44],[143,45],[144,46],[145,2],[146,47],[147,48],[148,49],[149,50],[150,51],[151,52],[152,53],[153,54],[154,55],[155,56],[156,57],[157,58],[291,2],[292,2],[293,2],[294,2],[295,2],[296,59],[297,2],[298,60],[279,2],[283,61],[285,62],[284,61],[282,63],[286,64],[278,2],[281,65],[280,2],[43,2],[8,2],[10,2],[9,2],[2,2],[11,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[3,2],[4,2],[22,2],[19,2],[20,2],[21,2],[23,2],[24,2],[25,2],[5,2],[26,2],[27,2],[28,2],[29,2],[6,2],[33,2],[30,2],[31,2],[32,2],[34,2],[7,2],[35,2],[40,2],[41,2],[36,2],[37,2],[38,2],[39,2],[1,2],[42,2],[255,66],[264,67],[217,68],[208,69],[224,70],[246,71],[209,72],[205,73],[247,74],[245,75],[244,70],[253,76],[204,70],[206,77],[252,78],[202,79],[263,80],[256,81],[262,82],[239,83],[248,84],[240,85],[235,70],[236,86],[238,87],[237,86],[243,88],[265,89],[242,90],[241,90],[191,91],[203,91],[216,92],[212,93],[211,94],[210,70],[266,95],[218,96],[260,91],[226,97],[229,98],[227,99],[261,100],[225,101],[231,102],[232,103],[220,104],[221,105],[222,106],[230,107],[251,108],[200,109],[201,110],[199,111],[196,112],[197,112],[257,113],[259,114],[258,114],[215,70],[254,91],[219,91],[228,115],[213,91],[193,115],[192,70],[194,91],[223,69],[214,91],[250,116],[249,91],[195,117],[207,69],[234,91],[198,118],[233,70],[61,119],[76,120],[91,2],[89,2],[104,121],[183,2],[60,2],[75,122],[105,123],[69,124],[46,2],[67,2],[68,125],[64,2],[47,2],[49,2],[70,126],[162,127],[80,128],[56,129],[77,130],[58,2],[65,131],[59,132],[50,126],[51,133],[57,133],[62,2],[63,2],[66,134],[88,135],[86,2],[87,136],[79,137],[98,138],[92,139],[101,140],[102,141],[103,2],[90,142],[55,143],[166,2],[167,126],[188,144],[54,2],[178,2],[181,145],[182,146],[179,145],[180,145],[190,147],[71,148],[83,149],[82,150],[45,126],[163,151],[189,2],[177,2],[53,152],[94,153],[93,154],[168,155],[171,156],[96,157],[169,158],[99,159],[100,160],[172,158],[160,161],[161,2],[173,162],[78,2],[95,163],[97,2],[170,2],[174,164],[176,165],[164,2],[81,126],[74,166],[73,2],[186,167],[72,2],[187,168],[85,169],[84,2],[48,2],[165,170],[44,2],[52,2],[175,121],[184,171],[185,2],[299,2],[300,2],[301,2],[302,2],[303,2],[328,172],[329,173],[304,174],[307,174],[326,172],[327,172],[317,172],[316,175],[314,172],[309,172],[322,172],[320,172],[324,172],[308,172],[321,172],[325,172],[310,172],[311,172],[323,172],[305,172],[312,172],[313,172],[315,172],[319,172],[330,176],[318,172],[306,172],[343,177],[342,2],[337,176],[339,178],[338,176],[331,176],[332,176],[334,176],[336,176],[340,178],[341,178],[333,178],[335,178]],"exportedModulesMap":[[269,1],[267,2],[272,3],[268,1],[270,4],[271,1],[274,5],[275,2],[276,179],[277,180],[287,8],[289,2],[290,9],[288,10],[106,11],[107,11],[109,12],[110,13],[111,14],[112,15],[113,16],[114,17],[115,18],[116,19],[117,20],[118,21],[119,21],[121,22],[120,23],[122,22],[123,24],[124,25],[108,26],[158,2],[125,27],[126,28],[127,29],[159,30],[128,31],[129,32],[130,33],[131,34],[132,35],[133,36],[134,37],[135,38],[136,39],[137,40],[138,40],[139,41],[140,42],[142,43],[141,44],[143,45],[144,46],[145,2],[146,47],[147,48],[148,49],[149,50],[150,51],[151,52],[152,53],[153,54],[154,55],[155,56],[156,57],[157,58],[291,2],[292,2],[295,2],[296,59],[297,2],[298,60],[279,2],[283,61],[285,62],[284,61],[282,63],[286,64],[278,2],[281,65],[280,2],[255,66],[264,67],[217,68],[208,69],[224,70],[246,71],[209,72],[205,73],[247,74],[245,75],[244,70],[253,76],[204,70],[206,77],[252,78],[202,79],[263,80],[256,81],[262,82],[239,83],[248,84],[240,85],[235,70],[236,86],[238,87],[237,86],[243,88],[265,89],[242,90],[241,90],[191,91],[203,91],[216,92],[212,93],[211,94],[210,70],[266,95],[218,96],[260,91],[226,97],[229,98],[227,99],[261,100],[225,101],[231,102],[232,103],[220,104],[221,105],[222,106],[230,107],[251,108],[200,109],[201,110],[199,111],[196,112],[197,112],[257,113],[259,114],[258,114],[254,91],[219,91],[228,115],[213,91],[193,115],[192,70],[194,91],[223,69],[214,91],[250,116],[249,91],[195,117],[207,69],[234,91],[198,118],[233,70],[61,119],[76,120],[91,2],[89,2],[104,121],[183,2],[60,2],[75,122],[105,123],[69,124],[46,2],[67,2],[68,125],[64,2],[47,2],[49,2],[70,126],[162,127],[80,128],[56,129],[77,130],[58,2],[65,131],[59,132],[50,126],[51,133],[57,133],[62,2],[63,2],[66,134],[88,135],[86,2],[87,136],[79,137],[98,138],[92,139],[101,140],[102,141],[103,2],[90,142],[55,143],[166,2],[167,126],[188,144],[54,2],[178,2],[181,145],[182,146],[179,145],[180,145],[190,147],[71,148],[83,149],[82,150],[45,126],[163,151],[189,2],[177,2],[53,152],[94,153],[93,154],[168,155],[171,156],[96,157],[169,158],[99,159],[100,160],[172,158],[160,161],[161,2],[173,162],[78,2],[95,163],[97,2],[170,2],[174,164],[176,165],[164,2],[81,126],[74,166],[73,2],[186,167],[72,2],[187,168],[85,169],[84,2],[48,2],[165,170],[44,2],[52,2],[175,121],[184,171],[185,2],[328,181],[329,182],[304,183],[307,183],[326,181],[327,181],[317,181],[316,184],[314,181],[309,181],[322,181],[320,181],[324,181],[308,181],[321,181],[325,181],[310,181],[311,181],[323,181],[305,181],[312,181],[313,181],[315,181],[319,181],[330,185],[318,181],[306,181],[343,186],[337,185],[339,187],[338,185],[331,185],[332,185],[334,185],[336,185],[340,187],[341,187],[333,187],[335,187]],"semanticDiagnosticsPerFile":[269,267,272,268,270,271,273,274,275,276,277,287,289,290,288,106,107,109,110,111,112,113,114,115,116,117,118,119,121,120,122,123,124,108,158,125,126,127,159,128,129,130,131,132,133,134,135,136,137,138,139,140,142,141,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,291,292,293,294,295,296,297,298,279,283,285,284,282,286,278,281,280,43,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,255,264,217,208,224,246,209,205,247,245,244,253,204,206,252,202,263,256,262,239,248,240,235,236,238,237,243,265,242,241,191,203,216,212,211,210,266,218,260,226,229,227,261,225,231,232,220,221,222,230,251,200,201,199,196,197,257,259,258,215,254,219,228,213,193,192,194,223,214,250,249,195,207,234,198,233,61,76,91,89,104,183,60,75,105,69,46,67,68,64,47,49,70,162,80,56,77,58,65,59,50,51,57,62,63,66,88,86,87,79,98,92,101,102,103,90,55,166,167,188,54,178,181,182,179,180,190,71,83,82,45,163,189,177,53,94,93,168,171,96,169,99,100,172,160,161,173,78,95,97,170,174,176,164,81,74,73,186,72,187,85,84,48,165,44,52,175,184,185,299,300,301,302,303,328,329,304,307,326,327,317,316,314,309,322,320,324,308,321,325,310,311,323,305,312,313,315,319,330,318,306,343,342,337,339,338,331,332,334,336,340,341,333,335],"emitSignatures":[[191,"d441166844cb18828680dbf0093614f6a7d7f3ed598452f23e037850f51d2b48"],[192,"efb8e27827124bc3bf96b81288c0278c722d10f2372a1bbbb9de1943e784022b"],[193,"b6db293a5ba0539a0007b69a92c196b21be784c1781e2f8b573fc70e5502fe00"],[194,"3faa2b7701286a5b3863930e59ec45a3e74a9b6dacd216e168afb2a799a9598a"],[195,"ad571a3f39e29d5e8e075af18b746e5e2d3118b988e9e83aad817a42095ae6a5"],[196,"19c3d80a37e4a5874dc264c1b5c5e11e73c25c65c31caa30064444e22d2bc19e"],[197,"587a18a5a21a6151ff51d2866fac32a61c2bf38ba878e2e5fcae6c06a27c8ed9"],[198,"d096779b92cdcef404daabce9e63afd112933685aae708b593a047fc6ef13682"],[199,"028906b65dcdb3143cc9b429815765340ffc11d40b7366ba30bb32e558e111f2"],[200,"05ba173a5408ad8a44e055640e5e153a684c6403f860dca7670cf52bd55b8f06"],[201,"91e41ef69d685c82a0a4fa960f672aca91d0bfb84e83226cc0efce42ea885f91"],[202,"0ccc83798a02eccf9f48d3c3f40018a9325e7c8340ebb37f0b6fcccccc559746"],[203,"14badeabb60c97286c971eb2a6836f94b11c640ff5524f732a4db47794aa81b5"],[204,"8c83218e92cb960a020ce6ccf208c7fdd29fdba50f824ec9f7804b9a47c175d0"],[205,"30e79e66ea64c11aaaec0ae2b8e5b7103719724a177ff960f46f354f43802917"],[206,"dd3e55e236d60bdf8506e7b8be544f8b9df241b62ee011b31315ab2e79b0a903"],[207,"21d8187cfb7239fce0ce089728ffd45ecbf8c4aa27032d9db415ea3cf5ca3c51"],[208,"603b76444ae7b739baddb69d2aae1e5c18b5c5c1015e881b3c3f2c513eb238fa"],[209,"43c34dae447b31f4c7dd950e2f680aba20870b8c609fa9833653dd98fd4c439a"],[210,"eae113bf0a860bcbc633f34b3f36e727d17be869809a9e9cc669465856cc7008"],[211,"b9ca0fb0079964ec1910ff2b82e5b8ca83f1ac6de0eb7c522dbfb684dc9183df"],[212,"22ff06d3a95eec8c7d0c5f0129af7303a358496857e0ce33e1c9208769f58741"],[213,"eef3134d50fa7818d4c01c67fb07f06370d555d962eff626b4d07a02129ef3ae"],[214,"220783370c7924b174300eba6475f0f0bfdd9af48b1b6666e396492b1f3fef98"],[216,"9949d8f1e82774101d22659e35dc5e033d88f9ff063f771f9b9adcd75ad19de7"],[217,"487ca02a3e3bbd43ad193f10a67c45ef382126be9a368d05811a661b905d3a8d"],[218,"58ca8213c17a9c2411639a1d7c400fc4607c8670cd5aea4587d484541b359a37"],[219,"631b03a76016caa819ebfa95a40a7c5eac41820c4451135f9114073e75ec4afe"],[220,"30e5060e2b21e10485b6ea2be7a6333a1203221bc524bcc50e91705da896e7f3"],[221,"28294756d2ac4e877f815fead8368692fc7184a1eac4068f2520d63a0a2fda8e"],[222,"3caff9d44a20278cb2afc4dc64920cc9526e54a573c173291a9d8fc1b158bf9e"],[223,"69519f4adf7a7cb54324811083ee3be4e1c5347e2ac231f8ea4e496887bff4c9"],[224,"8b837e28c1150e380b11aeaf340df60807cdab426470f8676f00bf95a4319a3c"],[225,"4ac2f63cc352f37faf2c9541c721ad3229395d37abfc598e2a43072058a72e69"],[226,"bd867da24128f3d993754f1d2d9b95c9f2ff621a8d3c98c1240fbef7f846e4cd"],[227,"4d28b4504df2740399e5aa82006b233b0ffa943cc62c241aa991ffe99fbb1ddd"],[228,"9febdac3e7d1d0b7eeeaf33c29910cbecd2ec54645fbcf599e96f9cb173d2220"],[229,"fcf5e0e4fa6fed619edcd530d9b377bce22484b2b25cadb4e9c40d41591372be"],[230,"effb76b3ca674c89ae36ec40ccece5ca4903ec3d13c7eb92578fc6e6b0badad4"],[231,"8cfd0ec19c0b2888662d17de5ffafd386a1f50efc11e271572d5684af46a3a51"],[232,"a87502b6275e6b99939a3014c2811b2e8edc7ae9fd1e3e8ee55cc81645239530"],[233,"739731412d089540b2052b41dd063e0f262bc19e01ceb4810f62c5a5f16ae100"],[234,"907131c0bcf9741260318ac27ffea73097acca354ceceb79786a333885b5a411"],[235,"b3b2c7ef0b4af33d7e14dd8476bd703a7177f05f508841d2b5c21f9a6ca76bee"],[236,"7ed92046051a8f54cfd94af6eb14780a40df60bea3d9b6f8352ac6e052d45426"],[237,"3d2ad15a531e64c9d5756fd06f0cfb7b45f42681d538c13b0254fe5dd40425df"],[238,"99a87bf464559fc16b188c79dec11daaf9655121849628505eb167a9eb7fa482"],[239,"24f99e013108faaa7c982d534beac5547799169ae56068729ba2dbc983e925e3"],[240,"02045589ea2bb49a89e6f8bc4849072452c577bc156de79d83d753dfa17957d6"],[241,"d98de1d7659f822b239b3bda52685932ff1146c84ad508f156e39919a53cfdb2"],[242,"2c44328a58807293355a0734148616a87f302cd4f25ae29ecf613531e572e46e"],[243,"942f20091205c4cb8b11bba42c44710f947c19dc94418330630ff6486817fbb3"],[244,"7e284c8dfe26d888a7c67a35917bd14b953434edfe829f4edf6359a3755a1104"],[245,"3ce69b0792fed631137c3962e3ff260648077ac227566940ebf0618005fa59d6"],[246,"27e989ca5305607f25c04f58cd6200f5914dff48a2fd73385a9b0cacce9b9703"],[247,"066ac9e2e824ab186a27aa4ff3dbaed993cad73884a03ae3cc9c3685c1c9c709"],[248,"a309d5dfcb9701d51b99affcea4b70aac378f7fba21aacf073965c730d616391"],[249,"bcf9cd7df582ca8558b0282337117890dd118ddd7907754bcec20051d773256d"],[250,"f29b4ba2cadff17b5f0f00c3738a0747f1a09277adb65efe913129b67f8192bc"],[251,"37367a7bb56e6b43242ae4f9e91f67daa7a81a3fc24059a13baa00c165a827a6"],[252,"30efc13612cb879a026ace5a8d2c70d9671b7089039548bd10e20ddb91d9173e"],[253,"5079b3b63c07286febd317783006102a7f083d0e6408714bccaafb714588187c"],[254,"46dc8315335776a873ff4ce9036b8108e99622ac5c14ac621bcf008c07a48c60"],[255,"8a5fd71a7211014842b6c1db1471adc8d5bb0a71940dee28789dcf6c5144e670"],[256,"06cbf838f6e6e82f9a0e4bf5c9fa4be0e0803d4529dae0e2de880e84da77c6b9"],[257,"eb3b9bcd24dd44ad6cfcedcd552084044c1c2758ec3cf6bf9fa38083bb07b24f"],[258,"18c1847b9366aee3f8bc45d5617bb5330faa03453b869b0a8c328fbb7c754db9"],[259,"96bbfa09f1c8eb678650c29c75a906e5fce8fbd9c486c04b5726eae18d3f45b5"],[260,"2028320e204d815bcd3c9449dcb9f9361b8f532d5e7461aae00efc4c57041653"],[261,"6bee3e8579b80d79017407c5d75f02d1931eb163e5eaf3bc34f15f30102075e2"],[262,"c59041530e840a693f22a2589a0d5d694b0dea2caa6f061264600431406894f9"],[263,"4835a88c228d2b941f689a36a56ef48dd0a499bbe96cd137d923d70952378f34"],[264,"e645ce3aef9ef7a80e316b1069b4c1559d6fb2f15f3d4b57b43bbb98e692961c"],[265,"a6ce4b4bc46a4c15e4e017fcf012c1660d04ad80cb351d91fd831d496ee674b4"],[266,"4362b4c2ca275c862b545143b59507ad796fa6654058ed1011545e8f06006f4e"]],"latestChangedDtsFile":"./lib/index.d.ts"},"version":"4.9.5"} \ No newline at end of file +{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/tslib/tslib.d.ts","../msal-common/dist/utils/constants.d.ts","../msal-common/dist/network/requestthumbprint.d.ts","../msal-common/dist/authority/authoritytype.d.ts","../msal-common/dist/authority/openidconfigresponse.d.ts","../msal-common/dist/url/iuri.d.ts","../msal-common/dist/authority/protocolmode.d.ts","../msal-common/dist/cache/entities/credentialentity.d.ts","../msal-common/dist/cache/entities/idtokenentity.d.ts","../msal-common/dist/utils/msaltypes.d.ts","../msal-common/dist/request/baseauthrequest.d.ts","../msal-common/dist/crypto/signedhttprequest.d.ts","../msal-common/dist/crypto/icrypto.d.ts","../msal-common/dist/cache/entities/accesstokenentity.d.ts","../msal-common/dist/cache/entities/refreshtokenentity.d.ts","../msal-common/dist/cache/entities/appmetadataentity.d.ts","../msal-common/dist/cache/entities/cacherecord.d.ts","../msal-common/dist/account/tokenclaims.d.ts","../msal-common/dist/account/accountinfo.d.ts","../msal-common/dist/cache/entities/servertelemetryentity.d.ts","../msal-common/dist/cache/entities/throttlingentity.d.ts","../msal-common/dist/authority/clouddiscoverymetadata.d.ts","../msal-common/dist/cache/entities/authoritymetadataentity.d.ts","../msal-common/dist/cache/interface/icachemanager.d.ts","../msal-common/dist/authority/azureregion.d.ts","../msal-common/dist/authority/azureregionconfiguration.d.ts","../msal-common/dist/authority/authorityoptions.d.ts","../msal-common/dist/authority/regiondiscoverymetadata.d.ts","../msal-common/dist/logger/logger.d.ts","../msal-common/dist/telemetry/performance/performanceevent.d.ts","../msal-common/dist/telemetry/performance/iperformancemeasurement.d.ts","../msal-common/dist/telemetry/performance/iperformanceclient.d.ts","../msal-common/dist/authority/authority.d.ts","../msal-common/dist/account/authtoken.d.ts","../msal-common/dist/cache/entities/accountentity.d.ts","../msal-common/dist/request/scopeset.d.ts","../msal-common/dist/cache/utils/cachetypes.d.ts","../msal-common/dist/cache/cachemanager.d.ts","../msal-common/dist/response/serverauthorizationtokenresponse.d.ts","../msal-common/dist/network/networkmanager.d.ts","../msal-common/dist/network/inetworkmodule.d.ts","../msal-common/dist/telemetry/server/servertelemetryrequest.d.ts","../msal-common/dist/telemetry/server/servertelemetrymanager.d.ts","../msal-common/dist/cache/interface/iserializabletokencache.d.ts","../msal-common/dist/cache/persistence/tokencachecontext.d.ts","../msal-common/dist/cache/interface/icacheplugin.d.ts","../msal-common/dist/account/clientcredentials.d.ts","../msal-common/dist/config/clientconfiguration.d.ts","../msal-common/dist/account/ccscredential.d.ts","../msal-common/dist/client/baseclient.d.ts","../msal-common/dist/request/commonauthorizationurlrequest.d.ts","../msal-common/dist/request/commonauthorizationcoderequest.d.ts","../msal-common/dist/response/authenticationresult.d.ts","../msal-common/dist/request/commonendsessionrequest.d.ts","../msal-common/dist/response/authorizationcodepayload.d.ts","../msal-common/dist/client/authorizationcodeclient.d.ts","../msal-common/dist/request/commonrefreshtokenrequest.d.ts","../msal-common/dist/request/commonsilentflowrequest.d.ts","../msal-common/dist/client/refreshtokenclient.d.ts","../msal-common/dist/client/silentflowclient.d.ts","../msal-common/dist/config/apptokenprovider.d.ts","../msal-common/dist/account/clientinfo.d.ts","../msal-common/dist/authority/authorityfactory.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","../msal-common/dist/request/nativerequest.d.ts","../msal-common/dist/request/nativesignoutrequest.d.ts","../msal-common/dist/broker/nativebroker/inativebrokerplugin.d.ts","../msal-common/dist/network/throttlingutils.d.ts","../msal-common/dist/response/serverauthorizationcoderesponse.d.ts","../msal-common/dist/url/urlstring.d.ts","../msal-common/dist/crypto/iguidgenerator.d.ts","../msal-common/dist/crypto/joseheader.d.ts","../msal-common/dist/request/commonclientcredentialrequest.d.ts","../msal-common/dist/request/commononbehalfofrequest.d.ts","../msal-common/dist/response/devicecoderesponse.d.ts","../msal-common/dist/request/commondevicecoderequest.d.ts","../msal-common/dist/request/commonusernamepasswordrequest.d.ts","../msal-common/dist/request/requestparameterbuilder.d.ts","../msal-common/dist/response/externaltokenresponse.d.ts","../msal-common/dist/utils/protocolutils.d.ts","../msal-common/dist/response/responsehandler.d.ts","../msal-common/dist/request/authenticationheaderparser.d.ts","../msal-common/dist/error/autherror.d.ts","../msal-common/dist/error/interactionrequiredautherror.d.ts","../msal-common/dist/error/servererror.d.ts","../msal-common/dist/error/clientautherror.d.ts","../msal-common/dist/error/clientconfigurationerror.d.ts","../msal-common/dist/account/decodedauthtoken.d.ts","../msal-common/dist/utils/stringutils.d.ts","../msal-common/dist/utils/timeutils.d.ts","../msal-common/dist/telemetry/performance/performanceclient.d.ts","../msal-common/dist/telemetry/performance/stubperformanceclient.d.ts","../msal-common/dist/crypto/poptokengenerator.d.ts","../msal-common/dist/packagemetadata.d.ts","../msal-common/dist/index.d.ts","./src/error/browserautherror.ts","./src/request/popupwindowattributes.ts","./src/request/popuprequest.ts","./src/request/redirectrequest.ts","./src/utils/browserconstants.ts","./src/network/fetchclient.ts","./src/network/xhrclient.ts","./src/utils/browserutils.ts","./src/navigation/navigationoptions.ts","./src/navigation/inavigationclient.ts","./src/navigation/navigationclient.ts","./src/config/configuration.ts","./src/error/browserconfigurationautherror.ts","./src/cache/iwindowstorage.ts","./src/cache/browserstorage.ts","./src/cache/memorystorage.ts","./src/utils/browserprotocolutils.ts","./src/broker/nativebroker/nativerequest.ts","./src/cache/browsercachemanager.ts","./src/event/eventtype.ts","./src/event/eventmessage.ts","./src/event/eventhandler.ts","./src/request/endsessionrequest.ts","./src/request/ssosilentrequest.ts","./src/packagemetadata.ts","./src/error/nativeautherror.ts","./src/broker/nativebroker/nativemessagehandler.ts","./src/interaction_client/baseinteractionclient.ts","./src/request/authorizationurlrequest.ts","./src/interaction_client/standardinteractionclient.ts","./src/interaction_handler/interactionhandler.ts","./src/interaction_handler/redirecthandler.ts","./src/request/silentrequest.ts","./src/broker/nativebroker/nativeresponse.ts","./src/interaction_client/silentcacheclient.ts","./src/interaction_client/nativeinteractionclient.ts","./src/interaction_client/redirectclient.ts","./src/request/endsessionpopuprequest.ts","./src/interaction_client/popupclient.ts","./src/interaction_handler/silenthandler.ts","./src/interaction_client/silentiframeclient.ts","./src/interaction_client/silentrefreshclient.ts","./src/utils/mathutils.ts","./src/utils/browserstringutils.ts","./src/crypto/isubtlecrypto.ts","./src/crypto/modernbrowsercrypto.ts","./src/crypto/browsercrypto.ts","./src/crypto/guidgenerator.ts","./src/encode/base64encode.ts","./src/encode/base64decode.ts","./src/crypto/pkcegenerator.ts","./src/cache/iasyncmemorystorage.ts","./src/cache/databasestorage.ts","./src/cache/asyncmemorystorage.ts","./src/cache/cryptokeystore.ts","./src/crypto/cryptoops.ts","./src/telemetry/browserperformancemeasurement.ts","./src/telemetry/browserperformanceclient.ts","./src/internals.ts","./src/cache/tokencache.ts","./src/cache/itokencache.ts","./src/request/authorizationcoderequest.ts","./src/app/ipublicclientapplication.ts","./src/controllers/icontroller.ts","./src/operatingcontext/baseoperatingcontext.ts","./src/operatingcontext/teamsappoperatingcontext.ts","./src/operatingcontext/standardoperatingcontext.ts","./src/interaction_client/hybridspaauthorizationcodeclient.ts","./src/interaction_client/silentauthcodeclient.ts","./src/controllers/standardcontroller.ts","./src/controllers/controllerfactory.ts","./src/app/publicclientapplication.ts","./src/crypto/signedhttprequest.ts","./src/index.ts","./node_modules/@jest/expect-utils/build/index.d.ts","./node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","./node_modules/@sinclair/typebox/typebox.d.ts","./node_modules/@jest/schemas/build/index.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/jest-diff/build/index.d.ts","./node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/expect/build/index.d.ts","./node_modules/@types/jest/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"4576b4e61049f5ffd7c9e935cf88832e089265bdb15ffc35077310042cbbbeea","6290294552868c27a27402be0b104448636779b5d39a5c9e26597001c59ea41d","5e319fdf572349410b8cc20d220cd6618137774ff770df7ab905b628339fda50","f607f88e0e89211bcca6d2cb3aed645574168a1892f272d9d1ae044039be4e9b","e03f6b084efd111f060e0c13bb864cb7e1d877e35191bbb717b524ae1c7fa947","862843747fa837649bd721feacd2d936e2221a85e35790cc67e2cffbca0dd1a8","6172ca1b321aac26f2262d0aae4d172daf9153a3957cfbf1681c8816ebcae65d","fb2a08a552475ef4e6ba971fc6ba453bf1706b7f20fb498e30ffe4995f61473c","840c254cef4d519c91012661e23795cc57892ba809351672b72243207083bc1b","a9bab28455365db6d1abf5ac14a819804e1151db5687a82919b78212fafffa2b","9b69d80c4b586889bdaa6e5e84768c0805b9fb4df7e188cf4f8bb7bb3c4c93e3","5a2fbd4dc710310356c99ad75288f33d686e360d8ed6c1302d396058ddb61118","ed4b75e934b993346c8b48953488a42e73184d07c60eff94ea11531999a7d64a","4c858e953c401511747441083ce7ba754f8bc3fe12dde7b6e961650265aaa97a","0fd87bdcee2af2fe527752e9d7f09b15eb3d8e279a143427b29afb5d6d7dac2e","9a1effdd0b12461ce95b95e58c77930b37e299b36cf8b0e307d62c4336faa11f","fb0bd3555b8af1497b0e0acd42c467ce0a40e9a9ed743c0f7722d6fab027c4d0","5ca47328dbfc6337b525152ab88927821a2a24c554bf4d5948f221b61e80d2dd","3304867f11ff65c60da788c360eb2ff136c9d5c3dd38e6d62abbbd89aaa78489","43140e0fcffc94424c4b9c4c7173e490cfb83df68d2e8ef9a6f34a16efa4e1ac","be85fb1199efb6c24dbf3aa5b985f21d649723fce53b9a6e8cab64bb72bcdc3c","3a867a1265733103bcad7755afd47b60a9dcac60d0a5dec42e085d6dcd5c911d","c01787f732d878d85dfa154b2b38e8d37de87d42103de786a5fab48d77c47655","c3c48e4f0deebb1b123f4dd83e980582cc1ea578c40062bce92cd4889ac50fa0","6dec53b98fadb9ec4638c1567d354aee9812fd20363e18e61609a3880ce9c763","fdb8d30b8242df45d23c5a4691b923ab99ad7cf5647693b62ce5824d9f24fe4f","cf57ae2795992cbbed84bca730860c246416d9f7b15bb551f3cef176e3d27cbe","9b36e35bf4f4abcca7de976c5e433f8be6910a7c674b404d2fe24d104254a8ab","d8f9503bc2f5e2b83f640311c546e4cedf4ef7bb0c2ab03e51a0e839ab66b150","9c19df457a55a8a36a5032471a8d328c8ab7e6c074d3f629753791a99e9b5f53","c22e784c6b2d47979cdf84bfe1b18f80532bc94265f62123870b755150067ac2","f53a6907dfc25b09496387bf53900e81740c92a015d39d7c8cf69adc168f90bc","b97198b2a3080ff30ee7bfc2f420114304c127f0e2ce32b4279fa3dc5d777216","0497c19904620e94359644b1b82447a57da03d520cba2e7b776c72d7829eb192","63354c3d7e63811e62243e4cf2bf1efc31f1eaa3d7f15cbac8e532986ea13772","93d77d212d03de4e0c178dfd2ca291ce5f9625ca7a4c4083cba957eadde4ac27","77207dda0cfc40edde84a390109f49fa399c90aa38dd409dd7bd2fe2f7c84c98","a4a011a1d8fe222cd7b7172d27a9d72dd278f9f054585f7896ca859c343feefb","5bdabd9e1f998ecefce8911db251da9b847e8a79dc769ab90f224dbda84038a3","bbc3b1e705969c600f86c16aeec099c3b1e76096ed8227e0050cb7049d3305b1","7cf75e284d43663adcf5fcee60dcbf8d87f0fa7eba404af34a802493dac3ac5c","d2f0b0326978533385f6256ff7ba75d6cf6fa9426d55c5bbb2a5c0d6fa892e69","e9e51d22e92e12c72c5418bec47197de38577a30cdbd5eb67efea402c2722986","dd87e240c0115e6e75635fecac4d76ca829a73c4ab5bb74bf18380b394830b39","dd93626fbc255c1439093574aed0806f3aec4baf9ce99c9867ef7951b616d89c","38c468fd15ab0b0d979625adfa3562aa3113277823f54bdc4072cf43691faf59","c7205cf438edcb87dd62562eb5586830cf57790ff3fa9c1bc6ea67e4e0a6c5f1","6041b0f2ab0c5effc49f99b71e359ced30a52085c93cb5eb7742ab6409bb5307","3883bfc6d685adea15758fa6db94a381c62f94f685ed9cc06e734e97a946172d","946fa0abe5336c2c8efb9aff02b4987889ba4f225b115bfa635614dfee52d4c7","9a155c2da9c111dc02dfae665fba36d0e8ae665b76f55aec87d48e1150653f28","12d918e9578ad563a64c094717e55a7a5bc738bd03476e36312d8a20f57dea18","99cef539733f3c32895e5890426a39281f533afcbf8780025d258020b30a9cab","2467ec5f8f8ca4f44b6f8af00ed1c004c91639239bdc51e79682ff0c4e348e5e","52c6c5e6a1de07b2bb5d0bb4370151506c9b9526b589793dd07338f42fc8234c","311c3d7c21065edd96c1400d79e29fbb28f87acb68d453d416f2a93114f8c7d0","9329d7590c92d3ce321d3c4de36d53528afe7bd40b79224c022b9a81eab526d8","18eac57b1c6a7525a83038562f36ba94994166ed108c134522f59926d729b703","3a610d83a35b9cafbef90aaa379cdb5fc1681e930978a8c477e74d08784bd47c","ca7b4548270f45c13b60a8b22a50fbe0b73070a60209a92f9924c2d426b9ef79","c649bebc86680273b4b8411a7eccef4613696151c3aa74b1fd4f44851dba3123","a54b5d7f8c63c389c475359d4bd776e872cbf96360b44cc75a9cbe804ffcf285","4a53c158922bf59d84d825e724c2596434f80251b6df4292cfae9ff75bff94a8","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"57b6cb95756d1fe3bfeb20205de27b0c5406e4a86e130c6dfa6bd92af641e09d","affectsGlobalScope":true},"11e2d554398d2bd460e7d06b2fa5827a297c8acfbe00b4f894a224ac0862857f",{"version":"e193e634a99c9c1d71f1c6e4e1567a4a73584328d21ea02dd5cddbaad6693f61","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","216717f17c095cde1dc19375e1ab3af0a4a485355860c077a4f9d6ea59fab5b5","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"80473bd0dd90ca1e166514c2dfead9d5803f9c51418864ca35abbeec6e6847e1","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","e6c86d83bd526c8bdb5d0bf935b8e72ce983763d600743f74d812fdf4abf4df6","a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","7d55d78cd47cf5280643b53434b16c2d9d11d144126932759fbdd51da525eec4","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","c4577fb855ca259bdbf3ea663ca73988ce5f84251a92b4aef80a1f4122b6f98e","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"ff07a9a03c65732ccc59b3c65bc584173da093bd563a6565411c01f5703bd3cb","affectsGlobalScope":true},"6de4a219df57d2b27274d59b67708f13c2cbf7ed211abe57d8f9ab8b25cde776","0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"d8d555f3d607ecaa18d55de6995ea8f206342ecc93305919eac945c7c78c78c6","e2a7281a5a7aec0ceb36ea105b8b3e1c6d6758ed199301f3a10de5ebbcb6e743","7f74442d87d094f1b77bed3748dd97c1d139eb05222fb46de9d1b8402279bd7d","0d39ee91274c833749ac253a276869d9bac615224a2cd55b65502260e02da127","f2fc45586b1e881c9e9cbff4445981c9c94554088881696cfa8926c10368838e","010696076753d265a6a67bcceb9ea6e66107067be599bdc2b0619efdc08d1bc7","e475bef588275a0f2b53373b3d17c7ddeaf111c40d3ca2706bfff92d2bf19d4e","612c84d13df19cc411b683a84df4a6401587afe703facbba3fc64ca933538fba","038799d3d36cdd6a0ab716d965f587f5d8f610a5306e1993364ebf4fae069ca3","3510b344ffb66182b00c0956dff723c6ab69a314112e71dd1eb0346a92d0312c","5599f34a53ab350a54e15a81982ba1c98197430ec3e1df7edcd37d1f31fdc506","d68d14ef5a31134bf952ef96c93446ed4f0686e840d0011a071ff8f4c782a30b","d4b5dc4a29556e4a80411db80e9f7eb69c69584e0738aca09ae4a6654c93d21f","63e61c4ea896197bfcbf8c499a2409baa31ab146694a847ec606a7e74080948e","60cab134777f1131b3abbe42a3eba3003013adb8c4d8a2f882a682c796c8a11e","0c0d1eadef6a092235981c643b9b797280f5130ddb3a738d563b87780977f668","7e25b3b42add5bb8b326256318255e81b83bccbfe4eff3bbab2070dffeb94f79","25e8e09851923044013f6efda775298ea55f220965d77c58b8a33802b63284f8","c22e086a091cfc8ccea49c0a23d7f59a70e61eff979662a0094e23aca97a9dcb","eb59654ed8ce9fc95dae05812daa514c9c8e0d0a49055d0b33e651e6926b31ea","0239a0d675f381ce9ee8ad7c77ab8acf9a1936810c2cd347480ea22f0acf6a9a","c7bb3d343635262f28289a380344885cc2d1178c4f2dc11e6e52eb6ec9fabff3","35af861275f61dfdf1be3690a1d53cfd825d7936c4ae548902291900b8402208","5980ba4a12dfc5fb66e59438315deb4d35d1369b3f886c1dec146600197b2c7e","36592459ea33688b09cc82689b506ea58ab6f9785d4d9b85dd368325801faeb5","00595ab91d01d295a2a1fa5ca7ac8a976846d59fe7ca901a50c1605a48f30db1","9585005cf0ada58ee1024cec39d99fc9993f3e0a54011cfc2eebf7cf9ca875a6","64204f5616702808166a699eac9856d511700688db9b5e9d9bdf202c72ffc2cd","dff9f3d7279058c621a4d76cb681ebd1c95e227dba067592fd347ac393b2d234","eeb28ef9fd75a3804ee12c66a0b3e6f039205270695b9faf14c86bd19af4ebee","8aec7a425aced8f5355175b94a273e7ea178bdbd52110c893170742b9be139e4","4b0215c65e2a94a467e48ca6ba9d67771f90d858a9b2dfb187a30308e7cbb69e",{"version":"8b4f4b7b2090b00acd17fe62fc30b1f8e57940c28d3b6ed450c1ef855be07330","signature":"d441166844cb18828680dbf0093614f6a7d7f3ed598452f23e037850f51d2b48"},{"version":"a07a778db67a89aabb04c41806d28552f8428f2fbcf0f488d1a1ffebd4c568d3","signature":"efb8e27827124bc3bf96b81288c0278c722d10f2372a1bbbb9de1943e784022b"},{"version":"a0a079fceca9261b22e611371647f081422cf2f33f104deee7c3dbf00c938190","signature":"b6db293a5ba0539a0007b69a92c196b21be784c1781e2f8b573fc70e5502fe00"},{"version":"f4a1cf86f7f71d4e20c90fcf34193d22737499d508a88ffa2f0a94dc1cbe1f20","signature":"3faa2b7701286a5b3863930e59ec45a3e74a9b6dacd216e168afb2a799a9598a"},{"version":"4045af8d5c148fbc03daa721f181748bb3dc6a67785cfcdafee46fb7ae8fde5c","signature":"b58aa94043dccae8ac9fcb2d7c07f25c863f3772a80a014a9a0b61d36b61895b"},{"version":"179c52a8c5b0db2bfdaf3695393d7157ea3b605b4b6e8fa2d421e72a7afd3840","signature":"19c3d80a37e4a5874dc264c1b5c5e11e73c25c65c31caa30064444e22d2bc19e"},{"version":"def88db6bdfce7bcab39f5faec825d5b88389e235741130989a5158fd1ccd178","signature":"587a18a5a21a6151ff51d2866fac32a61c2bf38ba878e2e5fcae6c06a27c8ed9"},{"version":"43082e738f695414514204221ea73dec8cc238a32b892cf9ef987ce7306eb733","signature":"d096779b92cdcef404daabce9e63afd112933685aae708b593a047fc6ef13682"},{"version":"aefdc2770c29c5630e908513c45072afea4b09420ea988d551e927e46c7c85d3","signature":"028906b65dcdb3143cc9b429815765340ffc11d40b7366ba30bb32e558e111f2"},{"version":"41478fcf2fd6d8f32f9a7050e3fa192140b90dde56a3503e3d3cdb34120ae6ce","signature":"05ba173a5408ad8a44e055640e5e153a684c6403f860dca7670cf52bd55b8f06"},{"version":"6ed7ec85c2efa9901cf6ff85513304221ca7104244ed412bcc3407843048a019","signature":"91e41ef69d685c82a0a4fa960f672aca91d0bfb84e83226cc0efce42ea885f91"},{"version":"585f2aa01d22c5a784269e9fa8b7600a766b3857d200eae061dd43c8cd498a56","signature":"857962d30dbc7f0910aa00e35085bd631b035ba1afc3c74a98df8cee53cb967f"},{"version":"5cca704e3d35807b0b8bf3d29dcc3e18ee78c401e58886daec5adebd70b11503","signature":"14badeabb60c97286c971eb2a6836f94b11c640ff5524f732a4db47794aa81b5"},{"version":"0fce22de0933f7003e94d97060d6e0a63a397fc661030c3b41f52e75bcc88b1b","signature":"8c83218e92cb960a020ce6ccf208c7fdd29fdba50f824ec9f7804b9a47c175d0"},{"version":"14a11fcd3ac91174a26b150d4d0c6aed0e010fa412207b65b505e5a5205182e2","signature":"30e79e66ea64c11aaaec0ae2b8e5b7103719724a177ff960f46f354f43802917"},{"version":"ff0815582326b779a5920602f257189a3cceb7f3c26ec2e386fbbcf03dc14bab","signature":"dd3e55e236d60bdf8506e7b8be544f8b9df241b62ee011b31315ab2e79b0a903"},{"version":"d222d5d94b908a09c806d3c2a1b859482e22800aa29594ec327f94543df2f885","signature":"21d8187cfb7239fce0ce089728ffd45ecbf8c4aa27032d9db415ea3cf5ca3c51"},{"version":"84ad1063e46bbc5314a35f8bad7798ec87b2cba274f2aa1215ffb4eeb87383ee","signature":"603b76444ae7b739baddb69d2aae1e5c18b5c5c1015e881b3c3f2c513eb238fa"},{"version":"cd6782b23b08b556002db5ad0c3e3365454e3327ac1fd7e4a9d27bb813c54d20","signature":"50425b41e87ffaf1fdee579f680643dbda413eea5db984eab163de063e23741d"},{"version":"ee686d629c0eab52714089e75be2f43a50d52662f0f4755362c3fda07cf2ae51","signature":"f08d4bb529d3348103d7b7133a13ae1880db310ba08b46a1f9f90dd67c6f9cbe"},{"version":"ba99629c0b3743e8c62e971cf69d3670a79e4d2bffc68a3e1408e66ec14a9f6d","signature":"b9ca0fb0079964ec1910ff2b82e5b8ca83f1ac6de0eb7c522dbfb684dc9183df"},{"version":"2a2f286378234a2cee79fc16ee97835d3cb7a67d1dfe8118b07fb36a392d89b6","signature":"22ff06d3a95eec8c7d0c5f0129af7303a358496857e0ce33e1c9208769f58741"},{"version":"0cf6f34f36515a78e185cf052db6e2cdd040ae5ad8c7c2f5cddfce150e80d7b4","signature":"eef3134d50fa7818d4c01c67fb07f06370d555d962eff626b4d07a02129ef3ae"},{"version":"57bbfe242a99fd2f6d71b62dd838f7d5d9aceaeae8221934392cc1a15eb061a0","signature":"220783370c7924b174300eba6475f0f0bfdd9af48b1b6666e396492b1f3fef98"},{"version":"27ed0fa5f7c55ff017a4ef62c61474d8db8b6426b58387faf9dc820e532d22f6","signature":"86910754b1dd2150aeb8b54951593015631871e352c3aaf6df332430162ea51b"},{"version":"416b53493a79f95a0ad66b718fac402a37af1792c2b149f2e2ffb5700f50217e","signature":"4a66502385c84a643589908ce44b12bcf94af05f970285b423536184ce894998"},{"version":"de930e86262cabede8aaecd6e7f50f11c66f3ff440b443ea8be55cb7963b662e","signature":"487ca02a3e3bbd43ad193f10a67c45ef382126be9a368d05811a661b905d3a8d"},{"version":"4574e0e173b7df9d9cbfb48a0f60cf454c835c024bd35fe9f66a72c2d434b125","signature":"5ebcb3d67df810df4f05891b1e53fcb890fa3860195d243cd25a6d0776be9a01"},{"version":"e7c598a83a03cd7790650d72482628a91ef54b61a82566df70340990c07df426","signature":"631b03a76016caa819ebfa95a40a7c5eac41820c4451135f9114073e75ec4afe"},{"version":"81f6d6148afbe12fdd155b21f1f76efd0ec464ef9e03ace4f0d675ef120c4398","signature":"30e5060e2b21e10485b6ea2be7a6333a1203221bc524bcc50e91705da896e7f3"},{"version":"63b3b61803c3332cb30f22d9557266278ba35e4d5f28b5fa66c49618ccf1e5db","signature":"28294756d2ac4e877f815fead8368692fc7184a1eac4068f2520d63a0a2fda8e"},{"version":"f2dbe29bfe06cfa1faf05036bb4d283a573ced9e65b516781d8ca444727d0785","signature":"3caff9d44a20278cb2afc4dc64920cc9526e54a573c173291a9d8fc1b158bf9e"},{"version":"79ac794d512663c8a40a0df96a34487f8e74539e06a5ef066ebeddf9a149ae04","signature":"69519f4adf7a7cb54324811083ee3be4e1c5347e2ac231f8ea4e496887bff4c9"},{"version":"8b52fd0c3e8906888df558c12fc41d09ca09210dedd977660e8b71ffe52023e3","signature":"8b837e28c1150e380b11aeaf340df60807cdab426470f8676f00bf95a4319a3c"},{"version":"54567c2c5119a2ce989178c450197ebd29e0c8c94a0f2199438481ed65464467","signature":"4ac2f63cc352f37faf2c9541c721ad3229395d37abfc598e2a43072058a72e69"},{"version":"2d6ad14ec61757d64ab7cb9a9866c6da0f36f9691209955ed3fc3dcc1b456b24","signature":"9bc8f648f6de3f01a348e35072ddd309bd057cc2783958d4818063084ac2bf82"},{"version":"d8ceff1b90873b896c16e41ceb5540cc7da933260d51e4670661b8feba1f86ff","signature":"4d28b4504df2740399e5aa82006b233b0ffa943cc62c241aa991ffe99fbb1ddd"},{"version":"875383df6e85ccdc3f76ee7e9a85544620035a43de51f346f31a0dddcf435a04","signature":"9febdac3e7d1d0b7eeeaf33c29910cbecd2ec54645fbcf599e96f9cb173d2220"},{"version":"14f90c2402ea4d1ae2b3831b61a840fab318d0034e2e7cc0e7e3c5db41f4bde8","signature":"fcf5e0e4fa6fed619edcd530d9b377bce22484b2b25cadb4e9c40d41591372be"},{"version":"51a72d498a22effce0e62bd87a3efc02731569d31aeae4e5dfb8532235cf090a","signature":"effb76b3ca674c89ae36ec40ccece5ca4903ec3d13c7eb92578fc6e6b0badad4"},{"version":"986855a63ecc9c740e697db64150ee4aebdf776bf8f6bb51b7669e187dc549c1","signature":"8cfd0ec19c0b2888662d17de5ffafd386a1f50efc11e271572d5684af46a3a51"},{"version":"253a1ccc1caf9ecc213f229bdac468b80961d6c90738f0d74d7671fcb522eaf6","signature":"a87502b6275e6b99939a3014c2811b2e8edc7ae9fd1e3e8ee55cc81645239530"},{"version":"b333c62026fe1a09474a11e0854ebd7215c125da7bd7584bd77627b3eeabe83d","signature":"739731412d089540b2052b41dd063e0f262bc19e01ceb4810f62c5a5f16ae100"},{"version":"ab77827099a1a5413f07a18fb0e849db20620298edadb249ec8f8622ef1a958a","signature":"5e7e5c5b3617526b5d2662556f5553ccb729b99bbeef33a343815155a9c4d2f7"},{"version":"648f83235478575ced1ec77e6af6b46bea5362bdfcfccd7291314f0f7bf1a137","signature":"b3b2c7ef0b4af33d7e14dd8476bd703a7177f05f508841d2b5c21f9a6ca76bee"},{"version":"172388d261e58df2b4ca3a2822cd4aa285415ab050bd027ea506dfb2f285075a","signature":"7ed92046051a8f54cfd94af6eb14780a40df60bea3d9b6f8352ac6e052d45426"},{"version":"3879bd2b4a9aec9e5147454d7efb785b4102de8dd079db4d51006fdb6dc362ad","signature":"cd8b70aecfe9342baa36f17d99522e361b7666907fc97e990e56eb791283d20d"},{"version":"82c80088bf08d069c595be833b7b16aaaedca6400fc02f1ad13ef97dcd5a6579","signature":"02045589ea2bb49a89e6f8bc4849072452c577bc156de79d83d753dfa17957d6"},{"version":"78d8a7d7b9e461de9a361356e5962b1d297c152085afc623ec7bfca4d7ab6748","signature":"d98de1d7659f822b239b3bda52685932ff1146c84ad508f156e39919a53cfdb2"},{"version":"00d50fd7d4d412cc52d3b5c6106a15d202d2ae86d4232efe25b3b93ae30b65f8","signature":"2c44328a58807293355a0734148616a87f302cd4f25ae29ecf613531e572e46e"},{"version":"1e9a4754e7bfc0e5e0d9334b2dd1ae200745e859e242a0731557372b83adcafc","signature":"942f20091205c4cb8b11bba42c44710f947c19dc94418330630ff6486817fbb3"},{"version":"7620b21e40397ce60afaae7b7dea5697e4d79838f104a891b17eed79d993319b","signature":"7e284c8dfe26d888a7c67a35917bd14b953434edfe829f4edf6359a3755a1104"},{"version":"34a9deba807e9cc490dd85edcb07e1840267481d0fcaf81ef1282e7f46561189","signature":"3ce69b0792fed631137c3962e3ff260648077ac227566940ebf0618005fa59d6"},{"version":"c404392717f996db62d70e560eca6f85573aac2fcb0a08eb3822a44bced6c79f","signature":"27e989ca5305607f25c04f58cd6200f5914dff48a2fd73385a9b0cacce9b9703"},{"version":"dc3340860809898df0a55554f16f5df11d4b08fe86b49fff87fafc547edb0e00","signature":"0757eaf226cfdd07b49a70d125f692cbf7fb286c5b38f3daf3f369e508875297"},{"version":"24fab3df46a3bfa08300e85f96549ba8ab3932284f05932b7da81e0ce08bcd0a","signature":"81b9671054b603f90e5b3cfa201cb75f0b8b2e47195b1bc93ea6d090a00f0bcf"},{"version":"f3f0772ad14ffeb9f8540c371500a26f23da69f54658f6e796845996ba214a74","signature":"bcf9cd7df582ca8558b0282337117890dd118ddd7907754bcec20051d773256d"},{"version":"daa27a5ea2db9d6975dc761135d4f6b587083decd00b66e766afdbd518feeb06","signature":"182e392a62f76505cea059dbda0113dc256f3b62bce7fbcd88860652688cdb6b"},{"version":"233ad5ae44409b60b8f5a608db873ed00a410fd22e4ec094a3d4a1686eaf26c4","signature":"37367a7bb56e6b43242ae4f9e91f67daa7a81a3fc24059a13baa00c165a827a6"},{"version":"7c191a7830a724eeed3a3a9260104a2d8dbd8eea5fbe5a661507c01235acaa87","signature":"30efc13612cb879a026ace5a8d2c70d9671b7089039548bd10e20ddb91d9173e"},{"version":"a3ac2beb8ec289c2bbec8d86a92aa15549c76c291381607c507f20e9d035014c","signature":"5079b3b63c07286febd317783006102a7f083d0e6408714bccaafb714588187c"},{"version":"b68fedd52f606a729a3342602c0d435d8d762ab87a7863f28678a5ec9d05d3ea","signature":"46dc8315335776a873ff4ce9036b8108e99622ac5c14ac621bcf008c07a48c60"},{"version":"b3b2ba7e8c50b4b22615a3e344fee19ec1669583cc02fd877e9f49b967307150","signature":"8a5fd71a7211014842b6c1db1471adc8d5bb0a71940dee28789dcf6c5144e670"},{"version":"5580306d17c4665e871e41eb645a8f823fda43c3aeda19acf2b658f47a24bac8","signature":"7723fb07804e04863dffe884bd1f018f4b1a144c7366aabfd3c8a17d2750aa62"},{"version":"3bfdd8c2d0ccf93d13a930ca7c64cb7c312156138f7a8c270832935cf1f8656b","signature":"eb3b9bcd24dd44ad6cfcedcd552084044c1c2758ec3cf6bf9fa38083bb07b24f"},{"version":"acfe21bab40163fa684741350f52fbd4d2297face00c3e93bb601222baa9041f","signature":"18c1847b9366aee3f8bc45d5617bb5330faa03453b869b0a8c328fbb7c754db9"},{"version":"9aac78f53a727d0fff57cd569003bbd30d45f7ce650ce1361f73142a66bbb934","signature":"96bbfa09f1c8eb678650c29c75a906e5fce8fbd9c486c04b5726eae18d3f45b5"},{"version":"71bbe82a64b6387c31566f738687036ceab49ffd44cb0c5fe5ded054ba1f2170","signature":"2028320e204d815bcd3c9449dcb9f9361b8f532d5e7461aae00efc4c57041653"},{"version":"d7d6a663ab7948d1b32c2f89e0e76e5221db6a3048e182b8774e643b9e040db3","signature":"6bee3e8579b80d79017407c5d75f02d1931eb163e5eaf3bc34f15f30102075e2"},{"version":"56f75fbfe11baded413e40d0bdcd9e79ade067d92ee2dc64b25e1773ab1a6147","signature":"5543c67a21ce7357a9ca55f30abda982fbafd5b78e1d5c215777b04e00193fbe"},{"version":"5b0be434253bc1877b6101b643954537ff9c0d55fd36af2b58bbf59da49b6f1b","signature":"4835a88c228d2b941f689a36a56ef48dd0a499bbe96cd137d923d70952378f34"},{"version":"7520b8fd838b0fbb00c880a2ee96182d7cc3fa284a01d9e76d4d546662ac5411","signature":"e645ce3aef9ef7a80e316b1069b4c1559d6fb2f15f3d4b57b43bbb98e692961c"},{"version":"86f1ba4ab86ed246250c97930abbcc6aa483ecc7112eb143ea06287bac2718ac","signature":"a6ce4b4bc46a4c15e4e017fcf012c1660d04ad80cb351d91fd831d496ee674b4"},{"version":"2a5134763ef8303d97fe8d990ae969fb426ccca4a5608863ff3000b1b60bf44a","signature":"eeef09185c6c7f8e02e581e05694238612db0271ad510ca8231e5fac12f95de2"},"6c1e688f95fcaf53b1e41c0fdadf2c1cfc96fa924eaf7f9fdb60f96deb0a4986","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","db25694be959314fd1e868d72e567746db1db9e2001fae545d12d2a8c1bba1b8","43883cf3635bb1846cbdc6c363787b76227677388c74f7313e3f0edb380840fa","2d47012580f859dae201d2eef898a416bdae719dffc087dfd06aefe3de2f9c8d","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","2cec1a31729b9b01e9294c33fc9425d336eff067282809761ad2e74425d6d2a5",{"version":"240c702fb4b3bd54d83ee167d80fa7f0cd7300fef7eea0b32cef33129740893c","affectsGlobalScope":true}],"options":{"allowUnusedLabels":false,"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"emitDeclarationOnly":false,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"module":99,"noEmitHelpers":true,"noImplicitAny":true,"noImplicitReturns":true,"outDir":"./lib","rootDir":"./src","skipLibCheck":true,"sourceMap":false,"strict":true,"suppressImplicitAnyIndexErrors":true,"target":7},"fileIdsList":[[152],[152,267],[152,269,272],[106,152],[109,152],[110,115,143,152],[111,122,123,130,140,151,152],[111,112,122,130,152],[113,152],[114,115,123,131,152],[115,140,148,152],[116,118,122,130,152],[117,152],[118,119,152],[122,152],[120,122,152],[122,123,124,140,151,152],[122,123,124,137,140,143,152],[152,156],[118,125,130,140,151,152],[122,123,125,126,130,140,148,151,152],[125,127,140,148,151,152],[106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[122,128,152],[129,151,152],[118,122,130,140,152],[131,152],[132,152],[109,133,152],[134,150,152,156],[135,152],[136,152],[122,137,138,152],[137,139,152,154],[110,122,140,141,142,143,152],[110,140,142,152],[140,141,152],[143,152],[144,152],[122,146,147,152],[146,147,152],[115,130,140,148,152],[149,152],[130,150,152],[110,125,136,151,152],[115,152],[140,152,153],[152,154],[152,155],[110,115,122,124,133,140,151,152,154,156],[140,152,157],[152,265,271],[152,269],[152,266,270],[152,268],[43,152,190,193,194,195,200,202,203,213,214,223,228,251,252],[43,152,190,193,194,195,200,202,213,214,223,251,252,253,254,257,260,261],[43,152,190,191,195,202,208,216],[43,152,190,195],[43,152],[43,152,190,191,206,242,243],[43,152,190,191,195,202,204,205,206,207,208],[43,152,195,203,204],[43,152,190,244,246],[43,152,191,195,242],[43,152,190,223,250],[43,152,204],[43,152,190,191,202,209,223,251],[43,152,190,195,198,200,201],[43,152,190,202,215,254,256,257,260],[43,152,190,193,194,195,200,202,209,212,213,214,217,223,228,229,231,251,252],[43,152,190,191,193,194,195,198,200,202,203,208,209,210,211,212,213,214,215,216,217,223,225,226,227,228,229,231,232,246,248,250,251,252,254,255,257,259],[43,152,190,191,234,235,236],[43,152,190,191,234,237,238,239,240,241,245],[43,152,190,233,237],[43,152,195,235],[43,152,190,191,237,239],[43,152,190,215,246],[43,152,190,234],[43,152,190],[43,152,190,191],[43,152,190,195,210,211],[43,152,190,195,210,264],[43,152,190,191,192,193,194,195,198,199,200,201,202,203,210,211,213,214,215,219,223,228,249,250,252,253,262,263],[43,152,190,193,194,195,198,200,202,209,212,213,214,215,217],[43,152,190,191,193,194,195,199,200,202,208,209,212,214,216,217,218,223,224,225],[43,152,190,191,192,193,195,198,199,200,202,209,210,211,212,217,220,221,226,228],[43,152,190,191,194,195,198,199,200,202,209,210,211,212,213,217,220,222,226],[43,152,190,191,195,200,202,209,212,217,219,220,230,252,258],[43,152,190,191,195,220,223],[43,152,190,191,195,200,202,209,212,214,217,219,220,226,230],[43,152,190,191,195,220],[43,152,190,191,193,194,195,198,207,213,214,215,218,219],[43,152,190,191,195,209],[43,152,190,191,195,199,200,209,221],[43,152,190,191,202,209,221],[43,152,195,207,208,209,212,216,217,220,222,224,225,226,227,229,231,232,246,247,248],[43,152,199],[43,152,199,200],[43,152,195],[43,152,190,191,195],[43,152,190,202,215],[43,152,255],[43,152,190,192],[43,152,190,237,238,247],[43,152,190,193,194],[43,152,190,191,195,196,197],[60,152],[55,60,152],[55,152],[46,47,48,49,64,66,69,70,71,74,83,90,152],[66,69,71,74,75,83,152],[49,68,152],[67,152],[44,152],[61,90,95,152,159,160,161],[51,53,55,56,57,58,59,61,62,63,65,66,71,77,79,152],[44,50,55,152],[46,55,60,61,71,75,76,152],[47,64,152],[51,56,57,58,77,152],[50,152],[51,56,57,58,59,61,62,63,65,77,79,152],[87,152],[86,152],[44,51,56,57,58,62,63,65,77,78,152],[74,90,92,93,94,95,96,97,152],[45,53,55,71,74,75,80,81,82,83,85,90,91,152],[74,90,92,95,99,100,152],[74,90,92,95,100,152],[55,69,71,75,80,83,85,86,88,89,152],[53,54,152],[55,74,152],[152,178],[152,181],[44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,67,68,69,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,152,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,184,185,186,187,188,189],[90,152],[82,152],[45,80,81,83,152],[45,53,80,81,82,152],[44,52,90,152],[52,53,91,152],[44,52,53,61,152],[53,67,89,152],[52,53,152,170],[52,61,152],[53,152],[53,91,152],[53,61,152],[52,152],[44,52,85,90,104,152],[61,152],[81,152],[53,55,59,71,74,75,76,80,81,86,88,95,97,152,164,175],[72,73,152],[71,72,73,74,90,152],[73,74,152,186],[44,62,70,80,84,152],[48,152,164],[152,183],[190,193,194,195,200,202,213,214,223,228,251,252],[190,193,194,195,200,202,213,214,223,251,252,253,254],[190,202,208],[190,195],[190,242],[190,195,202,204,206,208],[204],[190,244,246],[242],[190,223,250],[190,202,209,223,251],[190,195,200],[190,202,254],[190,193,194,195,200,202,209,212,213,214,217,223,228,229,231,251,252],[190,193,194,195,200,202,209,211,212,213,214,217,223,225,227,228,229,231,232,251,252,254,255,257,259],[190],[190,237],[235],[190,195,210,211],[190,195,210,264],[190,191,192,193,194,195,198,199,200,201,202,203,210,211,213,214,215,219,223,228,249,250,252,253,262,263],[190,193,194,200,202,209,212,213,214,217],[190,193,194,195,200,202,208,209,212,214,217,218,223,224,225],[190,192,193,200,202,209,212,217,220,221,228],[190,194,200,202,209,212,213,217,220],[190,195,200,202,209,212,217,220,252],[190,220,223],[190,195,200,202,209,212,214,217,219,220],[190,220],[190,193,194,195,213,214,218,219],[190,209],[190,200,209,221],[190,202,209,221],[195,207,208,209,212,216,217,220,222,224,225,226,227,229,231,232,246,247,248],[199],[199,200],[195],[190,202],[255],[190,192],[193,194]],"referencedMap":[[265,1],[268,2],[267,1],[273,3],[106,4],[107,4],[109,5],[110,6],[111,7],[112,8],[113,9],[114,10],[115,11],[116,12],[117,13],[118,14],[119,14],[121,15],[120,16],[122,15],[123,17],[124,18],[108,19],[158,1],[125,20],[126,21],[127,22],[159,23],[128,24],[129,25],[130,26],[131,27],[132,28],[133,29],[134,30],[135,31],[136,32],[137,33],[138,33],[139,34],[140,35],[142,36],[141,37],[143,38],[144,39],[145,1],[146,40],[147,41],[148,42],[149,43],[150,44],[151,45],[152,46],[153,47],[154,48],[155,49],[156,50],[157,51],[272,52],[270,53],[271,54],[266,1],[269,55],[43,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[253,56],[262,57],[217,58],[208,59],[224,60],[244,61],[209,62],[205,63],[245,64],[243,65],[242,60],[251,66],[204,60],[206,67],[250,68],[202,69],[261,70],[254,71],[260,72],[237,73],[246,74],[238,75],[235,60],[236,76],[241,77],[263,78],[240,79],[239,79],[191,80],[203,80],[216,81],[212,82],[211,83],[210,60],[264,84],[218,85],[258,80],[226,86],[229,87],[227,88],[259,89],[225,90],[231,91],[232,92],[220,93],[221,94],[222,95],[230,96],[249,97],[200,98],[201,99],[199,100],[196,101],[197,101],[255,102],[257,103],[256,103],[215,60],[252,80],[219,80],[228,104],[213,80],[193,104],[192,60],[194,80],[223,59],[214,80],[248,105],[247,80],[195,106],[207,59],[234,80],[198,107],[233,60],[61,108],[76,109],[91,1],[89,1],[104,110],[183,1],[60,1],[75,111],[105,112],[69,113],[46,1],[67,1],[68,114],[64,1],[47,1],[49,1],[70,115],[162,116],[80,117],[56,118],[77,119],[58,1],[65,120],[59,121],[50,115],[51,122],[57,122],[62,1],[63,1],[66,123],[88,124],[86,1],[87,125],[79,126],[98,127],[92,128],[101,129],[102,130],[103,1],[90,131],[55,132],[166,1],[167,115],[188,133],[54,1],[178,1],[181,134],[182,135],[179,134],[180,134],[190,136],[71,137],[83,138],[82,139],[45,115],[163,140],[189,1],[177,1],[53,141],[94,142],[93,143],[168,144],[171,145],[96,146],[169,147],[99,148],[100,149],[172,147],[160,150],[161,1],[173,151],[78,1],[95,152],[97,1],[170,1],[174,153],[176,154],[164,1],[81,115],[74,155],[73,1],[186,156],[72,1],[187,157],[85,158],[84,1],[48,1],[165,159],[44,1],[52,1],[175,110],[184,160],[185,1]],"exportedModulesMap":[[265,1],[268,2],[267,1],[273,3],[106,4],[107,4],[109,5],[110,6],[111,7],[112,8],[113,9],[114,10],[115,11],[116,12],[117,13],[118,14],[119,14],[121,15],[120,16],[122,15],[123,17],[124,18],[108,19],[158,1],[125,20],[126,21],[127,22],[159,23],[128,24],[129,25],[130,26],[131,27],[132,28],[133,29],[134,30],[135,31],[136,32],[137,33],[138,33],[139,34],[140,35],[142,36],[141,37],[143,38],[144,39],[145,1],[146,40],[147,41],[148,42],[149,43],[150,44],[151,45],[152,46],[153,47],[154,48],[155,49],[156,50],[157,51],[272,52],[270,53],[271,54],[266,1],[269,55],[253,161],[262,162],[217,163],[208,164],[244,165],[209,166],[205,167],[245,168],[243,169],[251,170],[206,167],[250,171],[202,172],[261,173],[254,174],[260,175],[237,176],[246,176],[238,177],[236,178],[241,177],[263,176],[191,176],[203,176],[216,176],[212,179],[211,180],[264,181],[218,182],[258,176],[226,183],[229,184],[227,185],[259,186],[225,187],[231,188],[232,189],[220,190],[221,191],[222,192],[230,193],[249,194],[200,195],[201,196],[199,197],[196,176],[197,176],[255,198],[257,199],[256,199],[252,176],[219,176],[228,200],[213,176],[193,200],[194,176],[223,164],[214,176],[248,176],[247,176],[195,201],[207,164],[198,164],[61,108],[76,109],[91,1],[89,1],[104,110],[183,1],[60,1],[75,111],[105,112],[69,113],[46,1],[67,1],[68,114],[64,1],[47,1],[49,1],[70,115],[162,116],[80,117],[56,118],[77,119],[58,1],[65,120],[59,121],[50,115],[51,122],[57,122],[62,1],[63,1],[66,123],[88,124],[86,1],[87,125],[79,126],[98,127],[92,128],[101,129],[102,130],[103,1],[90,131],[55,132],[166,1],[167,115],[188,133],[54,1],[178,1],[181,134],[182,135],[179,134],[180,134],[190,136],[71,137],[83,138],[82,139],[45,115],[163,140],[189,1],[177,1],[53,141],[94,142],[93,143],[168,144],[171,145],[96,146],[169,147],[99,148],[100,149],[172,147],[160,150],[161,1],[173,151],[78,1],[95,152],[97,1],[170,1],[174,153],[176,154],[164,1],[81,115],[74,155],[73,1],[186,156],[72,1],[187,157],[85,158],[84,1],[48,1],[165,159],[44,1],[52,1],[175,110],[184,160],[185,1]],"semanticDiagnosticsPerFile":[265,268,267,273,106,107,109,110,111,112,113,114,115,116,117,118,119,121,120,122,123,124,108,158,125,126,127,159,128,129,130,131,132,133,134,135,136,137,138,139,140,142,141,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,272,270,271,266,269,43,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,253,262,217,208,224,244,209,205,245,243,242,251,204,206,250,202,261,254,260,237,246,238,235,236,241,263,240,239,191,203,216,212,211,210,264,218,258,226,229,227,259,225,231,232,220,221,222,230,249,200,201,199,196,197,255,257,256,215,252,219,228,213,193,192,194,223,214,248,247,195,207,234,198,233,61,76,91,89,104,183,60,75,105,69,46,67,68,64,47,49,70,162,80,56,77,58,65,59,50,51,57,62,63,66,88,86,87,79,98,92,101,102,103,90,55,166,167,188,54,178,181,182,179,180,190,71,83,82,45,163,189,177,53,94,93,168,171,96,169,99,100,172,160,161,173,78,95,97,170,174,176,164,81,74,73,186,72,187,85,84,48,165,44,52,175,184,185],"latestChangedDtsFile":"./lib/index.d.ts"},"version":"4.9.5"} \ No newline at end of file diff --git a/lib/msal-common/src/client/SilentFlowClient.ts b/lib/msal-common/src/client/SilentFlowClient.ts index 827292df40..b3fb3c833e 100644 --- a/lib/msal-common/src/client/SilentFlowClient.ts +++ b/lib/msal-common/src/client/SilentFlowClient.ts @@ -19,6 +19,7 @@ import { ResponseHandler } from "../response/ResponseHandler"; import { CacheRecord } from "../cache/entities/CacheRecord"; import { CacheOutcome } from "../utils/Constants"; import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient"; +import { StringUtils } from "../utils/StringUtils"; export class SilentFlowClient extends BaseClient { constructor( @@ -75,6 +76,15 @@ export class SilentFlowClient extends BaseClient { "SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true." ); throw ClientAuthError.createRefreshRequiredError(); + } else if ( + !this.config.cacheOptions.claimsBasedCachingEnabled && + !StringUtils.isEmptyObj(request.claims) + ) { + // Must refresh due to request parameters. + this.logger.info( + "SilentFlowClient:acquireCachedToken - Skipping cache because claims-based caching is disabled and claims were requested." + ); + throw ClientAuthError.createRefreshRequiredError(); } // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases diff --git a/lib/msal-common/src/config/ClientConfiguration.ts b/lib/msal-common/src/config/ClientConfiguration.ts index 50b5019915..bb527b63db 100644 --- a/lib/msal-common/src/config/ClientConfiguration.ts +++ b/lib/msal-common/src/config/ClientConfiguration.ts @@ -38,6 +38,7 @@ export type ClientConfiguration = { authOptions: AuthOptions; systemOptions?: SystemOptions; loggerOptions?: LoggerOptions; + cacheOptions?: CacheOptions; storageInterface?: CacheManager; networkInterface?: INetworkModule; cryptoInterface?: ICrypto; @@ -53,6 +54,7 @@ export type CommonClientConfiguration = { authOptions: Required; systemOptions: Required; loggerOptions: Required; + cacheOptions: Required; storageInterface: CacheManager; networkInterface: INetworkModule; cryptoInterface: Required; @@ -108,6 +110,15 @@ export type LoggerOptions = { correlationId?: string; }; +/** + * Use this to configure credential cache preferences in the ClientConfiguration object + * + * - claimsBasedCachingEnabled - Sets whether tokens should be cached based on the claims hash. Default is false. + */ +export type CacheOptions = { + claimsBasedCachingEnabled?: boolean; +}; + /** * Library-specific options */ @@ -157,6 +168,10 @@ const DEFAULT_LOGGER_IMPLEMENTATION: Required = { correlationId: Constants.EMPTY_STRING, }; +const DEFAULT_CACHE_OPTIONS: Required = { + claimsBasedCachingEnabled: false, +}; + const DEFAULT_NETWORK_IMPLEMENTATION: INetworkModule = { async sendGetRequestAsync(): Promise { const notImplErr = @@ -205,6 +220,7 @@ export function buildClientConfiguration({ authOptions: userAuthOptions, systemOptions: userSystemOptions, loggerOptions: userLoggerOption, + cacheOptions: userCacheOptions, storageInterface: storageImplementation, networkInterface: networkImplementation, cryptoInterface: cryptoImplementation, @@ -224,6 +240,7 @@ export function buildClientConfiguration({ authOptions: buildAuthOptions(userAuthOptions), systemOptions: { ...DEFAULT_SYSTEM_OPTIONS, ...userSystemOptions }, loggerOptions: loggerOptions, + cacheOptions: { ...DEFAULT_CACHE_OPTIONS, ...userCacheOptions }, storageInterface: storageImplementation || new DefaultStorageClass( diff --git a/lib/msal-common/src/index.ts b/lib/msal-common/src/index.ts index f0f06faf33..ae9dd84c5c 100644 --- a/lib/msal-common/src/index.ts +++ b/lib/msal-common/src/index.ts @@ -16,6 +16,7 @@ export { AuthOptions, SystemOptions, LoggerOptions, + CacheOptions, DEFAULT_SYSTEM_OPTIONS, AzureCloudOptions, ApplicationTelemetry, diff --git a/lib/msal-common/test/client/SilentFlowClient.spec.ts b/lib/msal-common/test/client/SilentFlowClient.spec.ts index 828db9a148..3fbcd700d3 100644 --- a/lib/msal-common/test/client/SilentFlowClient.spec.ts +++ b/lib/msal-common/test/client/SilentFlowClient.spec.ts @@ -268,6 +268,120 @@ describe("SilentFlowClient unit tests", () => { expect(response.state).toBe(""); }); + it("acquireCachedToken throws when given valid claims with default configuration", async () => { + const testScopes = [ + Constants.OPENID_SCOPE, + Constants.PROFILE_SCOPE, + ...TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + ]; + testAccessTokenEntity.target = testScopes.join(" "); + sinon + .stub( + Authority.prototype, + "getEndpointMetadataFromNetwork" + ) + .resolves(DEFAULT_OPENID_CONFIG_RESPONSE.body); + sinon + .stub(AuthToken, "extractTokenClaims") + .returns(ID_TOKEN_CLAIMS); + sinon + .stub(CacheManager.prototype, "readAccountFromCache") + .returns(testAccountEntity); + sinon + .stub(CacheManager.prototype, "getIdToken") + .returns(testIdToken); + sinon + .stub(CacheManager.prototype, "getAccessToken") + .returns(testAccessTokenEntity); + sinon + .stub(CacheManager.prototype, "getRefreshToken") + .returns(testRefreshTokenEntity); + const config = + await ClientTestUtils.createTestClientConfiguration(); + const client = new SilentFlowClient(config, stubPerformanceClient); + sinon.stub(TimeUtils, "isTokenExpired").returns(false); + + const silentFlowRequest: CommonSilentFlowRequest = { + scopes: TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + account: testAccount, + authority: TEST_CONFIG.validAuthority, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + claims: `{ "access_token": { "xms_cc":{"values":["cp1"] } }}`, + }; + + await expect( + client.acquireCachedToken(silentFlowRequest) + ).rejects.toMatchObject( + ClientAuthError.createRefreshRequiredError() + ); + }); + + it("acquireCachedToken does not throw when given valid claims with claimsBasedCachingEnabled", async () => { + const testScopes = [ + Constants.OPENID_SCOPE, + Constants.PROFILE_SCOPE, + ...TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + ]; + testAccessTokenEntity.target = testScopes.join(" "); + sinon + .stub( + Authority.prototype, + "getEndpointMetadataFromNetwork" + ) + .resolves(DEFAULT_OPENID_CONFIG_RESPONSE.body); + sinon + .stub(AuthToken, "extractTokenClaims") + .returns(ID_TOKEN_CLAIMS); + sinon + .stub(CacheManager.prototype, "readAccountFromCache") + .returns(testAccountEntity); + sinon + .stub(CacheManager.prototype, "getIdToken") + .returns(testIdToken); + sinon + .stub(CacheManager.prototype, "getAccessToken") + .returns(testAccessTokenEntity); + sinon + .stub(CacheManager.prototype, "getRefreshToken") + .returns(testRefreshTokenEntity); + const config = + await ClientTestUtils.createTestClientConfiguration(); + const client = new SilentFlowClient( + { + ...config, + cacheOptions: { + ...config.cacheOptions, + claimsBasedCachingEnabled: true, + }, + }, + stubPerformanceClient + ); + sinon.stub(TimeUtils, "isTokenExpired").returns(false); + + const silentFlowRequest: CommonSilentFlowRequest = { + scopes: TEST_CONFIG.DEFAULT_GRAPH_SCOPE, + account: testAccount, + authority: TEST_CONFIG.validAuthority, + correlationId: TEST_CONFIG.CORRELATION_ID, + forceRefresh: false, + claims: `{ "access_token": { "xms_cc":{"values":["cp1"] } }}`, + }; + + const response = await client.acquireCachedToken(silentFlowRequest); + expect(response.authority).toEqual( + `${TEST_URIS.DEFAULT_INSTANCE}${TEST_CONFIG.TENANT}/` + ); + expect(response.uniqueId).toEqual(ID_TOKEN_CLAIMS.oid); + expect(response.tenantId).toEqual(ID_TOKEN_CLAIMS.tid); + expect(response.scopes).toEqual(testScopes); + expect(response.account).toEqual(testAccount); + expect(response.idToken).toEqual(testIdToken.secret); + expect(response.idTokenClaims).toEqual(ID_TOKEN_CLAIMS); + expect(response.accessToken).toEqual(testAccessTokenEntity.secret); + expect(response.state).toBe(""); + }); + it("acquireCachedToken returns correct token when max age is provided and has not transpired yet", async () => { const testScopes = [ Constants.OPENID_SCOPE, diff --git a/lib/msal-common/test/config/ClientConfiguration.spec.ts b/lib/msal-common/test/config/ClientConfiguration.spec.ts index 05a4bfb292..3913285a21 100644 --- a/lib/msal-common/test/config/ClientConfiguration.spec.ts +++ b/lib/msal-common/test/config/ClientConfiguration.spec.ts @@ -134,6 +134,9 @@ describe("ClientConfiguration.ts Class Unit Tests", () => { // Logger options checks expect(emptyConfig.loggerOptions).not.toBeNull(); expect(emptyConfig.loggerOptions.piiLoggingEnabled).toBe(false); + // Cache Options checks + expect(emptyConfig.cacheOptions).not.toBeNull(); + expect(emptyConfig.cacheOptions.claimsBasedCachingEnabled).toBe(false); // Client info checks expect(emptyConfig.libraryInfo.sku).toBe(Constants.SKU); expect(emptyConfig.libraryInfo.version).toBe(version); @@ -219,6 +222,9 @@ describe("ClientConfiguration.ts Class Unit Tests", () => { ): void => {}, piiLoggingEnabled: true, }, + cacheOptions: { + claimsBasedCachingEnabled: true, + }, libraryInfo: { sku: TEST_CONFIG.TEST_SKU, version: TEST_CONFIG.TEST_VERSION, @@ -298,6 +304,9 @@ describe("ClientConfiguration.ts Class Unit Tests", () => { expect(newConfig.loggerOptions).not.toBeNull(); expect(newConfig.loggerOptions.loggerCallback).not.toBeNull(); expect(newConfig.loggerOptions.piiLoggingEnabled).toBe(true); + // Cache options tests + expect(newConfig.cacheOptions).not.toBeNull(); + expect(newConfig.cacheOptions.claimsBasedCachingEnabled).toBe(true); // Client info tests expect(newConfig.libraryInfo.sku).toBe(TEST_CONFIG.TEST_SKU); expect(newConfig.libraryInfo.version).toBe(TEST_CONFIG.TEST_VERSION); diff --git a/lib/msal-node/package.json b/lib/msal-node/package.json index d4a4ed886a..230c964722 100644 --- a/lib/msal-node/package.json +++ b/lib/msal-node/package.json @@ -35,6 +35,7 @@ "lint:fix": "npm run lint -- -- --fix", "build:all": "npm run build:common && npm run build", "build:common": "cd ../msal-common && npm run build", + "build:modules:watch": "rollup -cw --bundleConfigAsCjs", "link:localDeps": "npx lerna@6 bootstrap --scope @azure/msal-common --scope @azure/msal-node", "prepack": "npm run build:all", "format:check": "npx prettier --ignore-path .gitignore --check src test", diff --git a/lib/msal-node/src/client/ClientApplication.ts b/lib/msal-node/src/client/ClientApplication.ts index 2f118a78c5..bd1ac3e203 100644 --- a/lib/msal-node/src/client/ClientApplication.ts +++ b/lib/msal-node/src/client/ClientApplication.ts @@ -437,6 +437,10 @@ export abstract class ClientApplication { this.config.system.loggerOptions.piiLoggingEnabled, correlationId: requestCorrelationId, }, + cacheOptions: { + claimsBasedCachingEnabled: + this.config.cache.claimsBasedCachingEnabled, + }, cryptoInterface: this.cryptoProvider, networkInterface: this.config.system.networkClient, storageInterface: this.storage, @@ -499,8 +503,13 @@ export abstract class ClientApplication { authRequest.authenticationScheme = AuthenticationScheme.BEARER; - // Set requested claims hash if claims were requested - if (authRequest.claims && !StringUtils.isEmpty(authRequest.claims)) { + // Set requested claims hash if claims-based caching is enabled and claims were requested + if ( + this.config.cache.claimsBasedCachingEnabled && + authRequest.claims && + // Checks for empty stringified object "{}" which doesn't qualify as requested claims + !StringUtils.isEmptyObj(authRequest.claims) + ) { authRequest.requestedClaimsHash = await this.cryptoProvider.hashString(authRequest.claims); } diff --git a/lib/msal-node/src/config/Configuration.ts b/lib/msal-node/src/config/Configuration.ts index b235675a67..43b628a299 100644 --- a/lib/msal-node/src/config/Configuration.ts +++ b/lib/msal-node/src/config/Configuration.ts @@ -57,6 +57,7 @@ export type NodeAuthOptions = { */ export type CacheOptions = { cachePlugin?: ICachePlugin; + claimsBasedCachingEnabled?: boolean; }; /** @@ -128,7 +129,9 @@ const DEFAULT_AUTH_OPTIONS: Required = { skipAuthorityMetadataCache: false, }; -const DEFAULT_CACHE_OPTIONS: CacheOptions = {}; +const DEFAULT_CACHE_OPTIONS: CacheOptions = { + claimsBasedCachingEnabled: false, +}; const DEFAULT_LOGGER_OPTIONS: LoggerOptions = { loggerCallback: (): void => { diff --git a/lib/msal-node/test/client/PublicClientApplication.spec.ts b/lib/msal-node/test/client/PublicClientApplication.spec.ts index d3578729ed..9fe3113f71 100644 --- a/lib/msal-node/test/client/PublicClientApplication.spec.ts +++ b/lib/msal-node/test/client/PublicClientApplication.spec.ts @@ -21,7 +21,7 @@ import { ServerAuthorizationCodeResponse, InteractionRequiredAuthError, AccountEntity, - IdToken + IdToken, } from "@azure/msal-common"; import { Configuration, @@ -237,12 +237,12 @@ describe("PublicClientApplication", () => { account: mockAccountInfo, scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, }; - + const silentFlowClient = getMsalCommonAutoMock().SilentFlowClient; jest.spyOn(msalCommon, "SilentFlowClient").mockImplementation( (config) => new silentFlowClient(config) ); - + const authApp = new PublicClientApplication(appConfig); await authApp.acquireTokenSilent(request); expect(SilentFlowClient).toHaveBeenCalledTimes(1); @@ -255,60 +255,70 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SilentFlowRequest = { account: mockNativeAccountInfo, - scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE + scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, }; - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenSilent"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "acquireTokenSilent" + ); const response = await authApp.acquireTokenSilent(request); expect(brokerSpy).toHaveBeenCalled(); - expect(response.idToken).toEqual(mockNativeAuthenticationResult.idToken); - expect(response.accessToken).toEqual(mockNativeAuthenticationResult.accessToken); - expect(response.account).toEqual(mockNativeAuthenticationResult.account); + expect(response.idToken).toEqual( + mockNativeAuthenticationResult.idToken + ); + expect(response.accessToken).toEqual( + mockNativeAuthenticationResult.accessToken + ); + expect(response.account).toEqual( + mockNativeAuthenticationResult.account + ); }); test("acquireTokenSilent - calls into NativeBrokerPlugin and throws", (done) => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SilentFlowRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, - account: mockNativeAccountInfo + account: mockNativeAccountInfo, }; - const testError = new InteractionRequiredAuthError("interaction_required", ); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenSilent").mockImplementation(() => { - return Promise.reject(testError); - }); - authApp.acquireTokenSilent(request).catch(e => { + const testError = new InteractionRequiredAuthError( + "interaction_required" + ); + const brokerSpy = jest + .spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenSilent") + .mockImplementation(() => { + return Promise.reject(testError); + }); + authApp.acquireTokenSilent(request).catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); done(); }); }); - }); - describe("acquireTokenInteractive tests", () => { - test("acquireTokenInteractive succeeds", async () => { const authApp = new PublicClientApplication(appConfig); - + let redirectUri: string; - + const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe( - true - ); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); http.get( `${redirectUri}?code=${TEST_CONSTANTS.AUTHORIZATION_CODE}` ); @@ -318,13 +328,16 @@ describe("PublicClientApplication", () => { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, openBrowser: openBrowser, }; - + const MockAuthorizationCodeClient = getMsalCommonAutoMock().AuthorizationCodeClient; - jest.spyOn(msalCommon, "AuthorizationCodeClient").mockImplementation( + jest.spyOn( + msalCommon, + "AuthorizationCodeClient" + ).mockImplementation( (config) => new MockAuthorizationCodeClient(config) ); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "getAuthCodeUrl" @@ -332,7 +345,7 @@ describe("PublicClientApplication", () => { redirectUri = req.redirectUri; return Promise.resolve(TEST_CONSTANTS.AUTH_CODE_URL); }); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "acquireToken" @@ -343,7 +356,7 @@ describe("PublicClientApplication", () => { ]); return Promise.resolve(mockAuthenticationResult); }); - + const response = await authApp.acquireTokenInteractive(request); expect(response.idToken).toEqual(mockAuthenticationResult.idToken); expect(response.accessToken).toEqual( @@ -351,49 +364,56 @@ describe("PublicClientApplication", () => { ); expect(response.account).toEqual(mockAuthenticationResult.account); }); - + test("acquireTokenInteractive - with custom loopback client succeeds", async () => { const authApp = new PublicClientApplication(appConfig); - + const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe( - true - ); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); return Promise.resolve(); }; - + const testServerCodeResponse: ServerAuthorizationCodeResponse = { code: TEST_CONSTANTS.AUTHORIZATION_CODE, client_info: TEST_DATA_CLIENT_INFO.TEST_DECODED_CLIENT_INFO, state: "123", }; - + const mockListenForAuthCode = jest.fn(() => { - return new Promise((resolve) => { - resolve(testServerCodeResponse); - }); + return new Promise( + (resolve) => { + resolve(testServerCodeResponse); + } + ); }); - const mockGetRedirectUri = jest.fn(() => TEST_CONSTANTS.REDIRECT_URI); + const mockGetRedirectUri = jest.fn( + () => TEST_CONSTANTS.REDIRECT_URI + ); const mockCloseServer = jest.fn(() => {}); - + const customLoopbackClient: ILoopbackClient = { listenForAuthCode: mockListenForAuthCode, getRedirectUri: mockGetRedirectUri, closeServer: mockCloseServer, }; - + const request: InteractiveRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, openBrowser: openBrowser, loopbackClient: customLoopbackClient, }; - + const MockAuthorizationCodeClient = getMsalCommonAutoMock().AuthorizationCodeClient; - jest.spyOn(msalCommon, "AuthorizationCodeClient").mockImplementation( + jest.spyOn( + msalCommon, + "AuthorizationCodeClient" + ).mockImplementation( (config) => new MockAuthorizationCodeClient(config) ); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "getAuthCodeUrl" @@ -401,7 +421,7 @@ describe("PublicClientApplication", () => { expect(req.redirectUri).toEqual(TEST_CONSTANTS.REDIRECT_URI); return Promise.resolve(TEST_CONSTANTS.AUTH_CODE_URL); }); - + jest.spyOn( MockAuthorizationCodeClient.prototype, "acquireToken" @@ -412,7 +432,7 @@ describe("PublicClientApplication", () => { ]); return Promise.resolve(mockAuthenticationResult); }); - + const response = await authApp.acquireTokenInteractive(request); expect(response.idToken).toEqual(mockAuthenticationResult.idToken); expect(response.accessToken).toEqual( @@ -428,50 +448,68 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe(true); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); return Promise.resolve(); }; const request: InteractiveRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, - openBrowser + openBrowser, }; - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenInteractive"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "acquireTokenInteractive" + ); const response = await authApp.acquireTokenInteractive(request); expect(brokerSpy).toHaveBeenCalled(); - expect(response.idToken).toEqual(mockNativeAuthenticationResult.idToken); - expect(response.accessToken).toEqual(mockNativeAuthenticationResult.accessToken); - expect(response.account).toEqual(mockNativeAuthenticationResult.account); + expect(response.idToken).toEqual( + mockNativeAuthenticationResult.idToken + ); + expect(response.accessToken).toEqual( + mockNativeAuthenticationResult.accessToken + ); + expect(response.account).toEqual( + mockNativeAuthenticationResult.account + ); }); test("acquireTokenInteractive - calls into NativeBrokerPlugin and throws", (done) => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const openBrowser = (url: string) => { - expect(url.startsWith("https://login.microsoftonline.com")).toBe(true); + expect( + url.startsWith("https://login.microsoftonline.com") + ).toBe(true); return Promise.resolve(); }; const request: InteractiveRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, - openBrowser + openBrowser, }; const testError = ClientAuthError.createUserCanceledError(); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "acquireTokenInteractive").mockImplementation(() => { - return Promise.reject(testError); - }); - authApp.acquireTokenInteractive(request).catch(e => { + const brokerSpy = jest + .spyOn( + MockNativeBrokerPlugin.prototype, + "acquireTokenInteractive" + ) + .mockImplementation(() => { + return Promise.reject(testError); + }); + authApp.acquireTokenInteractive(request).catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); done(); @@ -482,14 +520,14 @@ describe("PublicClientApplication", () => { describe("signOut tests", () => { test("signOut clears account from local cache", async () => { const authApp = new PublicClientApplication({ - ...appConfig + ...appConfig, }); const cryptoProvider = new CryptoProvider(); const accountEntity: AccountEntity = AccountEntity.createAccount( - TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, - mockAccountInfo.homeAccountId, - new IdToken(mockAuthenticationResult.idToken, cryptoProvider), + TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, + mockAccountInfo.homeAccountId, + new IdToken(mockAuthenticationResult.idToken, cryptoProvider), fakeAuthority ); @@ -508,14 +546,17 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SignOutRequest = { - account: mockNativeAccountInfo + account: mockNativeAccountInfo, }; - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "signOut"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "signOut" + ); await authApp.signOut(request); expect(brokerSpy).toHaveBeenCalled(); }); @@ -524,17 +565,19 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const request: SignOutRequest = { - account: mockNativeAccountInfo + account: mockNativeAccountInfo, }; const testError = ClientAuthError.createNoAccountFoundError(); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "signOut").mockImplementation(() => { - return Promise.reject(testError); - }); + const brokerSpy = jest + .spyOn(MockNativeBrokerPlugin.prototype, "signOut") + .mockImplementation(() => { + return Promise.reject(testError); + }); authApp.signOut(request).catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); @@ -546,14 +589,14 @@ describe("PublicClientApplication", () => { describe("getAllAccounts tests", () => { test("getAllAccounts returns an array of accounts found in the cache", async () => { const authApp = new PublicClientApplication({ - ...appConfig + ...appConfig, }); const cryptoProvider = new CryptoProvider(); const accountEntity: AccountEntity = AccountEntity.createAccount( - TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, - mockAccountInfo.homeAccountId, - new IdToken(mockAuthenticationResult.idToken, cryptoProvider), + TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, + mockAccountInfo.homeAccountId, + new IdToken(mockAuthenticationResult.idToken, cryptoProvider), fakeAuthority ); @@ -568,11 +611,14 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "getAllAccounts"); + const brokerSpy = jest.spyOn( + MockNativeBrokerPlugin.prototype, + "getAllAccounts" + ); const accounts = await authApp.getAllAccounts(); expect(brokerSpy).toHaveBeenCalled(); expect(accounts).toStrictEqual([mockNativeAccountInfo]); @@ -582,14 +628,16 @@ describe("PublicClientApplication", () => { const authApp = new PublicClientApplication({ ...appConfig, broker: { - nativeBrokerPlugin: new MockNativeBrokerPlugin() - } + nativeBrokerPlugin: new MockNativeBrokerPlugin(), + }, }); const testError = ClientAuthError.createNoAccountFoundError(); - const brokerSpy = jest.spyOn(MockNativeBrokerPlugin.prototype, "getAllAccounts").mockImplementation(() => { - return Promise.reject(testError); - }); + const brokerSpy = jest + .spyOn(MockNativeBrokerPlugin.prototype, "getAllAccounts") + .mockImplementation(() => { + return Promise.reject(testError); + }); authApp.getAllAccounts().catch((e) => { expect(brokerSpy).toHaveBeenCalled(); expect(e).toBe(testError); @@ -598,7 +646,7 @@ describe("PublicClientApplication", () => { }); }); - test("initializeBaseRequest passes a claims hash to acquireToken", async () => { + test("initializeBaseRequest passes a requested claims hash to acquireToken when claimsBasedHashing is enabled", async () => { const account: AccountInfo = { homeAccountId: "", environment: "", @@ -623,7 +671,10 @@ describe("PublicClientApplication", () => { silentFlowClient.prototype, "acquireToken" ); - const authApp = new PublicClientApplication(appConfig); + const authApp = new PublicClientApplication({ + ...appConfig, + cache: { claimsBasedCachingEnabled: true }, + }); await authApp.acquireTokenSilent(request); expect(silentFlowClient.prototype.acquireToken).toHaveBeenCalledWith( expect.objectContaining({ requestedClaimsHash: expect.any(String) }) @@ -635,6 +686,43 @@ describe("PublicClientApplication", () => { ).toBeGreaterThan(0); }); + test("initializeBaseRequest doesn't pass a claims hash to acquireToken when claimsBasedHashing is disabled by default", async () => { + const account: AccountInfo = { + homeAccountId: "", + environment: "", + tenantId: "", + username: "", + localAccountId: "", + name: "", + idTokenClaims: ID_TOKEN_CLAIMS, + }; + const request: SilentFlowRequest = { + account: account, + scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, + claims: TEST_CONSTANTS.CLAIMS, + }; + + const silentFlowClient = getMsalCommonAutoMock().SilentFlowClient; + jest.spyOn(msalCommon, "SilentFlowClient").mockImplementation( + (config) => new silentFlowClient(config) + ); + + const acquireTokenSpy = jest.spyOn( + silentFlowClient.prototype, + "acquireToken" + ); + const authApp = new PublicClientApplication(appConfig); + await authApp.acquireTokenSilent(request); + expect(silentFlowClient.prototype.acquireToken).toHaveBeenCalledWith( + expect.not.objectContaining({ + requestedClaimsHash: expect.any(String), + }) + ); + + const submittedRequest = acquireTokenSpy.mock.calls[0][0]; + expect((submittedRequest as any)?.requestedClaimsHash).toBe(undefined); + }); + test("create AuthorizationCode URL", async () => { const request: AuthorizationUrlRequest = { scopes: TEST_CONSTANTS.DEFAULT_GRAPH_SCOPE, diff --git a/lib/msal-node/test/utils/TestConstants.ts b/lib/msal-node/test/utils/TestConstants.ts index 50a647b427..d578836b88 100644 --- a/lib/msal-node/test/utils/TestConstants.ts +++ b/lib/msal-node/test/utils/TestConstants.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. */ -import { AccountInfo , +import { + AccountInfo, ICrypto, AuthError, PkceCodes, @@ -47,7 +48,7 @@ line3 line4 -----END CERTIFICATE----- `, - CLAIMS: "claim1 claim2", + CLAIMS: `{ "access_token": { "xms_cc":{"values":["cp1"] } }}`, SNI_CERTIFICATE: `-----BEGIN PRIVATE KEY-----\r line1\r line2\r @@ -249,13 +250,13 @@ export const mockAccountInfo: AccountInfo = { username: ID_TOKEN_CLAIMS.preferred_username, idTokenClaims: ID_TOKEN_CLAIMS, name: ID_TOKEN_CLAIMS.name, - nativeAccountId: undefined + nativeAccountId: undefined, }; export const mockNativeAccountInfo: AccountInfo = { ...mockAccountInfo, - nativeAccountId: "test-nativeAccountId" -} + nativeAccountId: "test-nativeAccountId", +}; export const mockAuthenticationResult: AuthenticationResult = { authority: TEST_CONSTANTS.DEFAULT_AUTHORITY, @@ -269,13 +270,13 @@ export const mockAuthenticationResult: AuthenticationResult = { fromCache: false, expiresOn: new Date(), tokenType: "BEARER", - correlationId: "test-correlationId" + correlationId: "test-correlationId", }; export const mockNativeAuthenticationResult: AuthenticationResult = { ...mockAuthenticationResult, - account: mockNativeAccountInfo -} + account: mockNativeAccountInfo, +}; export type MockedMetadataResponse = { tenant_discovery_endpoint: string;