cloud-ide-core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/cloud-ide-core.mjs +5 -0
- package/esm2022/lib/cloud-ide-core.component.mjs +19 -0
- package/esm2022/lib/cloud-ide-core.service.mjs +14 -0
- package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +768 -0
- package/esm2022/lib/core/department-management/index.mjs +5 -0
- package/esm2022/lib/core/department-management/services/department-management.service.mjs +187 -0
- package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +1122 -0
- package/esm2022/lib/core/designation-management/index.mjs +5 -0
- package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +194 -0
- package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +794 -0
- package/esm2022/lib/core/grade-level-management/index.mjs +5 -0
- package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +172 -0
- package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +1135 -0
- package/esm2022/lib/core/menu-management/index.mjs +10 -0
- package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +11 -0
- package/esm2022/lib/core/menu-management/mock-data/menu-items.json +311 -0
- package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +230 -0
- package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +483 -0
- package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +393 -0
- package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +767 -0
- package/esm2022/lib/core/page-management/index.mjs +10 -0
- package/esm2022/lib/core/page-management/services/page-controls.service.mjs +136 -0
- package/esm2022/lib/core/page-management/services/page-management.service.mjs +98 -0
- package/esm2022/lib/core/page-management/services/page-theme.service.mjs +107 -0
- package/esm2022/public-api.mjs +16 -0
- package/fesm2022/cloud-ide-core.mjs +6859 -0
- package/fesm2022/cloud-ide-core.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/cloud-ide-core.component.d.ts +5 -0
- package/lib/cloud-ide-core.service.d.ts +6 -0
- package/lib/core/department-management/components/department-list/department-list.component.d.ts +178 -0
- package/lib/core/department-management/index.d.ts +2 -0
- package/lib/core/department-management/services/department-management.service.d.ts +68 -0
- package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +242 -0
- package/lib/core/designation-management/index.d.ts +2 -0
- package/lib/core/designation-management/services/designation-management.service.d.ts +69 -0
- package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +199 -0
- package/lib/core/grade-level-management/index.d.ts +2 -0
- package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +69 -0
- package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +278 -0
- package/lib/core/menu-management/index.d.ts +3 -0
- package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +30 -0
- package/lib/core/menu-management/services/menu-management.service.d.ts +85 -0
- package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +126 -0
- package/lib/core/page-management/components/page-list/page-list.component.d.ts +91 -0
- package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +189 -0
- package/lib/core/page-management/index.d.ts +6 -0
- package/lib/core/page-management/services/page-controls.service.d.ts +54 -0
- package/lib/core/page-management/services/page-management.service.d.ts +42 -0
- package/lib/core/page-management/services/page-theme.service.d.ts +43 -0
- package/package.json +25 -0
- package/public-api.d.ts +7 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Department Management Components
|
|
2
|
+
export * from './components/department-list/department-list.component';
|
|
3
|
+
// Department Management Services
|
|
4
|
+
export * from './services/department-management.service';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvZGVwYXJ0bWVudC1tYW5hZ2VtZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQyxjQUFjLHdEQUF3RCxDQUFDO0FBRXZFLGlDQUFpQztBQUNqQyxjQUFjLDBDQUEwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRGVwYXJ0bWVudCBNYW5hZ2VtZW50IENvbXBvbmVudHNcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL2RlcGFydG1lbnQtbGlzdC9kZXBhcnRtZW50LWxpc3QuY29tcG9uZW50JztcclxuXHJcbi8vIERlcGFydG1lbnQgTWFuYWdlbWVudCBTZXJ2aWNlc1xyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2RlcGFydG1lbnQtbWFuYWdlbWVudC5zZXJ2aWNlJzsgIl19
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { throwError, BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { catchError, tap } from 'rxjs/operators';
|
|
4
|
+
import { cidePath, coreRoutesUrl, generateStringFromObject, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
export class DepartmentManagementService {
|
|
8
|
+
constructor(http) {
|
|
9
|
+
this.http = http;
|
|
10
|
+
this.departmentListSubject = new BehaviorSubject([]);
|
|
11
|
+
this.departmentList$ = this.departmentListSubject.asObservable();
|
|
12
|
+
console.log('DepartmentManagementService initialized - using real API');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get department list from API
|
|
16
|
+
*/
|
|
17
|
+
getDepartmentList(body) {
|
|
18
|
+
const query = generateStringFromObject(body);
|
|
19
|
+
return this.http?.get(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, query]))
|
|
20
|
+
.pipe(tap((response) => {
|
|
21
|
+
if (response?.success) {
|
|
22
|
+
this.departmentListSubject.next(response?.data || []);
|
|
23
|
+
}
|
|
24
|
+
}), catchError(error => {
|
|
25
|
+
console.error('DepartmentManagementService API error:', error);
|
|
26
|
+
return this.handleError(error);
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get department list from cache (if available)
|
|
31
|
+
*/
|
|
32
|
+
getDepartmentListFromCache() {
|
|
33
|
+
return this.departmentListSubject.value;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create new department
|
|
37
|
+
* POST ${coreRoutesUrl?.department} - payload: MDepartmentInsertUpdatePayload, response: departmentInsertUpdateControllerResponse
|
|
38
|
+
*/
|
|
39
|
+
createDepartment(department) {
|
|
40
|
+
console.log('Creating department:', department);
|
|
41
|
+
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department]);
|
|
42
|
+
return this.http.post(url, department)
|
|
43
|
+
.pipe(tap((response) => {
|
|
44
|
+
if (response.success) {
|
|
45
|
+
this.refreshDepartmentList();
|
|
46
|
+
}
|
|
47
|
+
}), catchError(this.handleError));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Update existing department
|
|
51
|
+
* POST ${coreRoutesUrl?.department} - payload: MDepartmentInsertUpdatePayload, response: departmentInsertUpdateControllerResponse
|
|
52
|
+
*/
|
|
53
|
+
updateDepartment(id, department) {
|
|
54
|
+
console.log('Updating department:', id, department);
|
|
55
|
+
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department]);
|
|
56
|
+
return this.http.post(url, department)
|
|
57
|
+
.pipe(tap((response) => {
|
|
58
|
+
if (response.success) {
|
|
59
|
+
this.refreshDepartmentList();
|
|
60
|
+
}
|
|
61
|
+
}), catchError(this.handleError));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get department by ID
|
|
65
|
+
* GET ${coreRoutesUrl?.department}/byId/:query - payload: MDepartmentGetByIdPayload, response: departmentByIdControllerResponse
|
|
66
|
+
*/
|
|
67
|
+
getDepartmentById(id) {
|
|
68
|
+
console.log('Getting department by ID:', id);
|
|
69
|
+
const payload = { sydept_id: id };
|
|
70
|
+
const query = generateStringFromObject(payload);
|
|
71
|
+
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, 'byId', query]);
|
|
72
|
+
return this.http.get(url)
|
|
73
|
+
.pipe(catchError(this.handleError));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Delete department
|
|
77
|
+
* DELETE ${coreRoutesUrl?.department}/:query - payload: MDepartmentDeletePayload, response: departmentDeleteControllerResponse
|
|
78
|
+
*/
|
|
79
|
+
deleteDepartment(id) {
|
|
80
|
+
const payload = { sydept_id: id };
|
|
81
|
+
const query = generateStringFromObject(payload);
|
|
82
|
+
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, query]);
|
|
83
|
+
return this.http.delete(url)
|
|
84
|
+
.pipe(tap((response) => {
|
|
85
|
+
if (response.success) {
|
|
86
|
+
this.refreshDepartmentList();
|
|
87
|
+
}
|
|
88
|
+
}), catchError(this.handleError));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Delete multiple departments
|
|
92
|
+
*/
|
|
93
|
+
deleteMultipleDepartments(ids) {
|
|
94
|
+
console.log('Deleting multiple departments:', ids);
|
|
95
|
+
const payload = { ids };
|
|
96
|
+
const query = generateStringFromObject(payload);
|
|
97
|
+
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, query]);
|
|
98
|
+
return this.http.delete(url)
|
|
99
|
+
.pipe(tap((response) => {
|
|
100
|
+
if (response.success) {
|
|
101
|
+
this.refreshDepartmentList();
|
|
102
|
+
}
|
|
103
|
+
}), catchError(this.handleError));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Toggle department active status
|
|
107
|
+
*/
|
|
108
|
+
toggleDepartmentStatus(payload) {
|
|
109
|
+
const query = generateStringFromObject(payload);
|
|
110
|
+
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, 'toggleStatus', query]);
|
|
111
|
+
return this.http.put(url, {})
|
|
112
|
+
.pipe(tap((response) => {
|
|
113
|
+
if (response.success) {
|
|
114
|
+
this.refreshDepartmentList();
|
|
115
|
+
}
|
|
116
|
+
}), catchError(this.handleError));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Find department by ID
|
|
120
|
+
*/
|
|
121
|
+
findDepartmentById(id, items = this.departmentListSubject.value) {
|
|
122
|
+
for (const item of items) {
|
|
123
|
+
if (item._id === id) {
|
|
124
|
+
return item;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get parent departments for dropdown selection
|
|
131
|
+
*/
|
|
132
|
+
getParentDepartments(excludeId) {
|
|
133
|
+
const allItems = [];
|
|
134
|
+
const flattenItems = (items, level = 0) => {
|
|
135
|
+
items.forEach(item => {
|
|
136
|
+
if (item._id !== excludeId) {
|
|
137
|
+
allItems.push({
|
|
138
|
+
...item,
|
|
139
|
+
sydept_name: ' '.repeat(level) + item.sydept_name
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
flattenItems(this.departmentListSubject.value);
|
|
145
|
+
return allItems;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Refresh department list from server
|
|
149
|
+
*/
|
|
150
|
+
refreshDepartmentList() {
|
|
151
|
+
const defaultBody = {
|
|
152
|
+
pageIndex: 1,
|
|
153
|
+
pageSize: 10
|
|
154
|
+
};
|
|
155
|
+
this.getDepartmentList(defaultBody).subscribe({
|
|
156
|
+
next: () => {
|
|
157
|
+
console.log('Department list refreshed successfully');
|
|
158
|
+
},
|
|
159
|
+
error: (error) => {
|
|
160
|
+
console.error('Error refreshing department list:', error);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Handle errors
|
|
166
|
+
*/
|
|
167
|
+
handleError(error) {
|
|
168
|
+
let errorMessage = 'An error occurred';
|
|
169
|
+
if (error instanceof Error) {
|
|
170
|
+
errorMessage = error.message;
|
|
171
|
+
}
|
|
172
|
+
else if (typeof error === 'string') {
|
|
173
|
+
errorMessage = error;
|
|
174
|
+
}
|
|
175
|
+
console.error('Department Management Service Error:', errorMessage);
|
|
176
|
+
return throwError(() => new Error(errorMessage));
|
|
177
|
+
}
|
|
178
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DepartmentManagementService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
179
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DepartmentManagementService, providedIn: 'root' }); }
|
|
180
|
+
}
|
|
181
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DepartmentManagementService, decorators: [{
|
|
182
|
+
type: Injectable,
|
|
183
|
+
args: [{
|
|
184
|
+
providedIn: 'root'
|
|
185
|
+
}]
|
|
186
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwYXJ0bWVudC1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvZGVwYXJ0bWVudC1tYW5hZ2VtZW50L3NlcnZpY2VzL2RlcGFydG1lbnQtbWFuYWdlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLGFBQWEsRUFDYix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBVXJCLE1BQU0scUJBQXFCLENBQUM7OztBQUs3QixNQUFNLE9BQU8sMkJBQTJCO0lBSXRDLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFINUIsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLG9CQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBR2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFpQjtRQUNqQyxNQUFNLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUErQixRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMs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SUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNwRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7OEdBN01VLDJCQUEyQjtrSEFBM0IsMkJBQTJCLGNBRjFCLE1BQU07OzJGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFxyXG4gIGNpZGVQYXRoLCBcclxuICBjb3JlUm91dGVzVXJsLCBcclxuICBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QsIFxyXG4gIGhvc3RNYW5hZ2VyUm91dGVzVXJsLCBcclxuICBJQ29yZVN5ZGVwdCwgXHJcbiAgTURlcGFydG1lbnREZWxldGVQYXlsb2FkLCBcclxuICBNRGVwYXJ0bWVudEdldEJ5SWRQYXlsb2FkLCBcclxuICBkZXBhcnRtZW50QnlJZENvbnRyb2xsZXJSZXNwb25zZSwgXHJcbiAgZGVwYXJ0bWVudERlbGV0ZUNvbnRyb2xsZXJSZXNwb25zZSwgXHJcbiAgZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZSxcclxuICBNRGVwYXJ0bWVudCxcclxuICBNRGVwYXJ0bWVudFRvZ2dsZVN0YXR1c1BheWxvYWQsXHJcbiAgZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZVxyXG59IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVwYXJ0bWVudE1hbmFnZW1lbnRTZXJ2aWNlIHtcclxuICBwcml2YXRlIGRlcGFydG1lbnRMaXN0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUNvcmVTeWRlcHRbXT4oW10pO1xyXG4gIHB1YmxpYyBkZXBhcnRtZW50TGlzdCQgPSB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XHJcbiAgICBjb25zb2xlLmxvZygnRGVwYXJ0bWVudE1hbmFnZW1lbnRTZXJ2aWNlIGluaXRpYWxpemVkIC0gdXNpbmcgcmVhbCBBUEknKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkZXBhcnRtZW50IGxpc3QgZnJvbSBBUElcclxuICAgKi9cclxuICBnZXREZXBhcnRtZW50TGlzdChib2R5OiBNRGVwYXJ0bWVudCk6IE9ic2VydmFibGU8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QoYm9keSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwPy5nZXQ8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4oY2lkZVBhdGg/LmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsPy5jaWRlU3VpdGVIb3N0LCBjb3JlUm91dGVzVXJsPy5tb2R1bGUsIGNvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnQsIHF1ZXJ5XSkpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgocmVzcG9uc2U6IGRlcGFydG1lbnRDb250cm9sbGVyUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZT8uc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlPy5kYXRhIHx8IFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlcGFydG1lbnRNYW5hZ2VtZW50U2VydmljZSBBUEkgZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZGVwYXJ0bWVudCBsaXN0IGZyb20gY2FjaGUgKGlmIGF2YWlsYWJsZSlcclxuICAgKi9cclxuICBnZXREZXBhcnRtZW50TGlzdEZyb21DYWNoZSgpOiBJQ29yZVN5ZGVwdFtdIHtcclxuICAgIHJldHVybiB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBuZXcgZGVwYXJ0bWVudFxyXG4gICAqIFBPU1QgJHtjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50fSAtIHBheWxvYWQ6IE1EZXBhcnRtZW50SW5zZXJ0VXBkYXRlUGF5bG9hZCwgcmVzcG9uc2U6IGRlcGFydG1lbnRJbnNlcnRVcGRhdGVDb250cm9sbGVyUmVzcG9uc2VcclxuICAgKi9cclxuICBjcmVhdGVEZXBhcnRtZW50KGRlcGFydG1lbnQ6IElDb3JlU3lkZXB0KTogT2JzZXJ2YWJsZTxkZXBhcnRtZW50Q29udHJvbGxlclJlc3BvbnNlPiB7XHJcbiAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgZGVwYXJ0bWVudDonLCBkZXBhcnRtZW50KTtcclxuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoPy5qb2luKFtob3N0TWFuYWdlclJvdXRlc1VybD8uY2lkZVN1aXRlSG9zdCwgY29yZVJvdXRlc1VybD8ubW9kdWxlLCBjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4odXJsLCBkZXBhcnRtZW50KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHJlc3BvbnNlOiBkZXBhcnRtZW50Q29udHJvbGxlclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEZXBhcnRtZW50TGlzdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBleGlzdGluZyBkZXBhcnRtZW50XHJcbiAgICogUE9TVCAke2NvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnR9IC0gcGF5bG9hZDogTURlcGFydG1lbnRJbnNlcnRVcGRhdGVQYXlsb2FkLCByZXNwb25zZTogZGVwYXJ0bWVudEluc2VydFVwZGF0ZUNvbnRyb2xsZXJSZXNwb25zZVxyXG4gICAqL1xyXG4gIHVwZGF0ZURlcGFydG1lbnQoaWQ6IHN0cmluZywgZGVwYXJ0bWVudDogSUNvcmVTeWRlcHQpOiBPYnNlcnZhYmxlPGRlcGFydG1lbnRDb250cm9sbGVyUmVzcG9uc2U+IHtcclxuICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBkZXBhcnRtZW50OicsIGlkLCBkZXBhcnRtZW50KTtcclxuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoPy5qb2luKFtob3N0TWFuYWdlclJvdXRlc1VybD8uY2lkZVN1aXRlSG9zdCwgY29yZVJvdXRlc1VybD8ubW9kdWxlLCBjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4odXJsLCBkZXBhcnRtZW50KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHJlc3BvbnNlOiBkZXBhcnRtZW50Q29udHJvbGxlclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEZXBhcnRtZW50TGlzdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkZXBhcnRtZW50IGJ5IElEXHJcbiAgICogR0VUICR7Y29yZVJvdXRlc1VybD8uZGVwYXJ0bWVudH0vYnlJZC86cXVlcnkgLSBwYXlsb2FkOiBNRGVwYXJ0bWVudEdldEJ5SWRQYXlsb2FkLCByZXNwb25zZTogZGVwYXJ0bWVudEJ5SWRDb250cm9sbGVyUmVzcG9uc2VcclxuICAgKi9cclxuICBnZXREZXBhcnRtZW50QnlJZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxkZXBhcnRtZW50QnlJZENvbnRyb2xsZXJSZXNwb25zZT4ge1xyXG4gICAgY29uc29sZS5sb2coJ0dldHRpbmcgZGVwYXJ0bWVudCBieSBJRDonLCBpZCk7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBNRGVwYXJ0bWVudEdldEJ5SWRQYXlsb2FkID0geyBzeWRlcHRfaWQ6IGlkIH07XHJcbiAgICBjb25zdCBxdWVyeSA9IGdlbmVyYXRlU3RyaW5nRnJvbU9iamVjdChwYXlsb2FkKTtcclxuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoPy5qb2luKFtob3N0TWFuYWdlclJvdXRlc1VybD8uY2lkZVN1aXRlSG9zdCwgY29yZVJvdXRlc1VybD8ubW9kdWxlLCBjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50LCAnYnlJZCcsIHF1ZXJ5XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxkZXBhcnRtZW50QnlJZENvbnRyb2xsZXJSZXNwb25zZT4odXJsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgZGVwYXJ0bWVudFxyXG4gICAqIERFTEVURSAke2NvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnR9LzpxdWVyeSAtIHBheWxvYWQ6IE1EZXBhcnRtZW50RGVsZXRlUGF5bG9hZCwgcmVzcG9uc2U6IGRlcGFydG1lbnREZWxldGVDb250cm9sbGVyUmVzcG9uc2VcclxuICAgKi9cclxuICBkZWxldGVEZXBhcnRtZW50KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGRlcGFydG1lbnREZWxldGVDb250cm9sbGVyUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IE1EZXBhcnRtZW50RGVsZXRlUGF5bG9hZCA9IHsgc3lkZXB0X2lkOiBpZCB9O1xyXG4gICAgY29uc3QgcXVlcnkgPSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QocGF5bG9hZCk7XHJcbiAgICBjb25zdCB1cmwgPSBjaWRlUGF0aD8uam9pbihbaG9zdE1hbmFnZXJSb3V0ZXNVcmw/LmNpZGVTdWl0ZUhvc3QsIGNvcmVSb3V0ZXNVcmw/Lm1vZHVsZSwgY29yZVJvdXRlc1VybD8uZGVwYXJ0bWVudCwgcXVlcnldKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPGRlcGFydG1lbnREZWxldGVDb250cm9sbGVyUmVzcG9uc2U+KHVybClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChyZXNwb25zZTogZGVwYXJ0bWVudERlbGV0ZUNvbnRyb2xsZXJSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGVwYXJ0bWVudExpc3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgbXVsdGlwbGUgZGVwYXJ0bWVudHNcclxuICAgKi9cclxuICBkZWxldGVNdWx0aXBsZURlcGFydG1lbnRzKGlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZT86IHN0cmluZzsgZGF0YT86IHVua25vd24gfT4ge1xyXG4gICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIG11bHRpcGxlIGRlcGFydG1lbnRzOicsIGlkcyk7XHJcbiAgICBjb25zdCBwYXlsb2FkID0geyBpZHMgfTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gZ2VuZXJhdGVTdHJpbmdGcm9tT2JqZWN0KHBheWxvYWQpO1xyXG4gICAgY29uc3QgdXJsID0gY2lkZVBhdGg/LmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsPy5jaWRlU3VpdGVIb3N0LCBjb3JlUm91dGVzVXJsPy5tb2R1bGUsIGNvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnQsIHF1ZXJ5XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U/OiBzdHJpbmc7IGRhdGE/OiB1bmtub3duIH0+KHVybClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChyZXNwb25zZTogeyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlPzogc3RyaW5nOyBkYXRhPzogdW5rbm93biB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEZXBhcnRtZW50TGlzdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBkZXBhcnRtZW50IGFjdGl2ZSBzdGF0dXNcclxuICAgKi9cclxuICB0b2dnbGVEZXBhcnRtZW50U3RhdHVzKHBheWxvYWQ6IE1EZXBhcnRtZW50VG9nZ2xlU3RhdHVzUGF5bG9hZCk6IE9ic2VydmFibGU8ZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QocGF5bG9hZCk7IFxyXG4gICAgY29uc3QgdXJsID0gY2lkZVBhdGg/LmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsPy5jaWRlU3VpdGVIb3N0LCBjb3JlUm91dGVzVXJsPy5tb2R1bGUsIGNvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnQsICd0b2dnbGVTdGF0dXMnLCBxdWVyeV0pO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8ZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZT4odXJsLCB7fSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChyZXNwb25zZTogZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGVwYXJ0bWVudExpc3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIGRlcGFydG1lbnQgYnkgSURcclxuICAgKi9cclxuICBmaW5kRGVwYXJ0bWVudEJ5SWQoaWQ6IHN0cmluZywgaXRlbXM6IElDb3JlU3lkZXB0W10gPSB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC52YWx1ZSk6IElDb3JlU3lkZXB0IHwgbnVsbCB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKGl0ZW0uX2lkID09PSBpZCkge1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwYXJlbnQgZGVwYXJ0bWVudHMgZm9yIGRyb3Bkb3duIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGdldFBhcmVudERlcGFydG1lbnRzKGV4Y2x1ZGVJZD86IHN0cmluZyk6IElDb3JlU3lkZXB0W10ge1xyXG4gICAgY29uc3QgYWxsSXRlbXM6IElDb3JlU3lkZXB0W10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBmbGF0dGVuSXRlbXMgPSAoaXRlbXM6IElDb3JlU3lkZXB0W10sIGxldmVsOiBudW1iZXIgPSAwKSA9PiB7XHJcbiAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uX2lkICE9PSBleGNsdWRlSWQpIHtcclxuICAgICAgICAgIGFsbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBzeWRlcHRfbmFtZTogJyAgJy5yZXBlYXQobGV2ZWwpICsgaXRlbS5zeWRlcHRfbmFtZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgZmxhdHRlbkl0ZW1zKHRoaXMuZGVwYXJ0bWVudExpc3RTdWJqZWN0LnZhbHVlKTtcclxuICAgIHJldHVybiBhbGxJdGVtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZnJlc2ggZGVwYXJ0bWVudCBsaXN0IGZyb20gc2VydmVyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWZyZXNoRGVwYXJ0bWVudExpc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWZhdWx0Qm9keSA9IHtcclxuICAgICAgcGFnZUluZGV4OiAxLFxyXG4gICAgICBwYWdlU2l6ZTogMTBcclxuICAgIH07XHJcbiAgICB0aGlzLmdldERlcGFydG1lbnRMaXN0KGRlZmF1bHRCb2R5KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0RlcGFydG1lbnQgbGlzdCByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIGRlcGFydG1lbnQgbGlzdDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGVycm9yc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBPYnNlcnZhYmxlPG5ldmVyPiB7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJztcclxuXHJcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUuZXJyb3IoJ0RlcGFydG1lbnQgTWFuYWdlbWVudCBTZXJ2aWNlIEVycm9yOicsIGVycm9yTWVzc2FnZSk7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XHJcbiAgfVxyXG59ICJdfQ==
|