@yelon/bis 15.1.2 → 15.2.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.
Files changed (73) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +23 -23
  3. package/esm2020/bis.mjs +4 -4
  4. package/esm2020/index.mjs +1 -1
  5. package/esm2020/layout/bis.config.mjs +10 -10
  6. package/esm2020/layout/html-names.mjs +33 -0
  7. package/esm2020/layout/icon/style-icons.mjs +795 -795
  8. package/esm2020/layout/layout-basic/index.mjs +2 -2
  9. package/esm2020/layout/layout-basic/interface.mjs +6 -6
  10. package/esm2020/layout/layout-basic/layout-basic.component.mjs +356 -332
  11. package/esm2020/layout/layout-nav/index.mjs +4 -4
  12. package/esm2020/layout/layout-nav/layout-nav-application.component.mjs +327 -283
  13. package/esm2020/layout/layout-nav/layout-nav-group.component.mjs +124 -120
  14. package/esm2020/layout/layout-nav/layout-nav-tile.component.mjs +14 -14
  15. package/esm2020/layout/layout-nav/types.mjs +1 -1
  16. package/esm2020/layout/layout.mjs +4 -4
  17. package/esm2020/layout/public_api.mjs +13 -12
  18. package/esm2020/layout/widgets/index.mjs +6 -6
  19. package/esm2020/layout/widgets/yunzai-clear-storage.component.mjs +44 -44
  20. package/esm2020/layout/widgets/yunzai-fullscreen.component.mjs +44 -44
  21. package/esm2020/layout/widgets/yunzai-i18n.component.mjs +146 -142
  22. package/esm2020/layout/widgets/yunzai-notify.component.mjs +182 -182
  23. package/esm2020/layout/widgets/yunzai-theme-btn.component.mjs +201 -195
  24. package/esm2020/layout/widgets/yunzai-user.component.mjs +130 -116
  25. package/esm2020/layout/yunzai-act.guard.mjs +106 -106
  26. package/esm2020/layout/yunzai-auth.service.mjs +169 -167
  27. package/esm2020/layout/yunzai-default.interceptor.mjs +208 -208
  28. package/esm2020/layout/yunzai-i18n.service.mjs +130 -130
  29. package/esm2020/layout/yunzai-lang.mjs +113 -113
  30. package/esm2020/layout/yunzai-layout.module.mjs +75 -75
  31. package/esm2020/layout/yunzai-startup.service.mjs +156 -156
  32. package/esm2020/public_api.mjs +1 -1
  33. package/fesm2015/bis.mjs +6 -6
  34. package/fesm2015/layout.mjs +3232 -3101
  35. package/fesm2015/layout.mjs.map +1 -1
  36. package/fesm2020/bis.mjs +6 -6
  37. package/fesm2020/layout.mjs +3240 -3109
  38. package/fesm2020/layout.mjs.map +1 -1
  39. package/index.d.ts +1 -1
  40. package/index.less +1 -1
  41. package/layout/bis.config.d.ts +3 -3
  42. package/layout/html-names.d.ts +31 -0
  43. package/layout/icon/style-icons.d.ts +1 -1
  44. package/layout/index.d.ts +5 -5
  45. package/layout/layout-basic/index.d.ts +2 -2
  46. package/layout/layout-basic/interface.d.ts +24 -24
  47. package/layout/layout-basic/layout-basic.component.d.ts +32 -32
  48. package/layout/layout-nav/index.d.ts +4 -4
  49. package/layout/layout-nav/layout-nav-application.component.d.ts +27 -27
  50. package/layout/layout-nav/layout-nav-group.component.d.ts +17 -17
  51. package/layout/layout-nav/layout-nav-tile.component.d.ts +6 -6
  52. package/layout/layout-nav/types.d.ts +15 -15
  53. package/layout/public_api.d.ts +12 -11
  54. package/layout/style/index.less +154 -154
  55. package/layout/widgets/index.d.ts +6 -6
  56. package/layout/widgets/yunzai-clear-storage.component.d.ts +11 -11
  57. package/layout/widgets/yunzai-fullscreen.component.d.ts +8 -8
  58. package/layout/widgets/yunzai-i18n.component.d.ts +21 -21
  59. package/layout/widgets/yunzai-notify.component.d.ts +30 -30
  60. package/layout/widgets/yunzai-theme-btn.component.d.ts +32 -32
  61. package/layout/widgets/yunzai-user.component.d.ts +28 -28
  62. package/layout/yunzai-act.guard.d.ts +22 -22
  63. package/layout/yunzai-auth.service.d.ts +21 -21
  64. package/layout/yunzai-default.interceptor.d.ts +27 -27
  65. package/layout/yunzai-i18n.service.d.ts +33 -33
  66. package/layout/yunzai-lang.d.ts +11 -11
  67. package/layout/yunzai-layout.module.d.ts +21 -21
  68. package/layout/yunzai-startup.service.d.ts +37 -37
  69. package/package.json +47 -47
  70. package/public_api.d.ts +2 -2
  71. package/theme-compact.less +3 -3
  72. package/theme-dark.less +46 -46
  73. package/theme-default.less +46 -46
