@libs-ui/services-base-request-abstract 0.2.10-6.2 → 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.
@@ -4,9 +4,11 @@ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
4
4
  import { Observable } from 'rxjs';
5
5
  type TYPE_METHOD = 'POST' | 'PATCH' | 'PUT';
6
6
  export declare abstract class LibsUiBaseRequestAbstractService {
7
+ protected keyCacheUniqueByIdUserLogin: string;
7
8
  protected baseUrl: string;
8
9
  protected ignoreRedirect401?: boolean;
9
10
  protected http: HttpClient;
11
+ protected isStartZeroPage: boolean;
10
12
  protected abstract getOptions<TypeParams>(httpParams: UtilsHttpParamsRequest<TypeParams>, contentType?: string): {
11
13
  headers: HttpHeaders;
12
14
  params: HttpParams;
@@ -40,8 +42,23 @@ export declare abstract class LibsUiBaseRequestAbstractService {
40
42
  };
41
43
  protected handlerResponse<TypeResponse>(res: any, isPageStartZero: boolean): IHttpResponse<TypeResponse>;
42
44
  protected handlerCatchError<TypeResponse>(err: HttpErrorResponse): Observable<IHttpResponse<TypeResponse>>;
43
- cacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache?: number): Observable<IHttpResponse<T>>;
44
- deleteCacheKeyStartWidth(key: string): Promise<void>;
45
+ /**
46
+ * Lưu trữ dữ liệu phản hồi vào cache.
47
+ * @param observable - Observable của phản hồi HTTP.
48
+ * @param key - Khóa cache.Lưu ý không md5 key trước khi truyền vào
49
+ * @param params - Các tham số để tạo khóa cache.
50
+ * @param timeCache - Thời gian lưu trữ cache (mặc định là CACHE_EXPIRE_TIME_DEFAULT).
51
+ * @param reloadCache - Nếu true, luôn gọi để lấy giá trị mới. giá trị này có để sử dụng với các nghiệp vụ gọi luôn luôn lấy dữ liệu mới nhất
52
+ * @returns Observable của phản hồi HTTP đã được cache.
53
+ */
54
+ cacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache?: number, reloadCache?: boolean): Observable<IHttpResponse<T>>;
55
+ /**
56
+ * Xóa các khóa cache bắt đầu với một chuỗi nhất định.
57
+ * Lưu ý: không md5 key trước khi truyền vào.
58
+ * Sử dụng hàm này trong các trường hợp như gọi API update hoặc xóa dữ liệu,khi đó cần xóa cache đi để khi gọi danh sách sẽ lấy được giá trị mới nhất.
59
+ * @param key - Chuỗi khóa cache cần xóa.
60
+ */
61
+ deleteCacheKeyStartWidth(key: string): Promise<unknown>;
45
62
  private promiseCacheResponseData;
46
63
  }
47
64
  export {};
@@ -2,12 +2,14 @@
2
2
  import { HttpClient, HttpStatusCode } from '@angular/common/http';
3
3
  import { inject } from '@angular/core';
4
4
  import { DEFAULT_START_PAGE_0, UtilsCache, UtilsHttpParamsRequest, UtilsHttpParamsRequestInstance, endCodeUrl, get, getKeyCacheByArrayObject, isNil, md5, omitBy } from '@libs-ui/utils';
5
- import { Observable } from 'rxjs';
5
+ import { from, lastValueFrom, Observable } from 'rxjs';
6
6
  import { catchError, map } from 'rxjs/operators';
