UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

232 lines • 25 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ import { SE_LOCATION_CHANGE, SE_NAVIGATE, SystemEventDispatcher } from '../system-events'; /** * ** State Manager for Browser URL. * * - Provides methods for easy appending/retrieving/removing of params and query params to the URL state. * - Provides ability to serialize current state as URL href. */ export class URLStateManager { /** * ** Constructor. */ constructor(baseURL, urlLocation) { this.baseURL = baseURL; this.urlLocation = urlLocation; /** * ** Store value if URL Params State mutated since previous navigation. */ this.isParamsStateMutated = false; /** * ** Store value if URL QueryParams State mutated since previous navigation. */ this.isQueryParamsStateMutated = false; this.params = new Map(); this.queryParams = new Map(); this.locationHref = this.urlLocation.path(); } /** * ** Returns current Browser URL href. */ get URL() { if (this.baseURL) { return `${this.baseURL}${this.getParamsToString()}${this.getQueryParamsToString()}`; } return null; } /** * ** Replace current URL state to Browser URL. */ replaceToUrl() { const browserCurrUrl = window.location.href; if (browserCurrUrl.endsWith(encodeURI(this.URL))) { return; } this.isParamsStateMutated = false; this.urlLocation.replaceState(this.URL); } /** * ** Apply current URL state to Browser URL. */ locationToURL() { const browserCurrUrl = window.location.href; if (browserCurrUrl.endsWith(encodeURI(this.URL))) { return; } this.isParamsStateMutated = false; this._notifyForLocationChange(); this.urlLocation.go(this.URL); } /** * ** Navigate through Angular Router with set URL state. */ navigateToUrl() { const browserCurrUrl = window.location.href; if (browserCurrUrl.endsWith(encodeURI(this.URL))) { return Promise.resolve(false); } this.isQueryParamsStateMutated = false; return SystemEventDispatcher.send(SE_NAVIGATE, { url: this.buildUrlWithParams(), extras: { queryParams: this.getQueryParamsAsMap() } }, 1); } /** * ** Set query param to URL state. */ setQueryParam(key, value, position = 1) { this.isQueryParamsStateMutated = true; if (value) { this.queryParams.set(key, { key, value, position }); } else { this.removeQueryParam(key); } } /** * ** Returns query param value for given key. */ getQueryParam(key) { if (this.queryParams.has(key)) { return this.queryParams.get(key).value; } return null; } /** * ** Removes query param from URL state. */ removeQueryParam(key) { if (this.queryParams.has(key)) { this.isQueryParamsStateMutated = true; this.queryParams.delete(key); } } /** * ** Clear stored queryParams. */ clearQueryParams() { this.queryParams.clear(); } /** * ** Set param to URL state. */ setParam(key, value, position = 1) { this.isParamsStateMutated = true; if (value) { this.params.set(key, { key, value, position }); } else { this.removeParam(key); } } /** * ** Returns param value for given key. */ getParam(key) { if (this.params.has(key)) { return this.params.get(key).value; } return null; } /** * ** Removes query param from URL state. */ removeParam(key) { if (this.params.has(key)) { this.isParamsStateMutated = true; this.params.delete(key); } } /** * ** Clear stored params. */ clearParams() { this.params.clear(); } /** * ** Returns serialized params in string. */ getParamsToString() { let paramString = ''; this.getSortedByPosition(this.params).forEach((p) => { paramString += `/${p.value}`; }); return paramString; } /** * ** Returns serialized queryParams in string. */ getQueryParamsToString() { const sortedParams = this.getSortedByPosition(this.queryParams); let paramString = ''; if (sortedParams.length > 0) { paramString = `?${sortedParams[0].key}=${sortedParams[0].value}`; for (let i = 1; i < sortedParams.length; i++) { const p = sortedParams[i]; paramString += `&${p.key}=${p.value}`; } } return paramString; } /** * ** Returns query params in Map format. */ getQueryParamsAsMap() { const sortedParams = this.getSortedByPosition(this.queryParams); const paramsMap = {}; for (const paramsPair of sortedParams) { paramsMap[paramsPair.key] = paramsPair.value; } return paramsMap; } /** * ** Returns params in Map format. */ getParamsAsMap() { const sortedParams = this.getSortedByPosition(this.params); const paramsMap = {}; for (const paramsPair of sortedParams) { paramsMap[paramsPair.key] = paramsPair.value; } return paramsMap; } /** * ** Build url from base and provided params. */ buildUrlWithParams() { if (this.baseURL) { return `${this.baseURL}${this.getParamsToString()}`; } return null; } /** * ** Change Base url. */ changeBaseUrl(baseUrl) { this.baseURL = baseUrl; } getSortedByPosition(values) { return Array.from(values.entries()) .sort((p1, p2) => p1[1].position - p2[1].position) .map((e) => e[1]); } _notifyForLocationChange() { const paramsMap = this.getParamsAsMap(); const paramsSerialized = this.buildUrlWithParams(); const queryParamsMap = this.getQueryParamsAsMap(); const queryParamsSerialized = this.getQueryParamsToString(); SystemEventDispatcher.post(SE_LOCATION_CHANGE, { url: this.URL, params: paramsMap ? paramsMap : {}, paramsSerialized: paramsSerialized ? paramsSerialized : '', queryParams: queryParamsMap ? queryParamsMap : {}, queryParamsSerialized: queryParamsSerialized ? queryParamsSerialized.replace(/^\?/, '') : '' }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXN0YXRlLm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb3JlL3VybC1zdGF0ZS1tYW5hZ2VyL3VybC1zdGF0ZS5tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQU1ILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVExRjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBZXhCOztPQUVHO0lBQ0gsWUFDVyxPQUFlLEVBQ2YsV0FBcUI7UUFEckIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBbkJoQzs7V0FFRztRQUNJLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUVwQzs7V0FFRztRQUNJLDhCQUF5QixHQUFHLEtBQUssQ0FBQztRQWFyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7UUFFN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksR0FBRztRQUNILElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7U0FDdkY7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1IsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFNUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUM5QyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFNUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUM5QyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFNUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUM5QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBRXZDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUM3QixXQUFXLEVBQ1g7WUFDSSxHQUFHLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzlCLE1BQU0sRUFBRTtnQkFDSixXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO2FBQzFDO1NBQ0osRUFDRCxDQUFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxHQUFXLEVBQUUsS0FBYSxFQUFFLFFBQVEsR0FBRyxDQUFDO1FBQ2xELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFFdEMsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxHQUFXO1FBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDMUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztZQUV0QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUSxDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsUUFBUSxHQUFHLENBQUM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDckM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsR0FBVztRQUNuQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFFakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUI7UUFDYixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNoRCxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0I7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVoRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVqRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUN6QztTQUNKO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CO1FBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxZQUFZLEVBQUU7WUFDbkMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXJCLEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxFQUFFO1lBQ25DLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztTQUNoRDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7U0FDdkQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsT0FBZTtRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsTUFBMkM7UUFDbkUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUM5QixJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7YUFDakQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sd0JBQXdCO1FBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ25ELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2xELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFNUQscUJBQXFCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNsQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUQsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pELHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQy9GLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IFNFX0xPQ0FUSU9OX0NIQU5HRSwgU0VfTkFWSUdBVEUsIFN5c3RlbUV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL3N5c3RlbS1ldmVudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlTWFuYWdlclBhcmFtVmFsdWUge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IG51bWJlcjtcbn1cblxuLyoqXG4gKiAqKiBTdGF0ZSBNYW5hZ2VyIGZvciBCcm93c2VyIFVSTC5cbiAqXG4gKiAgIC0gUHJvdmlkZXMgbWV0aG9kcyBmb3IgZWFzeSBhcHBlbmRpbmcvcmV0cmlldmluZy9yZW1vdmluZyBvZiBwYXJhbXMgYW5kIHF1ZXJ5IHBhcmFtcyB0byB0aGUgVVJMIHN0YXRlLlxuICogICAtIFByb3ZpZGVzIGFiaWxpdHkgdG8gc2VyaWFsaXplIGN1cnJlbnQgc3RhdGUgYXMgVVJMIGhyZWYuXG4gKi9cbmV4cG9ydCBjbGFzcyBVUkxTdGF0ZU1hbmFnZXIge1xuICAgIC8qKlxuICAgICAqICoqIFN0b3JlIHZhbHVlIGlmIFVSTCBQYXJhbXMgU3RhdGUgbXV0YXRlZCBzaW5jZSBwcmV2aW91cyBuYXZpZ2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BhcmFtc1N0YXRlTXV0YXRlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogKiogU3RvcmUgdmFsdWUgaWYgVVJMIFF1ZXJ5UGFyYW1zIFN0YXRlIG11dGF0ZWQgc2luY2UgcHJldmlvdXMgbmF2aWdhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNRdWVyeVBhcmFtc1N0YXRlTXV0YXRlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IE1hcDxzdHJpbmcsIFN0YXRlTWFuYWdlclBhcmFtVmFsdWU+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlQYXJhbXM6IE1hcDxzdHJpbmcsIFN0YXRlTWFuYWdlclBhcmFtVmFsdWU+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb25IcmVmOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBDb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGJhc2VVUkw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHVybExvY2F0aW9uOiBMb2NhdGlvblxuICAgICkge1xuICAgICAgICB0aGlzLnBhcmFtcyA9IG5ldyBNYXA8c3RyaW5nLCBTdGF0ZU1hbmFnZXJQYXJhbVZhbHVlPigpO1xuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gbmV3IE1hcDxzdHJpbmcsIFN0YXRlTWFuYWdlclBhcmFtVmFsdWU+KCk7XG5cbiAgICAgICAgdGhpcy5sb2NhdGlvbkhyZWYgPSB0aGlzLnVybExvY2F0aW9uLnBhdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXR1cm5zIGN1cnJlbnQgQnJvd3NlciBVUkwgaHJlZi5cbiAgICAgKi9cbiAgICBnZXQgVVJMKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VVUkx9JHt0aGlzLmdldFBhcmFtc1RvU3RyaW5nKCl9JHt0aGlzLmdldFF1ZXJ5UGFyYW1zVG9TdHJpbmcoKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmVwbGFjZSBjdXJyZW50IFVSTCBzdGF0ZSB0byBCcm93c2VyIFVSTC5cbiAgICAgKi9cbiAgICByZXBsYWNlVG9VcmwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJDdXJyVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cbiAgICAgICAgaWYgKGJyb3dzZXJDdXJyVXJsLmVuZHNXaXRoKGVuY29kZVVSSSh0aGlzLlVSTCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzUGFyYW1zU3RhdGVNdXRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy51cmxMb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5VUkwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEFwcGx5IGN1cnJlbnQgVVJMIHN0YXRlIHRvIEJyb3dzZXIgVVJMLlxuICAgICAqL1xuICAgIGxvY2F0aW9uVG9VUkwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJDdXJyVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cbiAgICAgICAgaWYgKGJyb3dzZXJDdXJyVXJsLmVuZHNXaXRoKGVuY29kZVVSSSh0aGlzLlVSTCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzUGFyYW1zU3RhdGVNdXRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fbm90aWZ5Rm9yTG9jYXRpb25DaGFuZ2UoKTtcblxuICAgICAgICB0aGlzLnVybExvY2F0aW9uLmdvKHRoaXMuVVJMKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBOYXZpZ2F0ZSB0aHJvdWdoIEFuZ3VsYXIgUm91dGVyIHdpdGggc2V0IFVSTCBzdGF0ZS5cbiAgICAgKi9cbiAgICBuYXZpZ2F0ZVRvVXJsKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBicm93c2VyQ3VyclVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXG4gICAgICAgIGlmIChicm93c2VyQ3VyclVybC5lbmRzV2l0aChlbmNvZGVVUkkodGhpcy5VUkwpKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzUXVlcnlQYXJhbXNTdGF0ZU11dGF0ZWQgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gU3lzdGVtRXZlbnREaXNwYXRjaGVyLnNlbmQoXG4gICAgICAgICAgICBTRV9OQVZJR0FURSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMuYnVpbGRVcmxXaXRoUGFyYW1zKCksXG4gICAgICAgICAgICAgICAgZXh0cmFzOiB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLmdldFF1ZXJ5UGFyYW1zQXNNYXAoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAxXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogU2V0IHF1ZXJ5IHBhcmFtIHRvIFVSTCBzdGF0ZS5cbiAgICAgKi9cbiAgICBzZXRRdWVyeVBhcmFtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBwb3NpdGlvbiA9IDEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1F1ZXJ5UGFyYW1zU3RhdGVNdXRhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXMuc2V0KGtleSwgeyBrZXksIHZhbHVlLCBwb3NpdGlvbiB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUXVlcnlQYXJhbShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmV0dXJucyBxdWVyeSBwYXJhbSB2YWx1ZSBmb3IgZ2l2ZW4ga2V5LlxuICAgICAqL1xuICAgIGdldFF1ZXJ5UGFyYW0oa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5xdWVyeVBhcmFtcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlQYXJhbXMuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZW1vdmVzIHF1ZXJ5IHBhcmFtIGZyb20gVVJMIHN0YXRlLlxuICAgICAqL1xuICAgIHJlbW92ZVF1ZXJ5UGFyYW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucXVlcnlQYXJhbXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNRdWVyeVBhcmFtc1N0YXRlTXV0YXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBDbGVhciBzdG9yZWQgcXVlcnlQYXJhbXMuXG4gICAgICovXG4gICAgY2xlYXJRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFNldCBwYXJhbSB0byBVUkwgc3RhdGUuXG4gICAgICovXG4gICAgc2V0UGFyYW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHBvc2l0aW9uID0gMSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzUGFyYW1zU3RhdGVNdXRhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLnNldChrZXksIHsga2V5LCB2YWx1ZSwgcG9zaXRpb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVBhcmFtKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXR1cm5zIHBhcmFtIHZhbHVlIGZvciBnaXZlbiBrZXkuXG4gICAgICovXG4gICAgZ2V0UGFyYW0oa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5wYXJhbXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy5nZXQoa2V5KS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJlbW92ZXMgcXVlcnkgcGFyYW0gZnJvbSBVUkwgc3RhdGUuXG4gICAgICovXG4gICAgcmVtb3ZlUGFyYW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmlzUGFyYW1zU3RhdGVNdXRhdGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBDbGVhciBzdG9yZWQgcGFyYW1zLlxuICAgICAqL1xuICAgIGNsZWFyUGFyYW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhcmFtcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgc2VyaWFsaXplZCBwYXJhbXMgaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIGdldFBhcmFtc1RvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBwYXJhbVN0cmluZyA9ICcnO1xuXG4gICAgICAgIHRoaXMuZ2V0U29ydGVkQnlQb3NpdGlvbih0aGlzLnBhcmFtcykuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgcGFyYW1TdHJpbmcgKz0gYC8ke3AudmFsdWV9YDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgc2VyaWFsaXplZCBxdWVyeVBhcmFtcyBpbiBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0UXVlcnlQYXJhbXNUb1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzb3J0ZWRQYXJhbXMgPSB0aGlzLmdldFNvcnRlZEJ5UG9zaXRpb24odGhpcy5xdWVyeVBhcmFtcyk7XG5cbiAgICAgICAgbGV0IHBhcmFtU3RyaW5nID0gJyc7XG5cbiAgICAgICAgaWYgKHNvcnRlZFBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwYXJhbVN0cmluZyA9IGA/JHtzb3J0ZWRQYXJhbXNbMF0ua2V5fT0ke3NvcnRlZFBhcmFtc1swXS52YWx1ZX1gO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNvcnRlZFBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBzb3J0ZWRQYXJhbXNbaV07XG4gICAgICAgICAgICAgICAgcGFyYW1TdHJpbmcgKz0gYCYke3Aua2V5fT0ke3AudmFsdWV9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhbVN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXR1cm5zIHF1ZXJ5IHBhcmFtcyBpbiBNYXAgZm9ybWF0LlxuICAgICAqL1xuICAgIGdldFF1ZXJ5UGFyYW1zQXNNYXAoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZFBhcmFtcyA9IHRoaXMuZ2V0U29ydGVkQnlQb3NpdGlvbih0aGlzLnF1ZXJ5UGFyYW1zKTtcbiAgICAgICAgY29uc3QgcGFyYW1zTWFwID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJhbXNQYWlyIG9mIHNvcnRlZFBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtc1BhaXIua2V5XSA9IHBhcmFtc1BhaXIudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYW1zTWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgcGFyYW1zIGluIE1hcCBmb3JtYXQuXG4gICAgICovXG4gICAgZ2V0UGFyYW1zQXNNYXAoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZFBhcmFtcyA9IHRoaXMuZ2V0U29ydGVkQnlQb3NpdGlvbih0aGlzLnBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHBhcmFtc01hcCA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyYW1zUGFpciBvZiBzb3J0ZWRQYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtc01hcFtwYXJhbXNQYWlyLmtleV0gPSBwYXJhbXNQYWlyLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtc01hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBCdWlsZCB1cmwgZnJvbSBiYXNlIGFuZCBwcm92aWRlZCBwYXJhbXMuXG4gICAgICovXG4gICAgYnVpbGRVcmxXaXRoUGFyYW1zKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VVUkx9JHt0aGlzLmdldFBhcmFtc1RvU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIENoYW5nZSBCYXNlIHVybC5cbiAgICAgKi9cbiAgICBjaGFuZ2VCYXNlVXJsKGJhc2VVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmJhc2VVUkwgPSBiYXNlVXJsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U29ydGVkQnlQb3NpdGlvbih2YWx1ZXM6IE1hcDxzdHJpbmcsIFN0YXRlTWFuYWdlclBhcmFtVmFsdWU+KTogU3RhdGVNYW5hZ2VyUGFyYW1WYWx1ZVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odmFsdWVzLmVudHJpZXMoKSlcbiAgICAgICAgICAgIC5zb3J0KChwMSwgcDIpID0+IHAxWzFdLnBvc2l0aW9uIC0gcDJbMV0ucG9zaXRpb24pXG4gICAgICAgICAgICAubWFwKChlKSA9PiBlWzFdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9ub3RpZnlGb3JMb2NhdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYW1zTWFwID0gdGhpcy5nZXRQYXJhbXNBc01hcCgpO1xuICAgICAgICBjb25zdCBwYXJhbXNTZXJpYWxpemVkID0gdGhpcy5idWlsZFVybFdpdGhQYXJhbXMoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXNNYXAgPSB0aGlzLmdldFF1ZXJ5UGFyYW1zQXNNYXAoKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXNTZXJpYWxpemVkID0gdGhpcy5nZXRRdWVyeVBhcmFtc1RvU3RyaW5nKCk7XG5cbiAgICAgICAgU3lzdGVtRXZlbnREaXNwYXRjaGVyLnBvc3QoU0VfTE9DQVRJT05fQ0hBTkdFLCB7XG4gICAgICAgICAgICB1cmw6IHRoaXMuVVJMLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNNYXAgPyBwYXJhbXNNYXAgOiB7fSxcbiAgICAgICAgICAgIHBhcmFtc1NlcmlhbGl6ZWQ6IHBhcmFtc1NlcmlhbGl6ZWQgPyBwYXJhbXNTZXJpYWxpemVkIDogJycsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXNNYXAgPyBxdWVyeVBhcmFtc01hcCA6IHt9LFxuICAgICAgICAgICAgcXVlcnlQYXJhbXNTZXJpYWxpemVkOiBxdWVyeVBhcmFtc1NlcmlhbGl6ZWQgPyBxdWVyeVBhcmFtc1NlcmlhbGl6ZWQucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==