@delon/abc 18.2.0 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/auto-focus/auto-focus.directive.d.ts +3 -5
- package/avatar-list/avatar-list.component.d.ts +3 -0
- package/avatar-list/avatar-list.module.d.ts +3 -0
- package/exception/exception.component.d.ts +1 -1
- package/fesm2022/auto-focus.mjs +19 -28
- package/fesm2022/auto-focus.mjs.map +1 -1
- package/fesm2022/avatar-list.mjs +35 -27
- package/fesm2022/avatar-list.mjs.map +1 -1
- package/fesm2022/cell.mjs +104 -107
- package/fesm2022/cell.mjs.map +1 -1
- package/fesm2022/chart-observer-size.mjs +17 -22
- package/fesm2022/chart-observer-size.mjs.map +1 -1
- package/fesm2022/count-down.mjs +11 -12
- package/fesm2022/count-down.mjs.map +1 -1
- package/fesm2022/date-picker.mjs +26 -26
- package/fesm2022/date-picker.mjs.map +1 -1
- package/fesm2022/down-file.mjs +19 -15
- package/fesm2022/down-file.mjs.map +1 -1
- package/fesm2022/ellipsis.mjs +29 -25
- package/fesm2022/ellipsis.mjs.map +1 -1
- package/fesm2022/error-collect.mjs +22 -21
- package/fesm2022/error-collect.mjs.map +1 -1
- package/fesm2022/exception.mjs +24 -20
- package/fesm2022/exception.mjs.map +1 -1
- package/fesm2022/footer-toolbar.mjs +13 -14
- package/fesm2022/footer-toolbar.mjs.map +1 -1
- package/fesm2022/full-content.mjs +31 -38
- package/fesm2022/full-content.mjs.map +1 -1
- package/fesm2022/global-footer.mjs +24 -23
- package/fesm2022/global-footer.mjs.map +1 -1
- package/fesm2022/hotkey.mjs +13 -15
- package/fesm2022/hotkey.mjs.map +1 -1
- package/fesm2022/loading.mjs +23 -21
- package/fesm2022/loading.mjs.map +1 -1
- package/fesm2022/lodop.mjs +15 -13
- package/fesm2022/lodop.mjs.map +1 -1
- package/fesm2022/media.mjs +30 -30
- package/fesm2022/media.mjs.map +1 -1
- package/fesm2022/notice-icon.mjs +48 -84
- package/fesm2022/notice-icon.mjs.map +1 -1
- package/fesm2022/onboarding.mjs +41 -37
- package/fesm2022/onboarding.mjs.map +1 -1
- package/fesm2022/page-header.mjs +48 -36
- package/fesm2022/page-header.mjs.map +1 -1
- package/fesm2022/pdf.mjs +45 -34
- package/fesm2022/pdf.mjs.map +1 -1
- package/fesm2022/quick-menu.mjs +22 -22
- package/fesm2022/quick-menu.mjs.map +1 -1
- package/fesm2022/result.mjs +17 -16
- package/fesm2022/result.mjs.map +1 -1
- package/fesm2022/reuse-tab.mjs +124 -122
- package/fesm2022/reuse-tab.mjs.map +1 -1
- package/fesm2022/se.mjs +68 -50
- package/fesm2022/se.mjs.map +1 -1
- package/fesm2022/sg.mjs +22 -21
- package/fesm2022/sg.mjs.map +1 -1
- package/fesm2022/st.mjs +445 -419
- package/fesm2022/st.mjs.map +1 -1
- package/fesm2022/sv.mjs +62 -43
- package/fesm2022/sv.mjs.map +1 -1
- package/fesm2022/tag-select.mjs +18 -20
- package/fesm2022/tag-select.mjs.map +1 -1
- package/fesm2022/xlsx.mjs +17 -18
- package/fesm2022/xlsx.mjs.map +1 -1
- package/fesm2022/zip.mjs +7 -6
- package/fesm2022/zip.mjs.map +1 -1
- package/hotkey/hotkey.directive.d.ts +2 -2
- package/notice-icon/notice-icon-tab.component.d.ts +5 -6
- package/notice-icon/notice-icon.component.d.ts +17 -22
- package/package.json +5 -75
- package/reuse-tab/public_api.d.ts +2 -1
- package/st/st-column-source.d.ts +1 -0
- package/st/st-filter.component.d.ts +4 -4
- package/st/st-row.directive.d.ts +1 -1
- package/st/st-widget-host.directive.d.ts +1 -1
- package/st/st.component.d.ts +38 -26
- package/st/st.interfaces.d.ts +26 -4
- package/st/st.module.d.ts +1 -22
- package/st/st.types.d.ts +2 -3
- package/sv/sv-container.component.d.ts +1 -1
- package/esm2022/abc.mjs +0 -5
- package/esm2022/auto-focus/auto-focus.directive.mjs +0 -40
- package/esm2022/auto-focus/auto-focus.mjs +0 -5
- package/esm2022/auto-focus/auto-focus.module.mjs +0 -17
- package/esm2022/auto-focus/index.mjs +0 -3
- package/esm2022/avatar-list/avatar-list-item.component.mjs +0 -27
- package/esm2022/avatar-list/avatar-list.component.mjs +0 -79
- package/esm2022/avatar-list/avatar-list.mjs +0 -5
- package/esm2022/avatar-list/avatar-list.module.mjs +0 -21
- package/esm2022/avatar-list/public_api.mjs +0 -4
- package/esm2022/cell/cell-host.directive.mjs +0 -35
- package/esm2022/cell/cell.component.mjs +0 -289
- package/esm2022/cell/cell.mjs +0 -5
- package/esm2022/cell/cell.module.mjs +0 -55
- package/esm2022/cell/cell.service.mjs +0 -173
- package/esm2022/cell/cell.types.mjs +0 -2
- package/esm2022/cell/index.mjs +0 -7
- package/esm2022/cell/provide.mjs +0 -18
- package/esm2022/count-down/count-down.component.mjs +0 -50
- package/esm2022/count-down/count-down.mjs +0 -5
- package/esm2022/count-down/count-down.module.mjs +0 -19
- package/esm2022/count-down/public_api.mjs +0 -3
- package/esm2022/date-picker/date-picker.mjs +0 -5
- package/esm2022/date-picker/date-picker.module.mjs +0 -21
- package/esm2022/date-picker/public_api.mjs +0 -4
- package/esm2022/date-picker/range-shortcut.component.mjs +0 -34
- package/esm2022/date-picker/range.directive.mjs +0 -168
- package/esm2022/down-file/down-file.directive.mjs +0 -113
- package/esm2022/down-file/down-file.mjs +0 -5
- package/esm2022/down-file/down-file.module.mjs +0 -19
- package/esm2022/down-file/public_api.mjs +0 -3
- package/esm2022/ellipsis/ellipsis.component.mjs +0 -219
- package/esm2022/ellipsis/ellipsis.mjs +0 -5
- package/esm2022/ellipsis/ellipsis.module.mjs +0 -20
- package/esm2022/ellipsis/public_api.mjs +0 -3
- package/esm2022/error-collect/error-collect.component.mjs +0 -110
- package/esm2022/error-collect/error-collect.mjs +0 -5
- package/esm2022/error-collect/error-collect.module.mjs +0 -19
- package/esm2022/error-collect/public_api.mjs +0 -3
- package/esm2022/exception/exception.component.mjs +0 -103
- package/esm2022/exception/exception.mjs +0 -5
- package/esm2022/exception/exception.module.mjs +0 -22
- package/esm2022/exception/public_api.mjs +0 -3
- package/esm2022/footer-toolbar/footer-toolbar.component.mjs +0 -33
- package/esm2022/footer-toolbar/footer-toolbar.mjs +0 -5
- package/esm2022/footer-toolbar/footer-toolbar.module.mjs +0 -20
- package/esm2022/footer-toolbar/public_api.mjs +0 -3
- package/esm2022/full-content/full-content-toggle.directive.mjs +0 -25
- package/esm2022/full-content/full-content.component.mjs +0 -125
- package/esm2022/full-content/full-content.mjs +0 -5
- package/esm2022/full-content/full-content.module.mjs +0 -19
- package/esm2022/full-content/full-content.service.mjs +0 -22
- package/esm2022/full-content/public_api.mjs +0 -5
- package/esm2022/global-footer/global-footer-item.component.mjs +0 -27
- package/esm2022/global-footer/global-footer.component.mjs +0 -65
- package/esm2022/global-footer/global-footer.mjs +0 -5
- package/esm2022/global-footer/global-footer.module.mjs +0 -20
- package/esm2022/global-footer/global-footer.types.mjs +0 -2
- package/esm2022/global-footer/public_api.mjs +0 -5
- package/esm2022/hotkey/hotkey.directive.mjs +0 -36
- package/esm2022/hotkey/hotkey.mjs +0 -5
- package/esm2022/hotkey/hotkey.module.mjs +0 -17
- package/esm2022/hotkey/public_api.mjs +0 -3
- package/esm2022/let/index.mjs +0 -3
- package/esm2022/let/let.directive.mjs +0 -40
- package/esm2022/let/let.mjs +0 -5
- package/esm2022/let/let.module.mjs +0 -20
- package/esm2022/loading/loading.component.mjs +0 -26
- package/esm2022/loading/loading.mjs +0 -5
- package/esm2022/loading/loading.module.mjs +0 -22
- package/esm2022/loading/loading.service.mjs +0 -88
- package/esm2022/loading/loading.types.mjs +0 -2
- package/esm2022/loading/public_api.mjs +0 -5
- package/esm2022/lodop/lodop.mjs +0 -5
- package/esm2022/lodop/lodop.module.mjs +0 -12
- package/esm2022/lodop/lodop.service.mjs +0 -224
- package/esm2022/lodop/lodop.types.mjs +0 -2
- package/esm2022/lodop/public_api.mjs +0 -4
- package/esm2022/media/media.component.mjs +0 -114
- package/esm2022/media/media.mjs +0 -5
- package/esm2022/media/media.module.mjs +0 -18
- package/esm2022/media/media.service.mjs +0 -46
- package/esm2022/media/public_api.mjs +0 -4
- package/esm2022/notice-icon/notice-icon-tab.component.mjs +0 -41
- package/esm2022/notice-icon/notice-icon.component.mjs +0 -96
- package/esm2022/notice-icon/notice-icon.mjs +0 -5
- package/esm2022/notice-icon/notice-icon.module.mjs +0 -59
- package/esm2022/notice-icon/notice-icon.types.mjs +0 -2
- package/esm2022/notice-icon/public_api.mjs +0 -5
- package/esm2022/observers/chart-observer-size.mjs +0 -5
- package/esm2022/observers/observer-size.mjs +0 -117
- package/esm2022/observers/public-api.mjs +0 -2
- package/esm2022/onboarding/onboarding.component.mjs +0 -127
- package/esm2022/onboarding/onboarding.mjs +0 -5
- package/esm2022/onboarding/onboarding.module.mjs +0 -42
- package/esm2022/onboarding/onboarding.service.mjs +0 -192
- package/esm2022/onboarding/onboarding.storage.mjs +0 -17
- package/esm2022/onboarding/onboarding.types.mjs +0 -2
- package/esm2022/onboarding/public_api.mjs +0 -6
- package/esm2022/page-header/page-header.component.mjs +0 -220
- package/esm2022/page-header/page-header.mjs +0 -5
- package/esm2022/page-header/page-header.module.mjs +0 -45
- package/esm2022/page-header/public_api.mjs +0 -3
- package/esm2022/pdf/pdf.component.mjs +0 -449
- package/esm2022/pdf/pdf.config.mjs +0 -10
- package/esm2022/pdf/pdf.mjs +0 -5
- package/esm2022/pdf/pdf.module.mjs +0 -19
- package/esm2022/pdf/pdf.types.mjs +0 -16
- package/esm2022/pdf/public_api.mjs +0 -5
- package/esm2022/public_api.mjs +0 -3
- package/esm2022/quick-menu/public_api.mjs +0 -3
- package/esm2022/quick-menu/quick-menu.component.mjs +0 -81
- package/esm2022/quick-menu/quick-menu.mjs +0 -5
- package/esm2022/quick-menu/quick-menu.module.mjs +0 -20
- package/esm2022/result/public_api.mjs +0 -3
- package/esm2022/result/result.component.mjs +0 -58
- package/esm2022/result/result.mjs +0 -5
- package/esm2022/result/result.module.mjs +0 -23
- package/esm2022/reuse-tab/lifecycle_hooks.mjs +0 -2
- package/esm2022/reuse-tab/provide.mjs +0 -74
- package/esm2022/reuse-tab/public_api.mjs +0 -14
- package/esm2022/reuse-tab/reuse-tab-context-menu.component.mjs +0 -75
- package/esm2022/reuse-tab/reuse-tab-context.component.mjs +0 -30
- package/esm2022/reuse-tab/reuse-tab-context.directive.mjs +0 -36
- package/esm2022/reuse-tab/reuse-tab-context.service.mjs +0 -54
- package/esm2022/reuse-tab/reuse-tab.cache.mjs +0 -13
- package/esm2022/reuse-tab/reuse-tab.component.mjs +0 -337
- package/esm2022/reuse-tab/reuse-tab.interfaces.mjs +0 -33
- package/esm2022/reuse-tab/reuse-tab.mjs +0 -5
- package/esm2022/reuse-tab/reuse-tab.module.mjs +0 -79
- package/esm2022/reuse-tab/reuse-tab.service.mjs +0 -574
- package/esm2022/reuse-tab/reuse-tab.state.mjs +0 -16
- package/esm2022/reuse-tab/reuse-tab.strategy.mjs +0 -23
- package/esm2022/se/public_api.mjs +0 -5
- package/esm2022/se/se-container.component.mjs +0 -158
- package/esm2022/se/se.component.mjs +0 -220
- package/esm2022/se/se.mjs +0 -5
- package/esm2022/se/se.module.mjs +0 -22
- package/esm2022/se/se.types.mjs +0 -14
- package/esm2022/sg/public_api.mjs +0 -4
- package/esm2022/sg/sg-container.component.mjs +0 -44
- package/esm2022/sg/sg.component.mjs +0 -62
- package/esm2022/sg/sg.mjs +0 -5
- package/esm2022/sg/sg.module.mjs +0 -19
- package/esm2022/st/provide.mjs +0 -18
- package/esm2022/st/public_api.mjs +0 -13
- package/esm2022/st/st-column-source.mjs +0 -496
- package/esm2022/st/st-data-source.mjs +0 -507
- package/esm2022/st/st-export.mjs +0 -87
- package/esm2022/st/st-filter.component.mjs +0 -293
- package/esm2022/st/st-row.directive.mjs +0 -43
- package/esm2022/st/st-widget-host.directive.mjs +0 -31
- package/esm2022/st/st-widget.mjs +0 -26
- package/esm2022/st/st.component.mjs +0 -966
- package/esm2022/st/st.config.mjs +0 -79
- package/esm2022/st/st.interfaces.mjs +0 -2
- package/esm2022/st/st.mjs +0 -5
- package/esm2022/st/st.module.mjs +0 -100
- package/esm2022/st/st.types.mjs +0 -2
- package/esm2022/sv/public_api.mjs +0 -5
- package/esm2022/sv/sv-container.component.mjs +0 -127
- package/esm2022/sv/sv-value.component.mjs +0 -53
- package/esm2022/sv/sv.component.mjs +0 -109
- package/esm2022/sv/sv.mjs +0 -5
- package/esm2022/sv/sv.module.mjs +0 -24
- package/esm2022/tag-select/public_api.mjs +0 -3
- package/esm2022/tag-select/tag-select.component.mjs +0 -53
- package/esm2022/tag-select/tag-select.mjs +0 -5
- package/esm2022/tag-select/tag-select.module.mjs +0 -20
- package/esm2022/xlsx/public_api.mjs +0 -5
- package/esm2022/xlsx/xlsx.directive.mjs +0 -28
- package/esm2022/xlsx/xlsx.mjs +0 -5
- package/esm2022/xlsx/xlsx.module.mjs +0 -17
- package/esm2022/xlsx/xlsx.service.mjs +0 -128
- package/esm2022/xlsx/xlsx.types.mjs +0 -2
- package/esm2022/zip/public_api.mjs +0 -3
- package/esm2022/zip/zip.mjs +0 -5
- package/esm2022/zip/zip.service.mjs +0 -116
- package/esm2022/zip/zip.types.mjs +0 -2
- package/fesm2022/let.mjs +0 -64
- package/fesm2022/let.mjs.map +0 -1
- package/let/index.d.ts +0 -2
- package/let/let.directive.d.ts +0 -19
- package/let/let.module.d.ts +0 -10
|
@@ -1,574 +0,0 @@
|
|
|
1
|
-
import { Injectable, Injector, inject } from '@angular/core';
|
|
2
|
-
import { ActivatedRoute, NavigationEnd, NavigationStart, Router, ROUTER_CONFIGURATION } from '@angular/router';
|
|
3
|
-
import { BehaviorSubject, take, timer } from 'rxjs';
|
|
4
|
-
import { MenuService } from '@delon/theme';
|
|
5
|
-
import { ScrollService } from '@delon/util/browser';
|
|
6
|
-
import { REUSE_TAB_CACHED_MANAGER } from './reuse-tab.cache';
|
|
7
|
-
import { ReuseTabMatchMode } from './reuse-tab.interfaces';
|
|
8
|
-
import { REUSE_TAB_STORAGE_KEY, REUSE_TAB_STORAGE_STATE } from './reuse-tab.state';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class ReuseTabService {
|
|
11
|
-
get snapshot() {
|
|
12
|
-
return this.injector.get(ActivatedRoute).snapshot;
|
|
13
|
-
}
|
|
14
|
-
// #region public
|
|
15
|
-
/**
|
|
16
|
-
* Get init status
|
|
17
|
-
*
|
|
18
|
-
* 是否已经初始化完成
|
|
19
|
-
*/
|
|
20
|
-
get inited() {
|
|
21
|
-
return this._inited;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Current routing address
|
|
25
|
-
*
|
|
26
|
-
* 当前路由地址
|
|
27
|
-
*/
|
|
28
|
-
get curUrl() {
|
|
29
|
-
return this.getUrl(this.snapshot);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 允许最多复用多少个页面,取值范围 `2-100`,值发生变更时会强制关闭且忽略可关闭条件
|
|
33
|
-
*/
|
|
34
|
-
set max(value) {
|
|
35
|
-
this._max = Math.min(Math.max(value, 2), 100);
|
|
36
|
-
for (let i = this.cached.list.length; i > this._max; i--) {
|
|
37
|
-
this.cached.list.pop();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
set keepingScroll(value) {
|
|
41
|
-
this._keepingScroll = value;
|
|
42
|
-
this.initScroll();
|
|
43
|
-
}
|
|
44
|
-
get keepingScroll() {
|
|
45
|
-
return this._keepingScroll;
|
|
46
|
-
}
|
|
47
|
-
/** 获取已缓存的路由 */
|
|
48
|
-
get items() {
|
|
49
|
-
return this.cached.list;
|
|
50
|
-
}
|
|
51
|
-
/** 获取当前缓存的路由总数 */
|
|
52
|
-
get count() {
|
|
53
|
-
return this.cached.list.length;
|
|
54
|
-
}
|
|
55
|
-
/** 订阅缓存变更通知 */
|
|
56
|
-
get change() {
|
|
57
|
-
return this._cachedChange.asObservable(); // .pipe(filter(w => w !== null));
|
|
58
|
-
}
|
|
59
|
-
/** 自定义当前标题 */
|
|
60
|
-
set title(value) {
|
|
61
|
-
const url = this.curUrl;
|
|
62
|
-
if (typeof value === 'string')
|
|
63
|
-
value = { text: value };
|
|
64
|
-
this.cached.title[url] = value;
|
|
65
|
-
this.di('update current tag title: ', value);
|
|
66
|
-
this._cachedChange.next({
|
|
67
|
-
active: 'title',
|
|
68
|
-
url,
|
|
69
|
-
title: value,
|
|
70
|
-
list: this.cached.list
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
/** 获取指定路径缓存所在位置,`-1` 表示无缓存 */
|
|
74
|
-
index(url) {
|
|
75
|
-
return this.cached.list.findIndex(w => w.url === url);
|
|
76
|
-
}
|
|
77
|
-
/** 获取指定路径缓存是否存在 */
|
|
78
|
-
exists(url) {
|
|
79
|
-
return this.index(url) !== -1;
|
|
80
|
-
}
|
|
81
|
-
/** 获取指定路径缓存 */
|
|
82
|
-
get(url) {
|
|
83
|
-
return url ? this.cached.list.find(w => w.url === url) || null : null;
|
|
84
|
-
}
|
|
85
|
-
remove(url, includeNonCloseable) {
|
|
86
|
-
const idx = typeof url === 'string' ? this.index(url) : url;
|
|
87
|
-
const item = idx !== -1 ? this.cached.list[idx] : null;
|
|
88
|
-
if (!item || (!includeNonCloseable && !item.closable))
|
|
89
|
-
return false;
|
|
90
|
-
this.destroy(item._handle);
|
|
91
|
-
this.cached.list.splice(idx, 1);
|
|
92
|
-
delete this.cached.title[url];
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 根据URL移除标签
|
|
97
|
-
*
|
|
98
|
-
* @param [includeNonCloseable=false] 是否强制包含不可关闭
|
|
99
|
-
*/
|
|
100
|
-
close(url, includeNonCloseable = false) {
|
|
101
|
-
this.removeUrlBuffer = url;
|
|
102
|
-
this.remove(url, includeNonCloseable);
|
|
103
|
-
this._cachedChange.next({ active: 'close', url, list: this.cached.list });
|
|
104
|
-
this.di('close tag', url);
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* 清除右边
|
|
109
|
-
*
|
|
110
|
-
* @param [includeNonCloseable=false] 是否强制包含不可关闭
|
|
111
|
-
*/
|
|
112
|
-
closeRight(url, includeNonCloseable = false) {
|
|
113
|
-
const start = this.index(url);
|
|
114
|
-
for (let i = this.count - 1; i > start; i--) {
|
|
115
|
-
this.remove(i, includeNonCloseable);
|
|
116
|
-
}
|
|
117
|
-
this.removeUrlBuffer = null;
|
|
118
|
-
this._cachedChange.next({ active: 'closeRight', url, list: this.cached.list });
|
|
119
|
-
this.di('close right tages', url);
|
|
120
|
-
return true;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* 清除所有缓存
|
|
124
|
-
*
|
|
125
|
-
* @param [includeNonCloseable=false] 是否强制包含不可关闭
|
|
126
|
-
*/
|
|
127
|
-
clear(includeNonCloseable = false) {
|
|
128
|
-
this.cached.list.forEach(w => {
|
|
129
|
-
if (!includeNonCloseable && w.closable)
|
|
130
|
-
this.destroy(w._handle);
|
|
131
|
-
});
|
|
132
|
-
this.cached.list = this.cached.list.filter(w => !includeNonCloseable && !w.closable);
|
|
133
|
-
this.removeUrlBuffer = null;
|
|
134
|
-
this._cachedChange.next({ active: 'clear', list: this.cached.list });
|
|
135
|
-
this.di('clear all catch');
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* 移动缓存数据
|
|
139
|
-
*
|
|
140
|
-
* @param url 要移动的URL地址
|
|
141
|
-
* @param position 新位置,下标从 `0` 开始
|
|
142
|
-
*
|
|
143
|
-
* @example
|
|
144
|
-
* ```
|
|
145
|
-
* // source
|
|
146
|
-
* [ '/a/1', '/a/2', '/a/3', '/a/4', '/a/5' ]
|
|
147
|
-
* move('/a/1', 2);
|
|
148
|
-
* // output
|
|
149
|
-
* [ '/a/2', '/a/3', '/a/1', '/a/4', '/a/5' ]
|
|
150
|
-
* move('/a/1', -1);
|
|
151
|
-
* // output
|
|
152
|
-
* [ '/a/2', '/a/3', '/a/4', '/a/5', '/a/1' ]
|
|
153
|
-
* ```
|
|
154
|
-
*/
|
|
155
|
-
move(url, position) {
|
|
156
|
-
const start = this.cached.list.findIndex(w => w.url === url);
|
|
157
|
-
if (start === -1)
|
|
158
|
-
return;
|
|
159
|
-
const data = this.cached.list.slice();
|
|
160
|
-
data.splice(position < 0 ? data.length + position : position, 0, data.splice(start, 1)[0]);
|
|
161
|
-
this.cached.list = data;
|
|
162
|
-
this._cachedChange.next({
|
|
163
|
-
active: 'move',
|
|
164
|
-
url,
|
|
165
|
-
position,
|
|
166
|
-
list: this.cached.list
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* 强制关闭当前路由(包含不可关闭状态),并重新导航至 `newUrl` 路由
|
|
171
|
-
*/
|
|
172
|
-
replace(newUrl) {
|
|
173
|
-
const url = this.curUrl;
|
|
174
|
-
this.injector
|
|
175
|
-
.get(Router)
|
|
176
|
-
.navigateByUrl(newUrl)
|
|
177
|
-
.then(() => {
|
|
178
|
-
if (this.exists(url)) {
|
|
179
|
-
this.close(url, true);
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
this.removeUrlBuffer = url;
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* 获取标题,顺序如下:
|
|
188
|
-
*
|
|
189
|
-
* 1. 组件内使用 `ReuseTabService.title = 'new title'` 重新指定文本
|
|
190
|
-
* 2. 路由配置中 data 属性中包含 titleI18n > title
|
|
191
|
-
* 3. 菜单数据中 text 属性
|
|
192
|
-
*
|
|
193
|
-
* @param url 指定URL
|
|
194
|
-
* @param route 指定路由快照
|
|
195
|
-
*/
|
|
196
|
-
getTitle(url, route) {
|
|
197
|
-
if (this.cached.title[url]) {
|
|
198
|
-
return this.cached.title[url];
|
|
199
|
-
}
|
|
200
|
-
if (route && route.data && (route.data.titleI18n || route.data.title)) {
|
|
201
|
-
return {
|
|
202
|
-
text: route.data.title,
|
|
203
|
-
i18n: route.data.titleI18n
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
const menu = this.getMenu(url);
|
|
207
|
-
return menu ? { text: menu.text, i18n: menu.i18n } : { text: url };
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* 清除标题缓存
|
|
211
|
-
*/
|
|
212
|
-
clearTitleCached() {
|
|
213
|
-
this.cached.title = {};
|
|
214
|
-
}
|
|
215
|
-
/** 自定义当前 `closable` 状态 */
|
|
216
|
-
set closable(value) {
|
|
217
|
-
const url = this.curUrl;
|
|
218
|
-
this.cached.closable[url] = value;
|
|
219
|
-
this.di('update current tag closable: ', value);
|
|
220
|
-
this._cachedChange.next({
|
|
221
|
-
active: 'closable',
|
|
222
|
-
closable: value,
|
|
223
|
-
list: this.cached.list
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* 获取 `closable` 状态,顺序如下:
|
|
228
|
-
*
|
|
229
|
-
* 1. 组件内使用 `ReuseTabService.closable = true` 重新指定 `closable` 状态
|
|
230
|
-
* 2. 路由配置中 data 属性中包含 `reuseClosable`
|
|
231
|
-
* 3. 菜单数据中 `reuseClosable` 属性
|
|
232
|
-
*
|
|
233
|
-
* @param url 指定URL
|
|
234
|
-
* @param route 指定路由快照
|
|
235
|
-
*/
|
|
236
|
-
getClosable(url, route) {
|
|
237
|
-
if (typeof this.cached.closable[url] !== 'undefined')
|
|
238
|
-
return this.cached.closable[url];
|
|
239
|
-
if (route && route.data && typeof route.data.reuseClosable === 'boolean')
|
|
240
|
-
return route.data.reuseClosable;
|
|
241
|
-
const menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
|
|
242
|
-
if (menu && typeof menu.reuseClosable === 'boolean')
|
|
243
|
-
return menu.reuseClosable;
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* 清空 `closable` 缓存
|
|
248
|
-
*/
|
|
249
|
-
clearClosableCached() {
|
|
250
|
-
this.cached.closable = {};
|
|
251
|
-
}
|
|
252
|
-
getTruthRoute(route) {
|
|
253
|
-
let next = route;
|
|
254
|
-
while (next.firstChild)
|
|
255
|
-
next = next.firstChild;
|
|
256
|
-
return next;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* 根据快照获取URL地址
|
|
260
|
-
*/
|
|
261
|
-
getUrl(route) {
|
|
262
|
-
let next = this.getTruthRoute(route);
|
|
263
|
-
const segments = [];
|
|
264
|
-
while (next) {
|
|
265
|
-
segments.push(next.url.join('/'));
|
|
266
|
-
next = next.parent;
|
|
267
|
-
}
|
|
268
|
-
const url = `/${segments
|
|
269
|
-
.filter(i => i)
|
|
270
|
-
.reverse()
|
|
271
|
-
.join('/')}`;
|
|
272
|
-
return url;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* 检查快照是否允许被复用
|
|
276
|
-
*/
|
|
277
|
-
can(route) {
|
|
278
|
-
const url = this.getUrl(route);
|
|
279
|
-
if (url === this.removeUrlBuffer)
|
|
280
|
-
return false;
|
|
281
|
-
if (route.data && typeof route.data.reuse === 'boolean')
|
|
282
|
-
return route.data.reuse;
|
|
283
|
-
if (this.mode !== ReuseTabMatchMode.URL) {
|
|
284
|
-
const menu = this.getMenu(url);
|
|
285
|
-
if (!menu)
|
|
286
|
-
return false;
|
|
287
|
-
if (this.mode === ReuseTabMatchMode.Menu) {
|
|
288
|
-
if (menu.reuse === false)
|
|
289
|
-
return false;
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
if (!menu.reuse || menu.reuse !== true)
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
return true;
|
|
296
|
-
}
|
|
297
|
-
return !this.isExclude(url);
|
|
298
|
-
}
|
|
299
|
-
isExclude(url) {
|
|
300
|
-
return this.excludes.findIndex(r => r.test(url)) !== -1;
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* 刷新,触发一个 refresh 类型事件
|
|
304
|
-
*/
|
|
305
|
-
refresh(data) {
|
|
306
|
-
this._cachedChange.next({ active: 'refresh', data });
|
|
307
|
-
}
|
|
308
|
-
// #endregion
|
|
309
|
-
// #region privates
|
|
310
|
-
destroy(_handle) {
|
|
311
|
-
if (_handle && _handle.componentRef && _handle.componentRef.destroy)
|
|
312
|
-
_handle.componentRef.destroy();
|
|
313
|
-
}
|
|
314
|
-
di(...args) {
|
|
315
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
316
|
-
if (!this.debug)
|
|
317
|
-
return;
|
|
318
|
-
console.warn(...args);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
// #endregion
|
|
322
|
-
constructor() {
|
|
323
|
-
this.injector = inject(Injector);
|
|
324
|
-
this.menuService = inject(MenuService);
|
|
325
|
-
this.cached = inject(REUSE_TAB_CACHED_MANAGER);
|
|
326
|
-
this.stateKey = inject(REUSE_TAB_STORAGE_KEY);
|
|
327
|
-
this.stateSrv = inject(REUSE_TAB_STORAGE_STATE);
|
|
328
|
-
this._inited = false;
|
|
329
|
-
this._max = 10;
|
|
330
|
-
this._keepingScroll = false;
|
|
331
|
-
this._cachedChange = new BehaviorSubject(null);
|
|
332
|
-
this.removeUrlBuffer = null;
|
|
333
|
-
this.positionBuffer = {};
|
|
334
|
-
this.debug = false;
|
|
335
|
-
this.routeParamMatchMode = 'strict';
|
|
336
|
-
this.mode = ReuseTabMatchMode.Menu;
|
|
337
|
-
/** 排除规则,限 `mode=URL` */
|
|
338
|
-
this.excludes = [];
|
|
339
|
-
this.storageState = false;
|
|
340
|
-
if (this.cached == null) {
|
|
341
|
-
this.cached = { list: [], title: {}, closable: {} };
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
init() {
|
|
345
|
-
this.initScroll();
|
|
346
|
-
this._inited = true;
|
|
347
|
-
this.loadState();
|
|
348
|
-
}
|
|
349
|
-
loadState() {
|
|
350
|
-
if (!this.storageState)
|
|
351
|
-
return;
|
|
352
|
-
this.cached.list = this.stateSrv.get(this.stateKey).map(v => ({
|
|
353
|
-
title: { text: v.title },
|
|
354
|
-
url: v.url,
|
|
355
|
-
position: v.position
|
|
356
|
-
}));
|
|
357
|
-
this._cachedChange.next({ active: 'loadState' });
|
|
358
|
-
}
|
|
359
|
-
getMenu(url) {
|
|
360
|
-
const menus = this.menuService.getPathByUrl(url);
|
|
361
|
-
if (!menus || menus.length === 0)
|
|
362
|
-
return null;
|
|
363
|
-
return menus.pop();
|
|
364
|
-
}
|
|
365
|
-
runHook(method, comp, type = 'init') {
|
|
366
|
-
if (typeof comp === 'number') {
|
|
367
|
-
const item = this.cached.list[comp];
|
|
368
|
-
comp = item._handle?.componentRef;
|
|
369
|
-
}
|
|
370
|
-
if (comp == null || !comp.instance) {
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
const compThis = comp.instance;
|
|
374
|
-
const fn = compThis[method];
|
|
375
|
-
if (typeof fn !== 'function') {
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
if (method === '_onReuseInit') {
|
|
379
|
-
fn.call(compThis, type);
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
fn.call(compThis);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
hasInValidRoute(route) {
|
|
386
|
-
return !route.routeConfig || !!route.routeConfig.loadChildren || !!route.routeConfig.children;
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* 决定是否允许路由复用,若 `true` 会触发 `store`
|
|
390
|
-
*/
|
|
391
|
-
shouldDetach(route) {
|
|
392
|
-
if (this.hasInValidRoute(route))
|
|
393
|
-
return false;
|
|
394
|
-
this.di('#shouldDetach', this.can(route), this.getUrl(route));
|
|
395
|
-
return this.can(route);
|
|
396
|
-
}
|
|
397
|
-
saveCache(snapshot, _handle, pos) {
|
|
398
|
-
const snapshotTrue = this.getTruthRoute(snapshot);
|
|
399
|
-
const url = this.getUrl(snapshot);
|
|
400
|
-
const idx = this.index(url);
|
|
401
|
-
const item = {
|
|
402
|
-
title: this.getTitle(url, snapshotTrue),
|
|
403
|
-
url,
|
|
404
|
-
closable: this.getClosable(url, snapshot),
|
|
405
|
-
_snapshot: snapshot,
|
|
406
|
-
_handle
|
|
407
|
-
};
|
|
408
|
-
if (idx < 0) {
|
|
409
|
-
this.items.splice(pos ?? this.items.length, 0, item);
|
|
410
|
-
if (this.count > this._max) {
|
|
411
|
-
// Get the oldest closable location
|
|
412
|
-
const closeIdx = this.items.findIndex(w => w.url !== url && w.closable);
|
|
413
|
-
if (closeIdx !== -1) {
|
|
414
|
-
const closeItem = this.items[closeIdx];
|
|
415
|
-
this.remove(closeIdx, false);
|
|
416
|
-
timer(1)
|
|
417
|
-
.pipe(take(1))
|
|
418
|
-
.subscribe(() => this._cachedChange.next({ active: 'close', url: closeItem.url, list: this.cached.list }));
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
this.items[idx] = item;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
/**
|
|
427
|
-
* 存储
|
|
428
|
-
*/
|
|
429
|
-
store(_snapshot, _handle) {
|
|
430
|
-
const url = this.getUrl(_snapshot);
|
|
431
|
-
if (_handle != null) {
|
|
432
|
-
this.saveCache(_snapshot, _handle);
|
|
433
|
-
}
|
|
434
|
-
const list = this.cached.list;
|
|
435
|
-
const item = {
|
|
436
|
-
title: this.getTitle(url, _snapshot),
|
|
437
|
-
closable: this.getClosable(url, _snapshot),
|
|
438
|
-
position: this.getKeepingScroll(url, _snapshot) ? this.positionBuffer[url] : null,
|
|
439
|
-
url,
|
|
440
|
-
_snapshot,
|
|
441
|
-
_handle
|
|
442
|
-
};
|
|
443
|
-
const idx = this.index(url);
|
|
444
|
-
// Current handler is null when activate routes
|
|
445
|
-
// For better reliability, we need to wait for the component to be attached before call _onReuseInit
|
|
446
|
-
const cahcedComponentRef = list[idx]?._handle?.componentRef;
|
|
447
|
-
if (_handle == null && cahcedComponentRef != null) {
|
|
448
|
-
timer(100)
|
|
449
|
-
.pipe(take(1))
|
|
450
|
-
.subscribe(() => this.runHook('_onReuseInit', cahcedComponentRef));
|
|
451
|
-
}
|
|
452
|
-
list[idx] = item;
|
|
453
|
-
this.removeUrlBuffer = null;
|
|
454
|
-
this.di('#store', '[override]', url);
|
|
455
|
-
if (_handle && _handle.componentRef) {
|
|
456
|
-
this.runHook('_onReuseDestroy', _handle.componentRef);
|
|
457
|
-
}
|
|
458
|
-
this._cachedChange.next({ active: 'override', item, list });
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* 决定是否允许应用缓存数据
|
|
462
|
-
*/
|
|
463
|
-
shouldAttach(route) {
|
|
464
|
-
if (this.hasInValidRoute(route))
|
|
465
|
-
return false;
|
|
466
|
-
const url = this.getUrl(route);
|
|
467
|
-
const data = this.get(url);
|
|
468
|
-
const ret = !!(data && data._handle);
|
|
469
|
-
this.di('#shouldAttach', ret, url);
|
|
470
|
-
if (!ret) {
|
|
471
|
-
this._cachedChange.next({ active: 'add', url, list: this.cached.list });
|
|
472
|
-
}
|
|
473
|
-
return ret;
|
|
474
|
-
}
|
|
475
|
-
/**
|
|
476
|
-
* 提取复用数据
|
|
477
|
-
*/
|
|
478
|
-
retrieve(route) {
|
|
479
|
-
if (this.hasInValidRoute(route))
|
|
480
|
-
return null;
|
|
481
|
-
const url = this.getUrl(route);
|
|
482
|
-
const data = this.get(url);
|
|
483
|
-
const ret = (data && data._handle) || null;
|
|
484
|
-
this.di('#retrieve', url, ret);
|
|
485
|
-
return ret;
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* 决定是否应该进行复用路由处理
|
|
489
|
-
*/
|
|
490
|
-
shouldReuseRoute(future, curr) {
|
|
491
|
-
let ret = future.routeConfig === curr.routeConfig;
|
|
492
|
-
if (!ret)
|
|
493
|
-
return false;
|
|
494
|
-
const path = ((future.routeConfig && future.routeConfig.path) || '');
|
|
495
|
-
if (path.length > 0 && ~path.indexOf(':')) {
|
|
496
|
-
if (this.routeParamMatchMode === 'strict') {
|
|
497
|
-
ret = this.getUrl(future) === this.getUrl(curr);
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
ret = path === ((curr.routeConfig && curr.routeConfig.path) || '');
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
this.di('=====================');
|
|
504
|
-
this.di('#shouldReuseRoute', ret, `${this.getUrl(curr)}=>${this.getUrl(future)}`, future, curr);
|
|
505
|
-
return ret;
|
|
506
|
-
}
|
|
507
|
-
// #region scroll
|
|
508
|
-
/**
|
|
509
|
-
* 获取 `keepingScroll` 状态,顺序如下:
|
|
510
|
-
*
|
|
511
|
-
* 1. 路由配置中 data 属性中包含 `keepingScroll`
|
|
512
|
-
* 2. 菜单数据中 `keepingScroll` 属性
|
|
513
|
-
* 3. 组件 `keepingScroll` 值
|
|
514
|
-
*/
|
|
515
|
-
getKeepingScroll(url, route) {
|
|
516
|
-
if (route && route.data && typeof route.data.keepingScroll === 'boolean')
|
|
517
|
-
return route.data.keepingScroll;
|
|
518
|
-
const menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
|
|
519
|
-
if (menu && typeof menu.keepingScroll === 'boolean')
|
|
520
|
-
return menu.keepingScroll;
|
|
521
|
-
return this.keepingScroll;
|
|
522
|
-
}
|
|
523
|
-
get isDisabledInRouter() {
|
|
524
|
-
const routerConfig = this.injector.get(ROUTER_CONFIGURATION, {});
|
|
525
|
-
return routerConfig.scrollPositionRestoration === 'disabled';
|
|
526
|
-
}
|
|
527
|
-
get ss() {
|
|
528
|
-
return this.injector.get(ScrollService);
|
|
529
|
-
}
|
|
530
|
-
initScroll() {
|
|
531
|
-
if (this._router$) {
|
|
532
|
-
this._router$.unsubscribe();
|
|
533
|
-
}
|
|
534
|
-
this._router$ = this.injector.get(Router).events.subscribe(e => {
|
|
535
|
-
if (e instanceof NavigationStart) {
|
|
536
|
-
const url = this.curUrl;
|
|
537
|
-
if (this.getKeepingScroll(url, this.getTruthRoute(this.snapshot))) {
|
|
538
|
-
this.positionBuffer[url] = this.ss.getScrollPosition(this.keepingScrollContainer);
|
|
539
|
-
}
|
|
540
|
-
else {
|
|
541
|
-
delete this.positionBuffer[url];
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
else if (e instanceof NavigationEnd) {
|
|
545
|
-
const url = this.curUrl;
|
|
546
|
-
const item = this.get(url);
|
|
547
|
-
if (item && item.position && this.getKeepingScroll(url, this.getTruthRoute(this.snapshot))) {
|
|
548
|
-
if (this.isDisabledInRouter) {
|
|
549
|
-
this.ss.scrollToPosition(this.keepingScrollContainer, item.position);
|
|
550
|
-
}
|
|
551
|
-
else {
|
|
552
|
-
setTimeout(() => this.ss.scrollToPosition(this.keepingScrollContainer, item.position), 1);
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
// #endregion
|
|
559
|
-
ngOnDestroy() {
|
|
560
|
-
const { _cachedChange, _router$ } = this;
|
|
561
|
-
this.clear();
|
|
562
|
-
this.cached.list = [];
|
|
563
|
-
_cachedChange.complete();
|
|
564
|
-
if (_router$) {
|
|
565
|
-
_router$.unsubscribe();
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ReuseTabService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
569
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ReuseTabService }); }
|
|
570
|
-
}
|
|
571
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ReuseTabService, decorators: [{
|
|
572
|
-
type: Injectable
|
|
573
|
-
}], ctorParameters: () => [] });
|
|
574
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV1c2UtdGFiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hYmMvcmV1c2UtdGFiL3JldXNlLXRhYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsY0FBYyxFQUdkLGFBQWEsRUFDYixlQUFlLEVBQ2YsTUFBTSxFQUNOLG9CQUFvQixFQUNyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxlQUFlLEVBQWMsSUFBSSxFQUFFLEtBQUssRUFBa0IsTUFBTSxNQUFNLENBQUM7QUFFaEYsT0FBTyxFQUFRLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0QsT0FBTyxFQUtMLGlCQUFpQixFQUlsQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUduRixNQUFNLE9BQU8sZUFBZTtJQXNCMUIsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3BELENBQUM7SUFFRCxpQkFBaUI7SUFFakI7Ozs7T0FJRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lB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SUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDM0YsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2RSxDQUFDO3lCQUFNLENBQUM7d0JBQ04sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxRQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDN0YsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7SUFFYixXQUFXO1FBQ1QsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV6QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDOzhHQXBsQlUsZUFBZTtrSEFBZixlQUFlOzsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE9uRGVzdHJveSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZSxcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgRXh0cmFPcHRpb25zLFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uU3RhcnQsXG4gIFJvdXRlcixcbiAgUk9VVEVSX0NPTkZJR1VSQVRJT05cbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgdGFrZSwgdGltZXIsIFVuc3Vic2NyaWJhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE1lbnUsIE1lbnVTZXJ2aWNlIH0gZnJvbSAnQGRlbG9uL3RoZW1lJztcbmltcG9ydCB7IFNjcm9sbFNlcnZpY2UgfSBmcm9tICdAZGVsb24vdXRpbC9icm93c2VyJztcbmltcG9ydCB0eXBlIHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcblxuaW1wb3J0IHsgUkVVU0VfVEFCX0NBQ0hFRF9NQU5BR0VSIH0gZnJvbSAnLi9yZXVzZS10YWIuY2FjaGUnO1xuaW1wb3J0IHtcbiAgUmV1c2VDb21wb25lbnRSZWYsXG4gIFJldXNlSG9va09uUmV1c2VJbml0VHlwZSxcbiAgUmV1c2VIb29rVHlwZXMsXG4gIFJldXNlVGFiQ2FjaGVkLFxuICBSZXVzZVRhYk1hdGNoTW9kZSxcbiAgUmV1c2VUYWJOb3RpZnksXG4gIFJldXNlVGFiUm91dGVQYXJhbU1hdGNoTW9kZSxcbiAgUmV1c2VUaXRsZVxufSBmcm9tICcuL3JldXNlLXRhYi5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJFVVNFX1RBQl9TVE9SQUdFX0tFWSwgUkVVU0VfVEFCX1NUT1JBR0VfU1RBVEUgfSBmcm9tICcuL3JldXNlLXRhYi5zdGF0ZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXVzZVRhYlNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW51U2VydmljZSA9IGluamVjdChNZW51U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVkID0gaW5qZWN0KFJFVVNFX1RBQl9DQUNIRURfTUFOQUdFUik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVLZXkgPSBpbmplY3QoUkVVU0VfVEFCX1NUT1JBR0VfS0VZKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNydiA9IGluamVjdChSRVVTRV9UQUJfU1RPUkFHRV9TVEFURSk7XG5cbiAgcHJpdmF0ZSBfaW5pdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX21heCA9IDEwO1xuICBwcml2YXRlIF9rZWVwaW5nU2Nyb2xsID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhY2hlZENoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmV1c2VUYWJOb3RpZnkgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfcm91dGVyJD86IFVuc3Vic2NyaWJhYmxlO1xuICBwcml2YXRlIHJlbW92ZVVybEJ1ZmZlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9zaXRpb25CdWZmZXI6IHsgW3VybDogc3RyaW5nXTogW251bWJlciwgbnVtYmVyXSB9ID0ge307XG4gIGNvbXBvbmVudFJlZj86IFJldXNlQ29tcG9uZW50UmVmO1xuICBkZWJ1ZyA9IGZhbHNlO1xuICByb3V0ZVBhcmFtTWF0Y2hNb2RlOiBSZXVzZVRhYlJvdXRlUGFyYW1NYXRjaE1vZGUgPSAnc3RyaWN0JztcbiAgbW9kZSA9IFJldXNlVGFiTWF0Y2hNb2RlLk1lbnU7XG4gIC8qKiDmjpLpmaTop4TliJnvvIzpmZAgYG1vZGU9VVJMYCAqL1xuICBleGNsdWRlczogUmVnRXhwW10gPSBbXTtcbiAgc3RvcmFnZVN0YXRlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBnZXQgc25hcHNob3QoKTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKS5zbmFwc2hvdDtcbiAgfVxuXG4gIC8vICNyZWdpb24gcHVibGljXG5cbiAgLyoqXG4gICAqIEdldCBpbml0IHN0YXR1c1xuICAgKlxuICAgKiDmmK/lkKblt7Lnu4/liJ3lp4vljJblrozmiJBcbiAgICovXG4gIGdldCBpbml0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHJvdXRpbmcgYWRkcmVzc1xuICAgKlxuICAgKiDlvZPliY3ot6/nlLHlnLDlnYBcbiAgICovXG4gIGdldCBjdXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcmwodGhpcy5zbmFwc2hvdCk7XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645pyA5aSa5aSN55So5aSa5bCR5Liq6aG16Z2i77yM5Y+W5YC86IyD5Zu0IGAyLTEwMGDvvIzlgLzlj5HnlJ/lj5jmm7Tml7bkvJrlvLrliLblhbPpl63kuJTlv73nlaXlj6/lhbPpl63mnaHku7ZcbiAgICovXG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCAyKSwgMTAwKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5jYWNoZWQubGlzdC5sZW5ndGg7IGkgPiB0aGlzLl9tYXg7IGktLSkge1xuICAgICAgdGhpcy5jYWNoZWQubGlzdC5wb3AoKTtcbiAgICB9XG4gIH1cbiAgc2V0IGtlZXBpbmdTY3JvbGwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9rZWVwaW5nU2Nyb2xsID0gdmFsdWU7XG4gICAgdGhpcy5pbml0U2Nyb2xsKCk7XG4gIH1cbiAgZ2V0IGtlZXBpbmdTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2tlZXBpbmdTY3JvbGw7XG4gIH1cbiAga2VlcGluZ1Njcm9sbENvbnRhaW5lcj86IEVsZW1lbnQgfCBudWxsO1xuICAvKiog6I635Y+W5bey57yT5a2Y55qE6Lev55SxICovXG4gIGdldCBpdGVtcygpOiBSZXVzZVRhYkNhY2hlZFtdIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWQubGlzdDtcbiAgfVxuICAvKiog6I635Y+W5b2T5YmN57yT5a2Y55qE6Lev55Sx5oC75pWwICovXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhY2hlZC5saXN0Lmxlbmd0aDtcbiAgfVxuICAvKiog6K6i6ZiF57yT5a2Y5Y+Y5pu06YCa55+lICovXG4gIGdldCBjaGFuZ2UoKTogT2JzZXJ2YWJsZTxSZXVzZVRhYk5vdGlmeSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpOyAvLyAucGlwZShmaWx0ZXIodyA9PiB3ICE9PSBudWxsKSk7XG4gIH1cbiAgLyoqIOiHquWumuS5ieW9k+WJjeagh+mimCAqL1xuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZyB8IFJldXNlVGl0bGUpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmN1clVybDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgdmFsdWUgPSB7IHRleHQ6IHZhbHVlIH07XG4gICAgdGhpcy5jYWNoZWQudGl0bGVbdXJsXSA9IHZhbHVlO1xuICAgIHRoaXMuZGkoJ3VwZGF0ZSBjdXJyZW50IHRhZyB0aXRsZTogJywgdmFsdWUpO1xuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHtcbiAgICAgIGFjdGl2ZTogJ3RpdGxlJyxcbiAgICAgIHVybCxcbiAgICAgIHRpdGxlOiB2YWx1ZSxcbiAgICAgIGxpc3Q6IHRoaXMuY2FjaGVkLmxpc3RcbiAgICB9KTtcbiAgfVxuICAvKiog6I635Y+W5oyH5a6a6Lev5b6E57yT5a2Y5omA5Zyo5L2N572u77yMYC0xYCDooajnpLrml6DnvJPlrZggKi9cbiAgaW5kZXgodXJsOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhY2hlZC5saXN0LmZpbmRJbmRleCh3ID0+IHcudXJsID09PSB1cmwpO1xuICB9XG4gIC8qKiDojrflj5bmjIflrprot6/lvoTnvJPlrZjmmK/lkKblrZjlnKggKi9cbiAgZXhpc3RzKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgodXJsKSAhPT0gLTE7XG4gIH1cbiAgLyoqIOiOt+WPluaMh+Wumui3r+W+hOe8k+WtmCAqL1xuICBnZXQodXJsPzogc3RyaW5nKTogUmV1c2VUYWJDYWNoZWQgfCBudWxsIHtcbiAgICByZXR1cm4gdXJsID8gdGhpcy5jYWNoZWQubGlzdC5maW5kKHcgPT4gdy51cmwgPT09IHVybCkgfHwgbnVsbCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmUodXJsOiBzdHJpbmcgfCBudW1iZXIsIGluY2x1ZGVOb25DbG9zZWFibGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBpZHggPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHRoaXMuaW5kZXgodXJsKSA6IHVybDtcbiAgICBjb25zdCBpdGVtID0gaWR4ICE9PSAtMSA/IHRoaXMuY2FjaGVkLmxpc3RbaWR4XSA6IG51bGw7XG4gICAgaWYgKCFpdGVtIHx8ICghaW5jbHVkZU5vbkNsb3NlYWJsZSAmJiAhaXRlbS5jbG9zYWJsZSkpIHJldHVybiBmYWxzZTtcblxuICAgIHRoaXMuZGVzdHJveShpdGVtLl9oYW5kbGUpO1xuXG4gICAgdGhpcy5jYWNoZWQubGlzdC5zcGxpY2UoaWR4LCAxKTtcbiAgICBkZWxldGUgdGhpcy5jYWNoZWQudGl0bGVbdXJsXTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICog5qC55o2uVVJM56e76Zmk5qCH562+XG4gICAqXG4gICAqIEBwYXJhbSBbaW5jbHVkZU5vbkNsb3NlYWJsZT1mYWxzZV0g5piv5ZCm5by65Yi25YyF5ZCr5LiN5Y+v5YWz6ZetXG4gICAqL1xuICBjbG9zZSh1cmw6IHN0cmluZywgaW5jbHVkZU5vbkNsb3NlYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZW1vdmVVcmxCdWZmZXIgPSB1cmw7XG5cbiAgICB0aGlzLnJlbW92ZSh1cmwsIGluY2x1ZGVOb25DbG9zZWFibGUpO1xuXG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdjbG9zZScsIHVybCwgbGlzdDogdGhpcy5jYWNoZWQubGlzdCB9KTtcblxuICAgIHRoaXMuZGkoJ2Nsb3NlIHRhZycsIHVybCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIOa4hemZpOWPs+i+uVxuICAgKlxuICAgKiBAcGFyYW0gW2luY2x1ZGVOb25DbG9zZWFibGU9ZmFsc2VdIOaYr+WQpuW8uuWItuWMheWQq+S4jeWPr+WFs+mXrVxuICAgKi9cbiAgY2xvc2VSaWdodCh1cmw6IHN0cmluZywgaW5jbHVkZU5vbkNsb3NlYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4KHVybCk7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMuY291bnQgLSAxOyBpID4gc3RhcnQ7IGktLSkge1xuICAgICAgdGhpcy5yZW1vdmUoaSwgaW5jbHVkZU5vbkNsb3NlYWJsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVVcmxCdWZmZXIgPSBudWxsO1xuXG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdjbG9zZVJpZ2h0JywgdXJsLCBsaXN0OiB0aGlzLmNhY2hlZC5saXN0IH0pO1xuXG4gICAgdGhpcy5kaSgnY2xvc2UgcmlnaHQgdGFnZXMnLCB1cmwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiDmuIXpmaTmiYDmnInnvJPlrZhcbiAgICpcbiAgICogQHBhcmFtIFtpbmNsdWRlTm9uQ2xvc2VhYmxlPWZhbHNlXSDmmK/lkKblvLrliLbljIXlkKvkuI3lj6/lhbPpl61cbiAgICovXG4gIGNsZWFyKGluY2x1ZGVOb25DbG9zZWFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGVkLmxpc3QuZm9yRWFjaCh3ID0+IHtcbiAgICAgIGlmICghaW5jbHVkZU5vbkNsb3NlYWJsZSAmJiB3LmNsb3NhYmxlKSB0aGlzLmRlc3Ryb3kody5faGFuZGxlKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhY2hlZC5saXN0ID0gdGhpcy5jYWNoZWQubGlzdC5maWx0ZXIodyA9PiAhaW5jbHVkZU5vbkNsb3NlYWJsZSAmJiAhdy5jbG9zYWJsZSk7XG5cbiAgICB0aGlzLnJlbW92ZVVybEJ1ZmZlciA9IG51bGw7XG5cbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ2NsZWFyJywgbGlzdDogdGhpcy5jYWNoZWQubGlzdCB9KTtcblxuICAgIHRoaXMuZGkoJ2NsZWFyIGFsbCBjYXRjaCcpO1xuICB9XG4gIC8qKlxuICAgKiDnp7vliqjnvJPlrZjmlbDmja5cbiAgICpcbiAgICogQHBhcmFtIHVybCDopoHnp7vliqjnmoRVUkzlnLDlnYBcbiAgICogQHBhcmFtIHBvc2l0aW9uIOaWsOS9jee9ru+8jOS4i+agh+S7jiBgMGAg5byA5aeLXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiAvLyBzb3VyY2VcbiAgICogWyAnL2EvMScsICcvYS8yJywgJy9hLzMnLCAnL2EvNCcsICcvYS81JyBdXG4gICAqIG1vdmUoJy9hLzEnLCAyKTtcbiAgICogLy8gb3V0cHV0XG4gICAqIFsgJy9hLzInLCAnL2EvMycsICcvYS8xJywgJy9hLzQnLCAnL2EvNScgXVxuICAgKiBtb3ZlKCcvYS8xJywgLTEpO1xuICAgKiAvLyBvdXRwdXRcbiAgICogWyAnL2EvMicsICcvYS8zJywgJy9hLzQnLCAnL2EvNScsICcvYS8xJyBdXG4gICAqIGBgYFxuICAgKi9cbiAgbW92ZSh1cmw6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jYWNoZWQubGlzdC5maW5kSW5kZXgodyA9PiB3LnVybCA9PT0gdXJsKTtcbiAgICBpZiAoc3RhcnQgPT09IC0xKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2FjaGVkLmxpc3Quc2xpY2UoKTtcbiAgICBkYXRhLnNwbGljZShwb3NpdGlvbiA8IDAgPyBkYXRhLmxlbmd0aCArIHBvc2l0aW9uIDogcG9zaXRpb24sIDAsIGRhdGEuc3BsaWNlKHN0YXJ0LCAxKVswXSk7XG4gICAgdGhpcy5jYWNoZWQubGlzdCA9IGRhdGE7XG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoe1xuICAgICAgYWN0aXZlOiAnbW92ZScsXG4gICAgICB1cmwsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGxpc3Q6IHRoaXMuY2FjaGVkLmxpc3RcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICog5by65Yi25YWz6Zet5b2T5YmN6Lev55Sx77yI5YyF5ZCr5LiN5Y+v5YWz6Zet54q25oCB77yJ77yM5bm26YeN5paw5a+86Iiq6IezIGBuZXdVcmxgIOi3r+eUsVxuICAgKi9cbiAgcmVwbGFjZShuZXdVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgIHRoaXMuaW5qZWN0b3JcbiAgICAgIC5nZXQoUm91dGVyKVxuICAgICAgLm5hdmlnYXRlQnlVcmwobmV3VXJsKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5leGlzdHModXJsKSkge1xuICAgICAgICAgIHRoaXMuY2xvc2UodXJsLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVVybEJ1ZmZlciA9IHVybDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIOiOt+WPluagh+mimO+8jOmhuuW6j+WmguS4i++8mlxuICAgKlxuICAgKiAxLiDnu4Tku7blhoXkvb/nlKggYFJldXNlVGFiU2VydmljZS50aXRsZSA9ICduZXcgdGl0bGUnYCDph43mlrDmjIflrprmlofmnKxcbiAgICogMi4g6Lev55Sx6YWN572u5LitIGRhdGEg5bGe5oCn5Lit5YyF5ZCrIHRpdGxlSTE4biA+IHRpdGxlXG4gICAqIDMuIOiPnOWNleaVsOaNruS4rSB0ZXh0IOWxnuaAp1xuICAgKlxuICAgKiBAcGFyYW0gdXJsIOaMh+WumlVSTFxuICAgKiBAcGFyYW0gcm91dGUg5oyH5a6a6Lev55Sx5b+r54WnXG4gICAqL1xuICBnZXRUaXRsZSh1cmw6IHN0cmluZywgcm91dGU/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogUmV1c2VUaXRsZSB7XG4gICAgaWYgKHRoaXMuY2FjaGVkLnRpdGxlW3VybF0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZC50aXRsZVt1cmxdO1xuICAgIH1cblxuICAgIGlmIChyb3V0ZSAmJiByb3V0ZS5kYXRhICYmIChyb3V0ZS5kYXRhLnRpdGxlSTE4biB8fCByb3V0ZS5kYXRhLnRpdGxlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogcm91dGUuZGF0YS50aXRsZSxcbiAgICAgICAgaTE4bjogcm91dGUuZGF0YS50aXRsZUkxOG5cbiAgICAgIH0gYXMgUmV1c2VUaXRsZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5nZXRNZW51KHVybCk7XG4gICAgcmV0dXJuIG1lbnUgPyB7IHRleHQ6IG1lbnUudGV4dCwgaTE4bjogbWVudS5pMThuIH0gOiB7IHRleHQ6IHVybCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOagh+mimOe8k+WtmFxuICAgKi9cbiAgY2xlYXJUaXRsZUNhY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZC50aXRsZSA9IHt9O1xuICB9XG4gIC8qKiDoh6rlrprkuYnlvZPliY0gYGNsb3NhYmxlYCDnirbmgIEgKi9cbiAgc2V0IGNsb3NhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jdXJVcmw7XG4gICAgdGhpcy5jYWNoZWQuY2xvc2FibGVbdXJsXSA9IHZhbHVlO1xuICAgIHRoaXMuZGkoJ3VwZGF0ZSBjdXJyZW50IHRhZyBjbG9zYWJsZTogJywgdmFsdWUpO1xuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHtcbiAgICAgIGFjdGl2ZTogJ2Nsb3NhYmxlJyxcbiAgICAgIGNsb3NhYmxlOiB2YWx1ZSxcbiAgICAgIGxpc3Q6IHRoaXMuY2FjaGVkLmxpc3RcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICog6I635Y+WIGBjbG9zYWJsZWAg54q25oCB77yM6aG65bqP5aaC5LiL77yaXG4gICAqXG4gICAqIDEuIOe7hOS7tuWGheS9v+eUqCBgUmV1c2VUYWJTZXJ2aWNlLmNsb3NhYmxlID0gdHJ1ZWAg6YeN5paw5oyH5a6aIGBjbG9zYWJsZWAg54q25oCBXG4gICAqIDIuIOi3r+eUsemFjee9ruS4rSBkYXRhIOWxnuaAp+S4reWMheWQqyBgcmV1c2VDbG9zYWJsZWBcbiAgICogMy4g6I+c5Y2V5pWw5o2u5LitIGByZXVzZUNsb3NhYmxlYCDlsZ7mgKdcbiAgICpcbiAgICogQHBhcmFtIHVybCDmjIflrppVUkxcbiAgICogQHBhcmFtIHJvdXRlIOaMh+Wumui3r+eUseW/q+eFp1xuICAgKi9cbiAgZ2V0Q2xvc2FibGUodXJsOiBzdHJpbmcsIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5jYWNoZWQuY2xvc2FibGVbdXJsXSAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiB0aGlzLmNhY2hlZC5jbG9zYWJsZVt1cmxdO1xuXG4gICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEgJiYgdHlwZW9mIHJvdXRlLmRhdGEucmV1c2VDbG9zYWJsZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcm91dGUuZGF0YS5yZXVzZUNsb3NhYmxlO1xuXG4gICAgY29uc3QgbWVudSA9IHRoaXMubW9kZSAhPT0gUmV1c2VUYWJNYXRjaE1vZGUuVVJMID8gdGhpcy5nZXRNZW51KHVybCkgOiBudWxsO1xuICAgIGlmIChtZW51ICYmIHR5cGVvZiBtZW51LnJldXNlQ2xvc2FibGUgPT09ICdib29sZWFuJykgcmV0dXJuIG1lbnUucmV1c2VDbG9zYWJsZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiDmuIXnqbogYGNsb3NhYmxlYCDnvJPlrZhcbiAgICovXG4gIGNsZWFyQ2xvc2FibGVDYWNoZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWQuY2xvc2FibGUgPSB7fTtcbiAgfVxuICBnZXRUcnV0aFJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gICAgbGV0IG5leHQgPSByb3V0ZTtcbiAgICB3aGlsZSAobmV4dC5maXJzdENoaWxkKSBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG4gIC8qKlxuICAgKiDmoLnmja7lv6vnhafojrflj5ZVUkzlnLDlnYBcbiAgICovXG4gIGdldFVybChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgbGV0IG5leHQgPSB0aGlzLmdldFRydXRoUm91dGUocm91dGUpO1xuICAgIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBzZWdtZW50cy5wdXNoKG5leHQudXJsLmpvaW4oJy8nKSk7XG4gICAgICBuZXh0ID0gbmV4dC5wYXJlbnQhO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgLyR7c2VnbWVudHNcbiAgICAgIC5maWx0ZXIoaSA9PiBpKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmpvaW4oJy8nKX1gO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgLyoqXG4gICAqIOajgOafpeW/q+eFp+aYr+WQpuWFgeiuuOiiq+WkjeeUqFxuICAgKi9cbiAgY2FuKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwocm91dGUpO1xuICAgIGlmICh1cmwgPT09IHRoaXMucmVtb3ZlVXJsQnVmZmVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocm91dGUuZGF0YSAmJiB0eXBlb2Ygcm91dGUuZGF0YS5yZXVzZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcm91dGUuZGF0YS5yZXVzZTtcblxuICAgIGlmICh0aGlzLm1vZGUgIT09IFJldXNlVGFiTWF0Y2hNb2RlLlVSTCkge1xuICAgICAgY29uc3QgbWVudSA9IHRoaXMuZ2V0TWVudSh1cmwpO1xuICAgICAgaWYgKCFtZW51KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSBSZXVzZVRhYk1hdGNoTW9kZS5NZW51KSB7XG4gICAgICAgIGlmIChtZW51LnJldXNlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFtZW51LnJldXNlIHx8IG1lbnUucmV1c2UgIT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNFeGNsdWRlKHVybCk7XG4gIH1cblxuICBpc0V4Y2x1ZGUodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leGNsdWRlcy5maW5kSW5kZXgociA9PiByLnRlc3QodXJsKSkgIT09IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIt+aWsO+8jOinpuWPkeS4gOS4qiByZWZyZXNoIOexu+Wei+S6i+S7tlxuICAgKi9cbiAgcmVmcmVzaChkYXRhPzogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdyZWZyZXNoJywgZGF0YSB9KTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBwcml2YXRlc1xuXG4gIHByaXZhdGUgZGVzdHJveShfaGFuZGxlOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICBpZiAoX2hhbmRsZSAmJiBfaGFuZGxlLmNvbXBvbmVudFJlZiAmJiBfaGFuZGxlLmNvbXBvbmVudFJlZi5kZXN0cm95KSBfaGFuZGxlLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIGRpKC4uLmFyZ3M6IE56U2FmZUFueVtdKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm47XG4gICAgICBjb25zb2xlLndhcm4oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmNhY2hlZCA9IHsgbGlzdDogW10sIHRpdGxlOiB7fSwgY2xvc2FibGU6IHt9IH07XG4gICAgfVxuICB9XG5cbiAgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRTY3JvbGwoKTtcbiAgICB0aGlzLl9pbml0ZWQgPSB0cnVlO1xuICAgIHRoaXMubG9hZFN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RvcmFnZVN0YXRlKSByZXR1cm47XG5cbiAgICB0aGlzLmNhY2hlZC5saXN0ID0gdGhpcy5zdGF0ZVNydi5nZXQodGhpcy5zdGF0ZUtleSkubWFwKHYgPT4gKHtcbiAgICAgIHRpdGxlOiB7IHRleHQ6IHYudGl0bGUgfSxcbiAgICAgIHVybDogdi51cmwsXG4gICAgICBwb3NpdGlvbjogdi5wb3NpdGlvblxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ2xvYWRTdGF0ZScgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1lbnUodXJsOiBzdHJpbmcpOiBNZW51IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWVudXMgPSB0aGlzLm1lbnVTZXJ2aWNlLmdldFBhdGhCeVVybCh1cmwpO1xuICAgIGlmICghbWVudXMgfHwgbWVudXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbWVudXMucG9wKCk7XG4gIH1cblxuICBydW5Ib29rKFxuICAgIG1ldGhvZDogUmV1c2VIb29rVHlwZXMsXG4gICAgY29tcDogUmV1c2VDb21wb25lbnRSZWYgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgdHlwZTogUmV1c2VIb29rT25SZXVzZUluaXRUeXBlID0gJ2luaXQnXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgY29tcCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNhY2hlZC5saXN0W2NvbXBdO1xuICAgICAgY29tcCA9IGl0ZW0uX2hhbmRsZT8uY29tcG9uZW50UmVmO1xuICAgIH1cbiAgICBpZiAoY29tcCA9PSBudWxsIHx8ICFjb21wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbXBUaGlzID0gY29tcC5pbnN0YW5jZTtcbiAgICBjb25zdCBmbiA9IGNvbXBUaGlzW21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSAnX29uUmV1c2VJbml0Jykge1xuICAgICAgZm4uY2FsbChjb21wVGhpcywgdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChmbiBhcyAoKSA9PiB2b2lkKS5jYWxsKGNvbXBUaGlzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0luVmFsaWRSb3V0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhcm91dGUucm91dGVDb25maWcgfHwgISFyb3V0ZS5yb3V0ZUNvbmZpZy5sb2FkQ2hpbGRyZW4gfHwgISFyb3V0ZS5yb3V0ZUNvbmZpZy5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhrPlrprmmK/lkKblhYHorrjot6/nlLHlpI3nlKjvvIzoi6UgYHRydWVgIOS8muinpuWPkSBgc3RvcmVgXG4gICAqL1xuICBzaG91bGREZXRhY2gocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNJblZhbGlkUm91dGUocm91dGUpKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kaSgnI3Nob3VsZERldGFjaCcsIHRoaXMuY2FuKHJvdXRlKSwgdGhpcy5nZXRVcmwocm91dGUpKTtcbiAgICByZXR1cm4gdGhpcy5jYW4ocm91dGUpO1xuICB9XG5cbiAgc2F2ZUNhY2hlKHNuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBfaGFuZGxlPzogTnpTYWZlQW55LCBwb3M/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdFRydWUgPSB0aGlzLmdldFRydXRoUm91dGUoc25hcHNob3QpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKHNuYXBzaG90KTtcbiAgICBjb25zdCBpZHggPSB0aGlzLmluZGV4KHVybCk7XG4gICAgY29uc3QgaXRlbTogUmV1c2VUYWJDYWNoZWQgPSB7XG4gICAgICB0aXRsZTogdGhpcy5nZXRUaXRsZSh1cmwsIHNuYXBzaG90VHJ1ZSksXG4gICAgICB1cmwsXG4gICAgICBjbG9zYWJsZTogdGhpcy5nZXRDbG9zYWJsZSh1cmwsIHNuYXBzaG90KSxcbiAgICAgIF9zbmFwc2hvdDogc25hcHNob3QsXG4gICAgICBfaGFuZGxlXG4gICAgfTtcbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UocG9zID8/IHRoaXMuaXRlbXMubGVuZ3RoLCAwLCBpdGVtKTtcbiAgICAgIGlmICh0aGlzLmNvdW50ID4gdGhpcy5fbWF4KSB7XG4gICAgICAgIC8vIEdldCB0aGUgb2xkZXN0IGNsb3NhYmxlIGxvY2F0aW9uXG4gICAgICAgIGNvbnN0IGNsb3NlSWR4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgodyA9PiB3LnVybCAhPT0gdXJsICYmIHcuY2xvc2FibGUhKTtcbiAgICAgICAgaWYgKGNsb3NlSWR4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IGNsb3NlSXRlbSA9IHRoaXMuaXRlbXNbY2xvc2VJZHhdO1xuICAgICAgICAgIHRoaXMucmVtb3ZlKGNsb3NlSWR4LCBmYWxzZSk7XG4gICAgICAgICAgdGltZXIoMSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAnY2xvc2UnLCB1cmw6IGNsb3NlSXRlbS51cmwsIGxpc3Q6IHRoaXMuY2FjaGVkLmxpc3QgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IGl0ZW07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWtmOWCqFxuICAgKi9cbiAgc3RvcmUoX3NuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBfaGFuZGxlOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybChfc25hcHNob3QpO1xuXG4gICAgaWYgKF9oYW5kbGUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5zYXZlQ2FjaGUoX3NuYXBzaG90LCBfaGFuZGxlKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ID0gdGhpcy5jYWNoZWQubGlzdDtcblxuICAgIGNvbnN0IGl0ZW06IFJldXNlVGFiQ2FjaGVkID0ge1xuICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGUodXJsLCBfc25hcHNob3QpLFxuICAgICAgY2xvc2FibGU6IHRoaXMuZ2V0Q2xvc2FibGUodXJsLCBfc25hcHNob3QpLFxuICAgICAgcG9zaXRpb246IHRoaXMuZ2V0S2VlcGluZ1Njcm9sbCh1cmwsIF9zbmFwc2hvdCkgPyB0aGlzLnBvc2l0aW9uQnVmZmVyW3VybF0gOiBudWxsLFxuICAgICAgdXJsLFxuICAgICAgX3NuYXBzaG90LFxuICAgICAgX2hhbmRsZVxuICAgIH07XG5cbiAgICBjb25zdCBpZHggPSB0aGlzLmluZGV4KHVybCk7XG4gICAgLy8gQ3VycmVudCBoYW5kbGVyIGlzIG51bGwgd2hlbiBhY3RpdmF0ZSByb3V0ZXNcbiAgICAvLyBGb3IgYmV0dGVyIHJlbGlhYmlsaXR5LCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgYXR0YWNoZWQgYmVmb3JlIGNhbGwgX29uUmV1c2VJbml0XG4gICAgY29uc3QgY2FoY2VkQ29tcG9uZW50UmVmID0gbGlzdFtpZHhdPy5faGFuZGxlPy5jb21wb25lbnRSZWY7XG4gICAgaWYgKF9oYW5kbGUgPT0gbnVsbCAmJiBjYWhjZWRDb21wb25lbnRSZWYgIT0gbnVsbCkge1xuICAgICAgdGltZXIoMTAwKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucnVuSG9vaygnX29uUmV1c2VJbml0JywgY2FoY2VkQ29tcG9uZW50UmVmKSk7XG4gICAgfVxuICAgIGxpc3RbaWR4XSA9IGl0ZW07XG4gICAgdGhpcy5yZW1vdmVVcmxCdWZmZXIgPSBudWxsO1xuXG4gICAgdGhpcy5kaSgnI3N0b3JlJywgJ1tvdmVycmlkZV0nLCB1cmwpO1xuXG4gICAgaWYgKF9oYW5kbGUgJiYgX2hhbmRsZS5jb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMucnVuSG9vaygnX29uUmV1c2VEZXN0cm95JywgX2hhbmRsZS5jb21wb25lbnRSZWYpO1xuICAgIH1cblxuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAnb3ZlcnJpZGUnLCBpdGVtLCBsaXN0IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWGs+WumuaYr+WQpuWFgeiuuOW6lOeUqOe8k+WtmOaVsOaNrlxuICAgKi9cbiAgc2hvdWxkQXR0YWNoKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzSW5WYWxpZFJvdXRlKHJvdXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKHJvdXRlKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXQodXJsKTtcbiAgICBjb25zdCByZXQgPSAhIShkYXRhICYmIGRhdGEuX2hhbmRsZSk7XG4gICAgdGhpcy5kaSgnI3Nob3VsZEF0dGFjaCcsIHJldCwgdXJsKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdhZGQnLCB1cmwsIGxpc3Q6IHRoaXMuY2FjaGVkLmxpc3QgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICog5o+Q5Y+W5aSN55So5pWw5o2uXG4gICAqL1xuICByZXRyaWV2ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE56U2FmZUFueSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhhc0luVmFsaWRSb3V0ZShyb3V0ZSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKHJvdXRlKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXQodXJsKTtcbiAgICBjb25zdCByZXQgPSAoZGF0YSAmJiBkYXRhLl9oYW5kbGUpIHx8IG51bGw7XG4gICAgdGhpcy5kaSgnI3JldHJpZXZlJywgdXJsLCByZXQpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICog5Yaz5a6a5piv5ZCm5bqU6K+l6L+b6KGM5aSN55So6Lev55Sx5aSE55CGXG4gICAqL1xuICBzaG91bGRSZXVzZVJvdXRlKGZ1dHVyZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY3VycjogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGxldCByZXQgPSBmdXR1cmUucm91dGVDb25maWcgPT09IGN1cnIucm91dGVDb25maWc7XG4gICAgaWYgKCFyZXQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhdGggPSAoKGZ1dHVyZS5yb3V0ZUNvbmZpZyAmJiBmdXR1cmUucm91dGVDb25maWcucGF0aCkgfHwgJycpIGFzIHN0cmluZztcbiAgICBpZiAocGF0aC5sZW5ndGggPiAwICYmIH5wYXRoLmluZGV4T2YoJzonKSkge1xuICAgICAgaWYgKHRoaXMucm91dGVQYXJhbU1hdGNoTW9kZSA9PT0gJ3N0cmljdCcpIHtcbiAgICAgICAgcmV0ID0gdGhpcy5nZXRVcmwoZnV0dXJlKSA9PT0gdGhpcy5nZXRVcmwoY3Vycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBwYXRoID09PSAoKGN1cnIucm91dGVDb25maWcgJiYgY3Vyci5yb3V0ZUNvbmZpZy5wYXRoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGkoJz09PT09PT09PT09PT09PT09PT09PScpO1xuICAgIHRoaXMuZGkoJyNzaG91bGRSZXVzZVJvdXRlJywgcmV0LCBgJHt0aGlzLmdldFVybChjdXJyKX09PiR7dGhpcy5nZXRVcmwoZnV0dXJlKX1gLCBmdXR1cmUsIGN1cnIpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyAjcmVnaW9uIHNjcm9sbFxuXG4gIC8qKlxuICAgKiDojrflj5YgYGtlZXBpbmdTY3JvbGxgIOeKtuaAge+8jOmhuuW6j+WmguS4i++8mlxuICAgKlxuICAgKiAxLiDot6/nlLHphY3nva7kuK0gZGF0YSDlsZ7mgKfkuK3ljIXlkKsgYGtlZXBpbmdTY3JvbGxgXG4gICAqIDIuIOiPnOWNleaVsOaNruS4rSBga2VlcGluZ1Njcm9sbGAg5bGe5oCnXG4gICAqIDMuIOe7hOS7tiBga2VlcGluZ1Njcm9sbGAg5YC8XG4gICAqL1xuICBnZXRLZWVwaW5nU2Nyb2xsKHVybDogc3RyaW5nLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBpZiAocm91dGUgJiYgcm91dGUuZGF0YSAmJiB0eXBlb2Ygcm91dGUuZGF0YS5rZWVwaW5nU2Nyb2xsID09PSAnYm9vbGVhbicpIHJldHVybiByb3V0ZS5kYXRhLmtlZXBpbmdTY3JvbGw7XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5tb2RlICE9PSBSZXVzZVRhYk1hdGNoTW9kZS5VUkwgPyB0aGlzLmdldE1lbnUodXJsKSA6IG51bGw7XG4gICAgaWYgKG1lbnUgJiYgdHlwZW9mIG1lbnUua2VlcGluZ1Njcm9sbCA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gbWVudS5rZWVwaW5nU2Nyb2xsO1xuXG4gICAgcmV0dXJuIHRoaXMua2VlcGluZ1Njcm9sbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzRGlzYWJsZWRJblJvdXRlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3V0ZXJDb25maWcgPSB0aGlzLmluamVjdG9yLmdldDxFeHRyYU9wdGlvbnM+KFJPVVRFUl9DT05GSUdVUkFUSU9OLCB7fSBhcyBOelNhZmVBbnkpO1xuICAgIHJldHVybiByb3V0ZXJDb25maWcuc2Nyb2xsUG9zaXRpb25SZXN0b3JhdGlvbiA9PT0gJ2Rpc2FibGVkJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNzKCk6IFNjcm9sbFNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChTY3JvbGxTZXJ2aWNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNjcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm91dGVyJCkge1xuICAgICAgdGhpcy5fcm91dGVyJC51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlciQgPSB0aGlzLmluamVjdG9yLmdldDxSb3V0ZXI+KFJvdXRlcikuZXZlbnRzLnN1YnNjcmliZShlID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgICAgICBpZiAodGhpcy5nZXRLZWVwaW5nU2Nyb2xsKHVybCwgdGhpcy5nZXRUcnV0aFJvdXRlKHRoaXMuc25hcHNob3QpKSkge1xuICAgICAgICAgIHRoaXMucG9zaXRpb25CdWZmZXJbdXJsXSA9IHRoaXMuc3MuZ2V0U2Nyb2xsUG9zaXRpb24odGhpcy5rZWVwaW5nU2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5wb3NpdGlvbkJ1ZmZlclt1cmxdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXQodXJsKTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5wb3NpdGlvbiAmJiB0aGlzLmdldEtlZXBpbmdTY3JvbGwodXJsLCB0aGlzLmdldFRydXRoUm91dGUodGhpcy5zbmFwc2hvdCkpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZEluUm91dGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNzLnNjcm9sbFRvUG9zaXRpb24odGhpcy5rZWVwaW5nU2Nyb2xsQ29udGFpbmVyLCBpdGVtLnBvc2l0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNzLnNjcm9sbFRvUG9zaXRpb24odGhpcy5rZWVwaW5nU2Nyb2xsQ29udGFpbmVyLCBpdGVtLnBvc2l0aW9uISksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgX2NhY2hlZENoYW5nZSwgX3JvdXRlciQgfSA9IHRoaXM7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVkLmxpc3QgPSBbXTtcbiAgICBfY2FjaGVkQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICBpZiAoX3JvdXRlciQpIHtcbiAgICAgIF9yb3V0ZXIkLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|