7
7
  export class LibsUiBaseRequestAbstractService {
8
+ keyCacheUniqueByIdUserLogin = '';
8
9
  baseUrl;
9
10
  ignoreRedirect401;
10
11
  http = inject(HttpClient);
12
+ isStartZeroPage = false;
11
13
  get(path, params) {
12
14
  params = UtilsHttpParamsRequestInstance(undefined, params);
13
15
  const resultCheckPageZero = this.checkStartPageIsZero(params);
@@ -61,7 +63,7 @@ export class LibsUiBaseRequestAbstractService {
61
63
  const url = result.url;
62
64
  const options = this.getOptions(result.params);
63
65
  return new Observable((observer) => {
64
- const formData = new FormData();
66
+ const formData = argumentsValue.bodyData instanceof FormData ? argumentsValue.bodyData : new FormData();
65
67
  const xhr = new XMLHttpRequest();
66
68
  const paramsStr = options.params.toString();
67
69
  const headers = options.headers;
@@ -70,12 +72,14 @@ export class LibsUiBaseRequestAbstractService {
70
72
  processUpload({
71
73
  loaded: e.loaded,
72
74
  total: e.total,
73
- percent: (e.loaded / e.total) * 100
75
+ percent: (e.loaded / e.total) * 100,
74
76
  });
75
77
  };
76
78
  }
77
- for (const property in bodyData) {
78
- this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);
79
+ if (!(argumentsValue.bodyData instanceof FormData)) {
80
+ for (const property in bodyData) {
81
+ this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);
82
+ }
79
83
  }
80
84
  xhr.open(method, `${url}${paramsStr ? `?${paramsStr}` : ''}`, true);
81
85
  headers.keys().forEach((key) => key.toLocaleLowerCase() !== 'content-type' && xhr.setRequestHeader(key, headers.get(key) || ''));
@@ -95,7 +99,7 @@ export class LibsUiBaseRequestAbstractService {
95
99
  }
96
100
  appendRecursive(fData, data, prop, keepFileOfBody, keepArrayValue) {
97
101
  if (keepFileOfBody) {
98
- if (data instanceof File || Object.prototype.toString.call(data) === '[object File]') {
102
+ if (data instanceof File || data instanceof Blob || Object.prototype.toString.call(data) === '[object File]') {
99
103
  this.appendFileToFormData(fData, prop, data);
100
104
  return;
101
105
  }
@@ -125,7 +129,7 @@ export class LibsUiBaseRequestAbstractService {
125
129
  let message = _xhr.statusText;
126
130
  let data = null;
127
131
  if (code !== 204) {
128
- data = (typeof _xhr.response === 'undefined') ? _xhr.responseText : _xhr.response;
132
+ data = typeof _xhr.response === 'undefined' ? _xhr.responseText : _xhr.response;
129
133
  if (typeof data === 'string') {
130
134
  data = data.replace(XSSI_PREFIX, '');
131
135
  }
@@ -154,7 +158,7 @@ export class LibsUiBaseRequestAbstractService {
154
158
  if (!params) {
155
159
  return { params: new UtilsHttpParamsRequest(), isStartZero: false };
156
160
  }
157
- if (params.has(DEFAULT_START_PAGE_0)) {
161
+ if (params.has(DEFAULT_START_PAGE_0) || this.isStartZeroPage) {
158
162
  params.delete(DEFAULT_START_PAGE_0);
159
163
  const page = params.get('page') ? Number(params.get('page')) : -1;
160
164
  if (isNil(page) || page === -1) {
@@ -168,21 +172,25 @@ export class LibsUiBaseRequestAbstractService {
168
172
  handlerResponse(res, isPageStartZero) {
169
173
  const resConvert = {
170
174
  message: get(res, 'message'),
171
- code: 200
175
+ code: 200,
172
176
  };
173
177
  const code = get(res, 'code', 200);
174
178
  if (`${code}` !== '200' && `${code}` !== '001') {
175
179
  resConvert.feCloneCode = code;
176
180
  }
181
+ if (typeof res !== 'object' || res === null) {
182
+ resConvert['data'] = res;
183
+ return resConvert;
184
+ }
177
185
  const paging = {
178
- page: get(res, 'paging.page'),
179
- per_page: get(res, 'paging.per_page'),
180
- total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item'),
181
- total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count'),
186
+ page: get(res, 'paging.page') || get(res, 'page') || 0,
187
+ per_page: get(res, 'paging.per_page') || get(res, 'size') || 0,
188
+ total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item') || get(res, 'totalElements') || 0,
189
+ total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count') || get(res, 'paging.page_count') || get(res, 'totalPages') || 0,
182
190
  before: get(res, 'paging.cursors.before') || get(res, 'paging.before') || get(res, 'cursors.before') || get(res, 'paging.before_token') || get(res, 'paging.cursors.before_token'),
183
191
  after: get(res, 'paging.cursors.after') || get(res, 'paging.after') || get(res, 'cursors.after') || get(res, 'paging.after_token') || get(res, 'paging.cursors.after_token'),
184
192
  previous: get(res, 'paging.previous') || get(res, 'paging.cursors.previous') || get(res, 'cursors.previous'),
185
- next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next')
193
+ next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next'),
186
194
  };
187
195
  const keysPaging = Object.keys(paging);
188
196
  keysPaging.forEach((key) => {
@@ -195,7 +203,7 @@ export class LibsUiBaseRequestAbstractService {
195
203
  if (isPageStartZero && !isNil(paging.page)) {
196
204
  paging.page += 1;
197
205
  }
198
- if (paging.total_items && paging.page && paging.per_page && (paging.page * paging.per_page >= paging.total_items)) {
206
+ if (paging.total_items && paging.page && paging.per_page && paging.page * paging.per_page >= paging.total_items) {
199
207
  paging.total_pages = paging.page;
200
208
  }
201
209
  if (resConvert.data instanceof Array && !resConvert.data.length) {
@@ -203,14 +211,14 @@ export class LibsUiBaseRequestAbstractService {
203
211
  }
204
212
  resConvert.paging = paging;
205
213
  }
206
- const fieldDelete = ['code', 'message', 'paging'];
207
- fieldDelete.forEach(field => {
214
+ const fieldDelete = ['code', 'message', 'paging', 'totalElements', 'size', 'totalPages', 'page'];
215
+ fieldDelete.forEach((field) => {
208
216
  if (!isNil(res[field])) {
209
217
  delete res[field];
210
218
  }
211
219
  });
212
220
  const fieldNotMergeToData = ['lang'];
213
- fieldNotMergeToData.forEach(field => {
221
+ fieldNotMergeToData.forEach((field) => {
214
222
  if (!isNil(res[field])) {
215
223
  resConvert[field] = res[field];
216
224
  delete res[field];
@@ -218,7 +226,7 @@ export class LibsUiBaseRequestAbstractService {
218
226
  });
219
227
  const keys = Object.keys(res);
220
228
  if (keys.length === 1) {
221
- resConvert.data = res[keys[0]];
229
+ resConvert.data = keys[0] === '0' ? res : res[keys[0]];
222
230
  }
223
231
  if (keys.length > 1) {
224
232
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
@@ -230,46 +238,48 @@ export class LibsUiBaseRequestAbstractService {
230
238
  if (err.status === HttpStatusCode.Unauthorized && !this.ignoreRedirect401) {
231
239
  this.redirectToLogin();
232
240
  }
233
- const code = get(err, 'error.code', err.status);
234
- const message = code >= 100 && code < 500 ? (err?.error?.message || err?.message || 'i18n_alert_connect_server_error') : 'i18n_alert_connect_server_error';
235
- const data = get(err, 'error.data', err.error.data);
236
- throw { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get(err, 'error.errors', get(err, 'errors')), data: data };
241
+ const code = get(err, 'error.code', get(err, 'status', 0));
242
+ const message = code >= 100 && code < 500 ? err?.error?.message || err?.message || 'i18n_alert_connect_server_error' : 'i18n_alert_connect_server_error';
243
+ const data = get(err, 'error.data', '');
244
+ throw { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get(err, 'error.errors', get(err, 'errors')), data: data, rootError: err };
237
245
  }
238
- cacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT) {
239
- return new Observable((observe) => {
240
- this.promiseCacheResponseData(observable, key, params, timeCache).then((res) => {
241
- observe?.next(res);
242
- observe?.complete();
243
- }).catch(err => {
244
- observe?.error(err);
245
- observe?.complete();
246
- });
247
- });
246
+ /**
247
+ * Lưu trữ dữ liệu phản hồi vào cache.
248
+ * @param observable - Observable của phản hồi HTTP.
249
+ * @param key - Khóa cache.Lưu ý không md5 key trước khi truyền vào
250
+ * @param params - Các tham số để tạo khóa cache.
251
+ * @param timeCache - Thời gian lưu trữ cache (mặc định là CACHE_EXPIRE_TIME_DEFAULT).
252
+ * @param reloadCache - Nếu true, luôn gọi để lấy giá trị mới. giá trị này có để sử dụng với các nghiệp vụ gọi luôn luôn lấy dữ liệu mới nhất
253
+ * @returns Observable của phản hồi HTTP đã được cache.
254
+ */
255
+ cacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false) {
256
+ return from(this.promiseCacheResponseData(observable, key, params, timeCache, reloadCache));
248
257
  }
258
+ /**
259
+ * Xóa các khóa cache bắt đầu với một chuỗi nhất định.
260
+ * Lưu ý: không md5 key trước khi truyền vào.
261
+ * Sử dụng hàm này trong các trường hợp như gọi API update hoặc xóa dữ liệu,khi đó cần xóa cache đi để khi gọi danh sách sẽ lấy được giá trị mới nhất.
262
+ * @param key - Chuỗi khóa cache cần xóa.
263
+ */
249
264
  async deleteCacheKeyStartWidth(key) {
250
- await UtilsCache.DeleteKeyStartWithAsync(md5(key));
265
+ return await UtilsCache.DeleteKeyStartWithAsync(md5(key), true);
251
266
  }
252
- promiseCacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT) {
253
- // eslint-disable-next-line no-async-promise-executor
254
- return new Promise(async (resolve, reject) => {
255
- const keyCache = getKeyCacheByArrayObject(key, Array.isArray(params) ? params : [params]);
256
- const data = await UtilsCache.GetAsync(keyCache, undefined, true);
257
- if (data) {
258
- return resolve(data);
259
- }
260
- observable.subscribe({
261
- next: async (result) => {
262
- if (!result || result.feCloneCode || !result.data) {
263
- return reject(result);
264
- }
265
- await UtilsCache.SetAsync(keyCache, result, timeCache, true);
266
- return resolve(result);
267
- },
268
- error: err => {
269
- return reject(err);
270
- }
271
- });
272
- });
267
+ async promiseCacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false) {
268
+ params = Array.isArray(params) ? params : [params];
269
+ params.push(this.keyCacheUniqueByIdUserLogin);
270
+ const keyCache = getKeyCacheByArrayObject(key, params);
271
+ if (reloadCache) {
272
+ await this.deleteCacheKeyStartWidth(key);
273
+ }
274
+ const data = await UtilsCache.GetAsync(keyCache, undefined, true);
275
+ if (data) {
276
+ return data;
277
+ }
278
+ const result = await lastValueFrom(observable);
279
+ if (result && result.data) {
280
+ UtilsCache.SetAsync(keyCache, result, timeCache, true);
281
+ }
282
+ return result;
273
283
  }
274
284
  }
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yZXF1ZXN0LWFic3RyYWN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2Jhc2UtcmVxdWVzdC1hYnN0cmFjdC9zcmMvYmFzZS1yZXF1ZXN0LWFic3RyYWN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQThDLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSw4QkFBOEIsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekwsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE1BQU0sT0FBZ0IsZ0NBQWdDO0lBQzFDLE9BQU8sQ0FBVTtJQUNqQixpQkFBaUIsQ0FBVztJQUM1QixJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBT3BDLEdBQUcsQ0FBaUMsSUFBWSxFQUFFLE1BQTJDO1FBQzNGLE1BQU0sR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQWEsTUFBTSxDQUFDLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxF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LEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFGLE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWxFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUNELFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDbEQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hCLENBQUM7b0JBQ0QsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUU3RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7b0JBQ1gsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFN0YXR1c0NvZGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElIdHRwUHJvY2Vzc1VwbG9hZCwgSUh0dHBSZXNwb25zZSwgSVBhZ2luZyB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9TVEFSVF9QQUdFXzAsIFV0aWxzQ2FjaGUsIFV0aWxzSHR0cFBhcmFtc1JlcXVlc3QsIFV0aWxzSHR0cFBhcmFtc1JlcXVlc3RJbnN0YW5jZSwgZW5kQ29kZVVybCwgZ2V0LCBnZXRLZXlDYWNoZUJ5QXJyYXlPYmplY3QsIGlzTmlsLCBtZDUsIG9taXRCeSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSAncnhqcy9pbnRlcm5hbC90eXBlcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG50eXBlIFRZUEVfTUVUSE9EID0gJ1BPU1QnIHwgJ1BBVENIJyB8ICdQVVQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGlic1VpQmFzZVJlcXVlc3RBYnN0cmFjdFNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgYmFzZVVybCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIGlnbm9yZVJlZGlyZWN0NDAxPzogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9wdGlvbnM8VHlwZVBhcmFtcz4oaHR0cFBhcmFtczogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPiwgY29udGVudFR5cGU/OiBzdHJpbmcpOiB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBwYXJhbXM6IEh0dHBQYXJhbXMgfTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlZGlyZWN0VG9Mb2dpbigpOiB2b2lkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPih1cmw6IHN0cmluZywgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KTogeyB1cmw6IHN0cmluZywgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+IH07XG5cblxuICBnZXQ8VHlwZVJlc3BvbnNlLCBUeXBlUGFyYW1zID0gYW55PihwYXRoOiBzdHJpbmcsIHBhcmFtcz86IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4pIHtcbiAgICBwYXJhbXMgPSBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0SW5zdGFuY2UodW5kZWZpbmVkLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdENoZWNrUGFnZVplcm8gPSB0aGlzLmNoZWNrU3RhcnRQYWdlSXNaZXJvPFR5cGVQYXJhbXM+KHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXBsYWNlVVJMQnlQYXR0ZXJuPFR5cGVQYXJhbXM+KGAke3RoaXMuYmFzZVVybH0ke3BhdGggPyBwYXRoIDogJyd9YCwgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPj4ocmVzdWx0LnVybCwgdGhpcy5nZXRPcHRpb25zKHBhcmFtcykpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB0aGlzLmhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlcywgcmVzdWx0Q2hlY2tQYWdlWmVyby5pc1N0YXJ0WmVybykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHRoaXMuaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnIpKVxuICAgICk7XG4gIH1cblxuICBwb3N0PFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueSwgVHlwZUJvZHkgPSBhbnk+KHBhdGg6IHN0cmluZywgYm9keTogVHlwZUJvZHksIHBhcmFtcz86IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4pIHtcbiAgICBwYXJhbXMgPSBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0SW5zdGFuY2UodW5kZWZpbmVkLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdENoZWNrUGFnZVplcm8gPSB0aGlzLmNoZWNrU3RhcnRQYWdlSXNaZXJvPFR5cGVQYXJhbXM+KHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXBsYWNlVVJMQnlQYXR0ZXJuPFR5cGVQYXJhbXM+KGAke3RoaXMuYmFzZVVybH0ke3BhdGggPyBwYXRoIDogJyd9YCwgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+KHJlc3VsdC51cmwsIGJvZHksIHRoaXMuZ2V0T3B0aW9ucyhwYXJhbXMpKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gdGhpcy5oYW5kbGVyUmVzcG9uc2U8VHlwZVJlc3BvbnNlPihyZXMsIHJlc3VsdENoZWNrUGFnZVplcm8uaXNTdGFydFplcm8pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB0aGlzLmhhbmRsZXJDYXRjaEVycm9yPFR5cGVSZXNwb25zZT4oZXJyKSlcbiAgICApO1xuICB9XG5cbiAgcG9zdFVybEVuZENvZGU8VHlwZVJlc3BvbnNlLCBUeXBlUGFyYW1zID0gYW55LCBUeXBlQm9keSA9IGFueT4ocGF0aDogc3RyaW5nLCBib2R5OiBUeXBlQm9keSwgcGFyYW1zPzogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPikge1xuICAgIHBhcmFtcyA9IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3RJbnN0YW5jZSh1bmRlZmluZWQsIHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0Q2hlY2tQYWdlWmVybyA9IHRoaXMuY2hlY2tTdGFydFBhZ2VJc1plcm88VHlwZVBhcmFtcz4ocGFyYW1zKTtcbiAgICBjb25zdCBib2R5VmFsdWUgPSBlbmRDb2RlVXJsKGJvZHksIHRydWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SUh0dHBSZXNwb25zZTxUeXBlUmVzcG9uc2U+PihyZXN1bHQudXJsLCBib2R5VmFsdWUsIHRoaXMuZ2V0T3B0aW9ucyhwYXJhbXMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHRoaXMuaGFuZGxlclJlc3BvbnNlPFR5cGVSZXNwb25zZT4ocmVzLCByZXN1bHRDaGVja1BhZ2VaZXJvLmlzU3RhcnRaZXJvKSksXG4gICAgICBjYXRjaEVycm9yKChlcnI6IGFueSkgPT4gdGhpcy5oYW5kbGVyQ2F0Y2hFcnJvcjxUeXBlUmVzcG9uc2U+KGVycikpXG4gICAgKTtcbiAgfVxuXG4gIHB1dDxUeXBlUmVzcG9uc2UsIFR5cGVQYXJhbXMgPSBhbnksIFR5cGVCb2R5ID0gYW55PihwYXRoOiBzdHJpbmcsIGJvZHk6IFR5cGVCb2R5LCBwYXJhbXM/OiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KSB7XG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+KHJlc3VsdC51cmwsIGJvZHksIHRoaXMuZ2V0T3B0aW9ucyhwYXJhbXMpKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gdGhpcy5oYW5kbGVyUmVzcG9uc2U8VHlwZVJlc3BvbnNlPihyZXMsIHJlc3VsdENoZWNrUGFnZVplcm8uaXNTdGFydFplcm8pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB0aGlzLmhhbmRsZXJDYXRjaEVycm9yPFR5cGVSZXNwb25zZT4oZXJyKSlcbiAgICApO1xuICB9XG5cbiAgcGF0Y2g8VHlwZVJlc3BvbnNlLCBUeXBlUGFyYW1zID0gYW55PihwYXRoOiBzdHJpbmcsIGJvZHk6IHVua25vd24sIHBhcmFtcz86IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4pIHtcbiAgICBwYXJhbXMgPSBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0SW5zdGFuY2UodW5kZWZpbmVkLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdENoZWNrUGFnZVplcm8gPSB0aGlzLmNoZWNrU3RhcnRQYWdlSXNaZXJvPFR5cGVQYXJhbXM+KHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXBsYWNlVVJMQnlQYXR0ZXJuPFR5cGVQYXJhbXM+KGAke3RoaXMuYmFzZVVybH0ke3BhdGggPyBwYXRoIDogJyd9YCwgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8SUh0dHBSZXNwb25zZTxUeXBlUmVzcG9uc2U+PihyZXN1bHQudXJsLCBib2R5LCB0aGlzLmdldE9wdGlvbnMocGFyYW1zKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHRoaXMuaGFuZGxlclJlc3BvbnNlPFR5cGVSZXNwb25zZT4ocmVzLCByZXN1bHRDaGVja1BhZ2VaZXJvLmlzU3RhcnRaZXJvKSksXG4gICAgICBjYXRjaEVycm9yKChlcnI6IGFueSkgPT4gdGhpcy5oYW5kbGVyQ2F0Y2hFcnJvcjxUeXBlUmVzcG9uc2U+KGVycikpXG4gICAgKTtcbiAgfVxuXG4gIHBhdGNoVXJsRW5kQ29kZTxUeXBlUmVzcG9uc2UsIFR5cGVQYXJhbXMgPSBhbnk+KHBhdGg6IHN0cmluZywgYm9keTogdW5rbm93biwgcGFyYW1zPzogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPikge1xuICAgIHBhcmFtcyA9IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3RJbnN0YW5jZSh1bmRlZmluZWQsIHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0Q2hlY2tQYWdlWmVybyA9IHRoaXMuY2hlY2tTdGFydFBhZ2VJc1plcm88VHlwZVBhcmFtcz4ocGFyYW1zKTtcbiAgICBjb25zdCBib2R5VmFsdWUgPSBlbmRDb2RlVXJsKGJvZHksIHRydWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoPElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPj4ocmVzdWx0LnVybCwgYm9keVZhbHVlLCB0aGlzLmdldE9wdGlvbnMocGFyYW1zLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB0aGlzLmhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlcywgcmVzdWx0Q2hlY2tQYWdlWmVyby5pc1N0YXJ0WmVybykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHRoaXMuaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnIpKVxuICAgICk7XG4gIH1cblxuICBkZWxldGU8VHlwZVJlc3BvbnNlLCBUeXBlUGFyYW1zID0gYW55PihwYXRoOiBzdHJpbmcsIHBhcmFtcz86IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4pIHtcbiAgICBwYXJhbXMgPSBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0SW5zdGFuY2UodW5kZWZpbmVkLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdENoZWNrUGFnZVplcm8gPSB0aGlzLmNoZWNrU3RhcnRQYWdlSXNaZXJvPFR5cGVQYXJhbXM+KHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXBsYWNlVVJMQnlQYXR0ZXJuPFR5cGVQYXJhbXM+KGAke3RoaXMuYmFzZVVybH0ke3BhdGggPyBwYXRoIDogJyd9YCwgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPj4ocmVzdWx0LnVybCwgdGhpcy5nZXRPcHRpb25zKHBhcmFtcykpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB0aGlzLmhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlcywgcmVzdWx0Q2hlY2tQYWdlWmVyby5pc1N0YXJ0WmVybykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHRoaXMuaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnIpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2VuZFdpdGhGaWxlPFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueSwgVHlwZUJvZHkgPSBhbnk+KHBhdGg6IHN0cmluZywgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+LCBhcmd1bWVudHNWYWx1ZTogeyBtZXRob2Q6IFRZUEVfTUVUSE9EOyBib2R5RGF0YTogVHlwZUJvZHk7IGtlZXBGaWxlT2ZCb2R5PzogYm9vbGVhbjsga2VlcEFycmF5VmFsdWU/OiBib29sZWFuOyBwcm9jZXNzVXBsb2FkPzogKHByb2Nlc3M6IElIdHRwUHJvY2Vzc1VwbG9hZCkgPT4gdm9pZCB9KTogT2JzZXJ2YWJsZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+IHtcbiAgICBjb25zdCB7IG1ldGhvZCwga2VlcEZpbGVPZkJvZHksIGtlZXBBcnJheVZhbHVlLCBwcm9jZXNzVXBsb2FkIH0gPSBhcmd1bWVudHNWYWx1ZTtcbiAgICBjb25zdCBib2R5RGF0YSA9IG9taXRCeTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pihhcmd1bWVudHNWYWx1ZS5ib2R5RGF0YSBhcyBhbnksIChkYXRhSXRlbTogYW55KSA9PiBpc05pbChkYXRhSXRlbSkpO1xuXG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHJlc3VsdENoZWNrUGFnZVplcm8ucGFyYW1zKTtcbiAgICBjb25zdCB1cmwgPSByZXN1bHQudXJsO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMocmVzdWx0LnBhcmFtcyk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+KSA9PiB7XG4gICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGNvbnN0IHhocjogWE1MSHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIGNvbnN0IHBhcmFtc1N0ciA9IG9wdGlvbnMucGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuXG4gICAgICBpZiAocHJvY2Vzc1VwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSAoZSkgPT4ge1xuICAgICAgICAgIHByb2Nlc3NVcGxvYWQoe1xuICAgICAgICAgICAgbG9hZGVkOiBlLmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBlLnRvdGFsLFxuICAgICAgICAgICAgcGVyY2VudDogKGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBib2R5RGF0YSkge1xuICAgICAgICB0aGlzLmFwcGVuZFJlY3Vyc2l2ZShmb3JtRGF0YSwgYm9keURhdGFbcHJvcGVydHldLCBwcm9wZXJ0eSwga2VlcEZpbGVPZkJvZHksIGtlZXBBcnJheVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHhoci5vcGVuKG1ldGhvZCwgYCR7dXJsfSR7cGFyYW1zU3RyID8gYD8ke3BhcmFtc1N0cn1gIDogJyd9YCwgdHJ1ZSk7XG4gICAgICBoZWFkZXJzLmtleXMoKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkgIT09ICdjb250ZW50LXR5cGUnICYmIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVycy5nZXQoa2V5KSB8fCAnJykpO1xuICAgICAgeGhyLnNlbmQoZm9ybURhdGEpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHRoaXMuaGFuZGxlclJlc3BvbnNlPFR5cGVSZXNwb25zZT4odGhpcy5jb252ZXJ0UmVzcG9uc2VYSFI8VHlwZVJlc3BvbnNlPih4aHIpLCByZXN1bHRDaGVja1BhZ2VaZXJvLmlzU3RhcnRaZXJvKSk7XG5cbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlci5lcnJvcih0aGlzLmNvbnZlcnRSZXNwb25zZVhIUjxUeXBlUmVzcG9uc2U+KHhocikpO1xuXG4gICAgICAgIHJldHVybiBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwZW5kUmVjdXJzaXZlPFR5cGVCb2R5PihmRGF0YTogRm9ybURhdGEsIGRhdGE6IFR5cGVCb2R5LCBwcm9wOiBzdHJpbmcsIGtlZXBGaWxlT2ZCb2R5PzogYm9vbGVhbiwga2VlcEFycmF5VmFsdWU/OiBib29sZWFuKSB7XG4gICAgaWYgKGtlZXBGaWxlT2ZCb2R5KSB7XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEZpbGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBGaWxlXScpIHtcbiAgICAgICAgdGhpcy5hcHBlbmRGaWxlVG9Gb3JtRGF0YShmRGF0YSwgcHJvcCwgZGF0YSBhcyBGaWxlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5ICYmIGRhdGEubGVuZ3RoICYmIGRhdGFbMF0gaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBkYXRhKSB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRGaWxlVG9Gb3JtRGF0YShmRGF0YSwgcHJvcCwgZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZWVwQXJyYXlWYWx1ZSAmJiBkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGZEYXRhLmFwcGVuZChwcm9wLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCdvYmplY3QnID09PSB0eXBlb2YgZGF0YSkge1xuICAgICAgZkRhdGEuYXBwZW5kKHByb3AsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmRGF0YS5hcHBlbmQocHJvcCwgZGF0YSBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBlbmRGaWxlVG9Gb3JtRGF0YShmb3JtRGF0YTogRm9ybURhdGEsIHByb3A6IHN0cmluZywgZmlsZTogRmlsZSkge1xuICAgIGZvcm1EYXRhLmFwcGVuZChwcm9wLCBmaWxlLCBmaWxlLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVzcG9uc2VYSFI8VHlwZVJlc3BvbnNlPihfeGhyOiBYTUxIdHRwUmVxdWVzdCk6IElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgWFNTSV9QUkVGSVggPSAvXlxcKVxcXVxcfScsP1xcbi87XG4gICAgbGV0IGNvZGU6IG51bWJlciA9IF94aHIuc3RhdHVzID09PSAxMjIzID8gMjA0IDogX3hoci5zdGF0dXM7XG4gICAgbGV0IG1lc3NhZ2UgPSBfeGhyLnN0YXR1c1RleHQ7XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG5cbiAgICBpZiAoY29kZSAhPT0gMjA0KSB7XG4gICAgICBkYXRhID0gKHR5cGVvZiBfeGhyLnJlc3BvbnNlID09PSAndW5kZWZpbmVkJykgPyBfeGhyLnJlc3BvbnNlVGV4dCA6IF94aHIucmVzcG9uc2U7XG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoWFNTSV9QUkVGSVgsICcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgY29kZSA9IGRhdGEgPyAyMDAgOiAwO1xuICAgIH1cbiAgICBpZiAoZGF0YSkge1xuXG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIGNvZGUgPSBkYXRhLmNvZGUgPz8gMjAwO1xuICAgICAgbWVzc2FnZSA9IGRhdGEubWVzc2FnZSB8fCBtZXNzYWdlO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8/ICdPSyc7XG5cbiAgICByZXR1cm4geyAuLi5kYXRhLCBjb2RlLCBtZXNzYWdlIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzcG9uc2VVUkwoeGhyOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICgncmVzcG9uc2VVUkwnIGluIHhocikge1xuICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVVSTDtcbiAgICB9XG4gICAgaWYgKC9eWC1SZXF1ZXN0LVVSTDovbS50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpIHtcbiAgICAgIHJldHVybiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1gtUmVxdWVzdC1VUkwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTdGFydFBhZ2VJc1plcm88VHlwZVBhcmFtcz4ocGFyYW1zPzogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPik6IHsgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+LCBpc1N0YXJ0WmVybzogYm9vbGVhbiB9IHtcbiAgICBpZiAoIXBhcmFtcykge1xuICAgICAgcmV0dXJuIHsgcGFyYW1zOiBuZXcgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCgpLCBpc1N0YXJ0WmVybzogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5oYXMoREVGQVVMVF9TVEFSVF9QQUdFXzApKSB7XG4gICAgICBwYXJhbXMuZGVsZXRlKERFRkFVTFRfU1RBUlRfUEFHRV8wKTtcbiAgICAgIGNvbnN0IHBhZ2UgPSBwYXJhbXMuZ2V0KCdwYWdlJykgPyBOdW1iZXIocGFyYW1zLmdldCgncGFnZScpKSA6IC0xO1xuXG4gICAgICBpZiAoaXNOaWwocGFnZSkgfHwgcGFnZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGlzU3RhcnRaZXJvOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcGFyYW1zLnNldCgncGFnZScsIHBhZ2UgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGlzU3RhcnRaZXJvOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGlzU3RhcnRaZXJvOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlczogYW55LCBpc1BhZ2VTdGFydFplcm86IGJvb2xlYW4pOiBJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc0NvbnZlcnQ6IGFueSA9IHtcbiAgICAgIG1lc3NhZ2U6IGdldChyZXMsICdtZXNzYWdlJyksXG4gICAgICBjb2RlOiAyMDBcbiAgICB9O1xuICAgIGNvbnN0IGNvZGUgPSBnZXQocmVzLCAnY29kZScsIDIwMCk7XG5cbiAgICBpZiAoYCR7Y29kZX1gICE9PSAnMjAwJyAmJiBgJHtjb2RlfWAgIT09ICcwMDEnKSB7XG4gICAgICByZXNDb252ZXJ0LmZlQ2xvbmVDb2RlID0gY29kZTtcbiAgICB9XG4gICAgY29uc3QgcGFnaW5nOiBJUGFnaW5nID0ge1xuICAgICAgcGFnZTogZ2V0KHJlcywgJ3BhZ2luZy5wYWdlJyksXG4gICAgICBwZXJfcGFnZTogZ2V0KHJlcywgJ3BhZ2luZy5wZXJfcGFnZScpLFxuICAgICAgdG90YWxfaXRlbXM6IGdldChyZXMsICdwYWdpbmcudG90YWxfaXRlbXMnKSB8fCBnZXQocmVzLCAncGFnaW5nLnRvdGFsX2NvdW50JykgfHwgZ2V0KHJlcywgJ3BhZ2luZy50b3RhbF9pdGVtJyksXG4gICAgICB0b3RhbF9wYWdlczogZ2V0KHJlcywgJ3BhZ2luZy50b3RhbF9wYWdlcycpIHx8IGdldChyZXMsICdwYWdpbmcudG90YWxfcGFnZScpIHx8IGdldChyZXMsICdwYWdpbmcucGFnZV9jb3VudCcpLFxuICAgICAgYmVmb3JlOiBnZXQocmVzLCAncGFnaW5nLmN1cnNvcnMuYmVmb3JlJykgfHwgZ2V0KHJlcywgJ3BhZ2luZy5iZWZvcmUnKSB8fCBnZXQocmVzLCAnY3Vyc29ycy5iZWZvcmUnKSB8fCBnZXQocmVzLCAncGFnaW5nLmJlZm9yZV90b2tlbicpIHx8IGdldChyZXMsICdwYWdpbmcuY3Vyc29ycy5iZWZvcmVfdG9rZW4nKSxcbiAgICAgIGFmdGVyOiBnZXQocmVzLCAncGFnaW5nLmN1cnNvcnMuYWZ0ZXInKSB8fCBnZXQocmVzLCAncGFnaW5nLmFmdGVyJykgfHwgZ2V0KHJlcywgJ2N1cnNvcnMuYWZ0ZXInKSB8fCBnZXQocmVzLCAncGFnaW5nLmFmdGVyX3Rva2VuJykgfHwgZ2V0KHJlcywgJ3BhZ2luZy5jdXJzb3JzLmFmdGVyX3Rva2VuJyksXG4gICAgICBwcmV2aW91czogZ2V0KHJlcywgJ3BhZ2luZy5wcmV2aW91cycpIHx8IGdldChyZXMsICdwYWdpbmcuY3Vyc29ycy5wcmV2aW91cycpIHx8IGdldChyZXMsICdjdXJzb3JzLnByZXZpb3VzJyksXG4gICAgICBuZXh0OiBnZXQocmVzLCAncGFnaW5nLm5leHQnKSB8fCBnZXQocmVzLCAncGFnaW5nLm5leHRfcGFnZScpIHx8IGdldChyZXMsICdwYWdpbmcuY3Vyc29ycy5uZXh0JykgfHwgZ2V0KHJlcywgJ2N1cnNvcnMubmV4dCcpXG4gICAgfTtcbiAgICBjb25zdCBrZXlzUGFnaW5nID0gT2JqZWN0LmtleXMocGFnaW5nKTtcblxuICAgIGtleXNQYWdpbmcuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChpc05pbCgocGFnaW5nIGFzIGFueSlba2V5XSkpIHtcbiAgICAgICAgZGVsZXRlIChwYWdpbmcgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhwYWdpbmcpLmxlbmd0aCkge1xuICAgICAgaWYgKGlzUGFnZVN0YXJ0WmVybyAmJiAhaXNOaWwocGFnaW5nLnBhZ2UpKSB7XG4gICAgICAgIHBhZ2luZy5wYWdlICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAocGFnaW5nLnRvdGFsX2l0ZW1zICYmIHBhZ2luZy5wYWdlICYmIHBhZ2luZy5wZXJfcGFnZSAmJiAocGFnaW5nLnBhZ2UgKiBwYWdpbmcucGVyX3BhZ2UgPj0gcGFnaW5nLnRvdGFsX2l0ZW1zKSkge1xuICAgICAgICBwYWdpbmcudG90YWxfcGFnZXMgPSBwYWdpbmcucGFnZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNDb252ZXJ0LmRhdGEgaW5zdGFuY2VvZiBBcnJheSAmJiAhcmVzQ29udmVydC5kYXRhLmxlbmd0aCkge1xuICAgICAgICBwYWdpbmcudG90YWxfcGFnZXMgPSBwYWdpbmcucGFnZSB8fCAwO1xuICAgICAgfVxuICAgICAgcmVzQ29udmVydC5wYWdpbmcgPSBwYWdpbmc7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkRGVsZXRlID0gWydjb2RlJywgJ21lc3NhZ2UnLCAncGFnaW5nJ107XG5cbiAgICBmaWVsZERlbGV0ZS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmICghaXNOaWwocmVzW2ZpZWxkXSkpIHtcbiAgICAgICAgZGVsZXRlIHJlc1tmaWVsZF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZmllbGROb3RNZXJnZVRvRGF0YSA9IFsnbGFuZyddO1xuXG4gICAgZmllbGROb3RNZXJnZVRvRGF0YS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGlmICghaXNOaWwocmVzW2ZpZWxkXSkpIHtcbiAgICAgICAgcmVzQ29udmVydFtmaWVsZF0gPSByZXNbZmllbGRdO1xuICAgICAgICBkZWxldGUgcmVzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVzKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmVzQ29udmVydC5kYXRhID0gcmVzW2tleXNbMF1dO1xuICAgIH1cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgaXNOaWwocmVzLmRhdGEpID8gKHJlc0NvbnZlcnQuZGF0YSA9IHJlcykgOiBPYmplY3QuYXNzaWduKHJlc0NvbnZlcnQsIHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc0NvbnZlcnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnI6IEh0dHBFcnJvclJlc3BvbnNlKTogT2JzZXJ2YWJsZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+IHtcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gSHR0cFN0YXR1c0NvZGUuVW5hdXRob3JpemVkICYmICF0aGlzLmlnbm9yZVJlZGlyZWN0NDAxKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9Mb2dpbigpO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gZ2V0KGVyciwgJ2Vycm9yLmNvZGUnLCBlcnIuc3RhdHVzKTtcbiAgICBjb25zdCBtZXNzYWdlID0gY29kZSA+PSAxMDAgJiYgY29kZSA8IDUwMCA/IChlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnaTE4bl9hbGVydF9jb25uZWN0X3NlcnZlcl9lcnJvcicpIDogJ2kxOG5fYWxlcnRfY29ubmVjdF9zZXJ2ZXJfZXJyb3InO1xuICAgIGNvbnN0IGRhdGEgPSBnZXQoZXJyLCAnZXJyb3IuZGF0YScsIGVyci5lcnJvci5kYXRhKTtcblxuICAgIHRocm93IHsgY29kZTogY29kZSA+PSAxMDAgJiYgY29kZSA8IDUwMCA/IGNvZGUgOiA1MDAsIG1lc3NhZ2UsIHN1Yk1lc3NhZ2U6IGdldChlcnIsICdlcnJvci5lcnJvcnMnLCBnZXQoZXJyLCAnZXJyb3JzJykpLCBkYXRhOiBkYXRhIH07XG4gIH1cblxuXG4gIHB1YmxpYyBjYWNoZVJlc3BvbnNlRGF0YTxUPihvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPElIdHRwUmVzcG9uc2U8VD4+LCBrZXk6IHN0cmluZywgcGFyYW1zOiBBcnJheTxhbnk+LCB0aW1lQ2FjaGUgPSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQpOiBPYnNlcnZhYmxlPElIdHRwUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmUpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZUNhY2hlUmVzcG9uc2VEYXRhKG9ic2VydmFibGUsIGtleSwgcGFyYW1zLCB0aW1lQ2FjaGUpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBvYnNlcnZlPy5uZXh0KHJlcyk7XG4gICAgICAgIG9ic2VydmU/LmNvbXBsZXRlKCk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICBvYnNlcnZlPy5lcnJvcihlcnIpO1xuICAgICAgICBvYnNlcnZlPy5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FjaGVLZXlTdGFydFdpZHRoKGtleTogc3RyaW5nKSB7XG4gICAgYXdhaXQgVXRpbHNDYWNoZS5EZWxldGVLZXlTdGFydFdpdGhBc3luYyhtZDUoa2V5KSk7XG4gIH1cblxuICBwcml2YXRlIHByb21pc2VDYWNoZVJlc3BvbnNlRGF0YTxUPihvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPElIdHRwUmVzcG9uc2U8VD4+LCBrZXk6IHN0cmluZywgcGFyYW1zOiBBcnJheTxhbnk+LCB0aW1lQ2FjaGUgPSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQpOiBQcm9taXNlPElIdHRwUmVzcG9uc2U8VD4+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBrZXlDYWNoZSA9IGdldEtleUNhY2hlQnlBcnJheU9iamVjdChrZXksIEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtcyA6IFtwYXJhbXNdKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBVdGlsc0NhY2hlLkdldEFzeW5jKGtleUNhY2hlLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5mZUNsb25lQ29kZSB8fCAhcmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgVXRpbHNDYWNoZS5TZXRBc3luYyhrZXlDYWNoZSwgcmVzdWx0LCB0aW1lQ2FjaGUsIHRydWUpO1xuXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9XG59XG4iXX0=
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yZXF1ZXN0LWFic3RyYWN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2Jhc2UtcmVxdWVzdC1hYnN0cmFjdC9zcmMvYmFzZS1yZXF1ZXN0LWFic3RyYWN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQThDLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSw4QkFBOEIsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekwsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakQsTUFBTSxPQUFnQixnQ0FBZ0M7SUFDMUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLE9BQU8sQ0FBVTtJQUNqQixpQkFBaUIsQ0FBVztJQUM1QixJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFCLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFNbEMsR0FBRyxDQUFpQyxJQUFZLEVBQUUsTUFBMkM7UUFDM0YsTUFBTSxHQUFHLDhCQUE4QixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBYSxNQUFNLENBQUMsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENB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SSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9DLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQixVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBTdGF0dXNDb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJSHR0cFByb2Nlc3NVcGxvYWQsIElIdHRwUmVzcG9uc2UsIElQYWdpbmcsIFRZUEVfT0JKRUNUIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX1NUQVJUX1BBR0VfMCwgVXRpbHNDYWNoZSwgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCwgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlLCBlbmRDb2RlVXJsLCBnZXQsIGdldEtleUNhY2hlQnlBcnJheU9iamVjdCwgaXNOaWwsIG1kNSwgb21pdEJ5IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgZnJvbSwgbGFzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzL2ludGVybmFsL3R5cGVzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbnR5cGUgVFlQRV9NRVRIT0QgPSAnUE9TVCcgfCAnUEFUQ0gnIHwgJ1BVVCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMaWJzVWlCYXNlUmVxdWVzdEFic3RyYWN0U2VydmljZSB7XG4gIHByb3RlY3RlZCBrZXlDYWNoZVVuaXF1ZUJ5SWRVc2VyTG9naW4gPSAnJztcbiAgcHJvdGVjdGVkIGJhc2VVcmwhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBpZ25vcmVSZWRpcmVjdDQwMT86IGJvb2xlYW47XG4gIHByb3RlY3RlZCBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcm90ZWN0ZWQgaXNTdGFydFplcm9QYWdlID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9wdGlvbnM8VHlwZVBhcmFtcz4oaHR0cFBhcmFtczogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPiwgY29udGVudFR5cGU/OiBzdHJpbmcpOiB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzOyBwYXJhbXM6IEh0dHBQYXJhbXMgfTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlZGlyZWN0VG9Mb2dpbigpOiB2b2lkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPih1cmw6IHN0cmluZywgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KTogeyB1cmw6IHN0cmluZzsgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+IH07XG5cbiAgZ2V0PFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueT4ocGF0aDogc3RyaW5nLCBwYXJhbXM/OiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KSB7XG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+KHJlc3VsdC51cmwsIHRoaXMuZ2V0T3B0aW9ucyhwYXJhbXMpKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gdGhpcy5oYW5kbGVyUmVzcG9uc2U8VHlwZVJlc3BvbnNlPihyZXMsIHJlc3VsdENoZWNrUGFnZVplcm8uaXNTdGFydFplcm8pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB0aGlzLmhhbmRsZXJDYXRjaEVycm9yPFR5cGVSZXNwb25zZT4oZXJyKSlcbiAgICApO1xuICB9XG5cbiAgcG9zdDxUeXBlUmVzcG9uc2UsIFR5cGVQYXJhbXMgPSBhbnksIFR5cGVCb2R5ID0gYW55PihwYXRoOiBzdHJpbmcsIGJvZHk6IFR5cGVCb2R5LCBwYXJhbXM/OiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KSB7XG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SUh0dHBSZXNwb25zZTxUeXBlUmVzcG9uc2U+PihyZXN1bHQudXJsLCBib2R5LCB0aGlzLmdldE9wdGlvbnMocGFyYW1zKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHRoaXMuaGFuZGxlclJlc3BvbnNlPFR5cGVSZXNwb25zZT4ocmVzLCByZXN1bHRDaGVja1BhZ2VaZXJvLmlzU3RhcnRaZXJvKSksXG4gICAgICBjYXRjaEVycm9yKChlcnI6IGFueSkgPT4gdGhpcy5oYW5kbGVyQ2F0Y2hFcnJvcjxUeXBlUmVzcG9uc2U+KGVycikpXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RVcmxFbmRDb2RlPFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueSwgVHlwZUJvZHkgPSBhbnk+KHBhdGg6IHN0cmluZywgYm9keTogVHlwZUJvZHksIHBhcmFtcz86IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4pIHtcbiAgICBwYXJhbXMgPSBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0SW5zdGFuY2UodW5kZWZpbmVkLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdENoZWNrUGFnZVplcm8gPSB0aGlzLmNoZWNrU3RhcnRQYWdlSXNaZXJvPFR5cGVQYXJhbXM+KHBhcmFtcyk7XG4gICAgY29uc3QgYm9keVZhbHVlID0gZW5kQ29kZVVybChib2R5IGFzIFRZUEVfT0JKRUNULCB0cnVlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlcGxhY2VVUkxCeVBhdHRlcm48VHlwZVBhcmFtcz4oYCR7dGhpcy5iYXNlVXJsfSR7cGF0aCA/IHBhdGggOiAnJ31gLCBwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPj4ocmVzdWx0LnVybCwgYm9keVZhbHVlLCB0aGlzLmdldE9wdGlvbnMocGFyYW1zLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB0aGlzLmhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlcywgcmVzdWx0Q2hlY2tQYWdlWmVyby5pc1N0YXJ0WmVybykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHRoaXMuaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnIpKVxuICAgICk7XG4gIH1cblxuICBwdXQ8VHlwZVJlc3BvbnNlLCBUeXBlUGFyYW1zID0gYW55LCBUeXBlQm9keSA9IGFueT4ocGF0aDogc3RyaW5nLCBib2R5OiBUeXBlQm9keSwgcGFyYW1zPzogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPikge1xuICAgIHBhcmFtcyA9IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3RJbnN0YW5jZSh1bmRlZmluZWQsIHBhcmFtcyk7XG4gICAgY29uc3QgcmVzdWx0Q2hlY2tQYWdlWmVybyA9IHRoaXMuY2hlY2tTdGFydFBhZ2VJc1plcm88VHlwZVBhcmFtcz4ocGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlcGxhY2VVUkxCeVBhdHRlcm48VHlwZVBhcmFtcz4oYCR7dGhpcy5iYXNlVXJsfSR7cGF0aCA/IHBhdGggOiAnJ31gLCBwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8SUh0dHBSZXNwb25zZTxUeXBlUmVzcG9uc2U+PihyZXN1bHQudXJsLCBib2R5LCB0aGlzLmdldE9wdGlvbnMocGFyYW1zKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHRoaXMuaGFuZGxlclJlc3BvbnNlPFR5cGVSZXNwb25zZT4ocmVzLCByZXN1bHRDaGVja1BhZ2VaZXJvLmlzU3RhcnRaZXJvKSksXG4gICAgICBjYXRjaEVycm9yKChlcnI6IGFueSkgPT4gdGhpcy5oYW5kbGVyQ2F0Y2hFcnJvcjxUeXBlUmVzcG9uc2U+KGVycikpXG4gICAgKTtcbiAgfVxuXG4gIHBhdGNoPFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueT4ocGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duLCBwYXJhbXM/OiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KSB7XG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoPElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPj4ocmVzdWx0LnVybCwgYm9keSwgdGhpcy5nZXRPcHRpb25zKHBhcmFtcykpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB0aGlzLmhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlcywgcmVzdWx0Q2hlY2tQYWdlWmVyby5pc1N0YXJ0WmVybykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IHRoaXMuaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnIpKVxuICAgICk7XG4gIH1cblxuICBwYXRjaFVybEVuZENvZGU8VHlwZVJlc3BvbnNlLCBUeXBlUGFyYW1zID0gYW55PihwYXRoOiBzdHJpbmcsIGJvZHk6IHVua25vd24sIHBhcmFtcz86IFV0aWxzSHR0cFBhcmFtc1JlcXVlc3Q8VHlwZVBhcmFtcz4pIHtcbiAgICBwYXJhbXMgPSBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0SW5zdGFuY2UodW5kZWZpbmVkLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdENoZWNrUGFnZVplcm8gPSB0aGlzLmNoZWNrU3RhcnRQYWdlSXNaZXJvPFR5cGVQYXJhbXM+KHBhcmFtcyk7XG4gICAgY29uc3QgYm9keVZhbHVlID0gZW5kQ29kZVVybChib2R5IGFzIFRZUEVfT0JKRUNULCB0cnVlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlcGxhY2VVUkxCeVBhdHRlcm48VHlwZVBhcmFtcz4oYCR7dGhpcy5iYXNlVXJsfSR7cGF0aCA/IHBhdGggOiAnJ31gLCBwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+KHJlc3VsdC51cmwsIGJvZHlWYWx1ZSwgdGhpcy5nZXRPcHRpb25zKHBhcmFtcywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gdGhpcy5oYW5kbGVyUmVzcG9uc2U8VHlwZVJlc3BvbnNlPihyZXMsIHJlc3VsdENoZWNrUGFnZVplcm8uaXNTdGFydFplcm8pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB0aGlzLmhhbmRsZXJDYXRjaEVycm9yPFR5cGVSZXNwb25zZT4oZXJyKSlcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlPFR5cGVSZXNwb25zZSwgVHlwZVBhcmFtcyA9IGFueT4ocGF0aDogc3RyaW5nLCBwYXJhbXM/OiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+KSB7XG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVwbGFjZVVSTEJ5UGF0dGVybjxUeXBlUGFyYW1zPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+KHJlc3VsdC51cmwsIHRoaXMuZ2V0T3B0aW9ucyhwYXJhbXMpKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gdGhpcy5oYW5kbGVyUmVzcG9uc2U8VHlwZVJlc3BvbnNlPihyZXMsIHJlc3VsdENoZWNrUGFnZVplcm8uaXNTdGFydFplcm8pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB0aGlzLmhhbmRsZXJDYXRjaEVycm9yPFR5cGVSZXNwb25zZT4oZXJyKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNlbmRXaXRoRmlsZTxUeXBlUmVzcG9uc2UsIFR5cGVQYXJhbXMgPSBhbnksIFR5cGVCb2R5ID0gYW55PihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+LFxuICAgIGFyZ3VtZW50c1ZhbHVlOiB7IG1ldGhvZDogVFlQRV9NRVRIT0Q7IGJvZHlEYXRhOiBUeXBlQm9keTsga2VlcEZpbGVPZkJvZHk/OiBib29sZWFuOyBrZWVwQXJyYXlWYWx1ZT86IGJvb2xlYW47IHByb2Nlc3NVcGxvYWQ/OiAocHJvY2VzczogSUh0dHBQcm9jZXNzVXBsb2FkKSA9PiB2b2lkIH1cbiAgKTogT2JzZXJ2YWJsZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+IHtcbiAgICBjb25zdCB7IG1ldGhvZCwga2VlcEZpbGVPZkJvZHksIGtlZXBBcnJheVZhbHVlLCBwcm9jZXNzVXBsb2FkIH0gPSBhcmd1bWVudHNWYWx1ZTtcbiAgICBjb25zdCBib2R5RGF0YSA9IG9taXRCeTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pihhcmd1bWVudHNWYWx1ZS5ib2R5RGF0YSBhcyBhbnksIChkYXRhSXRlbTogYW55KSA9PiBpc05pbChkYXRhSXRlbSkpO1xuXG4gICAgcGFyYW1zID0gVXRpbHNIdHRwUGFyYW1zUmVxdWVzdEluc3RhbmNlKHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgICBjb25zdCByZXN1bHRDaGVja1BhZ2VaZXJvID0gdGhpcy5jaGVja1N0YXJ0UGFnZUlzWmVybzxUeXBlUGFyYW1zPihwYXJhbXMpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXBsYWNlVVJMQnlQYXR0ZXJuPFR5cGVQYXJhbXM+KGAke3RoaXMuYmFzZVVybH0ke3BhdGggPyBwYXRoIDogJyd9YCwgcmVzdWx0Q2hlY2tQYWdlWmVyby5wYXJhbXMpO1xuICAgIGNvbnN0IHVybCA9IHJlc3VsdC51cmw7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucyhyZXN1bHQucGFyYW1zKTtcblxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPElIdHRwUmVzcG9uc2U8VHlwZVJlc3BvbnNlPj4pID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IGFyZ3VtZW50c1ZhbHVlLmJvZHlEYXRhIGluc3RhbmNlb2YgRm9ybURhdGEgPyBhcmd1bWVudHNWYWx1ZS5ib2R5RGF0YSA6IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgY29uc3QgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgY29uc3QgcGFyYW1zU3RyID0gb3B0aW9ucy5wYXJhbXMudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG5cbiAgICAgIGlmIChwcm9jZXNzVXBsb2FkKSB7XG4gICAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IChlKSA9PiB7XG4gICAgICAgICAgcHJvY2Vzc1VwbG9hZCh7XG4gICAgICAgICAgICBsb2FkZWQ6IGUubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGUudG90YWwsXG4gICAgICAgICAgICBwZXJjZW50OiAoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoYXJndW1lbnRzVmFsdWUuYm9keURhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBib2R5RGF0YSkge1xuICAgICAgICAgIHRoaXMuYXBwZW5kUmVjdXJzaXZlKGZvcm1EYXRhLCBib2R5RGF0YVtwcm9wZXJ0eV0sIHByb3BlcnR5LCBrZWVwRmlsZU9mQm9keSwga2VlcEFycmF5VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB4aHIub3BlbihtZXRob2QsIGAke3VybH0ke3BhcmFtc1N0ciA/IGA/JHtwYXJhbXNTdHJ9YCA6ICcnfWAsIHRydWUpO1xuICAgICAgaGVhZGVycy5rZXlzKCkuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IGtleS50b0xvY2FsZUxvd2VyQ2FzZSgpICE9PSAnY29udGVudC10eXBlJyAmJiB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnMuZ2V0KGtleSkgfHwgJycpKTtcbiAgICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLmhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHRoaXMuY29udmVydFJlc3BvbnNlWEhSPFR5cGVSZXNwb25zZT4oeGhyKSwgcmVzdWx0Q2hlY2tQYWdlWmVyby5pc1N0YXJ0WmVybykpO1xuXG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IodGhpcy5jb252ZXJ0UmVzcG9uc2VYSFI8VHlwZVJlc3BvbnNlPih4aHIpKTtcblxuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZFJlY3Vyc2l2ZTxUeXBlQm9keT4oZkRhdGE6IEZvcm1EYXRhLCBkYXRhOiBUeXBlQm9keSwgcHJvcDogc3RyaW5nLCBrZWVwRmlsZU9mQm9keT86IGJvb2xlYW4sIGtlZXBBcnJheVZhbHVlPzogYm9vbGVhbikge1xuICAgIGlmIChrZWVwRmlsZU9mQm9keSkge1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBGaWxlIHx8IGRhdGEgaW5zdGFuY2VvZiBCbG9iIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgRmlsZV0nKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRmlsZVRvRm9ybURhdGEoZkRhdGEsIHByb3AsIGRhdGEgYXMgRmlsZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRhLmxlbmd0aCAmJiBkYXRhWzBdIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZGF0YSkge1xuICAgICAgICAgIHRoaXMuYXBwZW5kRmlsZVRvRm9ybURhdGEoZkRhdGEsIHByb3AsIGZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2VlcEFycmF5VmFsdWUgJiYgZGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBmRGF0YS5hcHBlbmQocHJvcCwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnb2JqZWN0JyA9PT0gdHlwZW9mIGRhdGEpIHtcbiAgICAgIGZEYXRhLmFwcGVuZChwcm9wLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZkRhdGEuYXBwZW5kKHByb3AsIGRhdGEgYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwZW5kRmlsZVRvRm9ybURhdGEoZm9ybURhdGE6IEZvcm1EYXRhLCBwcm9wOiBzdHJpbmcsIGZpbGU6IEZpbGUpIHtcbiAgICBmb3JtRGF0YS5hcHBlbmQocHJvcCwgZmlsZSwgZmlsZS5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJlc3BvbnNlWEhSPFR5cGVSZXNwb25zZT4oX3hocjogWE1MSHR0cFJlcXVlc3QpOiBJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IFhTU0lfUFJFRklYID0gL15cXClcXF1cXH0nLD9cXG4vO1xuICAgIGxldCBjb2RlOiBudW1iZXIgPSBfeGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IF94aHIuc3RhdHVzO1xuICAgIGxldCBtZXNzYWdlID0gX3hoci5zdGF0dXNUZXh0O1xuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuXG4gICAgaWYgKGNvZGUgIT09IDIwNCkge1xuICAgICAgZGF0YSA9IHR5cGVvZiBfeGhyLnJlc3BvbnNlID09PSAndW5kZWZpbmVkJyA/IF94aHIucmVzcG9uc2VUZXh0IDogX3hoci5yZXNwb25zZTtcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShYU1NJX1BSRUZJWCwgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICBjb2RlID0gZGF0YSA/IDIwMCA6IDA7XG4gICAgfVxuICAgIGlmIChkYXRhKSB7XG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIGNvZGUgPSBkYXRhLmNvZGUgPz8gMjAwO1xuICAgICAgbWVzc2FnZSA9IGRhdGEubWVzc2FnZSB8fCBtZXNzYWdlO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8/ICdPSyc7XG5cbiAgICByZXR1cm4geyAuLi5kYXRhLCBjb2RlLCBtZXNzYWdlIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzcG9uc2VVUkwoeGhyOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICgncmVzcG9uc2VVUkwnIGluIHhocikge1xuICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVVSTDtcbiAgICB9XG4gICAgaWYgKC9eWC1SZXF1ZXN0LVVSTDovbS50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpIHtcbiAgICAgIHJldHVybiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1gtUmVxdWVzdC1VUkwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTdGFydFBhZ2VJc1plcm88VHlwZVBhcmFtcz4ocGFyYW1zPzogVXRpbHNIdHRwUGFyYW1zUmVxdWVzdDxUeXBlUGFyYW1zPik6IHsgcGFyYW1zOiBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0PFR5cGVQYXJhbXM+OyBpc1N0YXJ0WmVybzogYm9vbGVhbiB9IHtcbiAgICBpZiAoIXBhcmFtcykge1xuICAgICAgcmV0dXJuIHsgcGFyYW1zOiBuZXcgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCgpLCBpc1N0YXJ0WmVybzogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5oYXMoREVGQVVMVF9TVEFSVF9QQUdFXzApIHx8IHRoaXMuaXNTdGFydFplcm9QYWdlKSB7XG4gICAgICBwYXJhbXMuZGVsZXRlKERFRkFVTFRfU1RBUlRfUEFHRV8wKTtcbiAgICAgIGNvbnN0IHBhZ2UgPSBwYXJhbXMuZ2V0KCdwYWdlJykgPyBOdW1iZXIocGFyYW1zLmdldCgncGFnZScpKSA6IC0xO1xuXG4gICAgICBpZiAoaXNOaWwocGFnZSkgfHwgcGFnZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGlzU3RhcnRaZXJvOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcGFyYW1zLnNldCgncGFnZScsIHBhZ2UgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGlzU3RhcnRaZXJvOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGlzU3RhcnRaZXJvOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJSZXNwb25zZTxUeXBlUmVzcG9uc2U+KHJlczogYW55LCBpc1BhZ2VTdGFydFplcm86IGJvb2xlYW4pOiBJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc0NvbnZlcnQ6IGFueSA9IHtcbiAgICAgIG1lc3NhZ2U6IGdldChyZXMsICdtZXNzYWdlJyksXG4gICAgICBjb2RlOiAyMDAsXG4gICAgfTtcbiAgICBjb25zdCBjb2RlID0gZ2V0KHJlcywgJ2NvZGUnLCAyMDApO1xuXG4gICAgaWYgKGAke2NvZGV9YCAhPT0gJzIwMCcgJiYgYCR7Y29kZX1gICE9PSAnMDAxJykge1xuICAgICAgcmVzQ29udmVydC5mZUNsb25lQ29kZSA9IGNvZGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXMgIT09ICdvYmplY3QnIHx8IHJlcyA9PT0gbnVsbCkge1xuICAgICAgcmVzQ29udmVydFsnZGF0YSddID0gcmVzO1xuICAgICAgcmV0dXJuIHJlc0NvbnZlcnQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFnaW5nOiBJUGFnaW5nID0ge1xuICAgICAgcGFnZTogZ2V0KHJlcywgJ3BhZ2luZy5wYWdlJykgfHwgZ2V0KHJlcywgJ3BhZ2UnKSB8fCAwLFxuICAgICAgcGVyX3BhZ2U6IGdldChyZXMsICdwYWdpbmcucGVyX3BhZ2UnKSB8fCBnZXQocmVzLCAnc2l6ZScpIHx8IDAsXG4gICAgICB0b3RhbF9pdGVtczogZ2V0KHJlcywgJ3BhZ2luZy50b3RhbF9pdGVtcycpIHx8IGdldChyZXMsICdwYWdpbmcudG90YWxfY291bnQnKSB8fCBnZXQocmVzLCAncGFnaW5nLnRvdGFsX2l0ZW0nKSB8fCBnZXQocmVzLCAndG90YWxFbGVtZW50cycpIHx8IDAsXG4gICAgICB0b3RhbF9wYWdlczogZ2V0KHJlcywgJ3BhZ2luZy50b3RhbF9wYWdlcycpIHx8IGdldChyZXMsICdwYWdpbmcudG90YWxfcGFnZScpIHx8IGdldChyZXMsICdwYWdpbmcucGFnZV9jb3VudCcpIHx8IGdldChyZXMsICdwYWdpbmcucGFnZV9jb3VudCcpIHx8IGdldChyZXMsICd0b3RhbFBhZ2VzJykgfHwgMCxcbiAgICAgIGJlZm9yZTogZ2V0KHJlcywgJ3BhZ2luZy5jdXJzb3JzLmJlZm9yZScpIHx8IGdldChyZXMsICdwYWdpbmcuYmVmb3JlJykgfHwgZ2V0KHJlcywgJ2N1cnNvcnMuYmVmb3JlJykgfHwgZ2V0KHJlcywgJ3BhZ2luZy5iZWZvcmVfdG9rZW4nKSB8fCBnZXQocmVzLCAncGFnaW5nLmN1cnNvcnMuYmVmb3JlX3Rva2VuJyksXG4gICAgICBhZnRlcjogZ2V0KHJlcywgJ3BhZ2luZy5jdXJzb3JzLmFmdGVyJykgfHwgZ2V0KHJlcywgJ3BhZ2luZy5hZnRlcicpIHx8IGdldChyZXMsICdjdXJzb3JzLmFmdGVyJykgfHwgZ2V0KHJlcywgJ3BhZ2luZy5hZnRlcl90b2tlbicpIHx8IGdldChyZXMsICdwYWdpbmcuY3Vyc29ycy5hZnRlcl90b2tlbicpLFxuICAgICAgcHJldmlvdXM6IGdldChyZXMsICdwYWdpbmcucHJldmlvdXMnKSB8fCBnZXQocmVzLCAncGFnaW5nLmN1cnNvcnMucHJldmlvdXMnKSB8fCBnZXQocmVzLCAnY3Vyc29ycy5wcmV2aW91cycpLFxuICAgICAgbmV4dDogZ2V0KHJlcywgJ3BhZ2luZy5uZXh0JykgfHwgZ2V0KHJlcywgJ3BhZ2luZy5uZXh0X3BhZ2UnKSB8fCBnZXQocmVzLCAncGFnaW5nLmN1cnNvcnMubmV4dCcpIHx8IGdldChyZXMsICdjdXJzb3JzLm5leHQnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleXNQYWdpbmcgPSBPYmplY3Qua2V5cyhwYWdpbmcpO1xuXG4gICAga2V5c1BhZ2luZy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGlzTmlsKChwYWdpbmcgYXMgYW55KVtrZXldKSkge1xuICAgICAgICBkZWxldGUgKHBhZ2luZyBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHBhZ2luZykubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNQYWdlU3RhcnRaZXJvICYmICFpc05pbChwYWdpbmcucGFnZSkpIHtcbiAgICAgICAgcGFnaW5nLnBhZ2UgKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdpbmcudG90YWxfaXRlbXMgJiYgcGFnaW5nLnBhZ2UgJiYgcGFnaW5nLnBlcl9wYWdlICYmIHBhZ2luZy5wYWdlICogcGFnaW5nLnBlcl9wYWdlID49IHBhZ2luZy50b3RhbF9pdGVtcykge1xuICAgICAgICBwYWdpbmcudG90YWxfcGFnZXMgPSBwYWdpbmcucGFnZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNDb252ZXJ0LmRhdGEgaW5zdGFuY2VvZiBBcnJheSAmJiAhcmVzQ29udmVydC5kYXRhLmxlbmd0aCkge1xuICAgICAgICBwYWdpbmcudG90YWxfcGFnZXMgPSBwYWdpbmcucGFnZSB8fCAwO1xuICAgICAgfVxuICAgICAgcmVzQ29udmVydC5wYWdpbmcgPSBwYWdpbmc7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkRGVsZXRlID0gWydjb2RlJywgJ21lc3NhZ2UnLCAncGFnaW5nJywgJ3RvdGFsRWxlbWVudHMnLCAnc2l6ZScsICd0b3RhbFBhZ2VzJywgJ3BhZ2UnXTtcblxuICAgIGZpZWxkRGVsZXRlLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoIWlzTmlsKHJlc1tmaWVsZF0pKSB7XG4gICAgICAgIGRlbGV0ZSByZXNbZmllbGRdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGZpZWxkTm90TWVyZ2VUb0RhdGEgPSBbJ2xhbmcnXTtcblxuICAgIGZpZWxkTm90TWVyZ2VUb0RhdGEuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmICghaXNOaWwocmVzW2ZpZWxkXSkpIHtcbiAgICAgICAgcmVzQ29udmVydFtmaWVsZF0gPSByZXNbZmllbGRdO1xuICAgICAgICBkZWxldGUgcmVzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVzKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmVzQ29udmVydC5kYXRhID0ga2V5c1swXSA9PT0gJzAnID8gcmVzIDogcmVzW2tleXNbMF1dO1xuICAgIH1cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgaXNOaWwocmVzLmRhdGEpID8gKHJlc0NvbnZlcnQuZGF0YSA9IHJlcykgOiBPYmplY3QuYXNzaWduKHJlc0NvbnZlcnQsIHJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc0NvbnZlcnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNhdGNoRXJyb3I8VHlwZVJlc3BvbnNlPihlcnI6IEh0dHBFcnJvclJlc3BvbnNlKTogT2JzZXJ2YWJsZTxJSHR0cFJlc3BvbnNlPFR5cGVSZXNwb25zZT4+IHtcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gSHR0cFN0YXR1c0NvZGUuVW5hdXRob3JpemVkICYmICF0aGlzLmlnbm9yZVJlZGlyZWN0NDAxKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9Mb2dpbigpO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gZ2V0PGFueT4oZXJyLCAnZXJyb3IuY29kZScsIGdldChlcnIsICdzdGF0dXMnLCAwKSk7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNvZGUgPj0gMTAwICYmIGNvZGUgPCA1MDAgPyBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnaTE4bl9hbGVydF9jb25uZWN0X3NlcnZlcl9lcnJvcicgOiAnaTE4bl9hbGVydF9jb25uZWN0X3NlcnZlcl9lcnJvcic7XG4gICAgY29uc3QgZGF0YSA9IGdldDxhbnk+KGVyciwgJ2Vycm9yLmRhdGEnLCAnJyk7XG5cbiAgICB0aHJvdyB7IGNvZGU6IGNvZGUgPj0gMTAwICYmIGNvZGUgPCA1MDAgPyBjb2RlIDogNTAwLCBtZXNzYWdlLCBzdWJNZXNzYWdlOiBnZXQ8YW55PihlcnIsICdlcnJvci5lcnJvcnMnLCBnZXQ8YW55PihlcnIsICdlcnJvcnMnKSksIGRhdGE6IGRhdGEsIHJvb3RFcnJvcjogZXJyIH07XG4gIH1cblxuICAvKipcbiAgICogTMawdSB0cuG7ryBk4buvIGxp4buHdSBwaOG6o24gaOG7k2kgdsOgbyBjYWNoZS5cbiAgICogQHBhcmFtIG9ic2VydmFibGUgLSBPYnNlcnZhYmxlIGPhu6dhIHBo4bqjbiBo4buTaSBIVFRQLlxuICAgKiBAcGFyYW0ga2V5IC0gS2jDs2EgY2FjaGUuTMawdSDDvSBraMO0bmcgbWQ1IGtleSB0csaw4bubYyBraGkgdHJ1eeG7gW4gdsOgb1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ8OhYyB0aGFtIHPhu5EgxJHhu4MgdOG6oW8ga2jDs2EgY2FjaGUuXG4gICAqIEBwYXJhbSB0aW1lQ2FjaGUgLSBUaOG7nWkgZ2lhbiBsxrB1IHRy4buvIGNhY2hlICht4bq3YyDEkeG7i25oIGzDoCBDQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxUKS5cbiAgICogQHBhcmFtIHJlbG9hZENhY2hlIC0gTuG6v3UgdHJ1ZSwgbHXDtG4gZ+G7jWkgxJHhu4MgbOG6pXkgZ2nDoSB0cuG7iyBt4bubaS4gZ2nDoSB0cuG7iyBuw6B5IGPDsyDEkeG7gyBz4butIGThu6VuZyB24bubaSBjw6FjIG5naGnhu4dwIHbhu6UgZ+G7jWkgbHXDtG4gbHXDtG4gbOG6pXkgZOG7ryBsaeG7h3UgbeG7m2kgbmjhuqV0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgY+G7p2EgcGjhuqNuIGjhu5NpIEhUVFAgxJHDoyDEkcaw4bujYyBjYWNoZS5cbiAgICovXG4gIHB1YmxpYyBjYWNoZVJlc3BvbnNlRGF0YTxUPihvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPElIdHRwUmVzcG9uc2U8VD4+LCBrZXk6IHN0cmluZywgcGFyYW1zOiBBcnJheTxhbnk+LCB0aW1lQ2FjaGUgPSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQsIHJlbG9hZENhY2hlID0gZmFsc2UpOiBPYnNlcnZhYmxlPElIdHRwUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLnByb21pc2VDYWNoZVJlc3BvbnNlRGF0YShvYnNlcnZhYmxlLCBrZXksIHBhcmFtcywgdGltZUNhY2hlLCByZWxvYWRDYWNoZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFjDs2EgY8OhYyBraMOzYSBjYWNoZSBi4bqvdCDEkeG6p3UgduG7m2kgbeG7mXQgY2h14buXaSBuaOG6pXQgxJHhu4tuaC5cbiAgICogTMawdSDDvToga2jDtG5nIG1kNSBrZXkgdHLGsOG7m2Mga2hpIHRydXnhu4FuIHbDoG8uXG4gICAqIFPhu60gZOG7pW5nIGjDoG0gbsOgeSB0cm9uZyBjw6FjIHRyxrDhu51uZyBo4bujcCBuaMawIGfhu41pIEFQSSB1cGRhdGUgaG/hurdjIHjDs2EgZOG7ryBsaeG7h3Usa2hpIMSRw7MgY+G6p24geMOzYSBjYWNoZSDEkWkgxJHhu4Mga2hpIGfhu41pIGRhbmggc8OhY2ggc+G6vSBs4bqleSDEkcaw4bujYyBnacOhIHRy4buLIG3hu5tpIG5o4bqldC5cbiAgICogQHBhcmFtIGtleSAtIENodeG7l2kga2jDs2EgY2FjaGUgY+G6p24geMOzYS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWNoZUtleVN0YXJ0V2lkdGgoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXdhaXQgVXRpbHNDYWNoZS5EZWxldGVLZXlTdGFydFdpdGhBc3luYyhtZDUoa2V5KSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb21pc2VDYWNoZVJlc3BvbnNlRGF0YTxUPihvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPElIdHRwUmVzcG9uc2U8VD4+LCBrZXk6IHN0cmluZywgcGFyYW1zOiBBcnJheTxhbnk+LCB0aW1lQ2FjaGUgPSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQsIHJlbG9hZENhY2hlID0gZmFsc2UpOiBQcm9taXNlPElIdHRwUmVzcG9uc2U8VD4+IHtcbiAgICBwYXJhbXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBwYXJhbXMgOiBbcGFyYW1zXTtcbiAgICBwYXJhbXMucHVzaCh0aGlzLmtleUNhY2hlVW5pcXVlQnlJZFVzZXJMb2dpbik7XG5cbiAgICBjb25zdCBrZXlDYWNoZSA9IGdldEtleUNhY2hlQnlBcnJheU9iamVjdChrZXksIHBhcmFtcyk7XG4gICAgaWYgKHJlbG9hZENhY2hlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUNhY2hlS2V5U3RhcnRXaWR0aChrZXkpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgVXRpbHNDYWNoZS5HZXRBc3luYyhrZXlDYWNoZSwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIGlmIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShvYnNlcnZhYmxlKTtcblxuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmRhdGEpIHtcbiAgICAgIFV0aWxzQ2FjaGUuU2V0QXN5bmMoa2V5Q2FjaGUsIHJlc3VsdCwgdGltZUNhY2hlLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
@@ -1,14 +1,16 @@
1
1
  import { HttpClient, HttpStatusCode } from '@angular/common/http';
2
2
  import { inject } from '@angular/core';
3
3
  import { UtilsHttpParamsRequestInstance, endCodeUrl, omitBy, isNil, UtilsHttpParamsRequest, DEFAULT_START_PAGE_0, get, UtilsCache, md5, getKeyCacheByArrayObject } from '@libs-ui/utils';
4
- import { Observable } from 'rxjs';
4
+ import { Observable, from, lastValueFrom } from 'rxjs';
5
5
  import { map, catchError } from 'rxjs/operators';
6
6
 
7
7
  /* eslint-disable @typescript-eslint/no-explicit-any */
8
8
  class LibsUiBaseRequestAbstractService {
9
+ keyCacheUniqueByIdUserLogin = '';
9
10
  baseUrl;
10
11
  ignoreRedirect401;
11
12
  http = inject(HttpClient);
13
+ isStartZeroPage = false;
12
14
  get(path, params) {
13
15
  params = UtilsHttpParamsRequestInstance(undefined, params);
14
16
  const resultCheckPageZero = this.checkStartPageIsZero(params);
@@ -62,7 +64,7 @@ class LibsUiBaseRequestAbstractService {
62
64
  const url = result.url;
63
65
  const options = this.getOptions(result.params);
64
66
  return new Observable((observer) => {
65
- const formData = new FormData();
67
+ const formData = argumentsValue.bodyData instanceof FormData ? argumentsValue.bodyData : new FormData();
66
68
  const xhr = new XMLHttpRequest();
67
69
  const paramsStr = options.params.toString();
68
70
  const headers = options.headers;
@@ -71,12 +73,14 @@ class LibsUiBaseRequestAbstractService {
71
73
  processUpload({
72
74
  loaded: e.loaded,
73
75
  total: e.total,
74
- percent: (e.loaded / e.total) * 100
76
+ percent: (e.loaded / e.total) * 100,
75
77
  });
76
78
  };
77
79
  }
78
- for (const property in bodyData) {
79
- this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);
80
+ if (!(argumentsValue.bodyData instanceof FormData)) {
81
+ for (const property in bodyData) {
82
+ this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);
83
+ }
80
84
  }
81
85
  xhr.open(method, `${url}${paramsStr ? `?${paramsStr}` : ''}`, true);
82
86
  headers.keys().forEach((key) => key.toLocaleLowerCase() !== 'content-type' && xhr.setRequestHeader(key, headers.get(key) || ''));
@@ -96,7 +100,7 @@ class LibsUiBaseRequestAbstractService {
96
100
  }
97
101
  appendRecursive(fData, data, prop, keepFileOfBody, keepArrayValue) {
98
102
  if (keepFileOfBody) {
99
- if (data instanceof File || Object.prototype.toString.call(data) === '[object File]') {
103
+ if (data instanceof File || data instanceof Blob || Object.prototype.toString.call(data) === '[object File]') {
100
104
  this.appendFileToFormData(fData, prop, data);
101
105
  return;
102
106
  }
@@ -126,7 +130,7 @@ class LibsUiBaseRequestAbstractService {
126
130
  let message = _xhr.statusText;
127
131
  let data = null;
128
132
  if (code !== 204) {
129
- data = (typeof _xhr.response === 'undefined') ? _xhr.responseText : _xhr.response;
133
+ data = typeof _xhr.response === 'undefined' ? _xhr.responseText : _xhr.response;
130
134
  if (typeof data === 'string') {
131
135
  data = data.replace(XSSI_PREFIX, '');
132
136
  }
@@ -155,7 +159,7 @@ class LibsUiBaseRequestAbstractService {
155
159
  if (!params) {
156
160
  return { params: new UtilsHttpParamsRequest(), isStartZero: false };
157
161
  }
158
- if (params.has(DEFAULT_START_PAGE_0)) {
162
+ if (params.has(DEFAULT_START_PAGE_0) || this.isStartZeroPage) {
159
163
  params.delete(DEFAULT_START_PAGE_0);
160
164
  const page = params.get('page') ? Number(params.get('page')) : -1;
161
165
  if (isNil(page) || page === -1) {
@@ -169,21 +173,25 @@ class LibsUiBaseRequestAbstractService {
169
173
  handlerResponse(res, isPageStartZero) {
170
174
  const resConvert = {
171
175
  message: get(res, 'message'),
172
- code: 200
176
+ code: 200,
173
177
  };
174
178
  const code = get(res, 'code', 200);
175
179
  if (`${code}` !== '200' && `${code}` !== '001') {
176
180
  resConvert.feCloneCode = code;
177
181
  }
182
+ if (typeof res !== 'object' || res === null) {
183
+ resConvert['data'] = res;
184
+ return resConvert;
185
+ }
178
186
  const paging = {
179
- page: get(res, 'paging.page'),
180
- per_page: get(res, 'paging.per_page'),
181
- total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item'),
182
- total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count'),
187
+ page: get(res, 'paging.page') || get(res, 'page') || 0,
188
+ per_page: get(res, 'paging.per_page') || get(res, 'size') || 0,
189
+ total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item') || get(res, 'totalElements') || 0,
190
+ total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count') || get(res, 'paging.page_count') || get(res, 'totalPages') || 0,
183
191
  before: get(res, 'paging.cursors.before') || get(res, 'paging.before') || get(res, 'cursors.before') || get(res, 'paging.before_token') || get(res, 'paging.cursors.before_token'),
184
192
  after: get(res, 'paging.cursors.after') || get(res, 'paging.after') || get(res, 'cursors.after') || get(res, 'paging.after_token') || get(res, 'paging.cursors.after_token'),
185
193
  previous: get(res, 'paging.previous') || get(res, 'paging.cursors.previous') || get(res, 'cursors.previous'),
186
- next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next')
194
+ next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next'),
187
195
  };
188
196
  const keysPaging = Object.keys(paging);
189
197
  keysPaging.forEach((key) => {
@@ -196,7 +204,7 @@ class LibsUiBaseRequestAbstractService {
196
204
  if (isPageStartZero && !isNil(paging.page)) {
197
205
  paging.page += 1;
198
206
  }
199
- if (paging.total_items && paging.page && paging.per_page && (paging.page * paging.per_page >= paging.total_items)) {
207
+ if (paging.total_items && paging.page && paging.per_page && paging.page * paging.per_page >= paging.total_items) {
200
208
  paging.total_pages = paging.page;
201
209
  }
202
210
  if (resConvert.data instanceof Array && !resConvert.data.length) {
@@ -204,14 +212,14 @@ class LibsUiBaseRequestAbstractService {
204
212
  }
205
213
  resConvert.paging = paging;
206
214
  }
207
- const fieldDelete = ['code', 'message', 'paging'];
208
- fieldDelete.forEach(field => {
215
+ const fieldDelete = ['code', 'message', 'paging', 'totalElements', 'size', 'totalPages', 'page'];
216
+ fieldDelete.forEach((field) => {
209
217
  if (!isNil(res[field])) {
210
218
  delete res[field];
211
219
  }
212
220
  });
213
221
  const fieldNotMergeToData = ['lang'];
214
- fieldNotMergeToData.forEach(field => {
222
+ fieldNotMergeToData.forEach((field) => {
215
223
  if (!isNil(res[field])) {
216
224
  resConvert[field] = res[field];
217
225
  delete res[field];
@@ -219,7 +227,7 @@ class LibsUiBaseRequestAbstractService {
219
227
  });
220
228
  const keys = Object.keys(res);
221
229
  if (keys.length === 1) {
222
- resConvert.data = res[keys[0]];
230
+ resConvert.data = keys[0] === '0' ? res : res[keys[0]];
223
231
  }
224
232
  if (keys.length > 1) {
225
233
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
@@ -231,46 +239,48 @@ class LibsUiBaseRequestAbstractService {
231
239
  if (err.status === HttpStatusCode.Unauthorized && !this.ignoreRedirect401) {
232
240
  this.redirectToLogin();
233
241
  }
234
- const code = get(err, 'error.code', err.status);
235
- const message = code >= 100 && code < 500 ? (err?.error?.message || err?.message || 'i18n_alert_connect_server_error') : 'i18n_alert_connect_server_error';
236
- const data = get(err, 'error.data', err.error.data);
237
- throw { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get(err, 'error.errors', get(err, 'errors')), data: data };
242
+ const code = get(err, 'error.code', get(err, 'status', 0));
243
+ const message = code >= 100 && code < 500 ? err?.error?.message || err?.message || 'i18n_alert_connect_server_error' : 'i18n_alert_connect_server_error';
244
+ const data = get(err, 'error.data', '');
245
+ throw { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get(err, 'error.errors', get(err, 'errors')), data: data, rootError: err };
238
246
  }
239
- cacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT) {
240
- return new Observable((observe) => {
241
- this.promiseCacheResponseData(observable, key, params, timeCache).then((res) => {
242
- observe?.next(res);
243
- observe?.complete();
244
- }).catch(err => {
245
- observe?.error(err);
246
- observe?.complete();
247
- });
248
- });
247
+ /**
248
+ * Lưu trữ dữ liệu phản hồi vào cache.
249
+ * @param observable - Observable của phản hồi HTTP.
250
+ * @param key - Khóa cache.Lưu ý không md5 key trước khi truyền vào
251
+ * @param params - Các tham số để tạo khóa cache.
252
+ * @param timeCache - Thời gian lưu trữ cache (mặc định là CACHE_EXPIRE_TIME_DEFAULT).
253
+ * @param reloadCache - Nếu true, luôn gọi để lấy giá trị mới. giá trị này có để sử dụng với các nghiệp vụ gọi luôn luôn lấy dữ liệu mới nhất
254
+ * @returns Observable của phản hồi HTTP đã được cache.
255
+ */
256
+ cacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false) {
257
+ return from(this.promiseCacheResponseData(observable, key, params, timeCache, reloadCache));
249
258
  }
259
+ /**
260
+ * Xóa các khóa cache bắt đầu với một chuỗi nhất định.
261
+ * Lưu ý: không md5 key trước khi truyền vào.
262
+ * Sử dụng hàm này trong các trường hợp như gọi API update hoặc xóa dữ liệu,khi đó cần xóa cache đi để khi gọi danh sách sẽ lấy được giá trị mới nhất.
263
+ * @param key - Chuỗi khóa cache cần xóa.
264
+ */
250
265
  async deleteCacheKeyStartWidth(key) {
251
- await UtilsCache.DeleteKeyStartWithAsync(md5(key));
266
+ return await UtilsCache.DeleteKeyStartWithAsync(md5(key), true);
252
267
  }
253
- promiseCacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT) {
254
- // eslint-disable-next-line no-async-promise-executor
255
- return new Promise(async (resolve, reject) => {
256
- const keyCache = getKeyCacheByArrayObject(key, Array.isArray(params) ? params : [params]);
257
- const data = await UtilsCache.GetAsync(keyCache, undefined, true);
258
- if (data) {
259
- return resolve(data);
260
- }
261
- observable.subscribe({
262
- next: async (result) => {
263
- if (!result || result.feCloneCode || !result.data) {
264
- return reject(result);
265
- }
266
- await UtilsCache.SetAsync(keyCache, result, timeCache, true);
267
- return resolve(result);
268
- },
269
- error: err => {
270
- return reject(err);
271
- }
272
- });
273
- });
268
+ async promiseCacheResponseData(observable, key, params, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false) {
269
+ params = Array.isArray(params) ? params : [params];
270
+ params.push(this.keyCacheUniqueByIdUserLogin);
271
+ const keyCache = getKeyCacheByArrayObject(key, params);
272
+ if (reloadCache) {
273
+ await this.deleteCacheKeyStartWidth(key);
274
+ }
275
+ const data = await UtilsCache.GetAsync(keyCache, undefined, true);
276
+ if (data) {
277
+ return data;
278
+ }
279
+ const result = await lastValueFrom(observable);
280
+ if (result && result.data) {
281
+ UtilsCache.SetAsync(keyCache, result, timeCache, true);
282
+ }
283
+ return result;
274
284
  }
275
285
  }
276
286
 
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-services-base-request-abstract.mjs","sources":["../../../../../libs-ui/services/base-request-abstract/src/base-request-abstract.service.ts","../../../../../libs-ui/services/base-request-abstract/src/libs-ui-services-base-request-abstract.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpStatusCode } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { IHttpProcessUpload, IHttpResponse, IPaging } from '@libs-ui/interfaces-types';\nimport { DEFAULT_START_PAGE_0, UtilsCache, UtilsHttpParamsRequest, UtilsHttpParamsRequestInstance, endCodeUrl, get, getKeyCacheByArrayObject, isNil, md5, omitBy } from '@libs-ui/utils';\nimport { Observable } from 'rxjs';\nimport { Observer } from 'rxjs/internal/types';\nimport { catchError, map } from 'rxjs/operators';\ntype TYPE_METHOD = 'POST' | 'PATCH' | 'PUT';\n\nexport abstract class LibsUiBaseRequestAbstractService {\n protected baseUrl!: string;\n protected ignoreRedirect401?: boolean;\n protected http = inject(HttpClient);\n\n protected abstract getOptions<TypeParams>(httpParams: UtilsHttpParamsRequest<TypeParams>, contentType?: string): { headers: HttpHeaders, params: HttpParams };\n protected abstract redirectToLogin(): void;\n protected abstract replaceURLByPattern<TypeParams>(url: string, params: UtilsHttpParamsRequest<TypeParams>): { url: string, params: UtilsHttpParamsRequest<TypeParams> };\n\n\n get<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.get<IHttpResponse<TypeResponse>>(result.url, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n post<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(result.url, body, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n postUrlEndCode<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(result.url, bodyValue, this.getOptions(params, 'application/x-www-form-urlencoded')).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n put<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.put<IHttpResponse<TypeResponse>>(result.url, body, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patch<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(result.url, body, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patchUrlEndCode<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(result.url, bodyValue, this.getOptions(params, 'application/x-www-form-urlencoded')).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n delete<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.delete<IHttpResponse<TypeResponse>>(result.url, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n public sendWithFile<TypeResponse, TypeParams = any, TypeBody = any>(path: string, params: UtilsHttpParamsRequest<TypeParams>, argumentsValue: { method: TYPE_METHOD; bodyData: TypeBody; keepFileOfBody?: boolean; keepArrayValue?: boolean; processUpload?: (process: IHttpProcessUpload) => void }): Observable<IHttpResponse<TypeResponse>> {\n const { method, keepFileOfBody, keepArrayValue, processUpload } = argumentsValue;\n const bodyData = omitBy<Record<string, any>>(argumentsValue.bodyData as any, (dataItem: any) => isNil(dataItem));\n\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, resultCheckPageZero.params);\n const url = result.url;\n const options = this.getOptions(result.params);\n\n return new Observable((observer: Observer<IHttpResponse<TypeResponse>>) => {\n const formData: FormData = new FormData();\n const xhr: XMLHttpRequest = new XMLHttpRequest();\n const paramsStr = options.params.toString();\n const headers = options.headers;\n\n if (processUpload) {\n xhr.upload.onprogress = (e) => {\n processUpload({\n loaded: e.loaded,\n total: e.total,\n percent: (e.loaded / e.total) * 100\n });\n };\n }\n\n for (const property in bodyData) {\n this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);\n }\n xhr.open(method, `${url}${paramsStr ? `?${paramsStr}` : ''}`, true);\n headers.keys().forEach((key: string) => key.toLocaleLowerCase() !== 'content-type' && xhr.setRequestHeader(key, headers.get(key) || ''));\n xhr.send(formData);\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== 4) {\n return;\n }\n if (xhr.status === 200) {\n observer.next(this.handlerResponse<TypeResponse>(this.convertResponseXHR<TypeResponse>(xhr), resultCheckPageZero.isStartZero));\n\n return observer.complete();\n }\n observer.error(this.convertResponseXHR<TypeResponse>(xhr));\n\n return observer.complete();\n };\n });\n }\n\n private appendRecursive<TypeBody>(fData: FormData, data: TypeBody, prop: string, keepFileOfBody?: boolean, keepArrayValue?: boolean) {\n if (keepFileOfBody) {\n if (data instanceof File || Object.prototype.toString.call(data) === '[object File]') {\n this.appendFileToFormData(fData, prop, data as File);\n\n return;\n }\n if (data instanceof Array && data.length && data[0] instanceof File) {\n for (const file of data) {\n this.appendFileToFormData(fData, prop, file);\n }\n\n return;\n }\n }\n if (keepArrayValue && data instanceof Array) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n if ('object' === typeof data) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n fData.append(prop, data as any);\n }\n\n private appendFileToFormData(formData: FormData, prop: string, file: File) {\n formData.append(prop, file, file.name);\n }\n\n private convertResponseXHR<TypeResponse>(_xhr: XMLHttpRequest): IHttpResponse<TypeResponse> {\n const XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n let code: number = _xhr.status === 1223 ? 204 : _xhr.status;\n let message = _xhr.statusText;\n let data: any = null;\n\n if (code !== 204) {\n data = (typeof _xhr.response === 'undefined') ? _xhr.responseText : _xhr.response;\n if (typeof data === 'string') {\n data = data.replace(XSSI_PREFIX, '');\n }\n }\n\n if (code === 0) {\n code = data ? 200 : 0;\n }\n if (data) {\n\n data = JSON.parse(data);\n code = data.code ?? 200;\n message = data.message || message;\n }\n\n message = message ?? 'OK';\n\n return { ...data, code, message };\n }\n\n public getResponseURL(xhr: any): string {\n if ('responseURL' in xhr) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n\n return '';\n }\n\n protected checkStartPageIsZero<TypeParams>(params?: UtilsHttpParamsRequest<TypeParams>): { params: UtilsHttpParamsRequest<TypeParams>, isStartZero: boolean } {\n if (!params) {\n return { params: new UtilsHttpParamsRequest(), isStartZero: false };\n }\n if (params.has(DEFAULT_START_PAGE_0)) {\n params.delete(DEFAULT_START_PAGE_0);\n const page = params.get('page') ? Number(params.get('page')) : -1;\n\n if (isNil(page) || page === -1) {\n return { params: params, isStartZero: false };\n }\n params.set('page', page - 1);\n\n return { params: params, isStartZero: true };\n }\n\n return { params: params, isStartZero: false };\n }\n\n protected handlerResponse<TypeResponse>(res: any, isPageStartZero: boolean): IHttpResponse<TypeResponse> {\n const resConvert: any = {\n message: get(res, 'message'),\n code: 200\n };\n const code = get(res, 'code', 200);\n\n if (`${code}` !== '200' && `${code}` !== '001') {\n resConvert.feCloneCode = code;\n }\n const paging: IPaging = {\n page: get(res, 'paging.page'),\n per_page: get(res, 'paging.per_page'),\n total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item'),\n total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count'),\n before: get(res, 'paging.cursors.before') || get(res, 'paging.before') || get(res, 'cursors.before') || get(res, 'paging.before_token') || get(res, 'paging.cursors.before_token'),\n after: get(res, 'paging.cursors.after') || get(res, 'paging.after') || get(res, 'cursors.after') || get(res, 'paging.after_token') || get(res, 'paging.cursors.after_token'),\n previous: get(res, 'paging.previous') || get(res, 'paging.cursors.previous') || get(res, 'cursors.previous'),\n next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next')\n };\n const keysPaging = Object.keys(paging);\n\n keysPaging.forEach((key: string) => {\n if (isNil((paging as any)[key])) {\n delete (paging as any)[key];\n\n return;\n }\n });\n\n if (Object.keys(paging).length) {\n if (isPageStartZero && !isNil(paging.page)) {\n paging.page += 1;\n }\n if (paging.total_items && paging.page && paging.per_page && (paging.page * paging.per_page >= paging.total_items)) {\n paging.total_pages = paging.page;\n }\n if (resConvert.data instanceof Array && !resConvert.data.length) {\n paging.total_pages = paging.page || 0;\n }\n resConvert.paging = paging;\n }\n const fieldDelete = ['code', 'message', 'paging'];\n\n fieldDelete.forEach(field => {\n if (!isNil(res[field])) {\n delete res[field];\n }\n });\n const fieldNotMergeToData = ['lang'];\n\n fieldNotMergeToData.forEach(field => {\n if (!isNil(res[field])) {\n resConvert[field] = res[field];\n delete res[field];\n }\n });\n const keys = Object.keys(res);\n\n if (keys.length === 1) {\n resConvert.data = res[keys[0]];\n }\n if (keys.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n isNil(res.data) ? (resConvert.data = res) : Object.assign(resConvert, res);\n }\n\n return resConvert;\n }\n\n protected handlerCatchError<TypeResponse>(err: HttpErrorResponse): Observable<IHttpResponse<TypeResponse>> {\n if (err.status === HttpStatusCode.Unauthorized && !this.ignoreRedirect401) {\n this.redirectToLogin();\n }\n const code = get(err, 'error.code', err.status);\n const message = code >= 100 && code < 500 ? (err?.error?.message || err?.message || 'i18n_alert_connect_server_error') : 'i18n_alert_connect_server_error';\n const data = get(err, 'error.data', err.error.data);\n\n throw { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get(err, 'error.errors', get(err, 'errors')), data: data };\n }\n\n\n public cacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT): Observable<IHttpResponse<T>> {\n return new Observable((observe) => {\n this.promiseCacheResponseData(observable, key, params, timeCache).then((res) => {\n observe?.next(res);\n observe?.complete();\n }).catch(err => {\n observe?.error(err);\n observe?.complete();\n });\n });\n }\n\n public async deleteCacheKeyStartWidth(key: string) {\n await UtilsCache.DeleteKeyStartWithAsync(md5(key));\n }\n\n private promiseCacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT): Promise<IHttpResponse<T>> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n const keyCache = getKeyCacheByArrayObject(key, Array.isArray(params) ? params : [params]);\n const data = await UtilsCache.GetAsync(keyCache, undefined, true);\n\n if (data) {\n return resolve(data);\n }\n observable.subscribe({\n next: async (result) => {\n if (!result || result.feCloneCode || !result.data) {\n return reject(result);\n }\n await UtilsCache.SetAsync(keyCache, result, timeCache, true);\n\n return resolve(result);\n },\n error: err => {\n return reject(err);\n }\n });\n });\n\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-services-base-request-abstract.mjs","sources":["../../../../../libs-ui/services/base-request-abstract/src/base-request-abstract.service.ts","../../../../../libs-ui/services/base-request-abstract/src/libs-ui-services-base-request-abstract.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpStatusCode } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { IHttpProcessUpload, IHttpResponse, IPaging, TYPE_OBJECT } from '@libs-ui/interfaces-types';\nimport { DEFAULT_START_PAGE_0, UtilsCache, UtilsHttpParamsRequest, UtilsHttpParamsRequestInstance, endCodeUrl, get, getKeyCacheByArrayObject, isNil, md5, omitBy } from '@libs-ui/utils';\nimport { from, lastValueFrom, Observable } from 'rxjs';\nimport { Observer } from 'rxjs/internal/types';\nimport { catchError, map } from 'rxjs/operators';\ntype TYPE_METHOD = 'POST' | 'PATCH' | 'PUT';\n\nexport abstract class LibsUiBaseRequestAbstractService {\n protected keyCacheUniqueByIdUserLogin = '';\n protected baseUrl!: string;\n protected ignoreRedirect401?: boolean;\n protected http = inject(HttpClient);\n protected isStartZeroPage = false;\n\n protected abstract getOptions<TypeParams>(httpParams: UtilsHttpParamsRequest<TypeParams>, contentType?: string): { headers: HttpHeaders; params: HttpParams };\n protected abstract redirectToLogin(): void;\n protected abstract replaceURLByPattern<TypeParams>(url: string, params: UtilsHttpParamsRequest<TypeParams>): { url: string; params: UtilsHttpParamsRequest<TypeParams> };\n\n get<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.get<IHttpResponse<TypeResponse>>(result.url, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n post<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(result.url, body, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n postUrlEndCode<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body as TYPE_OBJECT, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(result.url, bodyValue, this.getOptions(params, 'application/x-www-form-urlencoded')).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n put<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.put<IHttpResponse<TypeResponse>>(result.url, body, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patch<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(result.url, body, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patchUrlEndCode<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body as TYPE_OBJECT, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(result.url, bodyValue, this.getOptions(params, 'application/x-www-form-urlencoded')).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n delete<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, params);\n\n return this.http.delete<IHttpResponse<TypeResponse>>(result.url, this.getOptions(params)).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n public sendWithFile<TypeResponse, TypeParams = any, TypeBody = any>(\n path: string,\n params: UtilsHttpParamsRequest<TypeParams>,\n argumentsValue: { method: TYPE_METHOD; bodyData: TypeBody; keepFileOfBody?: boolean; keepArrayValue?: boolean; processUpload?: (process: IHttpProcessUpload) => void }\n ): Observable<IHttpResponse<TypeResponse>> {\n const { method, keepFileOfBody, keepArrayValue, processUpload } = argumentsValue;\n const bodyData = omitBy<Record<string, any>>(argumentsValue.bodyData as any, (dataItem: any) => isNil(dataItem));\n\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path ? path : ''}`, resultCheckPageZero.params);\n const url = result.url;\n const options = this.getOptions(result.params);\n\n return new Observable((observer: Observer<IHttpResponse<TypeResponse>>) => {\n const formData: FormData = argumentsValue.bodyData instanceof FormData ? argumentsValue.bodyData : new FormData();\n const xhr: XMLHttpRequest = new XMLHttpRequest();\n const paramsStr = options.params.toString();\n const headers = options.headers;\n\n if (processUpload) {\n xhr.upload.onprogress = (e) => {\n processUpload({\n loaded: e.loaded,\n total: e.total,\n percent: (e.loaded / e.total) * 100,\n });\n };\n }\n\n if (!(argumentsValue.bodyData instanceof FormData)) {\n for (const property in bodyData) {\n this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);\n }\n }\n xhr.open(method, `${url}${paramsStr ? `?${paramsStr}` : ''}`, true);\n headers.keys().forEach((key: string) => key.toLocaleLowerCase() !== 'content-type' && xhr.setRequestHeader(key, headers.get(key) || ''));\n xhr.send(formData);\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== 4) {\n return;\n }\n if (xhr.status === 200) {\n observer.next(this.handlerResponse<TypeResponse>(this.convertResponseXHR<TypeResponse>(xhr), resultCheckPageZero.isStartZero));\n\n return observer.complete();\n }\n observer.error(this.convertResponseXHR<TypeResponse>(xhr));\n\n return observer.complete();\n };\n });\n }\n\n private appendRecursive<TypeBody>(fData: FormData, data: TypeBody, prop: string, keepFileOfBody?: boolean, keepArrayValue?: boolean) {\n if (keepFileOfBody) {\n if (data instanceof File || data instanceof Blob || Object.prototype.toString.call(data) === '[object File]') {\n this.appendFileToFormData(fData, prop, data as File);\n\n return;\n }\n if (data instanceof Array && data.length && data[0] instanceof File) {\n for (const file of data) {\n this.appendFileToFormData(fData, prop, file);\n }\n\n return;\n }\n }\n if (keepArrayValue && data instanceof Array) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n if ('object' === typeof data) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n fData.append(prop, data as any);\n }\n\n private appendFileToFormData(formData: FormData, prop: string, file: File) {\n formData.append(prop, file, file.name);\n }\n\n private convertResponseXHR<TypeResponse>(_xhr: XMLHttpRequest): IHttpResponse<TypeResponse> {\n const XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n let code: number = _xhr.status === 1223 ? 204 : _xhr.status;\n let message = _xhr.statusText;\n let data: any = null;\n\n if (code !== 204) {\n data = typeof _xhr.response === 'undefined' ? _xhr.responseText : _xhr.response;\n if (typeof data === 'string') {\n data = data.replace(XSSI_PREFIX, '');\n }\n }\n\n if (code === 0) {\n code = data ? 200 : 0;\n }\n if (data) {\n data = JSON.parse(data);\n code = data.code ?? 200;\n message = data.message || message;\n }\n\n message = message ?? 'OK';\n\n return { ...data, code, message };\n }\n\n public getResponseURL(xhr: any): string {\n if ('responseURL' in xhr) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n\n return '';\n }\n\n protected checkStartPageIsZero<TypeParams>(params?: UtilsHttpParamsRequest<TypeParams>): { params: UtilsHttpParamsRequest<TypeParams>; isStartZero: boolean } {\n if (!params) {\n return { params: new UtilsHttpParamsRequest(), isStartZero: false };\n }\n if (params.has(DEFAULT_START_PAGE_0) || this.isStartZeroPage) {\n params.delete(DEFAULT_START_PAGE_0);\n const page = params.get('page') ? Number(params.get('page')) : -1;\n\n if (isNil(page) || page === -1) {\n return { params: params, isStartZero: false };\n }\n params.set('page', page - 1);\n\n return { params: params, isStartZero: true };\n }\n\n return { params: params, isStartZero: false };\n }\n\n protected handlerResponse<TypeResponse>(res: any, isPageStartZero: boolean): IHttpResponse<TypeResponse> {\n const resConvert: any = {\n message: get(res, 'message'),\n code: 200,\n };\n const code = get(res, 'code', 200);\n\n if (`${code}` !== '200' && `${code}` !== '001') {\n resConvert.feCloneCode = code;\n }\n\n if (typeof res !== 'object' || res === null) {\n resConvert['data'] = res;\n return resConvert;\n }\n\n const paging: IPaging = {\n page: get(res, 'paging.page') || get(res, 'page') || 0,\n per_page: get(res, 'paging.per_page') || get(res, 'size') || 0,\n total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item') || get(res, 'totalElements') || 0,\n total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count') || get(res, 'paging.page_count') || get(res, 'totalPages') || 0,\n before: get(res, 'paging.cursors.before') || get(res, 'paging.before') || get(res, 'cursors.before') || get(res, 'paging.before_token') || get(res, 'paging.cursors.before_token'),\n after: get(res, 'paging.cursors.after') || get(res, 'paging.after') || get(res, 'cursors.after') || get(res, 'paging.after_token') || get(res, 'paging.cursors.after_token'),\n previous: get(res, 'paging.previous') || get(res, 'paging.cursors.previous') || get(res, 'cursors.previous'),\n next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next'),\n };\n const keysPaging = Object.keys(paging);\n\n keysPaging.forEach((key: string) => {\n if (isNil((paging as any)[key])) {\n delete (paging as any)[key];\n\n return;\n }\n });\n\n if (Object.keys(paging).length) {\n if (isPageStartZero && !isNil(paging.page)) {\n paging.page += 1;\n }\n if (paging.total_items && paging.page && paging.per_page && paging.page * paging.per_page >= paging.total_items) {\n paging.total_pages = paging.page;\n }\n if (resConvert.data instanceof Array && !resConvert.data.length) {\n paging.total_pages = paging.page || 0;\n }\n resConvert.paging = paging;\n }\n const fieldDelete = ['code', 'message', 'paging', 'totalElements', 'size', 'totalPages', 'page'];\n\n fieldDelete.forEach((field) => {\n if (!isNil(res[field])) {\n delete res[field];\n }\n });\n const fieldNotMergeToData = ['lang'];\n\n fieldNotMergeToData.forEach((field) => {\n if (!isNil(res[field])) {\n resConvert[field] = res[field];\n delete res[field];\n }\n });\n const keys = Object.keys(res);\n\n if (keys.length === 1) {\n resConvert.data = keys[0] === '0' ? res : res[keys[0]];\n }\n if (keys.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n isNil(res.data) ? (resConvert.data = res) : Object.assign(resConvert, res);\n }\n\n return resConvert;\n }\n\n protected handlerCatchError<TypeResponse>(err: HttpErrorResponse): Observable<IHttpResponse<TypeResponse>> {\n if (err.status === HttpStatusCode.Unauthorized && !this.ignoreRedirect401) {\n this.redirectToLogin();\n }\n const code = get<any>(err, 'error.code', get(err, 'status', 0));\n const message = code >= 100 && code < 500 ? err?.error?.message || err?.message || 'i18n_alert_connect_server_error' : 'i18n_alert_connect_server_error';\n const data = get<any>(err, 'error.data', '');\n\n throw { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get<any>(err, 'error.errors', get<any>(err, 'errors')), data: data, rootError: err };\n }\n\n /**\n * Lưu trữ dữ liệu phản hồi vào cache.\n * @param observable - Observable của phản hồi HTTP.\n * @param key - Khóa cache.Lưu ý không md5 key trước khi truyền vào\n * @param params - Các tham số để tạo khóa cache.\n * @param timeCache - Thời gian lưu trữ cache (mặc định là CACHE_EXPIRE_TIME_DEFAULT).\n * @param reloadCache - Nếu true, luôn gọi để lấy giá trị mới. giá trị này có để sử dụng với các nghiệp vụ gọi luôn luôn lấy dữ liệu mới nhất\n * @returns Observable của phản hồi HTTP đã được cache.\n */\n public cacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Observable<IHttpResponse<T>> {\n return from(this.promiseCacheResponseData(observable, key, params, timeCache, reloadCache));\n }\n\n /**\n * Xóa các khóa cache bắt đầu với một chuỗi nhất định.\n * Lưu ý: không md5 key trước khi truyền vào.\n * Sử dụng hàm này trong các trường hợp như gọi API update hoặc xóa dữ liệu,khi đó cần xóa cache đi để khi gọi danh sách sẽ lấy được giá trị mới nhất.\n * @param key - Chuỗi khóa cache cần xóa.\n */\n public async deleteCacheKeyStartWidth(key: string) {\n return await UtilsCache.DeleteKeyStartWithAsync(md5(key), true);\n }\n\n private async promiseCacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Promise<IHttpResponse<T>> {\n params = Array.isArray(params) ? params : [params];\n params.push(this.keyCacheUniqueByIdUserLogin);\n\n const keyCache = getKeyCacheByArrayObject(key, params);\n if (reloadCache) {\n await this.deleteCacheKeyStartWidth(key);\n }\n const data = await UtilsCache.GetAsync(keyCache, undefined, true);\n\n if (data) {\n return data;\n }\n const result = await lastValueFrom(observable);\n\n if (result && result.data) {\n UtilsCache.SetAsync(keyCache, result, timeCache, true);\n }\n\n return result;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "@libs-ui/services-base-request-abstract",
3
- "version": "0.2.106.2",
3
+ "version": "0.2.306.1",
4
4
  "peerDependencies": {
5
- "@angular/common": "^18.2.0",
6
- "@angular/core": "^18.2.0"
5
+ "@angular/common": ">=18.0.0",
6
+ "@angular/core": ">=18.0.0",
7
+ "@libs-ui/interfaces-types": "0.2.306.1",
8
+ "@libs-ui/utils": "0.2.306.1",
9
+ "rxjs": "~7.8.0"
7
10
  },
8
11
  "sideEffects": false,
9
12
  "module": "fesm2022/libs-ui-services-base-request-abstract.mjs",