@sunbird-cb/cbp-ai 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/lib/ai-cbp-routing.module.mjs +56 -0
- package/esm2022/lib/ai-cbp.component.mjs +14 -0
- package/esm2022/lib/ai-cbp.module.mjs +263 -0
- package/esm2022/lib/ai-cbp.service.mjs +14 -0
- package/esm2022/lib/components/add-course/add-course.component.mjs +444 -0
- package/esm2022/lib/components/add-designation/add-designation.component.mjs +460 -0
- package/esm2022/lib/components/add-personalisation/add-personalisation.component.mjs +33 -0
- package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +392 -0
- package/esm2022/lib/components/approval-requests/approval-requests.component.mjs +398 -0
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +265 -0
- package/esm2022/lib/components/delete-role-mapping/delete-role-mapping.component.mjs +53 -0
- package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +39 -0
- package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +699 -0
- package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +188 -0
- package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +1949 -0
- package/esm2022/lib/components/list-popup/list-popup.component.mjs +32 -0
- package/esm2022/lib/components/review-request/review-request.component.mjs +138 -0
- package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +1082 -0
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +714 -0
- package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +370 -0
- package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +235 -0
- package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +125 -0
- package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +397 -0
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +883 -0
- package/esm2022/lib/modules/initial-screen/initial-screen.component.mjs +127 -0
- package/esm2022/lib/modules/shared/constant/app.constant.mjs +2036 -0
- package/esm2022/lib/modules/shared/directives/clickoutside.directive.mjs +38 -0
- package/esm2022/lib/modules/shared/directives/directive.module.mjs +21 -0
- package/esm2022/lib/modules/shared/pipes/order-by-name.pipe.mjs +23 -0
- package/esm2022/lib/modules/shared/services/event.service.mjs +24 -0
- package/esm2022/lib/modules/shared/services/events.mjs +125 -0
- package/esm2022/lib/modules/shared/services/init.service.mjs +41 -0
- package/esm2022/lib/modules/shared/services/role-mapping.service.mjs +261 -0
- package/esm2022/lib/modules/shared/services/shared.service.mjs +869 -0
- package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs +53 -0
- package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +186 -0
- package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +367 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.pipe.mjs +23 -0
- package/esm2022/public-api.mjs +14 -0
- package/esm2022/sunbird-cb-cbp-ai.mjs +5 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs +12952 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ai-cbp-routing.module.d.ts +8 -0
- package/lib/ai-cbp-routing.module.d.ts.map +1 -0
- package/lib/ai-cbp.component.d.ts +7 -0
- package/lib/ai-cbp.component.d.ts.map +1 -0
- package/lib/ai-cbp.module.d.ts +68 -0
- package/lib/ai-cbp.module.d.ts.map +1 -0
- package/lib/ai-cbp.service.d.ts +7 -0
- package/lib/ai-cbp.service.d.ts.map +1 -0
- package/lib/components/add-course/add-course.component.d.ts +67 -0
- package/lib/components/add-course/add-course.component.d.ts.map +1 -0
- package/lib/components/add-designation/add-designation.component.d.ts +52 -0
- package/lib/components/add-designation/add-designation.component.d.ts.map +1 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts +16 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts.map +1 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts +48 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts.map +1 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts +80 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts.map +1 -0
- package/lib/components/dashboard/dashboard.component.d.ts +55 -0
- package/lib/components/dashboard/dashboard.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts +18 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +18 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts +94 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +35 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +198 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/list-popup/list-popup.component.d.ts +13 -0
- package/lib/components/list-popup/list-popup.component.d.ts.map +1 -0
- package/lib/components/review-request/review-request.component.d.ts +39 -0
- package/lib/components/review-request/review-request.component.d.ts.map +1 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +99 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +83 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +48 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +41 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts +29 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts +49 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +73 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts +85 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts.map +1 -0
- package/lib/modules/shared/constant/app.constant.d.ts +457 -0
- package/lib/modules/shared/constant/app.constant.d.ts.map +1 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts +13 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts.map +1 -0
- package/lib/modules/shared/directives/directive.module.d.ts +8 -0
- package/lib/modules/shared/directives/directive.module.d.ts.map +1 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts +8 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts.map +1 -0
- package/lib/modules/shared/services/event.service.d.ts +12 -0
- package/lib/modules/shared/services/event.service.d.ts.map +1 -0
- package/lib/modules/shared/services/events.d.ts +200 -0
- package/lib/modules/shared/services/events.d.ts.map +1 -0
- package/lib/modules/shared/services/init.service.d.ts +13 -0
- package/lib/modules/shared/services/init.service.d.ts.map +1 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts +21 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts.map +1 -0
- package/lib/modules/shared/services/shared.service.d.ts +108 -0
- package/lib/modules/shared/services/shared.service.d.ts.map +1 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts +14 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +29 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts +64 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts +11 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
- package/package.json +28 -0
- package/public-api.d.ts +11 -0
- package/public-api.d.ts.map +1 -0
- package/sunbird-cb-cbp-ai-0.0.1.tgz +0 -0
- package/sunbird-cb-cbp-ai.d.ts.map +1 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
3
|
+
import { MatPaginator } from '@angular/material/paginator';
|
|
4
|
+
import { MatTableDataSource } from '@angular/material/table';
|
|
5
|
+
import { ListPopupComponent } from '../list-popup/list-popup.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/material/dialog";
|
|
8
|
+
import * as i2 from "../../modules/shared/services/shared.service";
|
|
9
|
+
import * as i3 from "@angular/material/snack-bar";
|
|
10
|
+
import * as i4 from "@angular/forms";
|
|
11
|
+
import * as i5 from "@angular/router";
|
|
12
|
+
import * as i6 from "@angular/common";
|
|
13
|
+
import * as i7 from "@angular/material/legacy-card";
|
|
14
|
+
import * as i8 from "@angular/material/legacy-form-field";
|
|
15
|
+
import * as i9 from "@angular/material/legacy-input";
|
|
16
|
+
import * as i10 from "@angular/material/legacy-button";
|
|
17
|
+
import * as i11 from "@angular/material/icon";
|
|
18
|
+
import * as i12 from "@angular/material/legacy-select";
|
|
19
|
+
import * as i13 from "@angular/material/legacy-core";
|
|
20
|
+
import * as i14 from "@angular/material/progress-spinner";
|
|
21
|
+
import * as i15 from "@angular/material/table";
|
|
22
|
+
import * as i16 from "@angular/material/paginator";
|
|
23
|
+
import * as i17 from "@angular/material/tooltip";
|
|
24
|
+
export class ApprovalRequestsComponent {
|
|
25
|
+
constructor(dialog, sharedService, snackBar, fb, router) {
|
|
26
|
+
this.dialog = dialog;
|
|
27
|
+
this.sharedService = sharedService;
|
|
28
|
+
this.snackBar = snackBar;
|
|
29
|
+
this.fb = fb;
|
|
30
|
+
this.router = router;
|
|
31
|
+
this.dataSource = new MatTableDataSource([]);
|
|
32
|
+
this.selectedMinistryType = 'ministry';
|
|
33
|
+
this.ministryData = [];
|
|
34
|
+
this.ministryFullData = [];
|
|
35
|
+
this.disableBtn = true;
|
|
36
|
+
this.searchText = '';
|
|
37
|
+
this.displayedColumns = ['request_id', 'date', 'designation', 'status', 'actions'];
|
|
38
|
+
this.cbpFinalObj = {};
|
|
39
|
+
this.departmentData = [];
|
|
40
|
+
this.approvalRequests = [
|
|
41
|
+
// {
|
|
42
|
+
// name: 'Work Allocation',
|
|
43
|
+
// originalName: 'ACBP_Ministry_of_Women_and_Child_Development_Extract...',
|
|
44
|
+
// size: 4.5,
|
|
45
|
+
// date: 'Oct 13, 2025'
|
|
46
|
+
// },
|
|
47
|
+
// {
|
|
48
|
+
// name: 'Screenshot 2025-10-08 at 12',
|
|
49
|
+
// originalName: 'Screenshot 2025-10-08 at 12.54.18 PM.png',
|
|
50
|
+
// size: 331.8,
|
|
51
|
+
// date: 'Oct 13, 2025'
|
|
52
|
+
// }
|
|
53
|
+
];
|
|
54
|
+
this.loading = false;
|
|
55
|
+
this.filteredMinistryData = [];
|
|
56
|
+
this.searchControl = new FormControl('');
|
|
57
|
+
this.panelOpen = false;
|
|
58
|
+
this.departmentPanelOpen = false;
|
|
59
|
+
this.filteredList = [];
|
|
60
|
+
this.filteredDepartmentList = [];
|
|
61
|
+
this.loginUserOrgIds = [];
|
|
62
|
+
this.originalMinistryData = [];
|
|
63
|
+
this.status = [
|
|
64
|
+
{ "code": "", label: "All Status" },
|
|
65
|
+
{ "code": "pending", label: "Pending" },
|
|
66
|
+
{ "code": "approved", label: "Approved" },
|
|
67
|
+
{ "code": "rejected", label: "Rejected" }
|
|
68
|
+
];
|
|
69
|
+
this.time = [
|
|
70
|
+
{ "code": "", label: "All Time" },
|
|
71
|
+
{ "code": "last_7_days", label: "Last 7 Days" },
|
|
72
|
+
{ "code": "last_30_days", label: "Last 30 Days" },
|
|
73
|
+
{ "code": "last_90_days", label: "Last 90 Days" }
|
|
74
|
+
];
|
|
75
|
+
this.filteredStatus = [...this.status];
|
|
76
|
+
this.filteredTime = [...this.time];
|
|
77
|
+
this.roleMappingForm = this.fb.group({
|
|
78
|
+
ministryType: ['ministry', Validators.required],
|
|
79
|
+
ministry: [null, Validators.required],
|
|
80
|
+
sectors: [[]],
|
|
81
|
+
departments: [[]]
|
|
82
|
+
});
|
|
83
|
+
this.filterForm = this.fb.group({
|
|
84
|
+
status: [''],
|
|
85
|
+
time: [''],
|
|
86
|
+
search: ['']
|
|
87
|
+
});
|
|
88
|
+
// this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage()
|
|
89
|
+
this.getMinistryData();
|
|
90
|
+
}
|
|
91
|
+
ngOnInit() {
|
|
92
|
+
this.cbpPlanFinalObj = this.sharedService.getCBPPlanLocalStorage();
|
|
93
|
+
console.log('cbpFinalObj--', this.cbpFinalObj);
|
|
94
|
+
this.searchControl.valueChanges.subscribe(searchText => {
|
|
95
|
+
if (searchText) {
|
|
96
|
+
this.filterMinistryData(searchText);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.filteredMinistryData = this.ministryData;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
this.sharedService.summaryTriggerExecuted.subscribe((data) => {
|
|
103
|
+
if (data && data?.file_id) {
|
|
104
|
+
this.getApprovalRequests();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
if (this.cbpPlanFinalObj && this.cbpPlanFinalObj.ministry && this.cbpPlanFinalObj.ministry.identifier) {
|
|
108
|
+
this.getApprovalRequests();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
ngAfterViewInit() {
|
|
112
|
+
this.dataSource.paginator = this.paginator;
|
|
113
|
+
}
|
|
114
|
+
getApprovalRequests() {
|
|
115
|
+
let reqBody = {
|
|
116
|
+
state_center_id: this.cbpPlanFinalObj?.ministry?.identifier,
|
|
117
|
+
include_summary: true,
|
|
118
|
+
skip: 0,
|
|
119
|
+
limit: 200
|
|
120
|
+
};
|
|
121
|
+
if (this.cbpPlanFinalObj && this.cbpPlanFinalObj?.departments) {
|
|
122
|
+
reqBody['department_id'] = this.cbpPlanFinalObj?.departments;
|
|
123
|
+
}
|
|
124
|
+
this.loading = true;
|
|
125
|
+
this.sharedService.getApprovalRequests(reqBody).subscribe((res) => {
|
|
126
|
+
console.log('res--', res);
|
|
127
|
+
if (res && res?.items && res?.items?.length) {
|
|
128
|
+
this.loading = false;
|
|
129
|
+
this.approvalRequests = res?.items;
|
|
130
|
+
this.dataSource.data = this.approvalRequests;
|
|
131
|
+
console.log('this.approvalRequests', this.approvalRequests);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.loading = false;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
filteredapprovalRequests() {
|
|
139
|
+
let data = [...this.approvalRequests];
|
|
140
|
+
const search = this.filterForm.get('search')?.value?.toLowerCase() || '';
|
|
141
|
+
const status = this.filterForm.get('status')?.value;
|
|
142
|
+
const time = this.filterForm.get('time')?.value;
|
|
143
|
+
// Search Filter
|
|
144
|
+
if (search) {
|
|
145
|
+
data = data.filter(r => (r.request_name || '').toLowerCase().includes(search));
|
|
146
|
+
}
|
|
147
|
+
// Status Filter
|
|
148
|
+
if (status) {
|
|
149
|
+
data = data.filter(r => r.status === status);
|
|
150
|
+
}
|
|
151
|
+
// Time Filter
|
|
152
|
+
if (time) {
|
|
153
|
+
const now = new Date();
|
|
154
|
+
data = data.filter(r => {
|
|
155
|
+
const created = new Date(r.created_at);
|
|
156
|
+
const diffDays = (now.getTime() - created.getTime()) / (1000 * 3600 * 24);
|
|
157
|
+
if (time === 'last_7_days')
|
|
158
|
+
return diffDays <= 7;
|
|
159
|
+
if (time === 'last_30_days')
|
|
160
|
+
return diffDays <= 30;
|
|
161
|
+
if (time === 'last_90_days')
|
|
162
|
+
return diffDays <= 90;
|
|
163
|
+
return true;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return data;
|
|
167
|
+
}
|
|
168
|
+
deleteDocument(docToDelete) {
|
|
169
|
+
this.approvalRequests = this.approvalRequests.filter(doc => doc !== docToDelete);
|
|
170
|
+
this.loading = true;
|
|
171
|
+
this.sharedService.deleteSummary(docToDelete?.file_id).subscribe((res) => {
|
|
172
|
+
if (res) {
|
|
173
|
+
this.sharedService.deleteFile(docToDelete?.file_id).subscribe((dres) => {
|
|
174
|
+
this.loading = true;
|
|
175
|
+
if (dres) {
|
|
176
|
+
this.loading = false;
|
|
177
|
+
this.snackBar.open('Document Deleted Successfully', 'X', {
|
|
178
|
+
duration: 3000,
|
|
179
|
+
panelClass: ['snackbar-success']
|
|
180
|
+
});
|
|
181
|
+
this.getApprovalRequests();
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.loading = false;
|
|
185
|
+
this.snackBar.open('Error While Deleting Document', 'X', {
|
|
186
|
+
duration: 3000,
|
|
187
|
+
panelClass: ['snackbar-error']
|
|
188
|
+
});
|
|
189
|
+
this.getApprovalRequests();
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
this.loading = false;
|
|
193
|
+
this.snackBar.open('Document Summary Deleted Successfully', 'X', {
|
|
194
|
+
duration: 3000,
|
|
195
|
+
panelClass: ['snackbar-success']
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
this.loading = false;
|
|
200
|
+
this.snackBar.open('Error While Deleting Document Summary', 'X', {
|
|
201
|
+
duration: 3000,
|
|
202
|
+
panelClass: ['snackbar-error']
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
applyFilters() {
|
|
208
|
+
const filtered = this.filteredapprovalRequests();
|
|
209
|
+
this.dataSource.data = filtered;
|
|
210
|
+
if (this.paginator) {
|
|
211
|
+
this.paginator.firstPage();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
onMinistryTypeChange(event) {
|
|
215
|
+
this.roleMappingForm.reset();
|
|
216
|
+
// console.log('event', event)
|
|
217
|
+
this.getMinistryData();
|
|
218
|
+
this.sharedService.cbpPlanFinalObj['ministryType'] = event.value;
|
|
219
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
220
|
+
this.selectedMinistryType = event?.value;
|
|
221
|
+
this.roleMappingForm.get('sectors')?.setValue([]);
|
|
222
|
+
this.roleMappingForm.controls.ministryType.setValue(this.selectedMinistryType);
|
|
223
|
+
}
|
|
224
|
+
onMinistryChange(event) {
|
|
225
|
+
const selectedMinistryId = event.value;
|
|
226
|
+
// console.log('Selected Ministry ID:', selectedMinistryId);
|
|
227
|
+
// You can access the selected object if needed
|
|
228
|
+
const selectedMinistry = this.ministryData.find(item => item.identifier === selectedMinistryId);
|
|
229
|
+
console.log('Selected Ministry:', selectedMinistry);
|
|
230
|
+
``;
|
|
231
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = { identifier: selectedMinistryId?.identifier, name: selectedMinistryId?.orgName };
|
|
232
|
+
if (selectedMinistryId && this.selectedMinistryType === 'state') {
|
|
233
|
+
this.sharedService.getDepartmentList(selectedMinistryId).subscribe((res) => {
|
|
234
|
+
this.departmentData = res;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (this.selectedMinistryType === 'state') {
|
|
238
|
+
this.sharedService.cbpPlanFinalObj['ministryType'] = this.roleMappingForm.controls.ministryType.value;
|
|
239
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = { identifier: selectedMinistry?.identifier, name: selectedMinistry?.orgName };
|
|
240
|
+
this.sharedService.cbpPlanFinalObj['departments'] = this.roleMappingForm.controls.departments.value;
|
|
241
|
+
this.sharedService.cbpPlanFinalObj['sectors'] = this.roleMappingForm.controls.sectors.value;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
this.sharedService.cbpPlanFinalObj['ministryType'] = this.roleMappingForm.controls.ministryType.value;
|
|
245
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = { identifier: selectedMinistry?.identifier, name: selectedMinistry?.orgName };
|
|
246
|
+
}
|
|
247
|
+
console.log('this.sharedService.cbpPlanFinalObj', this.sharedService.cbpPlanFinalObj);
|
|
248
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
249
|
+
console.log('this.roleMappingForm', this.roleMappingForm);
|
|
250
|
+
}
|
|
251
|
+
filterMinistryData(searchText) {
|
|
252
|
+
if (searchText) {
|
|
253
|
+
console.log('searhTect, ', searchText);
|
|
254
|
+
const search = searchText?.trim().toLowerCase() || '';
|
|
255
|
+
this.filteredMinistryData = !search
|
|
256
|
+
? [...this.ministryData]
|
|
257
|
+
: this.ministryData.filter(item => item.orgName?.trim().toLowerCase().startsWith(search));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
getMinistryData() {
|
|
261
|
+
this.loading = true;
|
|
262
|
+
this.sharedService.getMinistryData(this.selectedMinistryType).subscribe((data) => {
|
|
263
|
+
this.loading = false;
|
|
264
|
+
console.log('data--', data);
|
|
265
|
+
this.ministryFullData = data;
|
|
266
|
+
this.ministryData = [];
|
|
267
|
+
if (this.selectedMinistryType === 'ministry') {
|
|
268
|
+
data.forEach((item) => {
|
|
269
|
+
if (item?.sbOrgType === 'ministry') {
|
|
270
|
+
this.ministryData.push(item);
|
|
271
|
+
this.filteredMinistryData = [...this.ministryData];
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
else if (this.selectedMinistryType === 'state') {
|
|
276
|
+
data.forEach((item) => {
|
|
277
|
+
if (item?.sbOrgType === 'state') {
|
|
278
|
+
this.ministryData.push(item);
|
|
279
|
+
this.filteredMinistryData = [...this.ministryData];
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
this.getUserProfileData();
|
|
284
|
+
});
|
|
285
|
+
console.log('this.ministryData--', this.ministryData);
|
|
286
|
+
console.log('this.filteredMinistryData--', this.filteredMinistryData);
|
|
287
|
+
}
|
|
288
|
+
routeToMain() {
|
|
289
|
+
this.router.navigate(['/ai/']);
|
|
290
|
+
}
|
|
291
|
+
viewSummary(doc) {
|
|
292
|
+
const dialogRef = this.dialog.open(ListPopupComponent, {
|
|
293
|
+
width: '800px',
|
|
294
|
+
data: { element: doc, type: 'doc-summary' },
|
|
295
|
+
disableClose: true,
|
|
296
|
+
maxHeight: '80vh'
|
|
297
|
+
});
|
|
298
|
+
dialogRef.afterClosed().subscribe(() => {
|
|
299
|
+
// No need to do anything special here to reset inline expanded state
|
|
300
|
+
// Because you're using dialog, not inline expand – view remains in initial (collapsed) state
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
viewRequest(request) {
|
|
304
|
+
console.log('request--', request);
|
|
305
|
+
this.loading = true;
|
|
306
|
+
this.router.navigate(['/ai/review-request', request.id]);
|
|
307
|
+
}
|
|
308
|
+
revokeApprovalRequest(request) {
|
|
309
|
+
console.log('request--', request);
|
|
310
|
+
this.loading = true;
|
|
311
|
+
let reqBody = {
|
|
312
|
+
"request_id": request?.id
|
|
313
|
+
};
|
|
314
|
+
this.sharedService.revokeApprovalRequest(reqBody).subscribe({
|
|
315
|
+
next: (res) => {
|
|
316
|
+
console.log('res', res);
|
|
317
|
+
this.loading = false;
|
|
318
|
+
this.getApprovalRequests();
|
|
319
|
+
},
|
|
320
|
+
error: () => {
|
|
321
|
+
this.loading = false;
|
|
322
|
+
this.snackBar.open('Failed to revoke the approval request.', 'X', {
|
|
323
|
+
duration: 3000,
|
|
324
|
+
panelClass: ['snackbar-error']
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
onOpened(opened) {
|
|
330
|
+
this.panelOpen = opened;
|
|
331
|
+
}
|
|
332
|
+
onOpenedDepartment(opened) {
|
|
333
|
+
this.departmentPanelOpen = opened;
|
|
334
|
+
}
|
|
335
|
+
filterData(event) {
|
|
336
|
+
if (event && event.target && event.target.value) {
|
|
337
|
+
const s = event.target.value.toLowerCase();
|
|
338
|
+
this.filteredList = this.ministryData.filter(x => x.orgName.toLowerCase().includes(s));
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
this.filteredList = this.ministryData;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
filterDepartmentData(event) {
|
|
345
|
+
if (event && event.target && event.target.value) {
|
|
346
|
+
const s = event.target.value.toLowerCase();
|
|
347
|
+
this.filteredDepartmentList = this.departmentData.filter(x => x.orgName.toLowerCase().includes(s));
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
this.filteredDepartmentList = this.departmentData;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
getUserProfileData() {
|
|
354
|
+
this.sharedService.getUserProfile().subscribe((data) => {
|
|
355
|
+
console.log('data--', data);
|
|
356
|
+
this.loginUserOrgIds = data?.organization_ids;
|
|
357
|
+
let filteredMinistryData = [];
|
|
358
|
+
console.log('this.ministryFullData--', this.ministryFullData);
|
|
359
|
+
this.ministryFullData.map((item) => {
|
|
360
|
+
if (this.loginUserOrgIds.indexOf(item?.identifier) > -1) {
|
|
361
|
+
filteredMinistryData.push(item);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
this.ministryData = filteredMinistryData;
|
|
365
|
+
this.originalMinistryData = filteredMinistryData;
|
|
366
|
+
this.filteredList = filteredMinistryData;
|
|
367
|
+
console.log('this.filteredList--', this.filteredList);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
routeToInitial() {
|
|
371
|
+
this.router.navigate(['/ai/initial']);
|
|
372
|
+
}
|
|
373
|
+
filterList(value, type) {
|
|
374
|
+
const search = value.toLowerCase();
|
|
375
|
+
switch (type) {
|
|
376
|
+
case 'status':
|
|
377
|
+
this.filteredStatus = this.status.filter(v => v.label?.toLowerCase().includes(search));
|
|
378
|
+
break;
|
|
379
|
+
case 'time':
|
|
380
|
+
this.filteredTime = this.time.filter(v => v.label?.toLowerCase().includes(search));
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
clearSearch() {
|
|
385
|
+
this.searchText = '';
|
|
386
|
+
this.applyFilters();
|
|
387
|
+
}
|
|
388
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApprovalRequestsComponent, deps: [{ token: i1.MatDialog }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i4.FormBuilder }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
389
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ApprovalRequestsComponent, selector: "app-approval-requests", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "<div class=\"upload-container\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 ml-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <mat-card class=\"mat-card-container mt-20\" [formGroup]=\"roleMappingForm\">\n <div class=\"header\">\n <div class=\"sub-heading\">\n <p>Approval Requests</p>\n </div>\n\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{cbpPlanFinalObj?.ministry?.orgName}} <span *ngIf=\"cbpPlanFinalObj?.department_name\">\n / {{cbpPlanFinalObj?.department_name}}</span>\n </p>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"routeToInitial()\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <!-- <div>\n <button [ngClass]=\"!(cbpPlanFinalObj?.ministry?.orgName) ? 'btn-disable':'btn-active'\" mat-raised-button\n color=\"primary\" [disabled]=\"!(cbpPlanFinalObj?.ministry?.orgName)\" (click)=\"openUploadDialog()\">\n <mat-icon>upload</mat-icon> Upload Document\n </button>\n </div> -->\n </div>\n </div>\n </div>\n\n\n\n\n\n </mat-card>\n <mat-card class=\"\">\n <form [formGroup]=\"filterForm\">\n <div class=\"search flex margin-right-m filter-container\">\n <div>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-filter h-4 w-4\">\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon>\n </svg>\n </div>\n <div>\n <b> Filters</b>\n </div>\n <div class=\"mt-10 w-50\">\n\n <div class=\"search-container\"> \n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" label=\"\" formControlName=\"search\"\n (keyup)=\"applyFilters()\" placeholder=\"Search by Request ID\" type=\"Standard\">\n \n </div>\n\n </div>\n\n\n\n </div>\n <div class=\"search-and-buttons-container\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-select\">\n <!-- <mat-label style=\"font-weight: normal;\">\n {{ filterForm.get('status')?.value ? '' : 'Select Status' }}\n </mat-label> -->\n\n <mat-select formControlName=\"status\" panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n\n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\" matInput\n placeholder=\"Search Status\" (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'status')\" />\n\n <!-- Values -->\n <mat-option *ngFor=\"let r of filteredStatus\" [value]=\"r?.code\">\n {{ r?.label }}\n </mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-select\">\n <!-- <mat-label style=\"font-weight: normal;\">\n {{ filterForm.get('time')?.value ? '' : 'Select Time' }}\n </mat-label> -->\n\n <mat-select formControlName=\"time\" panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n\n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\" matInput\n placeholder=\"Search Time\" (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'time')\" />\n\n <!-- Values -->\n <mat-option *ngFor=\"let r of filteredTime\" [value]=\"r?.code\">\n {{ r?.label }}\n </mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </form>\n <p class=\"mt-10\" style=\"font-family: 'Lato'; font-size: 18px; margin-left: 10px;\">\n {{dataSource.data.length}} Approval Requests</p>\n <table style=\"border-radius: 25px 25px 0 0;\n overflow: hidden;\n box-shadow: 0 5px 5px rgba(0, 0, 0, 0.12);\" mat-table [dataSource]=\"dataSource\"\n class=\"mat-elevation-z2 full-width-table mt-10\">\n\n <!-- Document Column -->\n <ng-container matColumnDef=\"request_id\">\n <th mat-header-cell *matHeaderCellDef> Request ID </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <div>\n <div class=\"doc-title\" *ngIf=\"request.request_name\">{{ request.request_name }}</div>\n <div class=\"doc-title\" *ngIf=\"!request.request_name\">{{ request.request_name }}</div>\n </div>\n </td>\n </ng-container>\n\n\n\n <!-- Summary Text Column -->\n <!-- <ng-container matColumnDef=\"summary_text\">\n <th mat-header-cell *matHeaderCellDef> Summary </th>\n <td mat-cell *matCellDef=\"let doc\">\n <div class=\"doc-summary-text\" style=\"width: 80%;\">\n <markdown [data]=\"doc?.summary_text | slice : 0 : 200\"></markdown>\n </div>\n </td>\n </ng-container> -->\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef> Date & Time</th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\"> {{ request.created_at | date: 'MMM d, y'}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"designation\">\n <th mat-header-cell *matHeaderCellDef> No of Designation </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <span>{{request?.designation_count}}</span>\n </td>\n </ng-container>\n\n\n <!-- Summary Status Column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef> Request Status </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <span *ngIf=\"request.status === 'completed'\" class=\"success\"> {{ request.status | titlecase\n }} </span>\n <span *ngIf=\"request.status !== 'completed'\" class=\"in-progress\"> {{ request.status |\n titlecase }} </span>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <div class=\"action-flex\">\n <div>\n <button class=\"btn-active\" mat-raised-button color=\"primary\" (click)=\"viewRequest(request)\"\n matTooltip=\"View/Review Request\">\n View/Review Request\n </button>\n </div>\n <div>\n <button style=\"margin-left: 15px;\" *ngIf=\"request.status === 'COMPLETED'\"\n mat-icon-button color=\"warn\" (click)=\"revokeApprovalRequest(request)\" matTooltip=\"Delete\">\n <mat-icon>delete</mat-icon>\n Revoke Request\n </button>\n </div>\n </div>\n\n\n\n\n\n </td>\n </ng-container>\n\n <!-- Header and Row Definitions -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n\n <!-- No Data Message -->\n\n </table>\n <div *ngIf=\"dataSource.data.length === 0\" class=\"no-data-message\">\n No record found\n </div>\n <!-- Pagination -->\n <div class=\"mt-1\">\n <!-- <mat-paginator class=\"custom-pagination\" [pageSize]=\"5\" [pageSizeOptions]=\"[5, 10, 20]\"></mat-paginator> -->\n <mat-paginator [pageSize]=\"5\" [pageSizeOptions]=\"[5, 10, 20]\"></mat-paginator>\n </div>\n\n\n </mat-card>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".upload-container{background:transparent;min-height:100vh;padding:24px 0;margin:0 30px 0 50px}.header{display:flex;flex-direction:row;justify-content:space-between}.primary-btn{background-color:#1b4ca1;color:#fff}:host .search .rsearch{position:relative}:host .search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}:host .search .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}:host .search .clear-icon:hover{color:#333}:host .search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:100%}.no-data-message{text-align:center;padding:16px;font-style:italic;color:#888}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:34px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.ml-10{margin-left:10px}.mt-10{margin-top:10px}.mt-20{margin-top:20px}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}.doc-title{font-weight:700}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;z-index:10;background:#fff;font-size:16px;box-shadow:0 2px 4px #0000001a;padding:5px 10px}:host ::ng-deep .mat-mdc-row{font-size:16px}:host ::ng-deep .mat-mdc-cell{padding:5px 10px}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;font-size:18px;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none;padding:5px 10px}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}::ng-deep .doc-summary-text ::ng-deep markdown p{line-height:1.5rem;font-family:Lato;font-size:1rem!important;font-style:normal;font-weight:400}:host .mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}:host ::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}:host ::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}.edit-plan{display:flex;padding:4px 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px;height:30px}.select-map-route-container{display:flex;flex-direction:row;width:100%}.select-map-flex{display:flex;flex-direction:row}.select-map-flex-container{display:flex;justify-content:space-between;width:100%}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.success{background:green;padding:4px 6px;color:#fff;border-radius:20px}.in-progress{background:orange;padding:4px 6px;color:#fff;border-radius:20px}.filter-container{display:flex;align-items:center;flex-direction:row;width:100%;gap:10px;background:#e3ecfa;padding:10px;border-radius:10px}.w-50{width:50%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:4px;flex-direction:column;flex-wrap:wrap;width:20%;margin:0 5px}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}:host ::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}.header-container{display:flex;flex-direction:row;justify-content:space-between;width:100%;margin:10px 0}.right-side-container{display:flex;justify-content:space-between}:host ::ng-deep .language-select .mat-select-trigger{font-weight:400!important}:host ::ng-deep .language-select .mat-select-value{color:#fff!important}:host ::ng-deep .custom-pagination{background-color:transparent!important}.action-flex{display:flex;gap:10px}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i8.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i10.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i16.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i6.DatePipe, name: "date" }] }); }
|
|
390
|
+
}
|
|
391
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApprovalRequestsComponent, decorators: [{
|
|
392
|
+
type: Component,
|
|
393
|
+
args: [{ selector: 'app-approval-requests', template: "<div class=\"upload-container\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 ml-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <mat-card class=\"mat-card-container mt-20\" [formGroup]=\"roleMappingForm\">\n <div class=\"header\">\n <div class=\"sub-heading\">\n <p>Approval Requests</p>\n </div>\n\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{cbpPlanFinalObj?.ministry?.orgName}} <span *ngIf=\"cbpPlanFinalObj?.department_name\">\n / {{cbpPlanFinalObj?.department_name}}</span>\n </p>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"routeToInitial()\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <!-- <div>\n <button [ngClass]=\"!(cbpPlanFinalObj?.ministry?.orgName) ? 'btn-disable':'btn-active'\" mat-raised-button\n color=\"primary\" [disabled]=\"!(cbpPlanFinalObj?.ministry?.orgName)\" (click)=\"openUploadDialog()\">\n <mat-icon>upload</mat-icon> Upload Document\n </button>\n </div> -->\n </div>\n </div>\n </div>\n\n\n\n\n\n </mat-card>\n <mat-card class=\"\">\n <form [formGroup]=\"filterForm\">\n <div class=\"search flex margin-right-m filter-container\">\n <div>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-filter h-4 w-4\">\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon>\n </svg>\n </div>\n <div>\n <b> Filters</b>\n </div>\n <div class=\"mt-10 w-50\">\n\n <div class=\"search-container\"> \n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" label=\"\" formControlName=\"search\"\n (keyup)=\"applyFilters()\" placeholder=\"Search by Request ID\" type=\"Standard\">\n \n </div>\n\n </div>\n\n\n\n </div>\n <div class=\"search-and-buttons-container\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-select\">\n <!-- <mat-label style=\"font-weight: normal;\">\n {{ filterForm.get('status')?.value ? '' : 'Select Status' }}\n </mat-label> -->\n\n <mat-select formControlName=\"status\" panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n\n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\" matInput\n placeholder=\"Search Status\" (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'status')\" />\n\n <!-- Values -->\n <mat-option *ngFor=\"let r of filteredStatus\" [value]=\"r?.code\">\n {{ r?.label }}\n </mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-select\">\n <!-- <mat-label style=\"font-weight: normal;\">\n {{ filterForm.get('time')?.value ? '' : 'Select Time' }}\n </mat-label> -->\n\n <mat-select formControlName=\"time\" panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n\n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\" matInput\n placeholder=\"Search Time\" (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'time')\" />\n\n <!-- Values -->\n <mat-option *ngFor=\"let r of filteredTime\" [value]=\"r?.code\">\n {{ r?.label }}\n </mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </form>\n <p class=\"mt-10\" style=\"font-family: 'Lato'; font-size: 18px; margin-left: 10px;\">\n {{dataSource.data.length}} Approval Requests</p>\n <table style=\"border-radius: 25px 25px 0 0;\n overflow: hidden;\n box-shadow: 0 5px 5px rgba(0, 0, 0, 0.12);\" mat-table [dataSource]=\"dataSource\"\n class=\"mat-elevation-z2 full-width-table mt-10\">\n\n <!-- Document Column -->\n <ng-container matColumnDef=\"request_id\">\n <th mat-header-cell *matHeaderCellDef> Request ID </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <div>\n <div class=\"doc-title\" *ngIf=\"request.request_name\">{{ request.request_name }}</div>\n <div class=\"doc-title\" *ngIf=\"!request.request_name\">{{ request.request_name }}</div>\n </div>\n </td>\n </ng-container>\n\n\n\n <!-- Summary Text Column -->\n <!-- <ng-container matColumnDef=\"summary_text\">\n <th mat-header-cell *matHeaderCellDef> Summary </th>\n <td mat-cell *matCellDef=\"let doc\">\n <div class=\"doc-summary-text\" style=\"width: 80%;\">\n <markdown [data]=\"doc?.summary_text | slice : 0 : 200\"></markdown>\n </div>\n </td>\n </ng-container> -->\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef> Date & Time</th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\"> {{ request.created_at | date: 'MMM d, y'}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"designation\">\n <th mat-header-cell *matHeaderCellDef> No of Designation </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <span>{{request?.designation_count}}</span>\n </td>\n </ng-container>\n\n\n <!-- Summary Status Column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef> Request Status </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <span *ngIf=\"request.status === 'completed'\" class=\"success\"> {{ request.status | titlecase\n }} </span>\n <span *ngIf=\"request.status !== 'completed'\" class=\"in-progress\"> {{ request.status |\n titlecase }} </span>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let request\" style=\"width: 15%;\">\n <div class=\"action-flex\">\n <div>\n <button class=\"btn-active\" mat-raised-button color=\"primary\" (click)=\"viewRequest(request)\"\n matTooltip=\"View/Review Request\">\n View/Review Request\n </button>\n </div>\n <div>\n <button style=\"margin-left: 15px;\" *ngIf=\"request.status === 'COMPLETED'\"\n mat-icon-button color=\"warn\" (click)=\"revokeApprovalRequest(request)\" matTooltip=\"Delete\">\n <mat-icon>delete</mat-icon>\n Revoke Request\n </button>\n </div>\n </div>\n\n\n\n\n\n </td>\n </ng-container>\n\n <!-- Header and Row Definitions -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n\n <!-- No Data Message -->\n\n </table>\n <div *ngIf=\"dataSource.data.length === 0\" class=\"no-data-message\">\n No record found\n </div>\n <!-- Pagination -->\n <div class=\"mt-1\">\n <!-- <mat-paginator class=\"custom-pagination\" [pageSize]=\"5\" [pageSizeOptions]=\"[5, 10, 20]\"></mat-paginator> -->\n <mat-paginator [pageSize]=\"5\" [pageSizeOptions]=\"[5, 10, 20]\"></mat-paginator>\n </div>\n\n\n </mat-card>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".upload-container{background:transparent;min-height:100vh;padding:24px 0;margin:0 30px 0 50px}.header{display:flex;flex-direction:row;justify-content:space-between}.primary-btn{background-color:#1b4ca1;color:#fff}:host .search .rsearch{position:relative}:host .search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}:host .search .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}:host .search .clear-icon:hover{color:#333}:host .search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:100%}.no-data-message{text-align:center;padding:16px;font-style:italic;color:#888}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:34px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.ml-10{margin-left:10px}.mt-10{margin-top:10px}.mt-20{margin-top:20px}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}.doc-title{font-weight:700}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;z-index:10;background:#fff;font-size:16px;box-shadow:0 2px 4px #0000001a;padding:5px 10px}:host ::ng-deep .mat-mdc-row{font-size:16px}:host ::ng-deep .mat-mdc-cell{padding:5px 10px}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;font-size:18px;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none;padding:5px 10px}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}::ng-deep .doc-summary-text ::ng-deep markdown p{line-height:1.5rem;font-family:Lato;font-size:1rem!important;font-style:normal;font-weight:400}:host .mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}:host ::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}:host ::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}.edit-plan{display:flex;padding:4px 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px;height:30px}.select-map-route-container{display:flex;flex-direction:row;width:100%}.select-map-flex{display:flex;flex-direction:row}.select-map-flex-container{display:flex;justify-content:space-between;width:100%}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.success{background:green;padding:4px 6px;color:#fff;border-radius:20px}.in-progress{background:orange;padding:4px 6px;color:#fff;border-radius:20px}.filter-container{display:flex;align-items:center;flex-direction:row;width:100%;gap:10px;background:#e3ecfa;padding:10px;border-radius:10px}.w-50{width:50%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:4px;flex-direction:column;flex-wrap:wrap;width:20%;margin:0 5px}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}:host ::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}.header-container{display:flex;flex-direction:row;justify-content:space-between;width:100%;margin:10px 0}.right-side-container{display:flex;justify-content:space-between}:host ::ng-deep .language-select .mat-select-trigger{font-weight:400!important}:host ::ng-deep .language-select .mat-select-value{color:#fff!important}:host ::ng-deep .custom-pagination{background-color:transparent!important}.action-flex{display:flex;gap:10px}\n"] }]
|
|
394
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i4.FormBuilder }, { type: i5.Router }]; }, propDecorators: { paginator: [{
|
|
395
|
+
type: ViewChild,
|
|
396
|
+
args: [MatPaginator]
|
|
397
|
+
}] } });
|
|
398
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92YWwtcmVxdWVzdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvYXBwcm92YWwtcmVxdWVzdHMvYXBwcm92YWwtcmVxdWVzdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvYXBwcm92YWwtcmVxdWVzdHMvYXBwcm92YWwtcmVxdWVzdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHckQsT0FBTyxFQUFlLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFReEUsTUFBTSxPQUFPLHlCQUF5QjtJQW9EcEMsWUFBbUIsTUFBaUIsRUFBUyxhQUE0QixFQUNoRSxRQUFxQixFQUNwQixFQUFlLEVBQ2hCLE1BQWM7UUFISixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDaEUsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNwQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFwRHZCLGVBQVUsR0FBRyxJQUFJLGtCQUFrQixDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLHlCQUFvQixHQUFXLFVBQVUsQ0FBQztRQUMxQyxpQkFBWSxH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TSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQzsrR0F6YVUseUJBQXlCO21HQUF6Qix5QkFBeUIsd0dBRXpCLFlBQVksZ0RDcEJ6Qiw4cldBNE9NOzs0RkQxTk8seUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHVCQUF1QjtxTUFNUixTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IHR5cGUgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBlbGVtZW50IH0gZnJvbSAncHJvdHJhY3Rvcic7XG5pbXBvcnQgeyBMaXN0UG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9saXN0LXBvcHVwL2xpc3QtcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hcHByb3ZhbC1yZXF1ZXN0cycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHByb3ZhbC1yZXF1ZXN0cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcHJvdmFsLXJlcXVlc3RzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQXBwcm92YWxSZXF1ZXN0c0NvbXBvbmVudCB7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG4gIHNlbGVjdGVkTWluaXN0cnlUeXBlOiBzdHJpbmcgPSAnbWluaXN0cnknO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIHJvbGVNYXBwaW5nRm9ybSE6IEZvcm1Hcm91cDtcbiAgZGlzYWJsZUJ0biA9IHRydWVcbiAgc2VhcmNoVGV4dCA9ICcnO1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFsncmVxdWVzdF9pZCcsICdkYXRlJywgJ2Rlc2lnbmF0aW9uJywgJ3N0YXR1cycsICdhY3Rpb25zJ107XG4gIGNicEZpbmFsT2JqOiBhbnkgPSB7fVxuICBkZXBhcnRtZW50RGF0YTogYW55ID0gW11cbiAgYXBwcm92YWxSZXF1ZXN0cyA9IFtcbiAgICAvLyB7XG4gICAgLy8gICBuYW1lOiAnV29yayBBbGxvY2F0aW9uJyxcbiAgICAvLyAgIG9yaWdpbmFsTmFtZTogJ0FDQlBfTWluaXN0cnlfb2ZfV29tZW5fYW5kX0NoaWxkX0RldmVsb3BtZW50X0V4dHJhY3QuLi4nLFxuICAgIC8vICAgc2l6ZTogNC41LFxuICAgIC8vICAgZGF0ZTogJ09jdCAxMywgMjAyNSdcbiAgICAvLyB9LFxuICAgIC8vIHtcbiAgICAvLyAgIG5hbWU6ICdTY3JlZW5zaG90IDIwMjUtMTAtMDggYXQgMTInLFxuICAgIC8vICAgb3JpZ2luYWxOYW1lOiAnU2NyZWVuc2hvdCAyMDI1LTEwLTA4IGF0IDEyLjU0LjE4IFBNLnBuZycsXG4gICAgLy8gICBzaXplOiAzMzEuOCxcbiAgICAvLyAgIGRhdGU6ICdPY3QgMTMsIDIwMjUnXG4gICAgLy8gfVxuICBdO1xuICBsb2FkaW5nID0gZmFsc2VcbiAgZmlsdGVyZWRNaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIHNlYXJjaENvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdO1xuICBsb2dpblVzZXJPcmdJZHMgPSBbXVxuICBvcmlnaW5hbE1pbmlzdHJ5RGF0YSA9IFtdXG4gIGNicFBsYW5GaW5hbE9iajogYW55XG4gIGZpbHRlckZvcm0hOiBGb3JtR3JvdXA7XG4gIHN0YXR1cyA9IFtcbiAgICB7IFwiY29kZVwiOiBcIlwiLCBsYWJlbDogXCJBbGwgU3RhdHVzXCIgfSxcbiAgICB7IFwiY29kZVwiOiBcInBlbmRpbmdcIiwgbGFiZWw6IFwiUGVuZGluZ1wiIH0sXG4gICAgeyBcImNvZGVcIjogXCJhcHByb3ZlZFwiLCBsYWJlbDogXCJBcHByb3ZlZFwiIH0sXG4gICAgeyBcImNvZGVcIjogXCJyZWplY3RlZFwiLCBsYWJlbDogXCJSZWplY3RlZFwiIH1cbiAgXTtcbiAgdGltZSA9IFtcbiAgICB7IFwiY29kZVwiOiBcIlwiLCBsYWJlbDogXCJBbGwgVGltZVwiIH0sXG4gICAgeyBcImNvZGVcIjogXCJsYXN0XzdfZGF5c1wiLCBsYWJlbDogXCJMYXN0IDcgRGF5c1wiIH0sXG4gICAgeyBcImNvZGVcIjogXCJsYXN0XzMwX2RheXNcIiwgbGFiZWw6IFwiTGFzdCAzMCBEYXlzXCIgfSxcbiAgICB7IFwiY29kZVwiOiBcImxhc3RfOTBfZGF5c1wiLCBsYWJlbDogXCJMYXN0IDkwIERheXNcIiB9XG4gIF07XG4gIGZpbHRlcmVkU3RhdHVzID0gWy4uLnRoaXMuc3RhdHVzXTtcbiAgZmlsdGVyZWRUaW1lID0gWy4uLnRoaXMudGltZV07XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXJcbiAgKSB7XG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG1pbmlzdHJ5VHlwZTogWydtaW5pc3RyeScsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgbWluaXN0cnk6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHNlY3RvcnM6IFtbXV0sXG4gICAgICBkZXBhcnRtZW50czogW1tdXVxuXG4gICAgfSk7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBzdGF0dXM6IFsnJ10sXG4gICAgICB0aW1lOiBbJyddLFxuICAgICAgc2VhcmNoOiBbJyddXG4gICAgfSk7XG4gICAgLy8gdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG5cblxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jYnBQbGFuRmluYWxPYmogPSB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q0JQUGxhbkxvY2FsU3RvcmFnZSgpXG4gICAgY29uc29sZS5sb2coJ2NicEZpbmFsT2JqLS0nLCB0aGlzLmNicEZpbmFsT2JqKVxuICAgIHRoaXMuc2VhcmNoQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHNlYXJjaFRleHQgPT4ge1xuICAgICAgaWYgKHNlYXJjaFRleHQpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNaW5pc3RyeURhdGEoc2VhcmNoVGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbHRlcmVkTWluaXN0cnlEYXRhID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5zdW1tYXJ5VHJpZ2dlckV4ZWN1dGVkLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhPy5maWxlX2lkKSB7XG4gICAgICAgIHRoaXMuZ2V0QXBwcm92YWxSZXF1ZXN0cygpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodGhpcy5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5nZXRBcHByb3ZhbFJlcXVlc3RzKClcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICB9XG5cbiAgZ2V0QXBwcm92YWxSZXF1ZXN0cygpIHtcblxuICAgIGxldCByZXFCb2R5ID0ge1xuICAgICAgc3RhdGVfY2VudGVyX2lkOiB0aGlzLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsXG4gICAgICBpbmNsdWRlX3N1bW1hcnk6IHRydWUsXG4gICAgICBza2lwOiAwLFxuICAgICAgbGltaXQ6IDIwMFxuICAgIH1cbiAgICBpZiAodGhpcy5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRzKSB7XG4gICAgICByZXFCb2R5WydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLmNicFBsYW5GaW5hbE9iaj8uZGVwYXJ0bWVudHNcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldEFwcHJvdmFsUmVxdWVzdHMocmVxQm9keSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdyZXMtLScsIHJlcylcbiAgICAgIGlmIChyZXMgJiYgcmVzPy5pdGVtcyAmJiByZXM/Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5hcHByb3ZhbFJlcXVlc3RzID0gcmVzPy5pdGVtc1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuYXBwcm92YWxSZXF1ZXN0cztcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuYXBwcm92YWxSZXF1ZXN0cycsIHRoaXMuYXBwcm92YWxSZXF1ZXN0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cblxuICBmaWx0ZXJlZGFwcHJvdmFsUmVxdWVzdHMoKSB7XG4gICAgbGV0IGRhdGEgPSBbLi4udGhpcy5hcHByb3ZhbFJlcXVlc3RzXTtcblxuICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuZmlsdGVyRm9ybS5nZXQoJ3NlYXJjaCcpPy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmZpbHRlckZvcm0uZ2V0KCdzdGF0dXMnKT8udmFsdWU7XG4gICAgY29uc3QgdGltZSA9IHRoaXMuZmlsdGVyRm9ybS5nZXQoJ3RpbWUnKT8udmFsdWU7XG4gICAgLy8gU2VhcmNoIEZpbHRlclxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihyID0+XG4gICAgICAgIChyLnJlcXVlc3RfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFN0YXR1cyBGaWx0ZXJcbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICBkYXRhID0gZGF0YS5maWx0ZXIociA9PiByLnN0YXR1cyA9PT0gc3RhdHVzKTtcbiAgICB9XG5cbiAgICAvLyBUaW1lIEZpbHRlclxuICAgIGlmICh0aW1lKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICBkYXRhID0gZGF0YS5maWx0ZXIociA9PiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBuZXcgRGF0ZShyLmNyZWF0ZWRfYXQpO1xuICAgICAgICBjb25zdCBkaWZmRGF5cyA9XG4gICAgICAgICAgKG5vdy5nZXRUaW1lKCkgLSBjcmVhdGVkLmdldFRpbWUoKSkgLyAoMTAwMCAqIDM2MDAgKiAyNCk7XG5cbiAgICAgICAgaWYgKHRpbWUgPT09ICdsYXN0XzdfZGF5cycpIHJldHVybiBkaWZmRGF5cyA8PSA3O1xuICAgICAgICBpZiAodGltZSA9PT0gJ2xhc3RfMzBfZGF5cycpIHJldHVybiBkaWZmRGF5cyA8PSAzMDtcbiAgICAgICAgaWYgKHRpbWUgPT09ICdsYXN0XzkwX2RheXMnKSByZXR1cm4gZGlmZkRheXMgPD0gOTA7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGRlbGV0ZURvY3VtZW50KGRvY1RvRGVsZXRlOiBhbnkpIHtcbiAgICB0aGlzLmFwcHJvdmFsUmVxdWVzdHMgPSB0aGlzLmFwcHJvdmFsUmVxdWVzdHMuZmlsdGVyKGRvYyA9PiBkb2MgIT09IGRvY1RvRGVsZXRlKTtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmRlbGV0ZVN1bW1hcnkoZG9jVG9EZWxldGU/LmZpbGVfaWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVGaWxlKGRvY1RvRGVsZXRlPy5maWxlX2lkKS5zdWJzY3JpYmUoKGRyZXMpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgaWYgKGRyZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0RvY3VtZW50IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5JywgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdldEFwcHJvdmFsUmVxdWVzdHMoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdFcnJvciBXaGlsZSBEZWxldGluZyBEb2N1bWVudCcsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0QXBwcm92YWxSZXF1ZXN0cygpXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRG9jdW1lbnQgU3VtbWFyeSBEZWxldGVkIFN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdFcnJvciBXaGlsZSBEZWxldGluZyBEb2N1bWVudCBTdW1tYXJ5JywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG5cbiAgfVxuXG4gIGFwcGx5RmlsdGVycygpIHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyZWRhcHByb3ZhbFJlcXVlc3RzKCk7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGZpbHRlcmVkO1xuXG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB9XG4gIH1cbiAgb25NaW5pc3RyeVR5cGVDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5yZXNldCgpXG5cbiAgICAvLyBjb25zb2xlLmxvZygnZXZlbnQnLCBldmVudClcbiAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnlUeXBlJ10gPSBldmVudC52YWx1ZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gZXZlbnQ/LnZhbHVlXG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcblxuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmNvbnRyb2xzLm1pbmlzdHJ5VHlwZS5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKVxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnU2VsZWN0ZWQgTWluaXN0cnkgSUQ6Jywgc2VsZWN0ZWRNaW5pc3RyeUlkKTtcblxuICAgIC8vIFlvdSBjYW4gYWNjZXNzIHRoZSBzZWxlY3RlZCBvYmplY3QgaWYgbmVlZGVkXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5OicsIHNlbGVjdGVkTWluaXN0cnkpOyBgYFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSB7IGlkZW50aWZpZXI6IHNlbGVjdGVkTWluaXN0cnlJZD8uaWRlbnRpZmllciwgbmFtZTogc2VsZWN0ZWRNaW5pc3RyeUlkPy5vcmdOYW1lIH1cbiAgICBpZiAoc2VsZWN0ZWRNaW5pc3RyeUlkICYmIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXREZXBhcnRtZW50TGlzdChzZWxlY3RlZE1pbmlzdHJ5SWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuZGVwYXJ0bWVudERhdGEgPSByZXNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydtaW5pc3RyeVR5cGUnXSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmNvbnRyb2xzLm1pbmlzdHJ5VHlwZS52YWx1ZVxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHsgaWRlbnRpZmllcjogc2VsZWN0ZWRNaW5pc3RyeT8uaWRlbnRpZmllciwgbmFtZTogc2VsZWN0ZWRNaW5pc3RyeT8ub3JnTmFtZSB9XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uY29udHJvbHMuZGVwYXJ0bWVudHMudmFsdWVcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3NlY3RvcnMnXSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmNvbnRyb2xzLnNlY3RvcnMudmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnlUeXBlJ10gPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5jb250cm9scy5taW5pc3RyeVR5cGUudmFsdWVcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSB7IGlkZW50aWZpZXI6IHNlbGVjdGVkTWluaXN0cnk/LmlkZW50aWZpZXIsIG5hbWU6IHNlbGVjdGVkTWluaXN0cnk/Lm9yZ05hbWUgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaicsIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLnJvbGVNYXBwaW5nRm9ybScsIHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICB9XG5cblxuXG4gIGZpbHRlck1pbmlzdHJ5RGF0YShzZWFyY2hUZXh0KSB7XG5cbiAgICBpZiAoc2VhcmNoVGV4dCkge1xuICAgICAgY29uc29sZS5sb2coJ3NlYXJoVGVjdCwgJywgc2VhcmNoVGV4dClcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHNlYXJjaFRleHQ/LnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgdGhpcy5maWx0ZXJlZE1pbmlzdHJ5RGF0YSA9ICFzZWFyY2hcbiAgICAgICAgPyBbLi4udGhpcy5taW5pc3RyeURhdGFdXG4gICAgICAgIDogdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLm9yZ05hbWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoc2VhcmNoKVxuICAgICAgICApO1xuICAgIH1cblxuICB9XG5cbiAgZ2V0TWluaXN0cnlEYXRhKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWluaXN0cnlEYXRhKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEgPSBkYXRhXG4gICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkTWluaXN0cnlEYXRhID0gWy4uLnRoaXMubWluaXN0cnlEYXRhXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE1pbmlzdHJ5RGF0YSA9IFsuLi50aGlzLm1pbmlzdHJ5RGF0YV07XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5nZXRVc2VyUHJvZmlsZURhdGEoKVxuICAgIH0pXG5cbiAgICBjb25zb2xlLmxvZygndGhpcy5taW5pc3RyeURhdGEtLScsIHRoaXMubWluaXN0cnlEYXRhKVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmZpbHRlcmVkTWluaXN0cnlEYXRhLS0nLCB0aGlzLmZpbHRlcmVkTWluaXN0cnlEYXRhKVxuICB9XG5cbiAgcm91dGVUb01haW4oKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvJ10pO1xuICB9XG5cbiAgdmlld1N1bW1hcnkoZG9jKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihMaXN0UG9wdXBDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnODAwcHgnLFxuICAgICAgZGF0YTogeyBlbGVtZW50OiBkb2MsIHR5cGU6ICdkb2Mtc3VtbWFyeScgfSxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIG1heEhlaWdodDogJzgwdmgnXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGhlcmUgdG8gcmVzZXQgaW5saW5lIGV4cGFuZGVkIHN0YXRlXG4gICAgICAvLyBCZWNhdXNlIHlvdSdyZSB1c2luZyBkaWFsb2csIG5vdCBpbmxpbmUgZXhwYW5kIOKAkyB2aWV3IHJlbWFpbnMgaW4gaW5pdGlhbCAoY29sbGFwc2VkKSBzdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgdmlld1JlcXVlc3QocmVxdWVzdDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ3JlcXVlc3QtLScsIHJlcXVlc3QpXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FpL3Jldmlldy1yZXF1ZXN0JywgcmVxdWVzdC5pZF0pO1xuICB9XG5cbiAgcmV2b2tlQXBwcm92YWxSZXF1ZXN0KHJlcXVlc3Q6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdyZXF1ZXN0LS0nLCByZXF1ZXN0KVxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICBsZXQgcmVxQm9keSA9XG4gICAge1xuICAgICAgXCJyZXF1ZXN0X2lkXCI6IHJlcXVlc3Q/LmlkXG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJldm9rZUFwcHJvdmFsUmVxdWVzdChyZXFCb2R5KS5zdWJzY3JpYmUoe1xuXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5nZXRBcHByb3ZhbFJlcXVlc3RzKClcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byByZXZva2UgdGhlIGFwcHJvdmFsIHJlcXVlc3QuJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25PcGVuZWQob3BlbmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSBvcGVuZWQ7XG4gIH1cblxuICBvbk9wZW5lZERlcGFydG1lbnQob3BlbmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kZXBhcnRtZW50UGFuZWxPcGVuID0gb3BlbmVkXG4gIH1cblxuICBmaWx0ZXJEYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLm1pbmlzdHJ5RGF0YVxuICAgIH1cblxuICB9XG5cbiAgZmlsdGVyRGVwYXJ0bWVudERhdGEoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC52YWx1ZSkge1xuICAgICAgY29uc3QgcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnREYXRhLmZpbHRlcih4ID0+XG4gICAgICAgIHgub3JnTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHMpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnREYXRhXG4gICAgfVxuXG4gIH1cblxuICBnZXRVc2VyUHJvZmlsZURhdGEoKSB7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICAgIHRoaXMubG9naW5Vc2VyT3JnSWRzID0gZGF0YT8ub3JnYW5pemF0aW9uX2lkc1xuICAgICAgbGV0IGZpbHRlcmVkTWluaXN0cnlEYXRhID0gW11cbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLm1pbmlzdHJ5RnVsbERhdGEtLScsIHRoaXMubWluaXN0cnlGdWxsRGF0YSlcbiAgICAgIHRoaXMubWluaXN0cnlGdWxsRGF0YS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMubG9naW5Vc2VyT3JnSWRzLmluZGV4T2YoaXRlbT8uaWRlbnRpZmllcikgPiAtMSkge1xuICAgICAgICAgIGZpbHRlcmVkTWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhpcy5taW5pc3RyeURhdGEgPSBmaWx0ZXJlZE1pbmlzdHJ5RGF0YVxuICAgICAgdGhpcy5vcmlnaW5hbE1pbmlzdHJ5RGF0YSA9IGZpbHRlcmVkTWluaXN0cnlEYXRhXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IGZpbHRlcmVkTWluaXN0cnlEYXRhO1xuICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZWRMaXN0LS0nLCB0aGlzLmZpbHRlcmVkTGlzdClcbiAgICB9KVxuICB9XG5cbiAgcm91dGVUb0luaXRpYWwoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvaW5pdGlhbCddKTtcbiAgfVxuXG5cbiAgZmlsdGVyTGlzdCh2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZWFyY2ggPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG5cbiAgICAgIGNhc2UgJ3N0YXR1cyc6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdGF0dXMgPSB0aGlzLnN0YXR1cy5maWx0ZXIodiA9PiB2LmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkVGltZSA9IHRoaXMudGltZS5maWx0ZXIodiA9PiB2LmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBjbGVhclNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ1cGxvYWQtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbXQtMTAgbWItMTAgbWwtMTAgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxwIChjbGljayk9XCJyb3V0ZVRvSW5pdGlhbCgpXCI+PG1hdC1pY29uIHN0eWxlPVwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcIj5hcnJvd19iYWNrPC9tYXQtaWNvbj48c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBsLTEwXCI+QmFjayB0byBSb2xlIE1hcHBpbmcgR2VuZXJhdGlvbjwvc3Bhbj48L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG4gICAgPG1hdC1jYXJkIGNsYXNzPVwibWF0LWNhcmQtY29udGFpbmVyIG10LTIwXCIgW2Zvcm1Hcm91cF09XCJyb2xlTWFwcGluZ0Zvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHA+QXBwcm92YWwgUmVxdWVzdHM8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1zZWN0aW9uIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLXJvdXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLWZsZXgtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1tYXBwaW5nLXJvdXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3tjYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5vcmdOYW1lfX0gPHNwYW4gKm5nSWY9XCJjYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyB7e2NicFBsYW5GaW5hbE9iaj8uZGVwYXJ0bWVudF9uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1wbGFuIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJvdXRlVG9Jbml0aWFsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+RWRpdFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtbC0xMFwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hY3RpdmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwibW92ZVRvSW5pdGlhbFNjcmVlbkxheW91dCgnYWRkJylcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENCUC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pi0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbbmdDbGFzc109XCIhKGNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm9yZ05hbWUpID8gJ2J0bi1kaXNhYmxlJzonYnRuLWFjdGl2ZSdcIiBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhKGNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm9yZ05hbWUpXCIgKGNsaWNrKT1cIm9wZW5VcGxvYWREaWFsb2coKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj51cGxvYWQ8L21hdC1pY29uPiBVcGxvYWQgRG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cblxuXG5cblxuICAgIDwvbWF0LWNhcmQ+XG4gICAgPG1hdC1jYXJkIGNsYXNzPVwiXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaCBmbGV4IG1hcmdpbi1yaWdodC1tIGZpbHRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImx1Y2lkZSBsdWNpZGUtZmlsdGVyIGgtNCB3LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjIyIDMgMiAzIDEwIDEyLjQ2IDEwIDE5IDE0IDIxIDE0IDEyLjQ2IDIyIDNcIj48L3BvbHlnb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxiPiBGaWx0ZXJzPC9iPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xMCB3LTUwXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj4gXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnNlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbG9yLTYwIHNlYXJjaC1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzaW5wdXQgY29sb3ItNjAgdy1mdWxsXCIgIGxhYmVsPVwiXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImFwcGx5RmlsdGVycygpXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgUmVxdWVzdCBJRFwiIHR5cGU9XCJTdGFuZGFyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYW5kLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImxhbmd1YWdlLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1sYWJlbCBzdHlsZT1cImZvbnQtd2VpZ2h0OiBub3JtYWw7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckZvcm0uZ2V0KCdzdGF0dXMnKT8udmFsdWUgPyAnJyA6ICdTZWxlY3QgU3RhdHVzJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInN0YXR1c1wiIHBhbmVsQ2xhc3M9XCJzZWxlY3Qtc2VhcmNoLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJhcHBseUZpbHRlcnMoKVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiA1cHg7d2lkdGg6IDkyJTttYXJnaW46IDVweDtcIiBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggU3RhdHVzXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ3N0YXR1cycpXCIgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWRTdGF0dXNcIiBbdmFsdWVdPVwicj8uY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcj8ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwibGFuZ3VhZ2Utc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWxhYmVsIHN0eWxlPVwiZm9udC13ZWlnaHQ6IG5vcm1hbDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS5nZXQoJ3RpbWUnKT8udmFsdWUgPyAnJyA6ICdTZWxlY3QgVGltZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0aW1lXCIgcGFuZWxDbGFzcz1cInNlbGVjdC1zZWFyY2gtcGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDVweDt3aWR0aDogOTIlO21hcmdpbjogNXB4O1wiIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBUaW1lXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ3RpbWUnKVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkVGltZVwiIFt2YWx1ZV09XCJyPy5jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByPy5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDxwIGNsYXNzPVwibXQtMTBcIiBzdHlsZT1cImZvbnQtZmFtaWx5OiAnTGF0byc7IGZvbnQtc2l6ZTogMThweDsgbWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICB7e2RhdGFTb3VyY2UuZGF0YS5sZW5ndGh9fSBBcHByb3ZhbCBSZXF1ZXN0czwvcD5cbiAgICAgICAgPHRhYmxlIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweCAyNXB4IDAgMDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYm94LXNoYWRvdzogMCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXoyIGZ1bGwtd2lkdGgtdGFibGUgbXQtMTBcIj5cblxuICAgICAgICAgICAgPCEtLSBEb2N1bWVudCBDb2x1bW4gLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RfaWRcIj5cbiAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBSZXF1ZXN0IElEIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJlcXVlc3RcIiBzdHlsZT1cIndpZHRoOiAxNSU7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLXRpdGxlXCIgKm5nSWY9XCJyZXF1ZXN0LnJlcXVlc3RfbmFtZVwiPnt7IHJlcXVlc3QucmVxdWVzdF9uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLXRpdGxlXCIgKm5nSWY9XCIhcmVxdWVzdC5yZXF1ZXN0X25hbWVcIj57eyByZXF1ZXN0LnJlcXVlc3RfbmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG4gICAgICAgICAgICA8IS0tIFN1bW1hcnkgVGV4dCBDb2x1bW4gLS0+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3VtbWFyeV90ZXh0XCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gU3VtbWFyeSA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBkb2NcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1zdW1tYXJ5LXRleHRcIiBzdHlsZT1cIndpZHRoOiA4MCU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWFya2Rvd24gW2RhdGFdPVwiZG9jPy5zdW1tYXJ5X3RleHQgfCBzbGljZSA6IDAgOiAyMDBcIj48L21hcmtkb3duPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuXG4gICAgICAgICAgICA8IS0tIERhdGUgQ29sdW1uIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkYXRlXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRGF0ZSAmIFRpbWU8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByZXF1ZXN0XCIgc3R5bGU9XCJ3aWR0aDogMTUlO1wiPiB7eyByZXF1ZXN0LmNyZWF0ZWRfYXQgfCBkYXRlOiAnTU1NIGQsIHknfX0gPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2lnbmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gTm8gb2YgRGVzaWduYXRpb24gPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcmVxdWVzdFwiIHN0eWxlPVwid2lkdGg6IDE1JTtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tyZXF1ZXN0Py5kZXNpZ25hdGlvbl9jb3VudH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICA8IS0tIFN1bW1hcnkgU3RhdHVzIENvbHVtbiAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gUmVxdWVzdCBTdGF0dXMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcmVxdWVzdFwiIHN0eWxlPVwid2lkdGg6IDE1JTtcIj5cbiAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicmVxdWVzdC5zdGF0dXMgPT09ICdjb21wbGV0ZWQnXCIgY2xhc3M9XCJzdWNjZXNzXCI+IHt7IHJlcXVlc3Quc3RhdHVzIHwgdGl0bGVjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicmVxdWVzdC5zdGF0dXMgIT09ICdjb21wbGV0ZWQnXCIgY2xhc3M9XCJpbi1wcm9ncmVzc1wiPiB7eyByZXF1ZXN0LnN0YXR1cyB8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZWNhc2UgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBBY3Rpb25zIENvbHVtbiAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGlvbnMgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcmVxdWVzdFwiIHN0eWxlPVwid2lkdGg6IDE1JTtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYWN0aXZlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInZpZXdSZXF1ZXN0KHJlcXVlc3QpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlZpZXcvUmV2aWV3IFJlcXVlc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldy9SZXZpZXcgUmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTVweDtcIiAqbmdJZj1cInJlcXVlc3Quc3RhdHVzID09PSAnQ09NUExFVEVEJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwicmV2b2tlQXBwcm92YWxSZXF1ZXN0KHJlcXVlc3QpXCIgbWF0VG9vbHRpcD1cIkRlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2b2tlIFJlcXVlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cblxuXG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEhlYWRlciBhbmQgUm93IERlZmluaXRpb25zIC0tPlxuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG5cbiAgICAgICAgICAgIDwhLS0gTm8gRGF0YSBNZXNzYWdlIC0tPlxuXG4gICAgICAgIDwvdGFibGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1kYXRhLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIE5vIHJlY29yZCBmb3VuZFxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiPlxuICAgICAgICAgICAgPCEtLSA8bWF0LXBhZ2luYXRvciBjbGFzcz1cImN1c3RvbS1wYWdpbmF0aW9uXCIgW3BhZ2VTaXplXT1cIjVcIiBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjBdXCI+PC9tYXQtcGFnaW5hdG9yPiAtLT5cbiAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yIFtwYWdlU2l6ZV09XCI1XCIgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDIwXVwiPjwvbWF0LXBhZ2luYXRvcj5cbiAgICAgICAgPC9kaXY+XG5cblxuICAgIDwvbWF0LWNhcmQ+XG48L2Rpdj5cblxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj4iXX0=
|