@@ -1,283 +1,327 @@
1
- import { Component } from '@angular/core';
2
- import { Subject, takeUntil } from 'rxjs';
3
- import { WINDOW } from '@yelon/util';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@yelon/cache";
6
- import * as i2 from "../yunzai-i18n.service";
7
- import * as i3 from "@yelon/theme";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "@angular/forms";
10
- import * as i6 from "ng-zorro-antd/core/transition-patch";
11
- import * as i7 from "ng-zorro-antd/grid";
12
- import * as i8 from "ng-zorro-antd/icon";
13
- import * as i9 from "ng-zorro-antd/input";
14
- export class LayoutNavApplicationComponent {
15
- constructor(cacheService, i18n, http, inject) {
16
- this.cacheService = cacheService;
17
- this.i18n = i18n;
18
- this.http = http;
19
- this.inject = inject;
20
- this.state = {
21
- active: false,
22
- type: 'all',
23
- topic: undefined,
24
- topics: [],
25
- list: [],
26
- search: null,
27
- destroy$: new Subject()
28
- };
29
- }
30
- ngOnInit() {
31
- this.fetchAllTopic();
32
- this.attachNav('all');
33
- }
34
- fetchAllTopic() {
35
- this.state.topics = this.cacheService.get('_yz_header', { mode: 'none' });
36
- }
37
- attachNav(type, topic) {
38
- this.state.type = type;
39
- this.clearSearch();
40
- if (type === 'all') {
41
- this.displayAllNav();
42
- }
43
- if (type === 'mine') {
44
- this.displayMineNav();
45
- }
46
- if (type === 'other' && topic) {
47
- this.displayOtherNav(topic);
48
- }
49
- }
50
- clearSearch() {
51
- this.state.search = null;
52
- }
53
- displayAllNav() {
54
- this.state.list = this.cacheService.get('_yz_header', { mode: 'none' });
55
- }
56
- displayMineNav() {
57
- const temp = this.cacheService.get('_yz_header', { mode: 'none' });
58
- this.state.list = temp
59
- .filter((topic) => {
60
- topic.children = topic.children.filter((child) => {
61
- return child.auth;
62
- });
63
- return topic;
64
- })
65
- .filter((topic) => {
66
- return topic.children.length > 0;
67
- });
68
- }
69
- displayOtherNav(topic) {
70
- this.state.topic = topic;
71
- const temp = this.cacheService.get('_yz_header', { mode: 'none' });
72
- this.state.list = temp.filter(t => t.key === topic.key)[0].children;
73
- }
74
- diffChange(flag) {
75
- if (flag) {
76
- this.state.active = flag;
77
- }
78
- else {
79
- this.state.active = !this.state.active;
80
- }
81
- }
82
- open(topic) {
83
- if (topic.key) {
84
- this.http
85
- .post(`/app-manager/web-scan/save`, {
86
- appId: topic.key,
87
- createDate: new Date()
88
- })
89
- .pipe(takeUntil(this.state.destroy$))
90
- .subscribe();
91
- }
92
- switch (topic.target) {
93
- case 'href':
94
- this.inject.get(WINDOW).location.href = topic.url;
95
- break;
96
- case 'blank':
97
- this.inject.get(WINDOW).location.href = topic.url;
98
- break;
99
- case 'target':
100
- this.inject.get(WINDOW).location.href = topic.url;
101
- break;
102
- default:
103
- this.inject.get(WINDOW).location.href = topic.url;
104
- break;
105
- }
106
- }
107
- onSearch() {
108
- const temp = this.cacheService.get('_yz_header', { mode: 'none' });
109
- if (this.state.search) {
110
- this.state.list = temp
111
- .filter((topic) => {
112
- if (this.i18n.fanyi(topic.name).includes(this.state.search)) {
113
- return topic;
114
- }
115
- else {
116
- topic.children = topic.children.filter((child) => {
117
- return this.i18n.fanyi(child.name).includes(this.state.search);
118
- });
119
- return topic;
120
- }
121
- })
122
- .filter((topic) => {
123
- return topic.children.length > 0;
124
- });
125
- }
126
- else {
127
- this.state.list = this.cacheService.get('_yz_header', { mode: 'none' });
128
- }
129
- }
130
- ngOnDestroy() {
131
- this.state.destroy$.complete();
132
- }
133
- }
134
- LayoutNavApplicationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LayoutNavApplicationComponent, deps: [{ token: i1.CacheService }, { token: i2.YunzaiI18NService }, { token: i3._HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
135
- LayoutNavApplicationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: LayoutNavApplicationComponent, selector: "layout-nav-application", ngImport: i0, template: `
136
- <!-- search start-->
137
- <ng-template #search>
138
- <div nz-row class="yz-application-list-search">
139
- <nz-input-group [nzPrefix]="prefixTemplate">
140
- <input
141
- type="text"
142
- nz-input
143
- placeholder="{{ 'application.search' | i18n }}"
144
- [(ngModel)]="state.search"
145
- (ngModelChange)="onSearch()"
146
- />
147
- <ng-template #prefixTemplate>
148
- <i nz-icon nzType="search" nzTheme="outline"></i>
149
- </ng-template>
150
- </nz-input-group>
151
- </div>
152
- </ng-template>
153
- <!-- search end -->
154
-
155
- <!-- right menu start -->
156
- <ng-template #ld>
157
- <div class="yz-application-list">
158
- <ul>
159
- <li *ngFor="let topic of state.list">
160
- <h5>{{ topic.name | i18n }}</h5>
161
- <a href="javascript:;" *ngFor="let nav of topic.children" (click)="open(nav)">{{ nav.name | i18n }}</a>
162
- </li>
163
- </ul>
164
- </div>
165
- </ng-template>
166
- <!-- right menu end -->
167
-
168
- <!-- button start-->
169
- <div class="yunzai-default__nav-item" (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
170
- <!-- button end-->
171
-
172
- <!-- header start-->
173
- <div class="yz-application" nz-row *ngIf="state.active">
174
- <div nz-col [nzSpan]="3" class="yz-application-topic">
175
- <div class="yz-application-text" (click)="attachNav('all')">{{ 'mode.nav.all' | i18n }}</div>
176
- <div class="yz-application-text" (click)="attachNav('mine')">{{ 'mode.nav.mine' | i18n }}</div>
177
- <div class="yz-application-text" *ngFor="let nav of state.topics" (click)="attachNav('other', nav)">{{
178
- nav.name | i18n
179
- }}</div>
180
- </div>
181
- <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
182
- <div *ngIf="state.type === 'all'">
183
- <ng-template [ngTemplateOutlet]="search"></ng-template>
184
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
185
- </div>
186
- <div *ngIf="state.type === 'mine'">
187
- <ng-template [ngTemplateOutlet]="search"></ng-template>
188
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
189
- </div>
190
- <div *ngIf="state.type === 'other'" class="yz-application-list">
191
- <div class="yz-application-list-item">
192
- <ul>
193
- <li *ngFor="let nav of state.list" (click)="open(nav)">
194
- <a href="javascript:;">
195
- <h4>{{ nav.name | i18n }}</h4>
196
- <p>{{ nav.intro | i18n }}</p>
197
- </a>
198
- </li>
199
- </ul>
200
- </div>
201
- </div>
202
- </div>
203
- </div>
204
- <!-- header end-->
205
- `, isInline: true, dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i7.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i9.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i9.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i9.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }] });
206
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LayoutNavApplicationComponent, decorators: [{
207
- type: Component,
208
- args: [{
209
- selector: `layout-nav-application`,
210
- template: `
211
- <!-- search start-->
212
- <ng-template #search>
213
- <div nz-row class="yz-application-list-search">
214
- <nz-input-group [nzPrefix]="prefixTemplate">
215
- <input
216
- type="text"
217
- nz-input
218
- placeholder="{{ 'application.search' | i18n }}"
219
- [(ngModel)]="state.search"
220
- (ngModelChange)="onSearch()"
221
- />
222
- <ng-template #prefixTemplate>
223
- <i nz-icon nzType="search" nzTheme="outline"></i>
224
- </ng-template>
225
- </nz-input-group>
226
- </div>
227
- </ng-template>
228
- <!-- search end -->
229
-
230
- <!-- right menu start -->
231
- <ng-template #ld>
232
- <div class="yz-application-list">
233
- <ul>
234
- <li *ngFor="let topic of state.list">
235
- <h5>{{ topic.name | i18n }}</h5>
236
- <a href="javascript:;" *ngFor="let nav of topic.children" (click)="open(nav)">{{ nav.name | i18n }}</a>
237
- </li>
238
- </ul>
239
- </div>
240
- </ng-template>
241
- <!-- right menu end -->
242
-
243
- <!-- button start-->
244
- <div class="yunzai-default__nav-item" (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
245
- <!-- button end-->
246
-
247
- <!-- header start-->
248
- <div class="yz-application" nz-row *ngIf="state.active">
249
- <div nz-col [nzSpan]="3" class="yz-application-topic">
250
- <div class="yz-application-text" (click)="attachNav('all')">{{ 'mode.nav.all' | i18n }}</div>
251
- <div class="yz-application-text" (click)="attachNav('mine')">{{ 'mode.nav.mine' | i18n }}</div>
252
- <div class="yz-application-text" *ngFor="let nav of state.topics" (click)="attachNav('other', nav)">{{
253
- nav.name | i18n
254
- }}</div>
255
- </div>
256
- <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
257
- <div *ngIf="state.type === 'all'">
258
- <ng-template [ngTemplateOutlet]="search"></ng-template>
259
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
260
- </div>
261
- <div *ngIf="state.type === 'mine'">
262
- <ng-template [ngTemplateOutlet]="search"></ng-template>
263
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
264
- </div>
265
- <div *ngIf="state.type === 'other'" class="yz-application-list">
266
- <div class="yz-application-list-item">
267
- <ul>
268
- <li *ngFor="let nav of state.list" (click)="open(nav)">
269
- <a href="javascript:;">
270
- <h4>{{ nav.name | i18n }}</h4>
271
- <p>{{ nav.intro | i18n }}</p>
272
- </a>
273
- </li>
274
- </ul>
275
- </div>
276
- </div>
277
- </div>
278
- </div>
279
- <!-- header end-->
280
- `
281
- }]
282
- }], ctorParameters: function () { return [{ type: i1.CacheService }, { type: i2.YunzaiI18NService }, { type: i3._HttpClient }, { type: i0.Injector }]; } });
283
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L2xheW91dC1uYXYvbGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7QUErRXJDLE1BQU0sT0FBTyw2QkFBNkI7SUFXeEMsWUFDVSxZQUEwQixFQUMxQixJQUF1QixFQUN2QixJQUFpQixFQUNqQixNQUFnQjtRQUhoQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFkMUIsVUFBSyxHQUE4QjtZQUNqQyxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUksT0FBTyxFQUFPO1NBQzdCLENBQUM7SUFPQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxF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QUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQXFCLEVBQUUsRUFBRTt3QkFDL0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLENBQUM7b0JBQ2xFLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNkO1lBQ0gsQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLEtBQXFCLEVBQUUsRUFBRTtnQkFDaEMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDekU7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7OzBIQS9IVSw2QkFBNkI7OEdBQTdCLDZCQUE2Qiw4REF4RTlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0VUOzJGQUVVLDZCQUE2QjtrQkExRXpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0VUO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UsIFl1bnphaU5hdlRvcGljIH0gZnJvbSAnQHllbG9uL2NhY2hlJztcbmltcG9ydCB7IF9IdHRwQ2xpZW50IH0gZnJvbSAnQHllbG9uL3RoZW1lJztcbmltcG9ydCB7IFdJTkRPVyB9IGZyb20gJ0B5ZWxvbi91dGlsJztcblxuaW1wb3J0IHsgWXVuemFpSTE4TlNlcnZpY2UgfSBmcm9tICcuLi95dW56YWktaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dE5hdkFwcGxpY2F0aW9uU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBgbGF5b3V0LW5hdi1hcHBsaWNhdGlvbmAsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSAgICAgIHNlYXJjaCBzdGFydC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2VhcmNoPlxuICAgICAgPGRpdiBuei1yb3cgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1saXN0LXNlYXJjaFwiPlxuICAgICAgICA8bnotaW5wdXQtZ3JvdXAgW256UHJlZml4XT1cInByZWZpeFRlbXBsYXRlXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBuei1pbnB1dFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnYXBwbGljYXRpb24uc2VhcmNoJyB8IGkxOG4gfX1cIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5zZWFyY2hcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3ByZWZpeFRlbXBsYXRlPlxuICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJzZWFyY2hcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvaT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8IS0tIHNlYXJjaCBlbmQgLS0+XG5cbiAgICA8IS0tIHJpZ2h0IG1lbnUgc3RhcnQgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNsZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1saXN0XCI+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHRvcGljIG9mIHN0YXRlLmxpc3RcIj5cbiAgICAgICAgICAgIDxoNT57eyB0b3BpYy5uYW1lIHwgaTE4biB9fTwvaDU+XG4gICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgKm5nRm9yPVwibGV0IG5hdiBvZiB0b3BpYy5jaGlsZHJlblwiIChjbGljayk9XCJvcGVuKG5hdilcIj57eyBuYXYubmFtZSB8IGkxOG4gfX08L2E+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPCEtLSByaWdodCBtZW51IGVuZCAtLT5cblxuICAgIDwhLS0gICAgICBidXR0b24gc3RhcnQtLT5cbiAgICA8ZGl2IGNsYXNzPVwieXVuemFpLWRlZmF1bHRfX25hdi1pdGVtXCIgKGNsaWNrKT1cImRpZmZDaGFuZ2UoKVwiPiB7eyAnbW9kZS5uYXYnIHwgaTE4biB9fTwvZGl2PlxuICAgIDwhLS0gICAgICBidXR0b24gZW5kLS0+XG5cbiAgICA8IS0tICAgICAgaGVhZGVyIHN0YXJ0LS0+XG4gICAgPGRpdiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uXCIgbnotcm93ICpuZ0lmPVwic3RhdGUuYWN0aXZlXCI+XG4gICAgICA8ZGl2IG56LWNvbCBbbnpTcGFuXT1cIjNcIiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLXRvcGljXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi10ZXh0XCIgKGNsaWNrKT1cImF0dGFjaE5hdignYWxsJylcIj57eyAnbW9kZS5uYXYuYWxsJyB8IGkxOG4gfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLXRleHRcIiAoY2xpY2spPVwiYXR0YWNoTmF2KCdtaW5lJylcIj57eyAnbW9kZS5uYXYubWluZScgfCBpMThuIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi10ZXh0XCIgKm5nRm9yPVwibGV0IG5hdiBvZiBzdGF0ZS50b3BpY3NcIiAoY2xpY2spPVwiYXR0YWNoTmF2KCdvdGhlcicsIG5hdilcIj57e1xuICAgICAgICAgIG5hdi5uYW1lIHwgaTE4blxuICAgICAgICB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IG56LWNvbCBbbnpTcGFuXT1cIjIxXCIgW25nU3dpdGNoXT1cInN0YXRlLnRvcGljXCIgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInN0YXRlLnR5cGUgPT09ICdhbGwnXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlYXJjaFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxkXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZS50eXBlID09PSAnbWluZSdcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VhcmNoXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGRcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInN0YXRlLnR5cGUgPT09ICdvdGhlcidcIiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLWxpc3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwieXotYXBwbGljYXRpb24tbGlzdC1pdGVtXCI+XG4gICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbmF2IG9mIHN0YXRlLmxpc3RcIiAoY2xpY2spPVwib3BlbihuYXYpXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiPlxuICAgICAgICAgICAgICAgICAgPGg0Pnt7IG5hdi5uYW1lIHwgaTE4biB9fTwvaDQ+XG4gICAgICAgICAgICAgICAgICA8cD57eyBuYXYuaW50cm8gfCBpMThuIH19PC9wPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSAgICAgIGhlYWRlciBlbmQtLT5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBMYXlvdXROYXZBcHBsaWNhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgc3RhdGU6IExheW91dE5hdkFwcGxpY2F0aW9uU3RhdGUgPSB7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICB0eXBlOiAnYWxsJyxcbiAgICB0b3BpYzogdW5kZWZpbmVkLFxuICAgIHRvcGljczogW10sXG4gICAgbGlzdDogW10sXG4gICAgc2VhcmNoOiBudWxsLFxuICAgIGRlc3Ryb3kkOiBuZXcgU3ViamVjdDxhbnk+KClcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaTE4bjogWXVuemFpSTE4TlNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBfSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGluamVjdDogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmV0Y2hBbGxUb3BpYygpO1xuICAgIHRoaXMuYXR0YWNoTmF2KCdhbGwnKTtcbiAgfVxuXG4gIGZldGNoQWxsVG9waWMoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS50b3BpY3MgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9oZWFkZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgfVxuXG4gIGF0dGFjaE5hdih0eXBlOiAnYWxsJyB8ICdtaW5lJyB8ICdvdGhlcicsIHRvcGljPzogWXVuemFpTmF2VG9waWMpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcbiAgICBpZiAodHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMuZGlzcGxheUFsbE5hdigpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ21pbmUnKSB7XG4gICAgICB0aGlzLmRpc3BsYXlNaW5lTmF2KCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnb3RoZXInICYmIHRvcGljKSB7XG4gICAgICB0aGlzLmRpc3BsYXlPdGhlck5hdih0b3BpYyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZWFyY2ggPSBudWxsO1xuICB9XG5cbiAgZGlzcGxheUFsbE5hdigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmxpc3QgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9oZWFkZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgfVxuXG4gIGRpc3BsYXlNaW5lTmF2KCk6IHZvaWQge1xuICAgIGNvbnN0IHRlbXA6IFl1bnphaU5hdlRvcGljW10gPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9oZWFkZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgICB0aGlzLnN0YXRlLmxpc3QgPSB0ZW1wXG4gICAgICAuZmlsdGVyKCh0b3BpYzogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgdG9waWMuY2hpbGRyZW4gPSB0b3BpYy5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGlsZC5hdXRoO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRvcGljO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHRvcGljOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICByZXR1cm4gdG9waWMuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICAgIH0pO1xuICB9XG5cbiAgZGlzcGxheU90aGVyTmF2KHRvcGljOiBZdW56YWlOYXZUb3BpYyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUudG9waWMgPSB0b3BpYztcbiAgICBjb25zdCB0ZW1wOiBZdW56YWlOYXZUb3BpY1tdID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgdGhpcy5zdGF0ZS5saXN0ID0gdGVtcC5maWx0ZXIodCA9PiB0LmtleSA9PT0gdG9waWMua2V5KVswXS5jaGlsZHJlbjtcbiAgfVxuXG4gIGRpZmZDaGFuZ2UoZmxhZz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmxhZykge1xuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmUgPSBmbGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZSA9ICF0aGlzLnN0YXRlLmFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBvcGVuKHRvcGljOiBZdW56YWlOYXZUb3BpYyk6IHZvaWQge1xuICAgIGlmICh0b3BpYy5rZXkpIHtcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucG9zdChgL2FwcC1tYW5hZ2VyL3dlYi1zY2FuL3NhdmVgLCB7XG4gICAgICAgICAgYXBwSWQ6IHRvcGljLmtleSxcbiAgICAgICAgICBjcmVhdGVEYXRlOiBuZXcgRGF0ZSgpXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnN0YXRlLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHRvcGljLnRhcmdldCkge1xuICAgICAgY2FzZSAnaHJlZic6XG4gICAgICAgIHRoaXMuaW5qZWN0LmdldChXSU5ET1cpLmxvY2F0aW9uLmhyZWYgPSB0b3BpYy51cmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYmxhbmsnOlxuICAgICAgICB0aGlzLmluamVjdC5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmID0gdG9waWMudXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RhcmdldCc6XG4gICAgICAgIHRoaXMuaW5qZWN0LmdldChXSU5ET1cpLmxvY2F0aW9uLmhyZWYgPSB0b3BpYy51cmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5pbmplY3QuZ2V0KFdJTkRPVykubG9jYXRpb24uaHJlZiA9IHRvcGljLnVybDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2goKTogdm9pZCB7XG4gICAgY29uc3QgdGVtcDogWXVuemFpTmF2VG9waWNbXSA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X2hlYWRlcicsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgdGhpcy5zdGF0ZS5saXN0ID0gdGVtcFxuICAgICAgICAuZmlsdGVyKCh0b3BpYzogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pMThuLmZhbnlpKHRvcGljLm5hbWUpLmluY2x1ZGVzKHRoaXMuc3RhdGUuc2VhcmNoISkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b3BpYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9waWMuY2hpbGRyZW4gPSB0b3BpYy5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pMThuLmZhbnlpKGNoaWxkLm5hbWUpLmluY2x1ZGVzKHRoaXMuc3RhdGUuc2VhcmNoISk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0b3BpYztcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKHRvcGljOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgIHJldHVybiB0b3BpYy5jaGlsZHJlbi5sZW5ndGggPiAwO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5saXN0ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
1
+ import { Component } from '@angular/core';
2
+ import { Subject, takeUntil } from 'rxjs';
3
+ import { WINDOW } from '@yelon/util';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@yelon/cache";
6
+ import * as i2 from "../yunzai-i18n.service";
7
+ import * as i3 from "@yelon/theme";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "@angular/forms";
10
+ import * as i6 from "ng-zorro-antd/core/transition-patch";
11
+ import * as i7 from "ng-zorro-antd/grid";
12
+ import * as i8 from "ng-zorro-antd/icon";
13
+ import * as i9 from "ng-zorro-antd/input";
14
+ export class LayoutNavApplicationComponent {
15
+ constructor(cacheService, i18n, http, inject) {
16
+ this.cacheService = cacheService;
17
+ this.i18n = i18n;
18
+ this.http = http;
19
+ this.inject = inject;
20
+ this.state = {
21
+ active: false,
22
+ type: 'all',
23
+ topic: undefined,
24
+ topics: [],
25
+ list: [],
26
+ search: null,
27
+ destroy$: new Subject()
28
+ };
29
+ }
30
+ ngOnInit() {
31
+ this.fetchAllTopic();
32
+ this.attachNav('all');
33
+ }
34
+ fetchAllTopic() {
35
+ this.state.topics = this.cacheService.get('_yz_header', { mode: 'none' });
36
+ }
37
+ attachNav(type, topic) {
38
+ this.state.type = type;
39
+ this.clearSearch();
40
+ if (type === 'all') {
41
+ this.displayAllNav();
42
+ }
43
+ if (type === 'mine') {
44
+ this.displayMineNav();
45
+ }
46
+ if (type === 'other' && topic) {
47
+ this.displayOtherNav(topic);
48
+ }
49
+ }
50
+ clearSearch() {
51
+ this.state.search = null;
52
+ }
53
+ displayAllNav() {
54
+ this.state.list = this.cacheService.get('_yz_header', { mode: 'none' });
55
+ }
56
+ displayMineNav() {
57
+ const temp = this.cacheService.get('_yz_header', { mode: 'none' });
58
+ this.state.list = temp
59
+ .filter((topic) => {
60
+ topic.children = topic.children.filter((child) => {
61
+ return child.auth;
62
+ });
63
+ return topic;
64
+ })
65
+ .filter((topic) => {
66
+ return topic.children.length > 0;
67
+ });
68
+ }
69
+ displayOtherNav(topic) {
70
+ this.state.topic = topic;
71
+ const temp = this.cacheService.get('_yz_header', { mode: 'none' });
72
+ this.state.list = temp.filter(t => t.key === topic.key)[0].children;
73
+ }
74
+ diffChange(flag) {
75
+ if (flag) {
76
+ this.state.active = flag;
77
+ }
78
+ else {
79
+ this.state.active = !this.state.active;
80
+ }
81
+ }
82
+ open(topic) {
83
+ if (topic.key) {
84
+ this.http
85
+ .post(`/app-manager/web-scan/save`, {
86
+ appId: topic.key,
87
+ createDate: new Date()
88
+ })
89
+ .pipe(takeUntil(this.state.destroy$))
90
+ .subscribe();
91
+ }
92
+ switch (topic.target) {
93
+ case 'href':
94
+ this.inject.get(WINDOW).location.href = topic.url;
95
+ break;
96
+ case 'blank':
97
+ this.inject.get(WINDOW).location.href = topic.url;
98
+ break;
99
+ case 'target':
100
+ this.inject.get(WINDOW).location.href = topic.url;
101
+ break;
102
+ default:
103
+ this.inject.get(WINDOW).location.href = topic.url;
104
+ break;
105
+ }
106
+ }
107
+ onSearch() {
108
+ const temp = this.cacheService.get('_yz_header', { mode: 'none' });
109
+ if (this.state.search) {
110
+ this.state.list = temp
111
+ .filter((topic) => {
112
+ if (this.i18n.fanyi(topic.name).includes(this.state.search)) {
113
+ return topic;
114
+ }
115
+ else {
116
+ topic.children = topic.children.filter((child) => {
117
+ return this.i18n.fanyi(child.name).includes(this.state.search);
118
+ });
119
+ return topic;
120
+ }
121
+ })
122
+ .filter((topic) => {
123
+ return topic.children.length > 0;
124
+ });
125
+ }
126
+ else {
127
+ this.state.list = this.cacheService.get('_yz_header', { mode: 'none' });
128
+ }
129
+ }
130
+ ngOnDestroy() {
131
+ this.state.destroy$.complete();
132
+ }
133
+ }
134
+ LayoutNavApplicationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LayoutNavApplicationComponent, deps: [{ token: i1.CacheService }, { token: i2.YunzaiI18NService }, { token: i3._HttpClient }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
135
+ LayoutNavApplicationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: LayoutNavApplicationComponent, selector: "layout-nav-application", ngImport: i0, template: `
136
+ <!-- search start-->
137
+ <ng-template #search>
138
+ <div nz-row class="yz-application-list-search">
139
+ <nz-input-group [nzPrefix]="prefixTemplate">
140
+ <input
141
+ data-event-id="_nav_search"
142
+ type="text"
143
+ nz-input
144
+ placeholder="{{ 'application.search' | i18n }}"
145
+ [(ngModel)]="state.search"
146
+ (ngModelChange)="onSearch()"
147
+ />
148
+ <ng-template #prefixTemplate>
149
+ <i nz-icon nzType="search" nzTheme="outline"></i>
150
+ </ng-template>
151
+ </nz-input-group>
152
+ </div>
153
+ </ng-template>
154
+ <!-- search end -->
155
+
156
+ <!-- right menu start -->
157
+ <ng-template #ld>
158
+ <div class="yz-application-list">
159
+ <ul>
160
+ <li *ngFor="let topic of state.list">
161
+ <h5>{{ topic.name | i18n }}</h5>
162
+ <a
163
+ data-event-id="_nav_item"
164
+ [attr.data-name]="nav.name | i18n"
165
+ href="javascript:;"
166
+ *ngFor="let nav of topic.children"
167
+ (click)="open(nav)"
168
+ >{{ nav.name | i18n }}</a
169
+ >
170
+ </li>
171
+ </ul>
172
+ </div>
173
+ </ng-template>
174
+ <!-- right menu end -->
175
+
176
+ <!-- button start-->
177
+ <div data-event-id="_nav_app" class="yunzai-default__nav-item" (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
178
+ <!-- button end-->
179
+
180
+ <!-- header start-->
181
+ <div class="yz-application" nz-row *ngIf="state.active">
182
+ <div nz-col [nzSpan]="3" class="yz-application-topic">
183
+ <div data-event-id="_nav_topic" data-name="全部应用" class="yz-application-text" (click)="attachNav('all')">{{
184
+ 'mode.nav.all' | i18n
185
+ }}</div>
186
+ <div data-event-id="_nav_topic" data-name="我的应用" class="yz-application-text" (click)="attachNav('mine')">{{
187
+ 'mode.nav.mine' | i18n
188
+ }}</div>
189
+ <div
190
+ data-event-id="_nav_topic"
191
+ [attr.data-name]="nav.name | i18n"
192
+ class="yz-application-text"
193
+ *ngFor="let nav of state.topics"
194
+ (click)="attachNav('other', nav)"
195
+ >{{ nav.name | i18n }}</div
196
+ >
197
+ </div>
198
+ <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
199
+ <div *ngIf="state.type === 'all'">
200
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
201
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
202
+ </div>
203
+ <div *ngIf="state.type === 'mine'">
204
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
205
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
206
+ </div>
207
+ <div *ngIf="state.type === 'other'" class="yz-application-list">
208
+ <div class="yz-application-list-item">
209
+ <ul>
210
+ <li
211
+ data-event-id="_nav_item"
212
+ [attr.data-name]="nav.name | i18n"
213
+ *ngFor="let nav of state.list"
214
+ (click)="open(nav)"
215
+ >
216
+ <a href="javascript:;">
217
+ <h4>{{ nav.name | i18n }}</h4>
218
+ <p>{{ nav.intro | i18n }}</p>
219
+ </a>
220
+ </li>
221
+ </ul>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ <!-- header end-->
227
+ `, isInline: true, dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i7.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i9.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i9.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i9.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }] });
228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LayoutNavApplicationComponent, decorators: [{
229
+ type: Component,
230
+ args: [{
231
+ selector: `layout-nav-application`,
232
+ template: `
233
+ <!-- search start-->
234
+ <ng-template #search>
235
+ <div nz-row class="yz-application-list-search">
236
+ <nz-input-group [nzPrefix]="prefixTemplate">
237
+ <input
238
+ data-event-id="_nav_search"
239
+ type="text"
240
+ nz-input
241
+ placeholder="{{ 'application.search' | i18n }}"
242
+ [(ngModel)]="state.search"
243
+ (ngModelChange)="onSearch()"
244
+ />
245
+ <ng-template #prefixTemplate>
246
+ <i nz-icon nzType="search" nzTheme="outline"></i>
247
+ </ng-template>
248
+ </nz-input-group>
249
+ </div>
250
+ </ng-template>
251
+ <!-- search end -->
252
+
253
+ <!-- right menu start -->
254
+ <ng-template #ld>
255
+ <div class="yz-application-list">
256
+ <ul>
257
+ <li *ngFor="let topic of state.list">
258
+ <h5>{{ topic.name | i18n }}</h5>
259
+ <a
260
+ data-event-id="_nav_item"
261
+ [attr.data-name]="nav.name | i18n"
262
+ href="javascript:;"
263
+ *ngFor="let nav of topic.children"
264
+ (click)="open(nav)"
265
+ >{{ nav.name | i18n }}</a
266
+ >
267
+ </li>
268
+ </ul>
269
+ </div>
270
+ </ng-template>
271
+ <!-- right menu end -->
272
+
273
+ <!-- button start-->
274
+ <div data-event-id="_nav_app" class="yunzai-default__nav-item" (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
275
+ <!-- button end-->
276
+
277
+ <!-- header start-->
278
+ <div class="yz-application" nz-row *ngIf="state.active">
279
+ <div nz-col [nzSpan]="3" class="yz-application-topic">
280
+ <div data-event-id="_nav_topic" data-name="全部应用" class="yz-application-text" (click)="attachNav('all')">{{
281
+ 'mode.nav.all' | i18n
282
+ }}</div>
283
+ <div data-event-id="_nav_topic" data-name="我的应用" class="yz-application-text" (click)="attachNav('mine')">{{
284
+ 'mode.nav.mine' | i18n
285
+ }}</div>
286
+ <div
287
+ data-event-id="_nav_topic"
288
+ [attr.data-name]="nav.name | i18n"
289
+ class="yz-application-text"
290
+ *ngFor="let nav of state.topics"
291
+ (click)="attachNav('other', nav)"
292
+ >{{ nav.name | i18n }}</div
293
+ >
294
+ </div>
295
+ <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
296
+ <div *ngIf="state.type === 'all'">
297
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
298
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
299
+ </div>
300
+ <div *ngIf="state.type === 'mine'">
301
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
302
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
303
+ </div>
304
+ <div *ngIf="state.type === 'other'" class="yz-application-list">
305
+ <div class="yz-application-list-item">
306
+ <ul>
307
+ <li
308
+ data-event-id="_nav_item"
309
+ [attr.data-name]="nav.name | i18n"
310
+ *ngFor="let nav of state.list"
311
+ (click)="open(nav)"
312
+ >
313
+ <a href="javascript:;">
314
+ <h4>{{ nav.name | i18n }}</h4>
315
+ <p>{{ nav.intro | i18n }}</p>
316
+ </a>
317
+ </li>
318
+ </ul>
319
+ </div>
320
+ </div>
321
+ </div>
322
+ </div>
323
+ <!-- header end-->
324
+ `
325
+ }]
326
+ }], ctorParameters: function () { return [{ type: i1.CacheService }, { type: i2.YunzaiI18NService }, { type: i3._HttpClient }, { type: i0.Injector }]; } });
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L2xheW91dC1uYXYvbGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7QUFxR3JDLE1BQU0sT0FBTyw2QkFBNkI7SUFXeEMsWUFDVSxZQUEwQixFQUMxQixJQUF1QixFQUN2QixJQUFpQixFQUNqQixNQUFnQjtRQUhoQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFkMUIsVUFBSyxHQUE4QjtZQUNqQyxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUksT0FBTyxFQUFPO1NBQzdCLENBQUM7SUFPQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxF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b25lbnQsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENhY2hlU2VydmljZSwgWXVuemFpTmF2VG9waWMgfSBmcm9tICdAeWVsb24vY2FjaGUnO1xuaW1wb3J0IHsgX0h0dHBDbGllbnQgfSBmcm9tICdAeWVsb24vdGhlbWUnO1xuaW1wb3J0IHsgV0lORE9XIH0gZnJvbSAnQHllbG9uL3V0aWwnO1xuXG5pbXBvcnQgeyBZdW56YWlJMThOU2VydmljZSB9IGZyb20gJy4uL3l1bnphaS1pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGF5b3V0TmF2QXBwbGljYXRpb25TdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IGBsYXlvdXQtbmF2LWFwcGxpY2F0aW9uYCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tICAgICAgc2VhcmNoIHN0YXJ0LS0+XG4gICAgPG5nLXRlbXBsYXRlICNzZWFyY2g+XG4gICAgICA8ZGl2IG56LXJvdyBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLWxpc3Qtc2VhcmNoXCI+XG4gICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpQcmVmaXhdPVwicHJlZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfbmF2X3NlYXJjaFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBuei1pbnB1dFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnYXBwbGljYXRpb24uc2VhcmNoJyB8IGkxOG4gfX1cIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5zZWFyY2hcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3ByZWZpeFRlbXBsYXRlPlxuICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJzZWFyY2hcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvaT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8IS0tIHNlYXJjaCBlbmQgLS0+XG5cbiAgICA8IS0tIHJpZ2h0IG1lbnUgc3RhcnQgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNsZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1saXN0XCI+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHRvcGljIG9mIHN0YXRlLmxpc3RcIj5cbiAgICAgICAgICAgIDxoNT57eyB0b3BpYy5uYW1lIHwgaTE4biB9fTwvaDU+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBkYXRhLWV2ZW50LWlkPVwiX25hdl9pdGVtXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1uYW1lXT1cIm5hdi5uYW1lIHwgaTE4blwiXG4gICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OjtcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbmF2IG9mIHRvcGljLmNoaWxkcmVuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4obmF2KVwiXG4gICAgICAgICAgICAgID57eyBuYXYubmFtZSB8IGkxOG4gfX08L2FcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8IS0tIHJpZ2h0IG1lbnUgZW5kIC0tPlxuXG4gICAgPCEtLSAgICAgIGJ1dHRvbiBzdGFydC0tPlxuICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfYXBwXCIgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fbmF2LWl0ZW1cIiAoY2xpY2spPVwiZGlmZkNoYW5nZSgpXCI+IHt7ICdtb2RlLm5hdicgfCBpMThuIH19PC9kaXY+XG4gICAgPCEtLSAgICAgIGJ1dHRvbiBlbmQtLT5cblxuICAgIDwhLS0gICAgICBoZWFkZXIgc3RhcnQtLT5cbiAgICA8ZGl2IGNsYXNzPVwieXotYXBwbGljYXRpb25cIiBuei1yb3cgKm5nSWY9XCJzdGF0ZS5hY3RpdmVcIj5cbiAgICAgIDxkaXYgbnotY29sIFtuelNwYW5dPVwiM1wiIGNsYXNzPVwieXotYXBwbGljYXRpb24tdG9waWNcIj5cbiAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl90b3BpY1wiIGRhdGEtbmFtZT1cIuWFqOmDqOW6lOeUqFwiIGNsYXNzPVwieXotYXBwbGljYXRpb24tdGV4dFwiIChjbGljayk9XCJhdHRhY2hOYXYoJ2FsbCcpXCI+e3tcbiAgICAgICAgICAnbW9kZS5uYXYuYWxsJyB8IGkxOG5cbiAgICAgICAgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl90b3BpY1wiIGRhdGEtbmFtZT1cIuaIkeeahOW6lOeUqFwiIGNsYXNzPVwieXotYXBwbGljYXRpb24tdGV4dFwiIChjbGljayk9XCJhdHRhY2hOYXYoJ21pbmUnKVwiPnt7XG4gICAgICAgICAgJ21vZGUubmF2Lm1pbmUnIHwgaTE4blxuICAgICAgICB9fTwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1ldmVudC1pZD1cIl9uYXZfdG9waWNcIlxuICAgICAgICAgIFthdHRyLmRhdGEtbmFtZV09XCJuYXYubmFtZSB8IGkxOG5cIlxuICAgICAgICAgIGNsYXNzPVwieXotYXBwbGljYXRpb24tdGV4dFwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG5hdiBvZiBzdGF0ZS50b3BpY3NcIlxuICAgICAgICAgIChjbGljayk9XCJhdHRhY2hOYXYoJ290aGVyJywgbmF2KVwiXG4gICAgICAgICAgPnt7IG5hdi5uYW1lIHwgaTE4biB9fTwvZGl2XG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBuei1jb2wgW256U3Bhbl09XCIyMVwiIFtuZ1N3aXRjaF09XCJzdGF0ZS50b3BpY1wiIGNsYXNzPVwieXotYXBwbGljYXRpb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZS50eXBlID09PSAnYWxsJ1wiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWFyY2hcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsZFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic3RhdGUudHlwZSA9PT0gJ21pbmUnXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlYXJjaFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxkXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZS50eXBlID09PSAnb3RoZXInXCIgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1saXN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLWxpc3QtaXRlbVwiPlxuICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICBkYXRhLWV2ZW50LWlkPVwiX25hdl9pdGVtXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLW5hbWVdPVwibmF2Lm5hbWUgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbmF2IG9mIHN0YXRlLmxpc3RcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuKG5hdilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiPlxuICAgICAgICAgICAgICAgICAgPGg0Pnt7IG5hdi5uYW1lIHwgaTE4biB9fTwvaDQ+XG4gICAgICAgICAgICAgICAgICA8cD57eyBuYXYuaW50cm8gfCBpMThuIH19PC9wPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSAgICAgIGhlYWRlciBlbmQtLT5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBMYXlvdXROYXZBcHBsaWNhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgc3RhdGU6IExheW91dE5hdkFwcGxpY2F0aW9uU3RhdGUgPSB7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICB0eXBlOiAnYWxsJyxcbiAgICB0b3BpYzogdW5kZWZpbmVkLFxuICAgIHRvcGljczogW10sXG4gICAgbGlzdDogW10sXG4gICAgc2VhcmNoOiBudWxsLFxuICAgIGRlc3Ryb3kkOiBuZXcgU3ViamVjdDxhbnk+KClcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaTE4bjogWXVuemFpSTE4TlNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBfSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGluamVjdDogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmV0Y2hBbGxUb3BpYygpO1xuICAgIHRoaXMuYXR0YWNoTmF2KCdhbGwnKTtcbiAgfVxuXG4gIGZldGNoQWxsVG9waWMoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS50b3BpY3MgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9oZWFkZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgfVxuXG4gIGF0dGFjaE5hdih0eXBlOiAnYWxsJyB8ICdtaW5lJyB8ICdvdGhlcicsIHRvcGljPzogWXVuemFpTmF2VG9waWMpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcbiAgICBpZiAodHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMuZGlzcGxheUFsbE5hdigpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ21pbmUnKSB7XG4gICAgICB0aGlzLmRpc3BsYXlNaW5lTmF2KCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnb3RoZXInICYmIHRvcGljKSB7XG4gICAgICB0aGlzLmRpc3BsYXlPdGhlck5hdih0b3BpYyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZWFyY2ggPSBudWxsO1xuICB9XG5cbiAgZGlzcGxheUFsbE5hdigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmxpc3QgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9oZWFkZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgfVxuXG4gIGRpc3BsYXlNaW5lTmF2KCk6IHZvaWQge1xuICAgIGNvbnN0IHRlbXA6IFl1bnphaU5hdlRvcGljW10gPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el9oZWFkZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgICB0aGlzLnN0YXRlLmxpc3QgPSB0ZW1wXG4gICAgICAuZmlsdGVyKCh0b3BpYzogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgdG9waWMuY2hpbGRyZW4gPSB0b3BpYy5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGlsZC5hdXRoO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRvcGljO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHRvcGljOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICByZXR1cm4gdG9waWMuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICAgIH0pO1xuICB9XG5cbiAgZGlzcGxheU90aGVyTmF2KHRvcGljOiBZdW56YWlOYXZUb3BpYyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUudG9waWMgPSB0b3BpYztcbiAgICBjb25zdCB0ZW1wOiBZdW56YWlOYXZUb3BpY1tdID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgdGhpcy5zdGF0ZS5saXN0ID0gdGVtcC5maWx0ZXIodCA9PiB0LmtleSA9PT0gdG9waWMua2V5KVswXS5jaGlsZHJlbjtcbiAgfVxuXG4gIGRpZmZDaGFuZ2UoZmxhZz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmxhZykge1xuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmUgPSBmbGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZSA9ICF0aGlzLnN0YXRlLmFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBvcGVuKHRvcGljOiBZdW56YWlOYXZUb3BpYyk6IHZvaWQge1xuICAgIGlmICh0b3BpYy5rZXkpIHtcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucG9zdChgL2FwcC1tYW5hZ2VyL3dlYi1zY2FuL3NhdmVgLCB7XG4gICAgICAgICAgYXBwSWQ6IHRvcGljLmtleSxcbiAgICAgICAgICBjcmVhdGVEYXRlOiBuZXcgRGF0ZSgpXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnN0YXRlLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHRvcGljLnRhcmdldCkge1xuICAgICAgY2FzZSAnaHJlZic6XG4gICAgICAgIHRoaXMuaW5qZWN0LmdldChXSU5ET1cpLmxvY2F0aW9uLmhyZWYgPSB0b3BpYy51cmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYmxhbmsnOlxuICAgICAgICB0aGlzLmluamVjdC5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmID0gdG9waWMudXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RhcmdldCc6XG4gICAgICAgIHRoaXMuaW5qZWN0LmdldChXSU5ET1cpLmxvY2F0aW9uLmhyZWYgPSB0b3BpYy51cmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5pbmplY3QuZ2V0KFdJTkRPVykubG9jYXRpb24uaHJlZiA9IHRvcGljLnVybDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2goKTogdm9pZCB7XG4gICAgY29uc3QgdGVtcDogWXVuemFpTmF2VG9waWNbXSA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X2hlYWRlcicsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIGlmICh0aGlzLnN0YXRlLnNlYXJjaCkge1xuICAgICAgdGhpcy5zdGF0ZS5saXN0ID0gdGVtcFxuICAgICAgICAuZmlsdGVyKCh0b3BpYzogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pMThuLmZhbnlpKHRvcGljLm5hbWUpLmluY2x1ZGVzKHRoaXMuc3RhdGUuc2VhcmNoISkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b3BpYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9waWMuY2hpbGRyZW4gPSB0b3BpYy5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pMThuLmZhbnlpKGNoaWxkLm5hbWUpLmluY2x1ZGVzKHRoaXMuc3RhdGUuc2VhcmNoISk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0b3BpYztcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKHRvcGljOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgIHJldHVybiB0b3BpYy5jaGlsZHJlbi5sZW5ndGggPiAwO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5saXN0ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=