@libs-ui/utils 0.2.29 → 0.2.30-6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base64.d.ts +5 -0
- package/cache.d.ts +16 -15
- package/color.d.ts +1 -1
- package/communicate-micro.d.ts +4 -5
- package/constants.d.ts +3 -0
- package/crypto-3rd.d.ts +4 -0
- package/crypto.d.ts +4 -0
- package/date.d.ts +49 -0
- package/dom.d.ts +36 -1
- package/download.d.ts +3 -0
- package/esm2022/base64.mjs +43 -0
- package/esm2022/cache.mjs +121 -132
- package/esm2022/color.mjs +2 -2
- package/esm2022/communicate-micro.mjs +26 -24
- package/esm2022/constants.mjs +4 -1
- package/esm2022/crypto-3rd.mjs +5 -1
- package/esm2022/crypto.mjs +5 -1
- package/esm2022/date.mjs +189 -0
- package/esm2022/dom.mjs +200 -22
- package/esm2022/download.mjs +37 -0
- package/esm2022/file.mjs +79 -0
- package/esm2022/format-text.mjs +150 -0
- package/esm2022/get-smart-axis-scale.mjs +174 -0
- package/esm2022/helpers.mjs +402 -91
- package/esm2022/http-params.mjs +15 -3
- package/esm2022/index.mjs +12 -5
- package/esm2022/inject-token.mjs +5 -0
- package/esm2022/key-cache.mjs +20 -8
- package/esm2022/language.mjs +67 -4
- package/esm2022/pattern.mjs +21 -21
- package/esm2022/random.mjs +42 -0
- package/esm2022/two-way-signal-object.mjs +113 -0
- package/esm2022/uri.mjs +22 -0
- package/esm2022/uuid.mjs +3 -2
- package/esm2022/xss-filter.mjs +10 -0
- package/fesm2022/libs-ui-utils.mjs +2238 -880
- package/fesm2022/libs-ui-utils.mjs.map +1 -1
- package/file.d.ts +18 -0
- package/format-text.d.ts +11 -0
- package/get-smart-axis-scale.d.ts +34 -0
- package/helpers.d.ts +218 -10
- package/http-params.d.ts +2 -2
- package/index.d.ts +11 -4
- package/inject-token.d.ts +4 -0
- package/language.d.ts +32 -0
- package/package.json +7 -4
- package/pattern.d.ts +20 -20
- package/random.d.ts +3 -0
- package/two-way-signal-object.d.ts +14 -0
- package/uri.d.ts +5 -0
- package/xss-filter.d.ts +3 -0
- package/delete-unicode.d.ts +0 -1
- package/escape-html.d.ts +0 -1
- package/esm2022/delete-unicode.mjs +0 -20
- package/esm2022/escape-html.mjs +0 -12
- package/esm2022/get-color-by-id.mjs +0 -17
- package/esm2022/remove-emoji.mjs +0 -10
- package/get-color-by-id.d.ts +0 -1
- package/remove-emoji.d.ts +0 -2
package/base64.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const base64Encode: (value: string) => string;
|
|
2
|
+
export declare const base64Decode: (value: string) => string;
|
|
3
|
+
export declare const convertBase64ToBlob: (dataBase64: string) => Blob;
|
|
4
|
+
export declare const convertFileToBase64_ObjectUrl: (file: File) => Promise<string | ArrayBuffer>;
|
|
5
|
+
export declare const convertFileToBase64: (file: File) => Promise<string | ArrayBuffer>;
|
package/cache.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import { TYPE_LANGUAGE_SUPPORT } from '@libs-ui/interfaces-types';
|
|
1
2
|
export declare class UtilsCache {
|
|
3
|
+
static readonly CACHE_EXPIRE_TIME_DEFAULT: number;
|
|
2
4
|
static readonly CACHE_EXPIRE_NONE = -1;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
+
static readonly idService: string;
|
|
6
|
+
static typeKeyClearLocalStorage: string;
|
|
5
7
|
private static languageKeyCache;
|
|
8
|
+
private static listKeyKeepWhenClearALll;
|
|
6
9
|
private static initdEvent?;
|
|
7
|
-
private static readonly CACHE_EXPIRE_TIME_DEFAULT;
|
|
8
|
-
private static language;
|
|
9
|
-
private static idService;
|
|
10
10
|
private static storage;
|
|
11
11
|
private static dbName;
|
|
12
12
|
private static itemIndexByKey;
|
|
@@ -16,26 +16,27 @@ export declare class UtilsCache {
|
|
|
16
16
|
indexedDBName?: string;
|
|
17
17
|
languageKeyCache?: string;
|
|
18
18
|
typeKeyClearLocalStorage?: string;
|
|
19
|
-
|
|
19
|
+
listKeyKeepWhenClearAll?: Array<string>;
|
|
20
20
|
}): void;
|
|
21
|
-
static setLang(lang:
|
|
22
|
-
static getLang():
|
|
21
|
+
static setLang(lang: TYPE_LANGUAGE_SUPPORT): void;
|
|
22
|
+
static getLang(): TYPE_LANGUAGE_SUPPORT;
|
|
23
23
|
private static openDB;
|
|
24
24
|
private static getObjectStore;
|
|
25
25
|
private static get LocalStorage();
|
|
26
26
|
private static getLocalStorageFakeOnSafari;
|
|
27
27
|
private static getLocalStorageFake;
|
|
28
|
-
static GetAsync(key: string, default_value?: any, isKeyMD5?: boolean): Promise<
|
|
29
|
-
static Get(key: string, default_value?: any):
|
|
30
|
-
|
|
31
|
-
static SetAsync(key: string, value: any, expireTimeBySecond?: number, isKeyMD5?: boolean): Promise<
|
|
32
|
-
static Set(key: string, value: any, expireTimeBySecond?: number):
|
|
33
|
-
static ClearAsync(key: string, isMD5?: boolean): Promise<
|
|
28
|
+
static GetAsync<T = any>(key: string, default_value?: any, isKeyMD5?: boolean): Promise<T>;
|
|
29
|
+
static Get<T = any>(key: string, default_value?: any): T;
|
|
30
|
+
static GetDefaultValueBySpecificKey(key: string, default_value: any): any;
|
|
31
|
+
static SetAsync<T = any>(key: string, value: any, expireTimeBySecond?: number, isKeyMD5?: boolean): Promise<T>;
|
|
32
|
+
static Set(key: string, value: any, expireTimeBySecond?: number): boolean;
|
|
33
|
+
static ClearAsync(key: string, isMD5?: boolean): Promise<void>;
|
|
34
34
|
static Clear(key: string): void;
|
|
35
|
-
static ClearAllAsync(): Promise<
|
|
35
|
+
static ClearAllAsync(): Promise<void>;
|
|
36
36
|
static ClearAll(): void;
|
|
37
37
|
private static GetDataByKeys;
|
|
38
38
|
private static SetDataByKey;
|
|
39
39
|
static DeleteKeyStartWithAsync(keyCacheStartWith: string, isKeyMD5?: boolean): Promise<unknown>;
|
|
40
40
|
static DeleteKeyStartWith(keyCache: string, isMD5?: boolean): void;
|
|
41
|
+
static DeleteDatabaseIndexDB(dbName?: string): Promise<unknown>;
|
|
41
42
|
}
|
package/color.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export declare const colorStepContrastFromOrigin: (color: string, stepNumber: nu
|
|
|
8
8
|
export declare const colorContrastFromOrigin: (color: string) => Array<IColorContrastFromOrigin>;
|
|
9
9
|
export declare const rgbToHex: (rgb: any) => string;
|
|
10
10
|
export declare const listColorDefine: Array<string>;
|
|
11
|
-
export declare const
|
|
11
|
+
export declare const getColorById: (str: string) => string;
|
package/communicate-micro.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { Subject } from "rxjs";
|
|
2
|
+
export declare class UtilsCommunicateMicroKeyGlobal {
|
|
3
|
+
static KEY_MESSAGE_MODAL: string;
|
|
4
|
+
}
|
|
2
5
|
export declare class UtilsCommunicateMicro {
|
|
3
|
-
private static readonly KEY_GET_ALL_MESSAGE;
|
|
4
|
-
static readonly PREFIX_TYPE = "3RD_INTEGRATE_MICRO_SITE_";
|
|
5
6
|
private static initdEvent?;
|
|
6
7
|
private static subs;
|
|
7
8
|
private static allMessageSub;
|
|
8
|
-
static initEvent(currentWindow: Window): void;
|
|
9
|
+
static initEvent(currentWindow: Window, onDestroy: Subject<void>): void;
|
|
9
10
|
static PostMessageToParent(data: any): void;
|
|
10
11
|
static PostMessageToChildren(data: any): void;
|
|
11
12
|
static PostMessageToOpener(data: any): void;
|
|
12
13
|
private static convertData;
|
|
13
14
|
static GetMessage(messageType: string | Array<string>): Subject<MessageEvent>;
|
|
14
15
|
private static initSubject;
|
|
15
|
-
postMessageToParent(data: unknown): void;
|
|
16
|
-
postMessageToChildren(data: unknown): void;
|
|
17
16
|
}
|
package/constants.d.ts
CHANGED
|
@@ -5,3 +5,6 @@ export declare const ERROR_MESSAGE_MAX_VALID = "i18n_message_error_input_max_val
|
|
|
5
5
|
export declare const ERROR_MESSAGE_MIN_LENGTH = "i18n_message_error_input_min_length";
|
|
6
6
|
export declare const ERROR_MESSAGE_MAX_LENGTH = "i18n_message_error_input_max_length";
|
|
7
7
|
export declare const CHARACTER_DATA_EMPTY = "__";
|
|
8
|
+
export declare const DEFAULT_START_PAGE_0 = "defaultStartPage0";
|
|
9
|
+
export declare const COMMUNICATE_MICRO_PREFIX_TYPE = "3RD_INTEGRATE_MICRO_SITE_";
|
|
10
|
+
export declare const COMMUNICATE_MICRO_KEY_GET_ALL_MESSAGE = "MICRO_SITES_ALL_MESSAGE";
|
package/crypto-3rd.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Thiết lập key mã hóa
|
|
3
|
+
* @param value key mã hóa, độ dài bằng 24 hoặc 32 ký tự.
|
|
4
|
+
*/
|
|
1
5
|
export declare const setKeyCrypto3rd: (value: string) => void;
|
|
2
6
|
export declare const encrypt3rd: (plainData: string) => string;
|
|
3
7
|
export declare const decrypt3rd: (encryptedData: string) => string;
|
package/crypto.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Thiết lập key mã hóa
|
|
3
|
+
* @param value key mã hóa, độ dài bằng 24 hoặc 32 ký tự.
|
|
4
|
+
*/
|
|
1
5
|
export declare const setKeyCrypto: (value: string) => void;
|
|
2
6
|
export declare const encrypt: (plainData: string) => string;
|
|
3
7
|
export declare const decrypt: (encryptedData: string) => string;
|
package/date.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import "dayjs/locale/en";
|
|
3
|
+
import "dayjs/locale/vi";
|
|
4
|
+
export declare const setDefaultTimeZone: (localeZone?: string) => void;
|
|
5
|
+
export type TYPE_FUNCTION_FORMAT_DATE = (time: dayjs.ConfigType, formatOutput: string, lang?: string) => string;
|
|
6
|
+
export declare const updateFunctionFormatDate: (functionCustom: TYPE_FUNCTION_FORMAT_DATE) => void;
|
|
7
|
+
/**
|
|
8
|
+
* @description Lấy đối tượng dayjs theo config
|
|
9
|
+
* @param config nếu không có config sẽ trả về đối tượng dayjs là thời gian hiện tại
|
|
10
|
+
* @param config.date thời gian cần lấy
|
|
11
|
+
* @param config.returnDayjsIfConfigDateNotExist true nếu muốn trả về đối tượng dayjs nếu config.date không có
|
|
12
|
+
* @param config.utc true nếu muốn lấy thời gian UTC
|
|
13
|
+
* @param config.formatOfDate định dạng thời gian đang được truyền vào
|
|
14
|
+
*/
|
|
15
|
+
export declare const getDayjs: <T = dayjs.Dayjs | undefined>(config?: {
|
|
16
|
+
date?: dayjs.ConfigType;
|
|
17
|
+
utc?: boolean;
|
|
18
|
+
formatOfDate?: string;
|
|
19
|
+
returnDayjsIfConfigDateNotExist?: boolean;
|
|
20
|
+
localeZone?: string;
|
|
21
|
+
}) => T;
|
|
22
|
+
/**
|
|
23
|
+
* @description Kiểm tra xem hai ngày có khác nhau không (khác ngày trong tuần)
|
|
24
|
+
* @param date1 ngày thứ nhất cần so sánh
|
|
25
|
+
* @param date2 ngày thứ hai cần so sánh
|
|
26
|
+
* @returns true nếu hai ngày khác nhau, false nếu giống nhau hoặc không thể so sánh
|
|
27
|
+
*/
|
|
28
|
+
export declare const isDifferenceDay: (date1: dayjs.ConfigType, date2: dayjs.ConfigType) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* @description Kiểm tra xem hai ngày có khác tháng không
|
|
31
|
+
* @param date1 ngày thứ nhất cần so sánh
|
|
32
|
+
* @param date2 ngày thứ hai cần so sánh
|
|
33
|
+
* @returns true nếu hai ngày khác tháng, false nếu cùng tháng hoặc không thể so sánh
|
|
34
|
+
*/
|
|
35
|
+
export declare const isDifferenceMonth: (date1: dayjs.ConfigType, date2: dayjs.ConfigType) => boolean;
|
|
36
|
+
/**
|
|
37
|
+
* @description Kiểm tra xem hai ngày có khác năm không
|
|
38
|
+
* @param date1 ngày thứ nhất cần so sánh
|
|
39
|
+
* @param date2 ngày thứ hai cần so sánh
|
|
40
|
+
* @returns true nếu hai ngày khác năm, false nếu cùng năm hoặc không thể so sánh
|
|
41
|
+
*/
|
|
42
|
+
export declare const isDifferenceYear: (date1: dayjs.ConfigType, date2: dayjs.ConfigType) => boolean;
|
|
43
|
+
/**
|
|
44
|
+
* @description Lấy ra chuỗi thời gian hiển thị theo định dạng và ngôn ngữ
|
|
45
|
+
* @param date thời gian cần định dạng
|
|
46
|
+
* @param format định dạng thời gian muốn lấy ra
|
|
47
|
+
* @param lang lấy theo ngôn ngữ
|
|
48
|
+
*/
|
|
49
|
+
export declare const formatDate: (date: dayjs.ConfigType, formatOutput?: string, lang?: string, formatInput?: string) => string;
|
package/dom.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { Renderer2 } from "@angular/core";
|
|
2
2
|
import { IBoundingClientRect } from "@libs-ui/interfaces-types";
|
|
3
|
+
import DeviceDetector from 'device-detector-js';
|
|
4
|
+
import Delta from "quill-delta";
|
|
5
|
+
import { Subject } from "rxjs";
|
|
6
|
+
export declare const getDeviceInfo: () => DeviceDetector.DeviceDetectorResult;
|
|
3
7
|
export declare const getPlatFromBrowser: () => string;
|
|
8
|
+
export declare const getEventNameHandleClick: string;
|
|
9
|
+
export declare const getDocumentByString: (htmlStr: string) => Document;
|
|
4
10
|
export declare const cloneIBoundingClientRect: (rect: IBoundingClientRect) => IBoundingClientRect;
|
|
5
|
-
export declare const
|
|
11
|
+
export declare const setStylesElement: (el: HTMLElement, styles: Record<string, string>, render2: Renderer2) => void;
|
|
6
12
|
export declare const getViewport: (win?: Window) => {
|
|
7
13
|
width: number;
|
|
8
14
|
height: number;
|
|
@@ -16,3 +22,32 @@ export declare const checkMouseOverInContainer: (mousePosition: {
|
|
|
16
22
|
clientX: number;
|
|
17
23
|
clientY: number;
|
|
18
24
|
}, element?: HTMLElement, rect?: DOMRect) => boolean;
|
|
25
|
+
export declare const getDragEventByElement: (config: {
|
|
26
|
+
elementMouseDown: HTMLElement;
|
|
27
|
+
functionMouseDown?: (event: MouseEvent) => void;
|
|
28
|
+
isStartWithMouseDownEvent?: boolean;
|
|
29
|
+
elementMouseMove?: HTMLElement;
|
|
30
|
+
functionMouseMove?: (event: MouseEvent) => void;
|
|
31
|
+
elementMouseUp?: HTMLElement;
|
|
32
|
+
functionMouseUp?: (event: MouseEvent) => void;
|
|
33
|
+
onDestroy: Subject<any>;
|
|
34
|
+
}) => import("rxjs").Observable<MouseEvent>;
|
|
35
|
+
export declare const getHTMLFromQuill: (data: Delta | string, options?: {
|
|
36
|
+
getRootHtml?: boolean;
|
|
37
|
+
replaceNewLineTo?: string;
|
|
38
|
+
replaceTagBRTo?: string;
|
|
39
|
+
replaceBrToDiv?: boolean;
|
|
40
|
+
functionReplaceDelta?: (op: Delta) => void;
|
|
41
|
+
replaceTags?: {
|
|
42
|
+
tag: string;
|
|
43
|
+
replaceTo: string;
|
|
44
|
+
}[];
|
|
45
|
+
}) => Promise<string>;
|
|
46
|
+
export declare const convertHtmlToDivBlocks: (html: string) => string;
|
|
47
|
+
export declare const getDeltaFromHTML: (html: string) => Promise<Delta>;
|
|
48
|
+
export declare const processPasteData: (e: ClipboardEvent, config: {
|
|
49
|
+
element: HTMLElement;
|
|
50
|
+
handlerPasteFile?: (files: FileList) => void;
|
|
51
|
+
callBack?: (positonReturn: "file" | "range" | "content" | "no-content") => void;
|
|
52
|
+
}) => Promise<void>;
|
|
53
|
+
export declare const insertContentWithRange: (content: string, savedRange: Range, element: HTMLElement) => void;
|
package/download.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const downloadFileByUrlUseXmlRequest: (fileUrl: string, filename: string) => void;
|
|
2
|
+
export declare const downloadFileByUrl: (fileUrl: string, filename: string, onlyOpen?: boolean) => Promise<void>;
|
|
3
|
+
export declare const downloadImageFromELement: (imageElement: HTMLImageElement, typeFileDownload?: string, nameFile?: string) => void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { encodeURI, decodeURI } from "./uri";
|
|
2
|
+
export const base64Encode = (value) => {
|
|
3
|
+
return btoa(encodeURI(value));
|
|
4
|
+
};
|
|
5
|
+
export const base64Decode = (value) => {
|
|
6
|
+
return decodeURI(atob(value));
|
|
7
|
+
};
|
|
8
|
+
export const convertBase64ToBlob = (dataBase64) => {
|
|
9
|
+
const BASE64_MARKER = ';base64,';
|
|
10
|
+
if (dataBase64.indexOf(BASE64_MARKER) === -1) {
|
|
11
|
+
const parts = dataBase64.split(',');
|
|
12
|
+
const contentType = parts[0].split(':')[1];
|
|
13
|
+
const raw = parts[1];
|
|
14
|
+
const blob = new Blob([raw], { type: contentType });
|
|
15
|
+
return blob;
|
|
16
|
+
}
|
|
17
|
+
const parts = dataBase64.split(BASE64_MARKER);
|
|
18
|
+
const contentType = parts[0].split(':')[1];
|
|
19
|
+
const raw = window.atob(parts[1]);
|
|
20
|
+
const rawLength = raw.length;
|
|
21
|
+
const uInt8Array = new Uint8Array(rawLength);
|
|
22
|
+
for (let i = 0; i < rawLength; ++i) {
|
|
23
|
+
uInt8Array[i] = raw.charCodeAt(i);
|
|
24
|
+
}
|
|
25
|
+
const blob = new Blob([uInt8Array], { type: contentType });
|
|
26
|
+
return blob;
|
|
27
|
+
};
|
|
28
|
+
export const convertFileToBase64_ObjectUrl = async (file) => {
|
|
29
|
+
if (!file.type.match(/image.*/)) {
|
|
30
|
+
return URL.createObjectURL(file);
|
|
31
|
+
}
|
|
32
|
+
return await convertFileToBase64(file);
|
|
33
|
+
};
|
|
34
|
+
export const convertFileToBase64 = (file) => {
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
const reader = new FileReader();
|
|
37
|
+
reader.readAsDataURL(file);
|
|
38
|
+
reader.onload = (event) => {
|
|
39
|
+
resolve(event.target?.result ?? '');
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvYmFzZTY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzVDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzVDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQ3hELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUVqQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUVwRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxFQUFFLElBQVUsRUFBaUMsRUFBRTtJQUMvRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUV6QyxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQVUsRUFBaUMsRUFBRTtJQUMvRSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUVoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbmNvZGVVUkksIGRlY29kZVVSSSB9IGZyb20gXCIuL3VyaVwiO1xuXG5leHBvcnQgY29uc3QgYmFzZTY0RW5jb2RlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGJ0b2EoZW5jb2RlVVJJKHZhbHVlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYmFzZTY0RGVjb2RlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGRlY29kZVVSSShhdG9iKHZhbHVlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChkYXRhQmFzZTY0OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgQkFTRTY0X01BUktFUiA9ICc7YmFzZTY0LCc7XG5cbiAgaWYgKGRhdGFCYXNlNjQuaW5kZXhPZihCQVNFNjRfTUFSS0VSKSA9PT0gLTEpIHtcbiAgICBjb25zdCBwYXJ0cyA9IGRhdGFCYXNlNjQuc3BsaXQoJywnKTtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnRzWzBdLnNwbGl0KCc6JylbMV07XG4gICAgY29uc3QgcmF3ID0gcGFydHNbMV07XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyYXddLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuXG4gICAgcmV0dXJuIGJsb2I7XG4gIH1cbiAgY29uc3QgcGFydHMgPSBkYXRhQmFzZTY0LnNwbGl0KEJBU0U2NF9NQVJLRVIpO1xuICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnRzWzBdLnNwbGl0KCc6JylbMV07XG4gIGNvbnN0IHJhdyA9IHdpbmRvdy5hdG9iKHBhcnRzWzFdKTtcbiAgY29uc3QgcmF3TGVuZ3RoID0gcmF3Lmxlbmd0aDtcbiAgY29uc3QgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHJhd0xlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdMZW5ndGg7ICsraSkge1xuICAgIHVJbnQ4QXJyYXlbaV0gPSByYXcuY2hhckNvZGVBdChpKTtcbiAgfVxuXG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdUludDhBcnJheV0sIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG5cbiAgcmV0dXJuIGJsb2I7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEZpbGVUb0Jhc2U2NF9PYmplY3RVcmwgPSBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nIHwgQXJyYXlCdWZmZXI+ID0+IHtcbiAgaWYgKCFmaWxlLnR5cGUubWF0Y2goL2ltYWdlLiovKSkge1xuICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGNvbnZlcnRGaWxlVG9CYXNlNjQoZmlsZSk7XG5cbn1cblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRGaWxlVG9CYXNlNjQgPSAoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nIHwgQXJyYXlCdWZmZXI+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0Py5yZXN1bHQgPz8gJycpO1xuICAgIH07XG4gIH0pO1xufTtcblxuIl19
|