@smarterplan/ngx-smarterplan-core 1.2.45 → 1.2.47
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 -24
- package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -59
- package/esm2020/lib/components/loader/loader.component.mjs +23 -23
- package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +80 -80
- package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +99 -99
- package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +384 -384
- package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +147 -147
- package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +40 -40
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -63
- package/esm2020/lib/components/support-modal/support-modal.component.mjs +66 -66
- package/esm2020/lib/config.mjs +4 -4
- package/esm2020/lib/helpers.service.mjs +470 -470
- package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +69 -69
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +51 -51
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +61 -61
- package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +158 -158
- package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +85 -85
- package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +128 -128
- package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +249 -249
- package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -98
- package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -64
- package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -221
- package/esm2020/lib/mattertagData.mjs +165 -165
- package/esm2020/lib/ngx-smarterplan-core.module.mjs +122 -122
- package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -14
- package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -66
- package/esm2020/lib/pipes/format-date-number-to-digits.pipe.mjs +30 -30
- package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -26
- package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -20
- package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -104
- package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -29
- package/esm2020/lib/services/amplify-cache.service.mjs +72 -72
- package/esm2020/lib/services/base-tab.service.mjs +24 -24
- package/esm2020/lib/services/baseVisibility.service.mjs +18 -18
- package/esm2020/lib/services/content.service.mjs +135 -135
- package/esm2020/lib/services/filter.service.mjs +599 -599
- package/esm2020/lib/services/intervention.service.mjs +236 -236
- package/esm2020/lib/services/locale.service.mjs +45 -45
- package/esm2020/lib/services/matterport-import.service.mjs +340 -340
- package/esm2020/lib/services/matterport.service.mjs +1587 -1587
- package/esm2020/lib/services/models/affectation.service.mjs +60 -60
- package/esm2020/lib/services/models/base-object.service.mjs +70 -70
- package/esm2020/lib/services/models/capture.service.mjs +34 -34
- package/esm2020/lib/services/models/comment.service.mjs +98 -98
- package/esm2020/lib/services/models/domain.service.mjs +78 -78
- package/esm2020/lib/services/models/equipment.service.mjs +683 -683
- package/esm2020/lib/services/models/event.service.mjs +128 -128
- package/esm2020/lib/services/models/feature.service.mjs +380 -380
- package/esm2020/lib/services/models/hashtag.service.mjs +38 -38
- package/esm2020/lib/services/models/layer.service.mjs +33 -33
- package/esm2020/lib/services/models/measurement.service.mjs +199 -199
- package/esm2020/lib/services/models/mission.service.mjs +206 -206
- package/esm2020/lib/services/models/navigation.service.mjs +92 -92
- package/esm2020/lib/services/models/node.service.mjs +31 -31
- package/esm2020/lib/services/models/object3D.service.mjs +364 -364
- package/esm2020/lib/services/models/operation.service.mjs +59 -59
- package/esm2020/lib/services/models/organisation.service.mjs +73 -73
- package/esm2020/lib/services/models/plan.service.mjs +799 -799
- package/esm2020/lib/services/models/poi.service.mjs +103 -103
- package/esm2020/lib/services/models/profile.service.mjs +58 -58
- package/esm2020/lib/services/models/property.service.mjs +44 -44
- package/esm2020/lib/services/models/space.service.mjs +204 -204
- package/esm2020/lib/services/models/template.service.mjs +41 -41
- package/esm2020/lib/services/models/ticket.service.mjs +526 -526
- package/esm2020/lib/services/models/visit.service.mjs +130 -130
- package/esm2020/lib/services/models/zone.service.mjs +225 -225
- package/esm2020/lib/services/navigator.service.mjs +212 -212
- package/esm2020/lib/services/s3.service.mjs +137 -137
- package/esm2020/lib/services/search.service.mjs +124 -124
- package/esm2020/lib/services/support.service.mjs +42 -42
- package/esm2020/lib/services/tag.service.mjs +111 -111
- package/esm2020/lib/services/user.service.mjs +501 -501
- package/esm2020/lib/services/validators.service.mjs +50 -50
- package/esm2020/lib/services/viewer.service.mjs +389 -389
- package/esm2020/lib/services/zone-drawer.service.mjs +76 -76
- package/esm2020/lib/services/zoneChange.service.mjs +30 -30
- package/esm2020/lib/types.service.mjs +311 -311
- package/esm2020/lib/validators/email.directive.mjs +7 -7
- package/esm2020/lib/validators/no-empty.directive.mjs +12 -12
- package/esm2020/lib/validators/number.directive.mjs +12 -12
- package/esm2020/lib/validators/text.directive.mjs +12 -12
- package/esm2020/public-api.mjs +72 -72
- package/esm2020/smarterplan-ngx-smarterplan-core.mjs +4 -4
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +13014 -13014
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12263 -12263
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/csv-export/csv-export.component.d.ts +18 -18
- package/lib/components/loader/loader.component.d.ts +10 -10
- package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
- package/lib/components/menu-bar/menu-bar.component.d.ts +38 -38
- package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +73 -73
- package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +35 -35
- package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
- package/lib/components/search-bar/search-bar.component.d.ts +16 -16
- package/lib/components/support-modal/support-modal.component.d.ts +26 -26
- package/lib/config.d.ts +22 -22
- package/lib/helpers.service.d.ts +79 -79
- package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
- package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
- package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
- package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
- package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
- package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
- package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
- package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
- package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
- package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
- package/lib/mattertagData.d.ts +70 -70
- package/lib/ngx-smarterplan-core.module.d.ts +29 -29
- package/lib/ngx-smarterplan-core.service.d.ts +6 -6
- package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
- package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
- package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
- package/lib/pipes/safe-url.pipe.d.ts +10 -10
- package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
- package/lib/pipes/username-from-id.pipe.d.ts +11 -11
- package/lib/services/amplify-cache.service.d.ts +37 -37
- package/lib/services/base-tab.service.d.ts +10 -10
- package/lib/services/baseVisibility.service.d.ts +9 -9
- package/lib/services/content.service.d.ts +28 -28
- package/lib/services/filter.service.d.ts +60 -60
- package/lib/services/intervention.service.d.ts +25 -25
- package/lib/services/locale.service.d.ts +23 -23
- package/lib/services/matterport-import.service.d.ts +53 -53
- package/lib/services/matterport.service.d.ts +336 -336
- package/lib/services/models/affectation.service.d.ts +14 -14
- package/lib/services/models/base-object.service.d.ts +20 -20
- package/lib/services/models/capture.service.d.ts +13 -13
- package/lib/services/models/comment.service.d.ts +26 -26
- package/lib/services/models/domain.service.d.ts +19 -19
- package/lib/services/models/equipment.service.d.ts +93 -93
- package/lib/services/models/event.service.d.ts +43 -43
- package/lib/services/models/feature.service.d.ts +75 -75
- package/lib/services/models/hashtag.service.d.ts +13 -13
- package/lib/services/models/layer.service.d.ts +11 -11
- package/lib/services/models/measurement.service.d.ts +51 -51
- package/lib/services/models/mission.service.d.ts +39 -39
- package/lib/services/models/navigation.service.d.ts +29 -29
- package/lib/services/models/node.service.d.ts +12 -12
- package/lib/services/models/object3D.service.d.ts +57 -57
- package/lib/services/models/operation.service.d.ts +15 -15
- package/lib/services/models/organisation.service.d.ts +19 -19
- package/lib/services/models/plan.service.d.ts +133 -133
- package/lib/services/models/poi.service.d.ts +25 -25
- package/lib/services/models/profile.service.d.ts +16 -16
- package/lib/services/models/property.service.d.ts +13 -13
- package/lib/services/models/space.service.d.ts +46 -46
- package/lib/services/models/template.service.d.ts +15 -15
- package/lib/services/models/ticket.service.d.ts +93 -93
- package/lib/services/models/visit.service.d.ts +24 -24
- package/lib/services/models/zone.service.d.ts +50 -50
- package/lib/services/navigator.service.d.ts +61 -61
- package/lib/services/s3.service.d.ts +14 -14
- package/lib/services/search.service.d.ts +20 -20
- package/lib/services/support.service.d.ts +17 -17
- package/lib/services/tag.service.d.ts +29 -29
- package/lib/services/user.service.d.ts +118 -118
- package/lib/services/validators.service.d.ts +18 -18
- package/lib/services/viewer.service.d.ts +110 -110
- package/lib/services/zone-drawer.service.d.ts +7 -7
- package/lib/services/zoneChange.service.d.ts +17 -17
- package/lib/types.service.d.ts +842 -842
- package/lib/validators/email.directive.d.ts +2 -2
- package/lib/validators/no-empty.directive.d.ts +2 -2
- package/lib/validators/number.directive.d.ts +2 -2
- package/lib/validators/text.directive.d.ts +2 -2
- package/package.json +2 -2
- package/public-api.d.ts +64 -64
- package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
|
@@ -1,526 +1,526 @@
|
|
|
1
|
-
/* eslint-disable class-methods-use-this */
|
|
2
|
-
/* eslint-disable consistent-return */
|
|
3
|
-
import { Inject, Injectable } from '@angular/core';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { openModalForVisitSwitch } from '../../helpers.service';
|
|
6
|
-
import { TicketType, TicketPriority, TicketStatus, EventStatus, EventType, PoiType, } from '../../types.service';
|
|
7
|
-
import { BaseObjectService } from './base-object.service';
|
|
8
|
-
import InformationIcon from '@iconify-
|
|
9
|
-
import AccidentIcon from '@iconify-
|
|
10
|
-
import WordOrderIcon from '@iconify-
|
|
11
|
-
import ReportingIcon from '@iconify-
|
|
12
|
-
import MaintenanceIcon from '@iconify-
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "./operation.service";
|
|
15
|
-
import * as i2 from "./event.service";
|
|
16
|
-
import * as i3 from "./affectation.service";
|
|
17
|
-
import * as i4 from "./poi.service";
|
|
18
|
-
import * as i5 from "../user.service";
|
|
19
|
-
import * as i6 from "../navigator.service";
|
|
20
|
-
import * as i7 from "../filter.service";
|
|
21
|
-
import * as i8 from "../intervention.service";
|
|
22
|
-
import * as i9 from "./navigation.service";
|
|
23
|
-
import * as i10 from "../viewer.service";
|
|
24
|
-
import * as i11 from "../zoneChange.service";
|
|
25
|
-
import * as i12 from "@ng-bootstrap/ng-bootstrap";
|
|
26
|
-
export class TicketsService extends BaseObjectService {
|
|
27
|
-
constructor(awsKinesisAnalyticsInjected, apiInjected, operationService, eventService, affectationService, poiService, userService, navigatorService, filterService, interventionService, navigationService, viewerService, zoneChangeService, modalService) {
|
|
28
|
-
super(poiService, navigationService);
|
|
29
|
-
this.operationService = operationService;
|
|
30
|
-
this.eventService = eventService;
|
|
31
|
-
this.affectationService = affectationService;
|
|
32
|
-
this.userService = userService;
|
|
33
|
-
this.navigatorService = navigatorService;
|
|
34
|
-
this.filterService = filterService;
|
|
35
|
-
this.interventionService = interventionService;
|
|
36
|
-
this.viewerService = viewerService;
|
|
37
|
-
this.zoneChangeService = zoneChangeService;
|
|
38
|
-
this.modalService = modalService;
|
|
39
|
-
this.currentTickets = {
|
|
40
|
-
zone: [],
|
|
41
|
-
space: [],
|
|
42
|
-
};
|
|
43
|
-
this.ticketTags = new Subject();
|
|
44
|
-
this.ticketsFiltered = [];
|
|
45
|
-
this.ticketsUpdated = new Subject();
|
|
46
|
-
this.reportingIcon = ReportingIcon;
|
|
47
|
-
this.maintenanceIcon = MaintenanceIcon;
|
|
48
|
-
this.workorderIcon = WordOrderIcon;
|
|
49
|
-
this.informationIcon = InformationIcon;
|
|
50
|
-
this.accidentIcon = AccidentIcon;
|
|
51
|
-
this.updateDone = new Subject();
|
|
52
|
-
this.updating = new Subject();
|
|
53
|
-
this.isMuseumUser = false;
|
|
54
|
-
this.floorsPerSpace = null;
|
|
55
|
-
this.selectedFloor = null;
|
|
56
|
-
this.destroy$ = new Subject();
|
|
57
|
-
this.awsKinesisAnalytics = awsKinesisAnalyticsInjected;
|
|
58
|
-
this.API = apiInjected;
|
|
59
|
-
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
60
|
-
this.initSubscriptions();
|
|
61
|
-
this.userService.isChanged.subscribe((isConnected) => {
|
|
62
|
-
if (isConnected) {
|
|
63
|
-
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
64
|
-
this.initSubscriptions();
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
if (this.navSubscription) {
|
|
68
|
-
this.navSubscription.unsubscribe();
|
|
69
|
-
this.filetrSubscription.unsubscribe();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
this.zoneChangeService.floorHasChanged.subscribe((floor) => {
|
|
74
|
-
if (floor) {
|
|
75
|
-
this.selectedFloor = floor;
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
async initTickets() {
|
|
80
|
-
let ticketsFiltered = [];
|
|
81
|
-
if (this.currentSpaceID) {
|
|
82
|
-
this.updating.next(true);
|
|
83
|
-
await this.getTicketsBySpace(this.currentSpaceID).then((tickets) => {
|
|
84
|
-
if (tickets) {
|
|
85
|
-
ticketsFiltered = tickets;
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
ticketsFiltered =
|
|
89
|
-
await this.filterService.filterTicketsForCurrentUserInSpace(ticketsFiltered, this.currentSpaceID);
|
|
90
|
-
// @ts-ignore
|
|
91
|
-
if (this.dateFilter && this.dateFilter[0] != "Invalid Date" && this.dateFilter[1] != "Invalid Date") {
|
|
92
|
-
ticketsFiltered = this.filterService.filterObjectsForDateRange(ticketsFiltered, this.dateFilter);
|
|
93
|
-
}
|
|
94
|
-
if (this.ticketTypeFilter) {
|
|
95
|
-
ticketsFiltered = ticketsFiltered.filter((ticket) => this.ticketTypeFilter.includes(ticket.type));
|
|
96
|
-
}
|
|
97
|
-
this.currentTickets.space = ticketsFiltered;
|
|
98
|
-
if (this.zoneIDFilter) {
|
|
99
|
-
ticketsFiltered = await this.filterService.filterObjectsForZone(ticketsFiltered, this.zoneIDFilter);
|
|
100
|
-
}
|
|
101
|
-
this.currentTickets.zone = ticketsFiltered;
|
|
102
|
-
this.ticketTags.next(ticketsFiltered);
|
|
103
|
-
this.ticketsUpdated.next(this.currentTickets);
|
|
104
|
-
this.updating.next(false);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.ticketTags.next(null);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
async adaptTicket(ticket) {
|
|
111
|
-
if (ticket.comments.items.length > 0) {
|
|
112
|
-
ticket.comments.items.sort((a, b) => {
|
|
113
|
-
// @ts-ignore
|
|
114
|
-
return new Date(b.createdAt) - new Date(a.createdAt);
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
if (ticket.events.items.length > 0) {
|
|
118
|
-
// Sort events by date
|
|
119
|
-
ticket.events.items.sort((event1, event2) => {
|
|
120
|
-
// @ts-ignore
|
|
121
|
-
return new Date(event2.createdAt) - new Date(event1.createdAt);
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
ticket.prestataire = await this.interventionService.getPrestataireForTicket(ticket);
|
|
125
|
-
return ticket;
|
|
126
|
-
}
|
|
127
|
-
getPriorityColor(ticket) {
|
|
128
|
-
switch (ticket.priority) {
|
|
129
|
-
case TicketPriority.MAXIMUM:
|
|
130
|
-
return 'crimson';
|
|
131
|
-
case TicketPriority.HIGH:
|
|
132
|
-
return 'red';
|
|
133
|
-
case TicketPriority.MEDIUM:
|
|
134
|
-
return 'orange';
|
|
135
|
-
case TicketPriority.LOW:
|
|
136
|
-
return 'green';
|
|
137
|
-
case TicketPriority.MINIMUM:
|
|
138
|
-
return 'blue';
|
|
139
|
-
default:
|
|
140
|
-
return 'blue';
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
getStatusColor(ticket) {
|
|
144
|
-
switch (ticket.status) {
|
|
145
|
-
case TicketStatus.TO_BE_PROCESSED:
|
|
146
|
-
return '#B0B0B1';
|
|
147
|
-
case TicketStatus.PLANNED:
|
|
148
|
-
return '#EBDF27';
|
|
149
|
-
case TicketStatus.IN_PROGRESS:
|
|
150
|
-
return '#EBDF27';
|
|
151
|
-
case TicketStatus.WAITING_FOR_VALIDATION:
|
|
152
|
-
return '#EBDF27';
|
|
153
|
-
case TicketStatus.VALIDATED:
|
|
154
|
-
return '#BCE2E5';
|
|
155
|
-
case TicketStatus.REJECTED:
|
|
156
|
-
return '#e84c35';
|
|
157
|
-
case TicketStatus.RESOLVED:
|
|
158
|
-
return '#BCE2E5';
|
|
159
|
-
case TicketStatus.ARCHIVED:
|
|
160
|
-
return '#B0B0B1';
|
|
161
|
-
case TicketStatus.LATE:
|
|
162
|
-
return '#e84c35';
|
|
163
|
-
case TicketStatus.BLOCKED:
|
|
164
|
-
return '#e84c35';
|
|
165
|
-
case TicketStatus.COMPLETED:
|
|
166
|
-
return '#388659';
|
|
167
|
-
case TicketStatus.DELAYED:
|
|
168
|
-
return '#DB7543';
|
|
169
|
-
case TicketStatus.CANCELLED:
|
|
170
|
-
return '#e84c35';
|
|
171
|
-
case TicketStatus.TO_REDO:
|
|
172
|
-
return '#DB7543';
|
|
173
|
-
case TicketStatus.CREATED:
|
|
174
|
-
return '#B0B0B1';
|
|
175
|
-
default:
|
|
176
|
-
return '#BCE2E5';
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
getTicketPriorityNumber(t) {
|
|
180
|
-
return t.priority === TicketPriority.MINIMUM
|
|
181
|
-
? -1
|
|
182
|
-
: t.priority === TicketPriority.LOW
|
|
183
|
-
? 0
|
|
184
|
-
: t.priority === TicketPriority.MEDIUM
|
|
185
|
-
? 1
|
|
186
|
-
: t.priority === TicketPriority.HIGH
|
|
187
|
-
? 2
|
|
188
|
-
: t.priority === TicketPriority.MAXIMUM
|
|
189
|
-
? 3
|
|
190
|
-
: -1;
|
|
191
|
-
}
|
|
192
|
-
getTicketIcon(type) {
|
|
193
|
-
// const typeIcon : TicketType = ticket.type;
|
|
194
|
-
switch (type) {
|
|
195
|
-
case TicketType.REPORTING:
|
|
196
|
-
return this.reportingIcon;
|
|
197
|
-
case TicketType.REQUEST_FOR_INTERVENTION:
|
|
198
|
-
return this.maintenanceIcon;
|
|
199
|
-
case TicketType.REQUEST_FOR_MAINTENANCE:
|
|
200
|
-
return this.maintenanceIcon;
|
|
201
|
-
case TicketType.WORK_ORDER:
|
|
202
|
-
return this.workorderIcon;
|
|
203
|
-
case TicketType.INCIDENT:
|
|
204
|
-
return this.accidentIcon;
|
|
205
|
-
case TicketType.INFORMATION:
|
|
206
|
-
return this.informationIcon;
|
|
207
|
-
default:
|
|
208
|
-
return this.maintenanceIcon;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
async addEventToTicket(ticket, event) {
|
|
212
|
-
const currentMission = this.userService.currentMission(ticket.spaceID);
|
|
213
|
-
event.group = event.group ? event.group : 'default';
|
|
214
|
-
event.ticketID = event.ticketID ? event.ticketID : ticket.id;
|
|
215
|
-
event.status = event.status ? event.status : EventStatus.CREATED;
|
|
216
|
-
event.type = event.type ? event.type : EventType.TICKET;
|
|
217
|
-
event.ownerID = event.ownerID ? event.ownerID : currentMission.id;
|
|
218
|
-
try {
|
|
219
|
-
const receivedEvent = await this.eventService.createEvent(event);
|
|
220
|
-
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
221
|
-
this.awsKinesisAnalytics.getInstance().record(
|
|
222
|
-
// @ts-ignore
|
|
223
|
-
{
|
|
224
|
-
data: {
|
|
225
|
-
eventType: 'Ticket Change',
|
|
226
|
-
ticketId: event.ticketID,
|
|
227
|
-
ticket: ticket,
|
|
228
|
-
status: event.status,
|
|
229
|
-
event: event,
|
|
230
|
-
user: this.userService.cu,
|
|
231
|
-
locationId: this.currentSpaceID,
|
|
232
|
-
timestamp: new Date(),
|
|
233
|
-
zoneId: this.zoneIDFilter,
|
|
234
|
-
floorId: this.selectedFloor?.id,
|
|
235
|
-
},
|
|
236
|
-
streamName: 'smarterplanKinesis-analytics',
|
|
237
|
-
// partitionKey: "",
|
|
238
|
-
}, 'AWSKinesis');
|
|
239
|
-
}
|
|
240
|
-
// console.log('Event successfully created !');
|
|
241
|
-
return receivedEvent;
|
|
242
|
-
}
|
|
243
|
-
catch (error) {
|
|
244
|
-
return null;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
async addTicket(ticket) {
|
|
248
|
-
ticket.status = TicketStatus.CREATED;
|
|
249
|
-
if (!ticket.ownerMissionID) {
|
|
250
|
-
ticket.ownerMissionID = this.userService.currentMission(ticket.spaceID).id;
|
|
251
|
-
}
|
|
252
|
-
// TODO!!! filter missions by space of ticket
|
|
253
|
-
try {
|
|
254
|
-
const receivedTicket = await this.createTicket(ticket);
|
|
255
|
-
// console.log('!!! Response from creating ticket :');
|
|
256
|
-
// console.log(receivedTicket);
|
|
257
|
-
this.addEventToTicket(receivedTicket, {
|
|
258
|
-
title: 'Création du ticket',
|
|
259
|
-
description: `Ticket créé par -`,
|
|
260
|
-
translationPath: 'ticketEvent.ticket.created',
|
|
261
|
-
});
|
|
262
|
-
this.updateDone.next(true);
|
|
263
|
-
return receivedTicket; // instead of true
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
console.log('Ticket creation FAILED');
|
|
267
|
-
console.log(JSON.stringify(error));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
async updateTicketWithEvent(ticket, event) {
|
|
271
|
-
const receivedTicket = await this.updateTicket(ticket);
|
|
272
|
-
if (receivedTicket) {
|
|
273
|
-
console.log('Updated ticket :');
|
|
274
|
-
console.log(receivedTicket);
|
|
275
|
-
if (event) {
|
|
276
|
-
await this.addEventToTicket(receivedTicket, event);
|
|
277
|
-
}
|
|
278
|
-
this.updateDone.next(true);
|
|
279
|
-
}
|
|
280
|
-
return receivedTicket;
|
|
281
|
-
}
|
|
282
|
-
async removeAssigneeFromTicket(ticket, assignee) {
|
|
283
|
-
try {
|
|
284
|
-
const affectation = await this.affectationService.softDeleteAffectationByID(assignee.id);
|
|
285
|
-
if (!affectation) {
|
|
286
|
-
console.warn(`removeAssigneeFromTicket(${ticket.id}, ${assignee.id}) failed`);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
console.error(error);
|
|
291
|
-
}
|
|
292
|
-
return ticket;
|
|
293
|
-
}
|
|
294
|
-
async updateTicketLocation(ticket, tagData) {
|
|
295
|
-
const poiInput = {
|
|
296
|
-
coordinate: tagData.getCoordinateString(),
|
|
297
|
-
type: PoiType.TICKET,
|
|
298
|
-
elementID: ticket.id,
|
|
299
|
-
metadata: tagData.getMetadataString(),
|
|
300
|
-
matterportSweepID: tagData.getSweepID(),
|
|
301
|
-
};
|
|
302
|
-
const poi = await this.poiService.createPOIForSpaceID(poiInput);
|
|
303
|
-
await this.addEventToTicket(ticket, {
|
|
304
|
-
title: 'Changement position du ticket',
|
|
305
|
-
description: "Le point d'intérêt du ticket a été modifié",
|
|
306
|
-
status: EventStatus.POSITION_SET,
|
|
307
|
-
translationPath: 'ticketEvent.position.set',
|
|
308
|
-
});
|
|
309
|
-
return poi;
|
|
310
|
-
}
|
|
311
|
-
async updateStatusOfTicket(ticket, status) {
|
|
312
|
-
const currentStatus = ticket.status;
|
|
313
|
-
const oldTicketStatus = ticket.status;
|
|
314
|
-
ticket.status = status;
|
|
315
|
-
if (currentStatus === status) {
|
|
316
|
-
return ticket;
|
|
317
|
-
}
|
|
318
|
-
console.log('Updating status');
|
|
319
|
-
return this.updateTicket({
|
|
320
|
-
id: ticket.id,
|
|
321
|
-
status,
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
async updateTypeOfTicket(ticket, type) {
|
|
325
|
-
const previousType = ticket.type;
|
|
326
|
-
ticket.type = type;
|
|
327
|
-
await this.updateTicketWithEvent({ id: ticket.id, type: ticket.type }, {
|
|
328
|
-
title: 'Type changé',
|
|
329
|
-
description: `Changement de ${previousType} vers ${ticket.type}`,
|
|
330
|
-
metadata: JSON.stringify({ type: ticket.type }),
|
|
331
|
-
translationPath: 'ticketEvent.ticket.type',
|
|
332
|
-
});
|
|
333
|
-
return ticket;
|
|
334
|
-
}
|
|
335
|
-
async getTicketsForUserForSpace(spaceID) {
|
|
336
|
-
const ticketsSpace = await this.getTicketsBySpace(spaceID);
|
|
337
|
-
return this.filterService.filterTicketsForCurrentUserInSpace(ticketsSpace, spaceID);
|
|
338
|
-
}
|
|
339
|
-
/** Basic CRUD operations */
|
|
340
|
-
async readTicket(id) {
|
|
341
|
-
return this.API.__proto__.GetTicket(id);
|
|
342
|
-
}
|
|
343
|
-
async createTicket(input) {
|
|
344
|
-
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
345
|
-
this.awsKinesisAnalytics.getInstance().record(
|
|
346
|
-
// @ts-ignore
|
|
347
|
-
{
|
|
348
|
-
data: {
|
|
349
|
-
eventType: 'Object Creation',
|
|
350
|
-
objectType: 'ticket',
|
|
351
|
-
//zoneId: input.spaceID, // TODO: check if spaceId == zoneId
|
|
352
|
-
domain: input.domain,
|
|
353
|
-
user: this.userService.cu,
|
|
354
|
-
locationId: this.currentSpaceID,
|
|
355
|
-
timestamp: new Date(),
|
|
356
|
-
zoneId: this.zoneIDFilter,
|
|
357
|
-
floorId: this.selectedFloor?.id,
|
|
358
|
-
},
|
|
359
|
-
streamName: 'smarterplanKinesis-analytics',
|
|
360
|
-
// partitionKey: "",
|
|
361
|
-
}, 'AWSKinesis');
|
|
362
|
-
}
|
|
363
|
-
return this.API.__proto__.CreateTicket(input);
|
|
364
|
-
}
|
|
365
|
-
async updateTicket(input) {
|
|
366
|
-
return this.API.__proto__.UpdateTicket(input);
|
|
367
|
-
}
|
|
368
|
-
async deleteTicket(ticket) {
|
|
369
|
-
const deleted = await this.API.__proto__.DeleteTicket({ id: ticket.id });
|
|
370
|
-
// delete POI
|
|
371
|
-
const poi = await this.poiService.getPoiByElementId(ticket.id);
|
|
372
|
-
if (poi) {
|
|
373
|
-
this.poiService.deletePoi(poi.id);
|
|
374
|
-
}
|
|
375
|
-
// clean parentID
|
|
376
|
-
if (ticket.children.items.length > 0) {
|
|
377
|
-
ticket.children.items.map(async (childTicket) => {
|
|
378
|
-
try {
|
|
379
|
-
await this.API.__proto__.UpdateTicket({
|
|
380
|
-
id: childTicket.id,
|
|
381
|
-
parentID: null,
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
catch {
|
|
385
|
-
console.warn('Could not update ticket', childTicket.id);
|
|
386
|
-
}
|
|
387
|
-
await this.API.__proto__.CreateEvent({
|
|
388
|
-
title: 'Ticket parent supprimé',
|
|
389
|
-
ticketID: childTicket.id,
|
|
390
|
-
description: `Ticket \"$ticket.title}\" a été supprimé`,
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
// delete events
|
|
395
|
-
await Promise.all(ticket.events.items.map(async (event_) => {
|
|
396
|
-
await this.API.__proto__.DeleteEvent({ id: event_.id });
|
|
397
|
-
}));
|
|
398
|
-
// delete affectationns
|
|
399
|
-
if (ticket.assignees.items.length > 0) {
|
|
400
|
-
for (const element of ticket.assignees.items) {
|
|
401
|
-
this.API.__proto__.DeleteAffectation({ id: element.id });
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
// delete comments
|
|
405
|
-
await Promise.all(ticket.comments.items.map(async (comment) => {
|
|
406
|
-
await this.API.__proto__.DeleteComment({ id: comment.id });
|
|
407
|
-
}));
|
|
408
|
-
await this.operationService.deleteOperationsForTicket(ticket.id);
|
|
409
|
-
return deleted;
|
|
410
|
-
}
|
|
411
|
-
/** Custom requests */
|
|
412
|
-
async getTicketsBySpace(spaceID) {
|
|
413
|
-
return this.API.__proto__
|
|
414
|
-
.TicketsBySpace(spaceID)
|
|
415
|
-
.then((tickets) => tickets.items);
|
|
416
|
-
}
|
|
417
|
-
async updateIconForAllTicketsInSpace(tagIcon, spaceID) {
|
|
418
|
-
const tickets = await this.getTicketsBySpace(spaceID);
|
|
419
|
-
const pois = await this.updateIconForAllObjects(tickets, tagIcon);
|
|
420
|
-
return { tickets, pois };
|
|
421
|
-
}
|
|
422
|
-
/** Archive related */
|
|
423
|
-
/** Return true if the current user has archived this ticket */
|
|
424
|
-
isArchived(ticket) {
|
|
425
|
-
return ticket.archivedForMissionID
|
|
426
|
-
? ticket.archivedForMissionID.includes(this.userService.currentMission(ticket.spaceID).id)
|
|
427
|
-
: false;
|
|
428
|
-
}
|
|
429
|
-
setArchived(ticket, archived) {
|
|
430
|
-
let archivedList = ticket.archivedForMissionID
|
|
431
|
-
? ticket.archivedForMissionID
|
|
432
|
-
: [];
|
|
433
|
-
const missionID = this.userService.currentMission(ticket.spaceID).id;
|
|
434
|
-
archivedList = archivedList.filter((m) => m !== missionID);
|
|
435
|
-
if (archived) {
|
|
436
|
-
archivedList.push(missionID);
|
|
437
|
-
}
|
|
438
|
-
return this.updateTicketWithEvent({
|
|
439
|
-
id: ticket.id,
|
|
440
|
-
archivedForMissionID: archivedList,
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
async navigateToTicketIn3D(ticket, forceSwitchVisit = false) {
|
|
444
|
-
let url = `visit/${ticket.spaceID}`;
|
|
445
|
-
if (forceSwitchVisit) {
|
|
446
|
-
url += `/detail/${ticket.id}`;
|
|
447
|
-
}
|
|
448
|
-
const canGoToTag = await this.viewerService.action_move_to_tag(`${ticket.id}`);
|
|
449
|
-
if (canGoToTag) {
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
const result = await this.getModel3dAndSweep(ticket);
|
|
453
|
-
if (!result || !result.model3D) {
|
|
454
|
-
alert('Error while getting virtual visit model');
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
if (!forceSwitchVisit) {
|
|
458
|
-
// check if we are moving within the same 3D model
|
|
459
|
-
const currentModel = localStorage.getItem('model3D');
|
|
460
|
-
if (currentModel && currentModel === result.model3D) {
|
|
461
|
-
// we add tag to the visit
|
|
462
|
-
const poi = ticket.pois.items[0];
|
|
463
|
-
if (poi.coordinate) {
|
|
464
|
-
// we force add because we might be in an another zone
|
|
465
|
-
await this.viewerService.actionAddObjectFromPOI(ticket, poi);
|
|
466
|
-
await this.viewerService.action_move_to_tag(ticket.id);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
else {
|
|
470
|
-
/** Si on ne force pas la visite, on demande si on veut etre switch */
|
|
471
|
-
openModalForVisitSwitch(this.modalService, result.model3D, ticket.spaceID, { sweepToMove: result.sweep, rotation: result.rotation });
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
else {
|
|
475
|
-
/** Si on force le switch de la visit */
|
|
476
|
-
window.open(`${url}?model3D=${result.model3D}&sweep=true`, '_blank');
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
initSubscriptions() {
|
|
480
|
-
if (!this.isMuseumUser) {
|
|
481
|
-
this.navSubscription = this.zoneChangeService.zoneChange.subscribe((zone) => {
|
|
482
|
-
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
483
|
-
if (!this.currentSpaceID) {
|
|
484
|
-
this.ticketTags.next(null);
|
|
485
|
-
this.ticketsUpdated.next({ space: [], zone: null });
|
|
486
|
-
this.ticketTypeFilter = null;
|
|
487
|
-
this.zoneIDFilter = null;
|
|
488
|
-
}
|
|
489
|
-
else if (zone.id !== this.zoneIDFilter) {
|
|
490
|
-
this.zoneIDFilter = zone.id;
|
|
491
|
-
// console.log("going to init tickets from zone");
|
|
492
|
-
this.initTickets().catch((e) => console.log(e.message));
|
|
493
|
-
}
|
|
494
|
-
});
|
|
495
|
-
this.filetrSubscription = this.filterService.subscribeToDataFilterUpdate((dateRange) => {
|
|
496
|
-
this.dateFilter = dateRange;
|
|
497
|
-
this.initTickets().catch((e) => console.log(e.message));
|
|
498
|
-
});
|
|
499
|
-
this.dateFilter = this.filterService.currentDateFilter;
|
|
500
|
-
this.updateDone.subscribe(() => {
|
|
501
|
-
if (this.currentSpaceID) {
|
|
502
|
-
this.initTickets().catch((e) => console.log(e.message));
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
unsubscribe() {
|
|
508
|
-
this.destroy$.next(true);
|
|
509
|
-
this.destroy$.complete();
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
TicketsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, deps: [{ token: 'currentAwsKinesisAnalyticsService' }, { token: 'currentAPIService' }, { token: i1.OperationService }, { token: i2.EventService }, { token: i3.AffectationService }, { token: i4.PoiService }, { token: i5.BaseUserService }, { token: i6.NavigatorService }, { token: i7.FilterService }, { token: i8.InterventionService }, { token: i9.NavigationService }, { token: i10.ViewerService }, { token: i11.ZoneChangeService }, { token: i12.NgbModal }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
513
|
-
TicketsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, providedIn: 'root' });
|
|
514
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, decorators: [{
|
|
515
|
-
type: Injectable,
|
|
516
|
-
args: [{
|
|
517
|
-
providedIn: 'root',
|
|
518
|
-
}]
|
|
519
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
520
|
-
type: Inject,
|
|
521
|
-
args: ['currentAwsKinesisAnalyticsService']
|
|
522
|
-
}] }, { type: undefined, decorators: [{
|
|
523
|
-
type: Inject,
|
|
524
|
-
args: ['currentAPIService']
|
|
525
|
-
}] }, { type: i1.OperationService }, { type: i2.EventService }, { type: i3.AffectationService }, { type: i4.PoiService }, { type: i5.BaseUserService }, { type: i6.NavigatorService }, { type: i7.FilterService }, { type: i8.InterventionService }, { type: i9.NavigationService }, { type: i10.ViewerService }, { type: i11.ZoneChangeService }, { type: i12.NgbModal }]; } });
|
|
526
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21vZGVscy90aWNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0Msc0NBQXNDO0FBQ3RDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxPQUFPLEVBQTBCLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBQyx1QkFBdUIsRUFBWSxNQUFNLHVCQUF1QixDQUFDO0FBRXpFLE9BQU8sRUFHTCxVQUFVLEVBQ1YsY0FBYyxFQUNkLFlBQVksRUFDWixXQUFXLEVBQ1gsU0FBUyxFQUdULE9BQU8sR0FHUixNQUFNLHFCQUFxQixDQUFDO0FBSzdCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXhELE9BQU8sZUFBZSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sYUFBYSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sYUFBYSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3JFLE9BQU8sZUFBZSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVN2RCxNQUFNLE9BQU8sY0FBZSxTQUFRLGlCQUFpQjtJQW9EbkQsWUFFSSwyQkFBZ0MsRUFDTCxXQUFnQixFQUNyQyxnQkFBa0MsRUFDbEMsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQzlDLFVBQXNCLEVBQ2QsV0FBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUNoRCxpQkFBb0MsRUFDNUIsYUFBNEIsRUFDNUIsaUJBQW9DLEVBQ3BDLFlBQXNCO1FBRTlCLEtBQUssQ0FBQyxVQUFVLEVBQUUs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QUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FDdEUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQ0YsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDekQ7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OzJHQW5tQlUsY0FBYyxrQkFxRGYsbUNBQW1DLGFBRW5DLG1CQUFtQjsrR0F2RGxCLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFzREksTUFBTTsyQkFBQyxtQ0FBbUM7OzBCQUUxQyxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nYk1vZGFsfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7b3Blbk1vZGFsRm9yVmlzaXRTd2l0Y2gsIHdhaXRVbnRpbH0gZnJvbSAnLi4vLi4vaGVscGVycy5zZXJ2aWNlJztcbmltcG9ydCB7TWF0dGVydGFnRGF0YX0gZnJvbSAnLi4vLi4vbWF0dGVydGFnRGF0YSc7XG5pbXBvcnQge1xuICBFdmVudCxcbiAgVGlja2V0LFxuICBUaWNrZXRUeXBlLFxuICBUaWNrZXRQcmlvcml0eSxcbiAgVGlja2V0U3RhdHVzLFxuICBFdmVudFN0YXR1cyxcbiAgRXZlbnRUeXBlLFxuICBBZmZlY3RhdGlvbixcbiAgUE9JLFxuICBQb2lUeXBlLFxuICBJVXBkYXRlLFxuICBab25lLFxufSBmcm9tICcuLi8uLi90eXBlcy5zZXJ2aWNlJztcbmltcG9ydCB7RmlsdGVyU2VydmljZX0gZnJvbSAnLi4vZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtOYXZpZ2F0b3JTZXJ2aWNlfSBmcm9tICcuLi9uYXZpZ2F0b3Iuc2VydmljZSc7XG5pbXBvcnQge0Jhc2VVc2VyU2VydmljZX0gZnJvbSAnLi4vdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7Vmlld2VyU2VydmljZX0gZnJvbSAnLi4vdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtCYXNlT2JqZWN0U2VydmljZX0gZnJvbSAnLi9iYXNlLW9iamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7TmF2aWdhdGlvblNlcnZpY2V9IGZyb20gJy4vbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7T3BlcmF0aW9uU2VydmljZX0gZnJvbSAnLi9vcGVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1BvaVNlcnZpY2V9IGZyb20gJy4vcG9pLnNlcnZpY2UnO1xuaW1wb3J0IEluZm9ybWF0aW9uSWNvbiBmcm9tICdAaWNvbmlmeS1pY29ucy9tZGkvaW5mb3JtYXRpb24tb3V0bGluZSc7XG5pbXBvcnQgQWNjaWRlbnRJY29uIGZyb20gJ0BpY29uaWZ5LWljb25zL21kaS9hbGVydCc7XG5pbXBvcnQgV29yZE9yZGVySWNvbiBmcm9tICdAaWNvbmlmeS1pY29ucy9tZGkvYWNjb3VudC1oYXJkLWhhdCc7XG5pbXBvcnQgUmVwb3J0aW5nSWNvbiBmcm9tICdAaWNvbmlmeS1pY29ucy9tZGkvZmlsZS1kb2N1bWVudC1vdXRsaW5lJztcbmltcG9ydCBNYWludGVuYW5jZUljb24gZnJvbSAnQGljb25pZnktaWNvbnMvbWRpL3Rvb2xzJztcbmltcG9ydCB7RXZlbnRTZXJ2aWNlfSBmcm9tICcuL2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtJbnRlcnZlbnRpb25TZXJ2aWNlfSBmcm9tICcuLi9pbnRlcnZlbnRpb24uc2VydmljZSc7XG5pbXBvcnQge0FmZmVjdGF0aW9uU2VydmljZX0gZnJvbSAnLi9hZmZlY3RhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7Wm9uZUNoYW5nZVNlcnZpY2V9IGZyb20gXCIuLi96b25lQ2hhbmdlLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRpY2tldHNTZXJ2aWNlIGV4dGVuZHMgQmFzZU9iamVjdFNlcnZpY2Uge1xuICBjdXJyZW50VGlja2V0czogeyB6b25lOiBUaWNrZXRbXTsgc3BhY2U6IFRpY2tldFtdIH0gPSB7XG4gICAgem9uZTogW10sXG4gICAgc3BhY2U6IFtdLFxuICB9O1xuXG4gIHRpY2tldFRhZ3M6IFN1YmplY3Q8VGlja2V0W10+ID0gbmV3IFN1YmplY3QoKTtcblxuICB0aWNrZXRzRmlsdGVyZWQ6IFRpY2tldFtdID0gW107XG5cbiAgdGlja2V0c1VwZGF0ZWQ6IFN1YmplY3Q8e1xuICAgIHpvbmU6IFRpY2tldFtdO1xuICAgIHNwYWNlOiBUaWNrZXRbXTtcbiAgfT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XG5cbiAgem9uZUlERmlsdGVyOiBzdHJpbmc7XG5cbiAgZGF0ZUZpbHRlcjogRGF0ZVtdO1xuXG4gIHRpY2tldFR5cGVGaWx0ZXI6IFRpY2tldFR5cGVbXTtcblxuICByZXBvcnRpbmdJY29uID0gUmVwb3J0aW5nSWNvbjtcblxuICBtYWludGVuYW5jZUljb24gPSBNYWludGVuYW5jZUljb247XG5cbiAgd29ya29yZGVySWNvbiA9IFdvcmRPcmRlckljb247XG5cbiAgaW5mb3JtYXRpb25JY29uID0gSW5mb3JtYXRpb25JY29uO1xuXG4gIGFjY2lkZW50SWNvbiA9IEFjY2lkZW50SWNvbjtcblxuICB1cGRhdGVEb25lOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcblxuICB1cGRhdGluZzogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgQVBJOiBhbnk7XG4gIGF3c0tpbmVzaXNBbmFseXRpY3M6IGFueTsgLy9BV1NcblxuICBpc011c2V1bVVzZXIgPSBmYWxzZTtcblxuICBuYXZTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBmaWxldHJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBmbG9vcnNQZXJTcGFjZTogWm9uZVtdID0gbnVsbDtcblxuICBzZWxlY3RlZEZsb29yOiBab25lID0gbnVsbDtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdjdXJyZW50QXdzS2luZXNpc0FuYWx5dGljc1NlcnZpY2UnKVxuICAgICAgYXdzS2luZXNpc0FuYWx5dGljc0luamVjdGVkOiBhbnksXG4gICAgQEluamVjdCgnY3VycmVudEFQSVNlcnZpY2UnKSBhcGlJbmplY3RlZDogYW55LFxuICAgIHByaXZhdGUgb3BlcmF0aW9uU2VydmljZTogT3BlcmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWZmZWN0YXRpb25TZXJ2aWNlOiBBZmZlY3RhdGlvblNlcnZpY2UsXG4gICAgcG9pU2VydmljZTogUG9pU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGludGVydmVudGlvblNlcnZpY2U6IEludGVydmVudGlvblNlcnZpY2UsXG4gICAgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICBwcml2YXRlIHpvbmVDaGFuZ2VTZXJ2aWNlOiBab25lQ2hhbmdlU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcbiAgKSB7XG4gICAgc3VwZXIocG9pU2VydmljZSwgbmF2aWdhdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcyA9IGF3c0tpbmVzaXNBbmFseXRpY3NJbmplY3RlZDtcbiAgICB0aGlzLkFQSSA9IGFwaUluamVjdGVkO1xuICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xuICAgIHRoaXMuaW5pdFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzQ2hhbmdlZC5zdWJzY3JpYmUoKGlzQ29ubmVjdGVkKSA9PiB7XG4gICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5pc011c2V1bVVzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc09ubHlNdXNldW1Sb2xlKCk7XG4gICAgICAgIHRoaXMuaW5pdFN1YnNjcmlwdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm5hdlN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5maWxldHJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy56b25lQ2hhbmdlU2VydmljZS5mbG9vckhhc0NoYW5nZWQuc3Vic2NyaWJlKChmbG9vcikgPT4ge1xuICAgICAgaWYgKGZsb29yKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IGZsb29yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdFRpY2tldHMoKSB7XG4gICAgbGV0IHRpY2tldHNGaWx0ZXJlZCA9IFtdO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XG4gICAgICB0aGlzLnVwZGF0aW5nLm5leHQodHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLmdldFRpY2tldHNCeVNwYWNlKHRoaXMuY3VycmVudFNwYWNlSUQpLnRoZW4oKHRpY2tldHMpID0+IHtcbiAgICAgICAgaWYgKHRpY2tldHMpIHtcbiAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQgPSB0aWNrZXRzO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRpY2tldHNGaWx0ZXJlZCA9XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJUaWNrZXRzRm9yQ3VycmVudFVzZXJJblNwYWNlKFxuICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZUlEXG4gICAgICAgICk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodGhpcy5kYXRlRmlsdGVyICYmIHRoaXMuZGF0ZUZpbHRlclswXSAhPSBcIkludmFsaWQgRGF0ZVwiICYmIHRoaXMuZGF0ZUZpbHRlclsxXSAhPSBcIkludmFsaWQgRGF0ZVwiKSB7XG4gICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJPYmplY3RzRm9yRGF0ZVJhbmdlKFxuICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCxcbiAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRpY2tldFR5cGVGaWx0ZXIpIHtcbiAgICAgICAgdGlja2V0c0ZpbHRlcmVkID0gdGlja2V0c0ZpbHRlcmVkLmZpbHRlcigodGlja2V0KSA9PlxuICAgICAgICAgIHRoaXMudGlja2V0VHlwZUZpbHRlci5pbmNsdWRlcyh0aWNrZXQudHlwZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFRpY2tldHMuc3BhY2UgPSB0aWNrZXRzRmlsdGVyZWQ7XG5cbiAgICAgIGlmICh0aGlzLnpvbmVJREZpbHRlcikge1xuICAgICAgICB0aWNrZXRzRmlsdGVyZWQgPSBhd2FpdCB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyT2JqZWN0c0ZvclpvbmUoXG4gICAgICAgICAgdGlja2V0c0ZpbHRlcmVkLFxuICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmN1cnJlbnRUaWNrZXRzLnpvbmUgPSB0aWNrZXRzRmlsdGVyZWQ7XG4gICAgICB0aGlzLnRpY2tldFRhZ3MubmV4dCh0aWNrZXRzRmlsdGVyZWQpO1xuICAgICAgdGhpcy50aWNrZXRzVXBkYXRlZC5uZXh0KHRoaXMuY3VycmVudFRpY2tldHMpO1xuICAgICAgdGhpcy51cGRhdGluZy5uZXh0KGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aWNrZXRUYWdzLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRhcHRUaWNrZXQodGlja2V0OiBUaWNrZXQpOiBQcm9taXNlPFRpY2tldD4ge1xuICAgIGlmICh0aWNrZXQuY29tbWVudHMuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgdGlja2V0LmNvbW1lbnRzLml0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IERhdGUoYi5jcmVhdGVkQXQpIC0gbmV3IERhdGUoYS5jcmVhdGVkQXQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRpY2tldC5ldmVudHMuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU29ydCBldmVudHMgYnkgZGF0ZVxuICAgICAgdGlja2V0LmV2ZW50cy5pdGVtcy5zb3J0KChldmVudDEsIGV2ZW50MikgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShldmVudDIuY3JlYXRlZEF0KSAtIG5ldyBEYXRlKGV2ZW50MS5jcmVhdGVkQXQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRpY2tldC5wcmVzdGF0YWlyZSA9IGF3YWl0IHRoaXMuaW50ZXJ2ZW50aW9uU2VydmljZS5nZXRQcmVzdGF0YWlyZUZvclRpY2tldChcbiAgICAgIHRpY2tldFxuICAgICk7XG4gICAgcmV0dXJuIHRpY2tldDtcbiAgfVxuXG4gIGdldFByaW9yaXR5Q29sb3IodGlja2V0OiBUaWNrZXQpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGlja2V0LnByaW9yaXR5KSB7XG4gICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1BWElNVU06XG4gICAgICAgIHJldHVybiAnY3JpbXNvbic7XG4gICAgICBjYXNlIFRpY2tldFByaW9yaXR5LkhJR0g6XG4gICAgICAgIHJldHVybiAncmVkJztcbiAgICAgIGNhc2UgVGlja2V0UHJpb3JpdHkuTUVESVVNOlxuICAgICAgICByZXR1cm4gJ29yYW5nZSc7XG4gICAgICBjYXNlIFRpY2tldFByaW9yaXR5LkxPVzpcbiAgICAgICAgcmV0dXJuICdncmVlbic7XG4gICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1JTklNVU06XG4gICAgICAgIHJldHVybiAnYmx1ZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2JsdWUnO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c0NvbG9yKHRpY2tldDogVGlja2V0KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRpY2tldC5zdGF0dXMpIHtcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlRPX0JFX1BST0NFU1NFRDpcbiAgICAgICAgcmV0dXJuICcjQjBCMEIxJztcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlBMQU5ORUQ6XG4gICAgICAgIHJldHVybiAnI0VCREYyNyc7XG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5JTl9QUk9HUkVTUzpcbiAgICAgICAgcmV0dXJuICcjRUJERjI3JztcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLldBSVRJTkdfRk9SX1ZBTElEQVRJT046XG4gICAgICAgIHJldHVybiAnI0VCREYyNyc7XG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5WQUxJREFURUQ6XG4gICAgICAgIHJldHVybiAnI0JDRTJFNSc7XG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5SRUpFQ1RFRDpcbiAgICAgICAgcmV0dXJuICcjZTg0YzM1JztcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlJFU09MVkVEOlxuICAgICAgICByZXR1cm4gJyNCQ0UyRTUnO1xuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQVJDSElWRUQ6XG4gICAgICAgIHJldHVybiAnI0IwQjBCMSc7XG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5MQVRFOlxuICAgICAgICByZXR1cm4gJyNlODRjMzUnO1xuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQkxPQ0tFRDpcbiAgICAgICAgcmV0dXJuICcjZTg0YzM1JztcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkNPTVBMRVRFRDpcbiAgICAgICAgcmV0dXJuICcjMzg4NjU5JztcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkRFTEFZRUQ6XG4gICAgICAgIHJldHVybiAnI0RCNzU0Myc7XG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5DQU5DRUxMRUQ6XG4gICAgICAgIHJldHVybiAnI2U4NGMzNSc7XG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5UT19SRURPOlxuICAgICAgICByZXR1cm4gJyNEQjc1NDMnO1xuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQ1JFQVRFRDpcbiAgICAgICAgcmV0dXJuICcjQjBCMEIxJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnI0JDRTJFNSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGlja2V0UHJpb3JpdHlOdW1iZXIodCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1JTklNVU1cbiAgICAgID8gLTFcbiAgICAgIDogdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuTE9XXG4gICAgICAgID8gMFxuICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1FRElVTVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuSElHSFxuICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1BWElNVU1cbiAgICAgICAgICAgICAgPyAzXG4gICAgICAgICAgICAgIDogLTE7XG4gIH1cblxuICBnZXRUaWNrZXRJY29uKHR5cGU6IFRpY2tldFR5cGUpOiBhbnkge1xuICAgIC8vIGNvbnN0IHR5cGVJY29uIDogVGlja2V0VHlwZSA9IHRpY2tldC50eXBlO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUaWNrZXRUeXBlLlJFUE9SVElORzpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0aW5nSWNvbjtcbiAgICAgIGNhc2UgVGlja2V0VHlwZS5SRVFVRVNUX0ZPUl9JTlRFUlZFTlRJT046XG4gICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcbiAgICAgIGNhc2UgVGlja2V0VHlwZS5SRVFVRVNUX0ZPUl9NQUlOVEVOQU5DRTpcbiAgICAgICAgcmV0dXJuIHRoaXMubWFpbnRlbmFuY2VJY29uO1xuICAgICAgY2FzZSBUaWNrZXRUeXBlLldPUktfT1JERVI6XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtvcmRlckljb247XG4gICAgICBjYXNlIFRpY2tldFR5cGUuSU5DSURFTlQ6XG4gICAgICAgIHJldHVybiB0aGlzLmFjY2lkZW50SWNvbjtcbiAgICAgIGNhc2UgVGlja2V0VHlwZS5JTkZPUk1BVElPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5mb3JtYXRpb25JY29uO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMubWFpbnRlbmFuY2VJY29uO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZEV2ZW50VG9UaWNrZXQodGlja2V0OiBUaWNrZXQsIGV2ZW50OiBFdmVudCk6IFByb21pc2U8RXZlbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50TWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGlja2V0LnNwYWNlSUQpO1xuICAgIGV2ZW50Lmdyb3VwID0gZXZlbnQuZ3JvdXAgPyBldmVudC5ncm91cCA6ICdkZWZhdWx0JztcbiAgICBldmVudC50aWNrZXRJRCA9IGV2ZW50LnRpY2tldElEID8gZXZlbnQudGlja2V0SUQgOiB0aWNrZXQuaWQ7XG4gICAgZXZlbnQuc3RhdHVzID0gZXZlbnQuc3RhdHVzID8gZXZlbnQuc3RhdHVzIDogRXZlbnRTdGF0dXMuQ1JFQVRFRDtcbiAgICBldmVudC50eXBlID0gZXZlbnQudHlwZSA/IGV2ZW50LnR5cGUgOiBFdmVudFR5cGUuVElDS0VUO1xuICAgIGV2ZW50Lm93bmVySUQgPSBldmVudC5vd25lcklEID8gZXZlbnQub3duZXJJRCA6IGN1cnJlbnRNaXNzaW9uLmlkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNlaXZlZEV2ZW50ID0gYXdhaXQgdGhpcy5ldmVudFNlcnZpY2UuY3JlYXRlRXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKCEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzICYmICEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLnJlY29yZCAmJiB0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MucmVjb3JkKCkpIHtcbiAgICAgICAgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLmdldEluc3RhbmNlKCkucmVjb3JkKFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ1RpY2tldCBDaGFuZ2UnLFxuICAgICAgICAgICAgICB0aWNrZXRJZDogZXZlbnQudGlja2V0SUQsXG4gICAgICAgICAgICAgIHRpY2tldDogdGlja2V0LFxuICAgICAgICAgICAgICBzdGF0dXM6IGV2ZW50LnN0YXR1cyxcbiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJTZXJ2aWNlLmN1LFxuICAgICAgICAgICAgICBsb2NhdGlvbklkOiB0aGlzLmN1cnJlbnRTcGFjZUlELFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIHpvbmVJZDogdGhpcy56b25lSURGaWx0ZXIsXG4gICAgICAgICAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcj8uaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyZWFtTmFtZTogJ3NtYXJ0ZXJwbGFuS2luZXNpcy1hbmFseXRpY3MnLFxuICAgICAgICAgICAgLy8gcGFydGl0aW9uS2V5OiBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0FXU0tpbmVzaXMnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygnRXZlbnQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgIScpO1xuICAgICAgcmV0dXJuIHJlY2VpdmVkRXZlbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZFRpY2tldCh0aWNrZXQ6IFRpY2tldCk6IFByb21pc2U8VGlja2V0IHwgdm9pZD4ge1xuICAgIHRpY2tldC5zdGF0dXMgPSBUaWNrZXRTdGF0dXMuQ1JFQVRFRDtcbiAgICBpZiAoIXRpY2tldC5vd25lck1pc3Npb25JRCkge1xuICAgICAgdGlja2V0Lm93bmVyTWlzc2lvbklEID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihcbiAgICAgICAgdGlja2V0LnNwYWNlSURcbiAgICAgICkuaWQ7XG4gICAgfVxuICAgIC8vIFRPRE8hISEgZmlsdGVyIG1pc3Npb25zIGJ5IHNwYWNlIG9mIHRpY2tldFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNlaXZlZFRpY2tldCA9IGF3YWl0IHRoaXMuY3JlYXRlVGlja2V0KHRpY2tldCk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnISEhIFJlc3BvbnNlIGZyb20gY3JlYXRpbmcgdGlja2V0IDonKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJlY2VpdmVkVGlja2V0KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRUb1RpY2tldChyZWNlaXZlZFRpY2tldCwge1xuICAgICAgICB0aXRsZTogJ0Nyw6lhdGlvbiBkdSB0aWNrZXQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFRpY2tldCBjcsOpw6kgcGFyIC1gLFxuICAgICAgICB0cmFuc2xhdGlvblBhdGg6ICd0aWNrZXRFdmVudC50aWNrZXQuY3JlYXRlZCcsXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xuICAgICAgcmV0dXJuIHJlY2VpdmVkVGlja2V0OyAvLyBpbnN0ZWFkIG9mIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coJ1RpY2tldCBjcmVhdGlvbiBGQUlMRUQnKTtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVGlja2V0V2l0aEV2ZW50KFxuICAgIHRpY2tldDogSVVwZGF0ZSAmIFBhcnRpYWw8VGlja2V0PixcbiAgICBldmVudD86IEV2ZW50XG4gICk6IFByb21pc2U8VGlja2V0PiB7XG4gICAgY29uc3QgcmVjZWl2ZWRUaWNrZXQgPSBhd2FpdCB0aGlzLnVwZGF0ZVRpY2tldCh0aWNrZXQpO1xuICAgIGlmIChyZWNlaXZlZFRpY2tldCkge1xuICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgdGlja2V0IDonKTtcbiAgICAgIGNvbnNvbGUubG9nKHJlY2VpdmVkVGlja2V0KTtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkZEV2ZW50VG9UaWNrZXQocmVjZWl2ZWRUaWNrZXQsIGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7XG4gIH1cblxuICBhc3luYyByZW1vdmVBc3NpZ25lZUZyb21UaWNrZXQoXG4gICAgdGlja2V0OiBUaWNrZXQsXG4gICAgYXNzaWduZWU6IEFmZmVjdGF0aW9uXG4gICk6IFByb21pc2U8VGlja2V0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFmZmVjdGF0aW9uID1cbiAgICAgICAgYXdhaXQgdGhpcy5hZmZlY3RhdGlvblNlcnZpY2Uuc29mdERlbGV0ZUFmZmVjdGF0aW9uQnlJRChhc3NpZ25lZS5pZCk7XG4gICAgICBpZiAoIWFmZmVjdGF0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgcmVtb3ZlQXNzaWduZWVGcm9tVGlja2V0KCR7dGlja2V0LmlkfSwgJHthc3NpZ25lZS5pZH0pIGZhaWxlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB0aWNrZXQ7XG4gIH1cblxuICBhc3luYyB1cGRhdGVUaWNrZXRMb2NhdGlvbihcbiAgICB0aWNrZXQ6IFRpY2tldCxcbiAgICB0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhXG4gICk6IFByb21pc2U8UE9JPiB7XG4gICAgY29uc3QgcG9pSW5wdXQgPSB7XG4gICAgICBjb29yZGluYXRlOiB0YWdEYXRhLmdldENvb3JkaW5hdGVTdHJpbmcoKSxcbiAgICAgIHR5cGU6IFBvaVR5cGUuVElDS0VULFxuICAgICAgZWxlbWVudElEOiB0aWNrZXQuaWQsXG4gICAgICBtZXRhZGF0YTogdGFnRGF0YS5nZXRNZXRhZGF0YVN0cmluZygpLFxuICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxuICAgIH0gYXMgUE9JO1xuICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHBvaUlucHV0KTtcbiAgICBhd2FpdCB0aGlzLmFkZEV2ZW50VG9UaWNrZXQodGlja2V0LCB7XG4gICAgICB0aXRsZTogJ0NoYW5nZW1lbnQgcG9zaXRpb24gZHUgdGlja2V0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkxlIHBvaW50IGQnaW50w6lyw6p0IGR1IHRpY2tldCBhIMOpdMOpIG1vZGlmacOpXCIsXG4gICAgICBzdGF0dXM6IEV2ZW50U3RhdHVzLlBPU0lUSU9OX1NFVCxcbiAgICAgIHRyYW5zbGF0aW9uUGF0aDogJ3RpY2tldEV2ZW50LnBvc2l0aW9uLnNldCcsXG4gICAgfSk7XG4gICAgcmV0dXJuIHBvaTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVN0YXR1c09mVGlja2V0KFxuICAgIHRpY2tldDogVGlja2V0LFxuICAgIHN0YXR1czogVGlja2V0U3RhdHVzXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRpY2tldC5zdGF0dXM7XG4gICAgY29uc3Qgb2xkVGlja2V0U3RhdHVzID0gdGlja2V0LnN0YXR1cztcbiAgICB0aWNrZXQuc3RhdHVzID0gc3RhdHVzO1xuICAgIGlmIChjdXJyZW50U3RhdHVzID09PSBzdGF0dXMpIHtcbiAgICAgIHJldHVybiB0aWNrZXQ7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBzdGF0dXMnKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVUaWNrZXQoe1xuICAgICAgaWQ6IHRpY2tldC5pZCxcbiAgICAgIHN0YXR1cyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVR5cGVPZlRpY2tldCh0aWNrZXQ6IFRpY2tldCwgdHlwZTogVGlja2V0VHlwZSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcHJldmlvdXNUeXBlID0gdGlja2V0LnR5cGU7XG4gICAgdGlja2V0LnR5cGUgPSB0eXBlO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlVGlja2V0V2l0aEV2ZW50KFxuICAgICAge2lkOiB0aWNrZXQuaWQsIHR5cGU6IHRpY2tldC50eXBlfSxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdUeXBlIGNoYW5nw6knLFxuICAgICAgICBkZXNjcmlwdGlvbjogYENoYW5nZW1lbnQgZGUgJHtwcmV2aW91c1R5cGV9IHZlcnMgJHt0aWNrZXQudHlwZX1gLFxuICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoe3R5cGU6IHRpY2tldC50eXBlfSksXG4gICAgICAgIHRyYW5zbGF0aW9uUGF0aDogJ3RpY2tldEV2ZW50LnRpY2tldC50eXBlJyxcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiB0aWNrZXQ7XG4gIH1cblxuICBhc3luYyBnZXRUaWNrZXRzRm9yVXNlckZvclNwYWNlKHNwYWNlSUQ6IHN0cmluZyk6IFByb21pc2U8VGlja2V0W10+IHtcbiAgICBjb25zdCB0aWNrZXRzU3BhY2UgPSBhd2FpdCB0aGlzLmdldFRpY2tldHNCeVNwYWNlKHNwYWNlSUQpO1xuICAgIHJldHVybiB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyVGlja2V0c0ZvckN1cnJlbnRVc2VySW5TcGFjZShcbiAgICAgIHRpY2tldHNTcGFjZSxcbiAgICAgIHNwYWNlSURcbiAgICApO1xuICB9XG5cbiAgLyoqIEJhc2ljIENSVUQgb3BlcmF0aW9ucyAqL1xuICBhc3luYyByZWFkVGlja2V0KGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldFRpY2tldChpZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVUaWNrZXQoaW5wdXQ6IFRpY2tldCk6IFByb21pc2U8VGlja2V0PiB7XG4gICAgaWYgKCEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzICYmICEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLnJlY29yZCAmJiB0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MucmVjb3JkKCkpIHtcbiAgICAgIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5nZXRJbnN0YW5jZSgpLnJlY29yZChcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnT2JqZWN0IENyZWF0aW9uJyxcbiAgICAgICAgICAgIG9iamVjdFR5cGU6ICd0aWNrZXQnLFxuICAgICAgICAgICAgLy96b25lSWQ6IGlucHV0LnNwYWNlSUQsIC8vIFRPRE86IGNoZWNrIGlmIHNwYWNlSWQgPT0gem9uZUlkXG4gICAgICAgICAgICBkb21haW46IGlucHV0LmRvbWFpbixcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlclNlcnZpY2UuY3UsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiB0aGlzLmN1cnJlbnRTcGFjZUlELFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgem9uZUlkOiB0aGlzLnpvbmVJREZpbHRlcixcbiAgICAgICAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcj8uaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJlYW1OYW1lOiAnc21hcnRlcnBsYW5LaW5lc2lzLWFuYWx5dGljcycsXG4gICAgICAgICAgLy8gcGFydGl0aW9uS2V5OiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgICAnQVdTS2luZXNpcydcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlVGlja2V0KGlucHV0KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVRpY2tldChpbnB1dDogSVVwZGF0ZSAmIFBhcnRpYWw8VGlja2V0Pik6IFByb21pc2U8VGlja2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVUaWNrZXQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZVRpY2tldCh7aWQ6IHRpY2tldC5pZH0pO1xuXG4gICAgLy8gZGVsZXRlIFBPSVxuICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5nZXRQb2lCeUVsZW1lbnRJZCh0aWNrZXQuaWQpO1xuICAgIGlmIChwb2kpIHtcbiAgICAgIHRoaXMucG9pU2VydmljZS5kZWxldGVQb2kocG9pLmlkKTtcbiAgICB9XG5cbiAgICAvLyBjbGVhbiBwYXJlbnRJRFxuICAgIGlmICh0aWNrZXQuY2hpbGRyZW4uaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgdGlja2V0LmNoaWxkcmVuLml0ZW1zLm1hcChhc3luYyAoY2hpbGRUaWNrZXQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uVXBkYXRlVGlja2V0KHtcbiAgICAgICAgICAgIGlkOiBjaGlsZFRpY2tldC5pZCxcbiAgICAgICAgICAgIHBhcmVudElEOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCB1cGRhdGUgdGlja2V0JywgY2hpbGRUaWNrZXQuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICB0aXRsZTogJ1RpY2tldCBwYXJlbnQgc3VwcHJpbcOpJyxcbiAgICAgICAgICB0aWNrZXRJRDogY2hpbGRUaWNrZXQuaWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBUaWNrZXQgXFxcIiR0aWNrZXQudGl0bGV9XFxcIiBhIMOpdMOpIHN1cHByaW3DqWAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGRlbGV0ZSBldmVudHNcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRpY2tldC5ldmVudHMuaXRlbXMubWFwKGFzeW5jIChldmVudF8pID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZUV2ZW50KHtpZDogZXZlbnRfLmlkfSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gZGVsZXRlIGFmZmVjdGF0aW9ubnNcbiAgICBpZiAodGlja2V0LmFzc2lnbmVlcy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGlja2V0LmFzc2lnbmVlcy5pdGVtcykge1xuICAgICAgICB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlQWZmZWN0YXRpb24oe2lkOiBlbGVtZW50LmlkfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGRlbGV0ZSBjb21tZW50c1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGlja2V0LmNvbW1lbnRzLml0ZW1zLm1hcChhc3luYyAoY29tbWVudCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlQ29tbWVudCh7aWQ6IGNvbW1lbnQuaWR9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuZGVsZXRlT3BlcmF0aW9uc0ZvclRpY2tldCh0aWNrZXQuaWQpO1xuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgLyoqIEN1c3RvbSByZXF1ZXN0cyAqL1xuICBhc3luYyBnZXRUaWNrZXRzQnlTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPFRpY2tldFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fX1xuICAgICAgLlRpY2tldHNCeVNwYWNlKHNwYWNlSUQpXG4gICAgICAudGhlbigodGlja2V0cykgPT4gdGlja2V0cy5pdGVtcyk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVJY29uRm9yQWxsVGlja2V0c0luU3BhY2UoXG4gICAgdGFnSWNvbjogc3RyaW5nLFxuICAgIHNwYWNlSUQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHsgdGlja2V0czogVGlja2V0W107IHBvaXM6IFBPSVtdIH0+IHtcbiAgICBjb25zdCB0aWNrZXRzID0gYXdhaXQgdGhpcy5nZXRUaWNrZXRzQnlTcGFjZShzcGFjZUlEKTtcbiAgICBjb25zdCBwb2lzID0gYXdhaXQgdGhpcy51cGRhdGVJY29uRm9yQWxsT2JqZWN0cyh0aWNrZXRzLCB0YWdJY29uKTtcbiAgICByZXR1cm4ge3RpY2tldHMsIHBvaXN9O1xuICB9XG5cbiAgLyoqIEFyY2hpdmUgcmVsYXRlZCAqL1xuICAvKiogUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgYXJjaGl2ZWQgdGhpcyB0aWNrZXQgKi9cbiAgaXNBcmNoaXZlZCh0aWNrZXQ6IFRpY2tldCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aWNrZXQuYXJjaGl2ZWRGb3JNaXNzaW9uSURcbiAgICAgID8gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklELmluY2x1ZGVzKFxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKHRpY2tldC5zcGFjZUlEKS5pZFxuICAgICAgKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHNldEFyY2hpdmVkKHRpY2tldDogVGlja2V0LCBhcmNoaXZlZDogYm9vbGVhbikge1xuICAgIGxldCBhcmNoaXZlZExpc3QgPSB0aWNrZXQuYXJjaGl2ZWRGb3JNaXNzaW9uSURcbiAgICAgID8gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklEXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IG1pc3Npb25JRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGlja2V0LnNwYWNlSUQpLmlkO1xuXG4gICAgYXJjaGl2ZWRMaXN0ID0gYXJjaGl2ZWRMaXN0LmZpbHRlcigobSkgPT4gbSAhPT0gbWlzc2lvbklEKTtcblxuICAgIGlmIChhcmNoaXZlZCkge1xuICAgICAgYXJjaGl2ZWRMaXN0LnB1c2gobWlzc2lvbklEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51cGRhdGVUaWNrZXRXaXRoRXZlbnQoe1xuICAgICAgaWQ6IHRpY2tldC5pZCxcbiAgICAgIGFyY2hpdmVkRm9yTWlzc2lvbklEOiBhcmNoaXZlZExpc3QsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvVGlja2V0SW4zRChcbiAgICB0aWNrZXQ6IFRpY2tldCxcbiAgICBmb3JjZVN3aXRjaFZpc2l0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgbGV0IHVybCA9IGB2aXNpdC8ke3RpY2tldC5zcGFjZUlEfWA7XG4gICAgaWYgKGZvcmNlU3dpdGNoVmlzaXQpIHtcbiAgICAgIHVybCArPSBgL2RldGFpbC8ke3RpY2tldC5pZH1gO1xuICAgIH1cbiAgICBjb25zdCBjYW5Hb1RvVGFnID0gYXdhaXQgdGhpcy52aWV3ZXJTZXJ2aWNlLmFjdGlvbl9tb3ZlX3RvX3RhZyhcbiAgICAgIGAke3RpY2tldC5pZH1gXG4gICAgKTtcbiAgICBpZiAoY2FuR29Ub1RhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldE1vZGVsM2RBbmRTd2VlcCh0aWNrZXQpO1xuICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQubW9kZWwzRCkge1xuICAgICAgYWxlcnQoJ0Vycm9yIHdoaWxlIGdldHRpbmcgdmlydHVhbCB2aXNpdCBtb2RlbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWZvcmNlU3dpdGNoVmlzaXQpIHtcbiAgICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgbW92aW5nIHdpdGhpbiB0aGUgc2FtZSAzRCBtb2RlbFxuICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2RlbDNEJyk7XG4gICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwgPT09IHJlc3VsdC5tb2RlbDNEKSB7XG4gICAgICAgICAvLyB3ZSBhZGQgdGFnIHRvIHRoZSB2aXNpdFxuICAgICAgICAgY29uc3QgcG9pID0gdGlja2V0LnBvaXMuaXRlbXNbMF07XG4gICAgICAgICBpZiAocG9pLmNvb3JkaW5hdGUpIHtcbiAgICAgICAgICAgLy8gd2UgZm9yY2UgYWRkIGJlY2F1c2Ugd2UgbWlnaHQgYmUgaW4gYW4gYW5vdGhlciB6b25lXG4gICAgICAgICAgIGF3YWl0IHRoaXMudmlld2VyU2VydmljZS5hY3Rpb25BZGRPYmplY3RGcm9tUE9JKHRpY2tldCwgcG9pKTtcbiAgICAgICAgICAgYXdhaXQgdGhpcy52aWV3ZXJTZXJ2aWNlLmFjdGlvbl9tb3ZlX3RvX3RhZyh0aWNrZXQuaWQpO1xuICAgICAgICAgfVxuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAvKiogU2kgb24gbmUgZm9yY2UgcGFzIGxhIHZpc2l0ZSwgb24gZGVtYW5kZSBzaSBvbiB2ZXV0IGV0cmUgc3dpdGNoICovXG4gICAgICAgICBvcGVuTW9kYWxGb3JWaXNpdFN3aXRjaChcbiAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UsXG4gICAgICAgICAgIHJlc3VsdC5tb2RlbDNELFxuICAgICAgICAgICB0aWNrZXQuc3BhY2VJRCxcbiAgICAgICAgICAge3N3ZWVwVG9Nb3ZlOiByZXN1bHQuc3dlZXAsIHJvdGF0aW9uOiByZXN1bHQucm90YXRpb259XG4gICAgICAgICApO1xuICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoqIFNpIG9uIGZvcmNlIGxlIHN3aXRjaCBkZSBsYSB2aXNpdCAqL1xuICAgICAgd2luZG93Lm9wZW4oYCR7dXJsfT9tb2RlbDNEPSR7cmVzdWx0Lm1vZGVsM0R9JnN3ZWVwPXRydWVgLCAnX2JsYW5rJyk7XG4gICAgfVxuICB9XG5cbiAgaW5pdFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmlzTXVzZXVtVXNlcikge1xuICAgICAgdGhpcy5uYXZTdWJzY3JpcHRpb24gPSB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLnpvbmVDaGFuZ2Uuc3Vic2NyaWJlKFxuICAgICAgICAoem9uZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY3VycmVudFNwYWNlSUQgPSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQ7XG4gICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XG4gICAgICAgICAgICB0aGlzLnRpY2tldFRhZ3MubmV4dChudWxsKTtcbiAgICAgICAgICAgIHRoaXMudGlja2V0c1VwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBudWxsfSk7XG4gICAgICAgICAgICB0aGlzLnRpY2tldFR5cGVGaWx0ZXIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSBpZiAoem9uZS5pZCAhPT0gdGhpcy56b25lSURGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyID0gem9uZS5pZDtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ29pbmcgdG8gaW5pdCB0aWNrZXRzIGZyb20gem9uZVwiKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFRpY2tldHMoKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5maWxldHJTdWJzY3JpcHRpb24gPSB0aGlzLmZpbHRlclNlcnZpY2Uuc3Vic2NyaWJlVG9EYXRhRmlsdGVyVXBkYXRlKFxuICAgICAgICAoZGF0ZVJhbmdlKSA9PiB7XG4gICAgICAgICAgdGhpcy5kYXRlRmlsdGVyID0gZGF0ZVJhbmdlO1xuICAgICAgICAgIHRoaXMuaW5pdFRpY2tldHMoKS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coZS5tZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmRhdGVGaWx0ZXIgPSB0aGlzLmZpbHRlclNlcnZpY2UuY3VycmVudERhdGVGaWx0ZXI7XG4gICAgICB0aGlzLnVwZGF0ZURvbmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgICAgICB0aGlzLmluaXRUaWNrZXRzKCkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1bnN1YnNjcmliZSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
|
|
1
|
+
/* eslint-disable class-methods-use-this */
|
|
2
|
+
/* eslint-disable consistent-return */
|
|
3
|
+
import { Inject, Injectable } from '@angular/core';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { openModalForVisitSwitch } from '../../helpers.service';
|
|
6
|
+
import { TicketType, TicketPriority, TicketStatus, EventStatus, EventType, PoiType, } from '../../types.service';
|
|
7
|
+
import { BaseObjectService } from './base-object.service';
|
|
8
|
+
import InformationIcon from '@iconify/icons-mdi/information-outline';
|
|
9
|
+
import AccidentIcon from '@iconify/icons-mdi/alert';
|
|
10
|
+
import WordOrderIcon from '@iconify/icons-mdi/account-hard-hat';
|
|
11
|
+
import ReportingIcon from '@iconify/icons-mdi/file-document-outline';
|
|
12
|
+
import MaintenanceIcon from '@iconify/icons-mdi/tools';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "./operation.service";
|
|
15
|
+
import * as i2 from "./event.service";
|
|
16
|
+
import * as i3 from "./affectation.service";
|
|
17
|
+
import * as i4 from "./poi.service";
|
|
18
|
+
import * as i5 from "../user.service";
|
|
19
|
+
import * as i6 from "../navigator.service";
|
|
20
|
+
import * as i7 from "../filter.service";
|
|
21
|
+
import * as i8 from "../intervention.service";
|
|
22
|
+
import * as i9 from "./navigation.service";
|
|
23
|
+
import * as i10 from "../viewer.service";
|
|
24
|
+
import * as i11 from "../zoneChange.service";
|
|
25
|
+
import * as i12 from "@ng-bootstrap/ng-bootstrap";
|
|
26
|
+
export class TicketsService extends BaseObjectService {
|
|
27
|
+
constructor(awsKinesisAnalyticsInjected, apiInjected, operationService, eventService, affectationService, poiService, userService, navigatorService, filterService, interventionService, navigationService, viewerService, zoneChangeService, modalService) {
|
|
28
|
+
super(poiService, navigationService);
|
|
29
|
+
this.operationService = operationService;
|
|
30
|
+
this.eventService = eventService;
|
|
31
|
+
this.affectationService = affectationService;
|
|
32
|
+
this.userService = userService;
|
|
33
|
+
this.navigatorService = navigatorService;
|
|
34
|
+
this.filterService = filterService;
|
|
35
|
+
this.interventionService = interventionService;
|
|
36
|
+
this.viewerService = viewerService;
|
|
37
|
+
this.zoneChangeService = zoneChangeService;
|
|
38
|
+
this.modalService = modalService;
|
|
39
|
+
this.currentTickets = {
|
|
40
|
+
zone: [],
|
|
41
|
+
space: [],
|
|
42
|
+
};
|
|
43
|
+
this.ticketTags = new Subject();
|
|
44
|
+
this.ticketsFiltered = [];
|
|
45
|
+
this.ticketsUpdated = new Subject();
|
|
46
|
+
this.reportingIcon = ReportingIcon;
|
|
47
|
+
this.maintenanceIcon = MaintenanceIcon;
|
|
48
|
+
this.workorderIcon = WordOrderIcon;
|
|
49
|
+
this.informationIcon = InformationIcon;
|
|
50
|
+
this.accidentIcon = AccidentIcon;
|
|
51
|
+
this.updateDone = new Subject();
|
|
52
|
+
this.updating = new Subject();
|
|
53
|
+
this.isMuseumUser = false;
|
|
54
|
+
this.floorsPerSpace = null;
|
|
55
|
+
this.selectedFloor = null;
|
|
56
|
+
this.destroy$ = new Subject();
|
|
57
|
+
this.awsKinesisAnalytics = awsKinesisAnalyticsInjected;
|
|
58
|
+
this.API = apiInjected;
|
|
59
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
60
|
+
this.initSubscriptions();
|
|
61
|
+
this.userService.isChanged.subscribe((isConnected) => {
|
|
62
|
+
if (isConnected) {
|
|
63
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
64
|
+
this.initSubscriptions();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (this.navSubscription) {
|
|
68
|
+
this.navSubscription.unsubscribe();
|
|
69
|
+
this.filetrSubscription.unsubscribe();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
this.zoneChangeService.floorHasChanged.subscribe((floor) => {
|
|
74
|
+
if (floor) {
|
|
75
|
+
this.selectedFloor = floor;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async initTickets() {
|
|
80
|
+
let ticketsFiltered = [];
|
|
81
|
+
if (this.currentSpaceID) {
|
|
82
|
+
this.updating.next(true);
|
|
83
|
+
await this.getTicketsBySpace(this.currentSpaceID).then((tickets) => {
|
|
84
|
+
if (tickets) {
|
|
85
|
+
ticketsFiltered = tickets;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
ticketsFiltered =
|
|
89
|
+
await this.filterService.filterTicketsForCurrentUserInSpace(ticketsFiltered, this.currentSpaceID);
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
if (this.dateFilter && this.dateFilter[0] != "Invalid Date" && this.dateFilter[1] != "Invalid Date") {
|
|
92
|
+
ticketsFiltered = this.filterService.filterObjectsForDateRange(ticketsFiltered, this.dateFilter);
|
|
93
|
+
}
|
|
94
|
+
if (this.ticketTypeFilter) {
|
|
95
|
+
ticketsFiltered = ticketsFiltered.filter((ticket) => this.ticketTypeFilter.includes(ticket.type));
|
|
96
|
+
}
|
|
97
|
+
this.currentTickets.space = ticketsFiltered;
|
|
98
|
+
if (this.zoneIDFilter) {
|
|
99
|
+
ticketsFiltered = await this.filterService.filterObjectsForZone(ticketsFiltered, this.zoneIDFilter);
|
|
100
|
+
}
|
|
101
|
+
this.currentTickets.zone = ticketsFiltered;
|
|
102
|
+
this.ticketTags.next(ticketsFiltered);
|
|
103
|
+
this.ticketsUpdated.next(this.currentTickets);
|
|
104
|
+
this.updating.next(false);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.ticketTags.next(null);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async adaptTicket(ticket) {
|
|
111
|
+
if (ticket.comments.items.length > 0) {
|
|
112
|
+
ticket.comments.items.sort((a, b) => {
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
return new Date(b.createdAt) - new Date(a.createdAt);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (ticket.events.items.length > 0) {
|
|
118
|
+
// Sort events by date
|
|
119
|
+
ticket.events.items.sort((event1, event2) => {
|
|
120
|
+
// @ts-ignore
|
|
121
|
+
return new Date(event2.createdAt) - new Date(event1.createdAt);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
ticket.prestataire = await this.interventionService.getPrestataireForTicket(ticket);
|
|
125
|
+
return ticket;
|
|
126
|
+
}
|
|
127
|
+
getPriorityColor(ticket) {
|
|
128
|
+
switch (ticket.priority) {
|
|
129
|
+
case TicketPriority.MAXIMUM:
|
|
130
|
+
return 'crimson';
|
|
131
|
+
case TicketPriority.HIGH:
|
|
132
|
+
return 'red';
|
|
133
|
+
case TicketPriority.MEDIUM:
|
|
134
|
+
return 'orange';
|
|
135
|
+
case TicketPriority.LOW:
|
|
136
|
+
return 'green';
|
|
137
|
+
case TicketPriority.MINIMUM:
|
|
138
|
+
return 'blue';
|
|
139
|
+
default:
|
|
140
|
+
return 'blue';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
getStatusColor(ticket) {
|
|
144
|
+
switch (ticket.status) {
|
|
145
|
+
case TicketStatus.TO_BE_PROCESSED:
|
|
146
|
+
return '#B0B0B1';
|
|
147
|
+
case TicketStatus.PLANNED:
|
|
148
|
+
return '#EBDF27';
|
|
149
|
+
case TicketStatus.IN_PROGRESS:
|
|
150
|
+
return '#EBDF27';
|
|
151
|
+
case TicketStatus.WAITING_FOR_VALIDATION:
|
|
152
|
+
return '#EBDF27';
|
|
153
|
+
case TicketStatus.VALIDATED:
|
|
154
|
+
return '#BCE2E5';
|
|
155
|
+
case TicketStatus.REJECTED:
|
|
156
|
+
return '#e84c35';
|
|
157
|
+
case TicketStatus.RESOLVED:
|
|
158
|
+
return '#BCE2E5';
|
|
159
|
+
case TicketStatus.ARCHIVED:
|
|
160
|
+
return '#B0B0B1';
|
|
161
|
+
case TicketStatus.LATE:
|
|
162
|
+
return '#e84c35';
|
|
163
|
+
case TicketStatus.BLOCKED:
|
|
164
|
+
return '#e84c35';
|
|
165
|
+
case TicketStatus.COMPLETED:
|
|
166
|
+
return '#388659';
|
|
167
|
+
case TicketStatus.DELAYED:
|
|
168
|
+
return '#DB7543';
|
|
169
|
+
case TicketStatus.CANCELLED:
|
|
170
|
+
return '#e84c35';
|
|
171
|
+
case TicketStatus.TO_REDO:
|
|
172
|
+
return '#DB7543';
|
|
173
|
+
case TicketStatus.CREATED:
|
|
174
|
+
return '#B0B0B1';
|
|
175
|
+
default:
|
|
176
|
+
return '#BCE2E5';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
getTicketPriorityNumber(t) {
|
|
180
|
+
return t.priority === TicketPriority.MINIMUM
|
|
181
|
+
? -1
|
|
182
|
+
: t.priority === TicketPriority.LOW
|
|
183
|
+
? 0
|
|
184
|
+
: t.priority === TicketPriority.MEDIUM
|
|
185
|
+
? 1
|
|
186
|
+
: t.priority === TicketPriority.HIGH
|
|
187
|
+
? 2
|
|
188
|
+
: t.priority === TicketPriority.MAXIMUM
|
|
189
|
+
? 3
|
|
190
|
+
: -1;
|
|
191
|
+
}
|
|
192
|
+
getTicketIcon(type) {
|
|
193
|
+
// const typeIcon : TicketType = ticket.type;
|
|
194
|
+
switch (type) {
|
|
195
|
+
case TicketType.REPORTING:
|
|
196
|
+
return this.reportingIcon;
|
|
197
|
+
case TicketType.REQUEST_FOR_INTERVENTION:
|
|
198
|
+
return this.maintenanceIcon;
|
|
199
|
+
case TicketType.REQUEST_FOR_MAINTENANCE:
|
|
200
|
+
return this.maintenanceIcon;
|
|
201
|
+
case TicketType.WORK_ORDER:
|
|
202
|
+
return this.workorderIcon;
|
|
203
|
+
case TicketType.INCIDENT:
|
|
204
|
+
return this.accidentIcon;
|
|
205
|
+
case TicketType.INFORMATION:
|
|
206
|
+
return this.informationIcon;
|
|
207
|
+
default:
|
|
208
|
+
return this.maintenanceIcon;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async addEventToTicket(ticket, event) {
|
|
212
|
+
const currentMission = this.userService.currentMission(ticket.spaceID);
|
|
213
|
+
event.group = event.group ? event.group : 'default';
|
|
214
|
+
event.ticketID = event.ticketID ? event.ticketID : ticket.id;
|
|
215
|
+
event.status = event.status ? event.status : EventStatus.CREATED;
|
|
216
|
+
event.type = event.type ? event.type : EventType.TICKET;
|
|
217
|
+
event.ownerID = event.ownerID ? event.ownerID : currentMission.id;
|
|
218
|
+
try {
|
|
219
|
+
const receivedEvent = await this.eventService.createEvent(event);
|
|
220
|
+
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
221
|
+
this.awsKinesisAnalytics.getInstance().record(
|
|
222
|
+
// @ts-ignore
|
|
223
|
+
{
|
|
224
|
+
data: {
|
|
225
|
+
eventType: 'Ticket Change',
|
|
226
|
+
ticketId: event.ticketID,
|
|
227
|
+
ticket: ticket,
|
|
228
|
+
status: event.status,
|
|
229
|
+
event: event,
|
|
230
|
+
user: this.userService.cu,
|
|
231
|
+
locationId: this.currentSpaceID,
|
|
232
|
+
timestamp: new Date(),
|
|
233
|
+
zoneId: this.zoneIDFilter,
|
|
234
|
+
floorId: this.selectedFloor?.id,
|
|
235
|
+
},
|
|
236
|
+
streamName: 'smarterplanKinesis-analytics',
|
|
237
|
+
// partitionKey: "",
|
|
238
|
+
}, 'AWSKinesis');
|
|
239
|
+
}
|
|
240
|
+
// console.log('Event successfully created !');
|
|
241
|
+
return receivedEvent;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async addTicket(ticket) {
|
|
248
|
+
ticket.status = TicketStatus.CREATED;
|
|
249
|
+
if (!ticket.ownerMissionID) {
|
|
250
|
+
ticket.ownerMissionID = this.userService.currentMission(ticket.spaceID).id;
|
|
251
|
+
}
|
|
252
|
+
// TODO!!! filter missions by space of ticket
|
|
253
|
+
try {
|
|
254
|
+
const receivedTicket = await this.createTicket(ticket);
|
|
255
|
+
// console.log('!!! Response from creating ticket :');
|
|
256
|
+
// console.log(receivedTicket);
|
|
257
|
+
this.addEventToTicket(receivedTicket, {
|
|
258
|
+
title: 'Création du ticket',
|
|
259
|
+
description: `Ticket créé par -`,
|
|
260
|
+
translationPath: 'ticketEvent.ticket.created',
|
|
261
|
+
});
|
|
262
|
+
this.updateDone.next(true);
|
|
263
|
+
return receivedTicket; // instead of true
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
console.log('Ticket creation FAILED');
|
|
267
|
+
console.log(JSON.stringify(error));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
async updateTicketWithEvent(ticket, event) {
|
|
271
|
+
const receivedTicket = await this.updateTicket(ticket);
|
|
272
|
+
if (receivedTicket) {
|
|
273
|
+
console.log('Updated ticket :');
|
|
274
|
+
console.log(receivedTicket);
|
|
275
|
+
if (event) {
|
|
276
|
+
await this.addEventToTicket(receivedTicket, event);
|
|
277
|
+
}
|
|
278
|
+
this.updateDone.next(true);
|
|
279
|
+
}
|
|
280
|
+
return receivedTicket;
|
|
281
|
+
}
|
|
282
|
+
async removeAssigneeFromTicket(ticket, assignee) {
|
|
283
|
+
try {
|
|
284
|
+
const affectation = await this.affectationService.softDeleteAffectationByID(assignee.id);
|
|
285
|
+
if (!affectation) {
|
|
286
|
+
console.warn(`removeAssigneeFromTicket(${ticket.id}, ${assignee.id}) failed`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
console.error(error);
|
|
291
|
+
}
|
|
292
|
+
return ticket;
|
|
293
|
+
}
|
|
294
|
+
async updateTicketLocation(ticket, tagData) {
|
|
295
|
+
const poiInput = {
|
|
296
|
+
coordinate: tagData.getCoordinateString(),
|
|
297
|
+
type: PoiType.TICKET,
|
|
298
|
+
elementID: ticket.id,
|
|
299
|
+
metadata: tagData.getMetadataString(),
|
|
300
|
+
matterportSweepID: tagData.getSweepID(),
|
|
301
|
+
};
|
|
302
|
+
const poi = await this.poiService.createPOIForSpaceID(poiInput);
|
|
303
|
+
await this.addEventToTicket(ticket, {
|
|
304
|
+
title: 'Changement position du ticket',
|
|
305
|
+
description: "Le point d'intérêt du ticket a été modifié",
|
|
306
|
+
status: EventStatus.POSITION_SET,
|
|
307
|
+
translationPath: 'ticketEvent.position.set',
|
|
308
|
+
});
|
|
309
|
+
return poi;
|
|
310
|
+
}
|
|
311
|
+
async updateStatusOfTicket(ticket, status) {
|
|
312
|
+
const currentStatus = ticket.status;
|
|
313
|
+
const oldTicketStatus = ticket.status;
|
|
314
|
+
ticket.status = status;
|
|
315
|
+
if (currentStatus === status) {
|
|
316
|
+
return ticket;
|
|
317
|
+
}
|
|
318
|
+
console.log('Updating status');
|
|
319
|
+
return this.updateTicket({
|
|
320
|
+
id: ticket.id,
|
|
321
|
+
status,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
async updateTypeOfTicket(ticket, type) {
|
|
325
|
+
const previousType = ticket.type;
|
|
326
|
+
ticket.type = type;
|
|
327
|
+
await this.updateTicketWithEvent({ id: ticket.id, type: ticket.type }, {
|
|
328
|
+
title: 'Type changé',
|
|
329
|
+
description: `Changement de ${previousType} vers ${ticket.type}`,
|
|
330
|
+
metadata: JSON.stringify({ type: ticket.type }),
|
|
331
|
+
translationPath: 'ticketEvent.ticket.type',
|
|
332
|
+
});
|
|
333
|
+
return ticket;
|
|
334
|
+
}
|
|
335
|
+
async getTicketsForUserForSpace(spaceID) {
|
|
336
|
+
const ticketsSpace = await this.getTicketsBySpace(spaceID);
|
|
337
|
+
return this.filterService.filterTicketsForCurrentUserInSpace(ticketsSpace, spaceID);
|
|
338
|
+
}
|
|
339
|
+
/** Basic CRUD operations */
|
|
340
|
+
async readTicket(id) {
|
|
341
|
+
return this.API.__proto__.GetTicket(id);
|
|
342
|
+
}
|
|
343
|
+
async createTicket(input) {
|
|
344
|
+
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
345
|
+
this.awsKinesisAnalytics.getInstance().record(
|
|
346
|
+
// @ts-ignore
|
|
347
|
+
{
|
|
348
|
+
data: {
|
|
349
|
+
eventType: 'Object Creation',
|
|
350
|
+
objectType: 'ticket',
|
|
351
|
+
//zoneId: input.spaceID, // TODO: check if spaceId == zoneId
|
|
352
|
+
domain: input.domain,
|
|
353
|
+
user: this.userService.cu,
|
|
354
|
+
locationId: this.currentSpaceID,
|
|
355
|
+
timestamp: new Date(),
|
|
356
|
+
zoneId: this.zoneIDFilter,
|
|
357
|
+
floorId: this.selectedFloor?.id,
|
|
358
|
+
},
|
|
359
|
+
streamName: 'smarterplanKinesis-analytics',
|
|
360
|
+
// partitionKey: "",
|
|
361
|
+
}, 'AWSKinesis');
|
|
362
|
+
}
|
|
363
|
+
return this.API.__proto__.CreateTicket(input);
|
|
364
|
+
}
|
|
365
|
+
async updateTicket(input) {
|
|
366
|
+
return this.API.__proto__.UpdateTicket(input);
|
|
367
|
+
}
|
|
368
|
+
async deleteTicket(ticket) {
|
|
369
|
+
const deleted = await this.API.__proto__.DeleteTicket({ id: ticket.id });
|
|
370
|
+
// delete POI
|
|
371
|
+
const poi = await this.poiService.getPoiByElementId(ticket.id);
|
|
372
|
+
if (poi) {
|
|
373
|
+
this.poiService.deletePoi(poi.id);
|
|
374
|
+
}
|
|
375
|
+
// clean parentID
|
|
376
|
+
if (ticket.children.items.length > 0) {
|
|
377
|
+
ticket.children.items.map(async (childTicket) => {
|
|
378
|
+
try {
|
|
379
|
+
await this.API.__proto__.UpdateTicket({
|
|
380
|
+
id: childTicket.id,
|
|
381
|
+
parentID: null,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
console.warn('Could not update ticket', childTicket.id);
|
|
386
|
+
}
|
|
387
|
+
await this.API.__proto__.CreateEvent({
|
|
388
|
+
title: 'Ticket parent supprimé',
|
|
389
|
+
ticketID: childTicket.id,
|
|
390
|
+
description: `Ticket \"$ticket.title}\" a été supprimé`,
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
// delete events
|
|
395
|
+
await Promise.all(ticket.events.items.map(async (event_) => {
|
|
396
|
+
await this.API.__proto__.DeleteEvent({ id: event_.id });
|
|
397
|
+
}));
|
|
398
|
+
// delete affectationns
|
|
399
|
+
if (ticket.assignees.items.length > 0) {
|
|
400
|
+
for (const element of ticket.assignees.items) {
|
|
401
|
+
this.API.__proto__.DeleteAffectation({ id: element.id });
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// delete comments
|
|
405
|
+
await Promise.all(ticket.comments.items.map(async (comment) => {
|
|
406
|
+
await this.API.__proto__.DeleteComment({ id: comment.id });
|
|
407
|
+
}));
|
|
408
|
+
await this.operationService.deleteOperationsForTicket(ticket.id);
|
|
409
|
+
return deleted;
|
|
410
|
+
}
|
|
411
|
+
/** Custom requests */
|
|
412
|
+
async getTicketsBySpace(spaceID) {
|
|
413
|
+
return this.API.__proto__
|
|
414
|
+
.TicketsBySpace(spaceID)
|
|
415
|
+
.then((tickets) => tickets.items);
|
|
416
|
+
}
|
|
417
|
+
async updateIconForAllTicketsInSpace(tagIcon, spaceID) {
|
|
418
|
+
const tickets = await this.getTicketsBySpace(spaceID);
|
|
419
|
+
const pois = await this.updateIconForAllObjects(tickets, tagIcon);
|
|
420
|
+
return { tickets, pois };
|
|
421
|
+
}
|
|
422
|
+
/** Archive related */
|
|
423
|
+
/** Return true if the current user has archived this ticket */
|
|
424
|
+
isArchived(ticket) {
|
|
425
|
+
return ticket.archivedForMissionID
|
|
426
|
+
? ticket.archivedForMissionID.includes(this.userService.currentMission(ticket.spaceID).id)
|
|
427
|
+
: false;
|
|
428
|
+
}
|
|
429
|
+
setArchived(ticket, archived) {
|
|
430
|
+
let archivedList = ticket.archivedForMissionID
|
|
431
|
+
? ticket.archivedForMissionID
|
|
432
|
+
: [];
|
|
433
|
+
const missionID = this.userService.currentMission(ticket.spaceID).id;
|
|
434
|
+
archivedList = archivedList.filter((m) => m !== missionID);
|
|
435
|
+
if (archived) {
|
|
436
|
+
archivedList.push(missionID);
|
|
437
|
+
}
|
|
438
|
+
return this.updateTicketWithEvent({
|
|
439
|
+
id: ticket.id,
|
|
440
|
+
archivedForMissionID: archivedList,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
async navigateToTicketIn3D(ticket, forceSwitchVisit = false) {
|
|
444
|
+
let url = `visit/${ticket.spaceID}`;
|
|
445
|
+
if (forceSwitchVisit) {
|
|
446
|
+
url += `/detail/${ticket.id}`;
|
|
447
|
+
}
|
|
448
|
+
const canGoToTag = await this.viewerService.action_move_to_tag(`${ticket.id}`);
|
|
449
|
+
if (canGoToTag) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
const result = await this.getModel3dAndSweep(ticket);
|
|
453
|
+
if (!result || !result.model3D) {
|
|
454
|
+
alert('Error while getting virtual visit model');
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
if (!forceSwitchVisit) {
|
|
458
|
+
// check if we are moving within the same 3D model
|
|
459
|
+
const currentModel = localStorage.getItem('model3D');
|
|
460
|
+
if (currentModel && currentModel === result.model3D) {
|
|
461
|
+
// we add tag to the visit
|
|
462
|
+
const poi = ticket.pois.items[0];
|
|
463
|
+
if (poi.coordinate) {
|
|
464
|
+
// we force add because we might be in an another zone
|
|
465
|
+
await this.viewerService.actionAddObjectFromPOI(ticket, poi);
|
|
466
|
+
await this.viewerService.action_move_to_tag(ticket.id);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
/** Si on ne force pas la visite, on demande si on veut etre switch */
|
|
471
|
+
openModalForVisitSwitch(this.modalService, result.model3D, ticket.spaceID, { sweepToMove: result.sweep, rotation: result.rotation });
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
/** Si on force le switch de la visit */
|
|
476
|
+
window.open(`${url}?model3D=${result.model3D}&sweep=true`, '_blank');
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
initSubscriptions() {
|
|
480
|
+
if (!this.isMuseumUser) {
|
|
481
|
+
this.navSubscription = this.zoneChangeService.zoneChange.subscribe((zone) => {
|
|
482
|
+
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
483
|
+
if (!this.currentSpaceID) {
|
|
484
|
+
this.ticketTags.next(null);
|
|
485
|
+
this.ticketsUpdated.next({ space: [], zone: null });
|
|
486
|
+
this.ticketTypeFilter = null;
|
|
487
|
+
this.zoneIDFilter = null;
|
|
488
|
+
}
|
|
489
|
+
else if (zone.id !== this.zoneIDFilter) {
|
|
490
|
+
this.zoneIDFilter = zone.id;
|
|
491
|
+
// console.log("going to init tickets from zone");
|
|
492
|
+
this.initTickets().catch((e) => console.log(e.message));
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
this.filetrSubscription = this.filterService.subscribeToDataFilterUpdate((dateRange) => {
|
|
496
|
+
this.dateFilter = dateRange;
|
|
497
|
+
this.initTickets().catch((e) => console.log(e.message));
|
|
498
|
+
});
|
|
499
|
+
this.dateFilter = this.filterService.currentDateFilter;
|
|
500
|
+
this.updateDone.subscribe(() => {
|
|
501
|
+
if (this.currentSpaceID) {
|
|
502
|
+
this.initTickets().catch((e) => console.log(e.message));
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
unsubscribe() {
|
|
508
|
+
this.destroy$.next(true);
|
|
509
|
+
this.destroy$.complete();
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
TicketsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, deps: [{ token: 'currentAwsKinesisAnalyticsService' }, { token: 'currentAPIService' }, { token: i1.OperationService }, { token: i2.EventService }, { token: i3.AffectationService }, { token: i4.PoiService }, { token: i5.BaseUserService }, { token: i6.NavigatorService }, { token: i7.FilterService }, { token: i8.InterventionService }, { token: i9.NavigationService }, { token: i10.ViewerService }, { token: i11.ZoneChangeService }, { token: i12.NgbModal }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
513
|
+
TicketsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, providedIn: 'root' });
|
|
514
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, decorators: [{
|
|
515
|
+
type: Injectable,
|
|
516
|
+
args: [{
|
|
517
|
+
providedIn: 'root',
|
|
518
|
+
}]
|
|
519
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
520
|
+
type: Inject,
|
|
521
|
+
args: ['currentAwsKinesisAnalyticsService']
|
|
522
|
+
}] }, { type: undefined, decorators: [{
|
|
523
|
+
type: Inject,
|
|
524
|
+
args: ['currentAPIService']
|
|
525
|
+
}] }, { type: i1.OperationService }, { type: i2.EventService }, { type: i3.AffectationService }, { type: i4.PoiService }, { type: i5.BaseUserService }, { type: i6.NavigatorService }, { type: i7.FilterService }, { type: i8.InterventionService }, { type: i9.NavigationService }, { type: i10.ViewerService }, { type: i11.ZoneChangeService }, { type: i12.NgbModal }]; } });
|
|
526
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21vZGVscy90aWNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0Msc0NBQXNDO0FBQ3RDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxPQUFPLEVBQTBCLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBQyx1QkFBdUIsRUFBWSxNQUFNLHVCQUF1QixDQUFDO0FBRXpFLE9BQU8sRUFHTCxVQUFVLEVBQ1YsY0FBYyxFQUNkLFlBQVksRUFDWixXQUFXLEVBQ1gsU0FBUyxFQUdULE9BQU8sR0FHUixNQUFNLHFCQUFxQixDQUFDO0FBSzdCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXhELE9BQU8sZUFBZSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sYUFBYSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sYUFBYSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3JFLE9BQU8sZUFBZSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVN2RCxNQUFNLE9BQU8sY0FBZSxTQUFRLGlCQUFpQjtJQW9EbkQsWUFFSSwyQkFBZ0MsRUFDTCxXQUFnQixFQUNyQyxnQkFBa0MsRUFDbEMsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQzlDLFVBQXNCLEVBQ2QsV0FBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUNoRCxpQkFBb0MsRUFDNUIsYUFBNEIsRUFDNUIsaUJBQW9DLEVBQ3BDLFlBQXNCO1FBRTlCLEtBQUssQ0FBQyxVQUFVLEVBQUUs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QUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FDdEUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQ0YsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDekQ7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OzJHQW5tQlUsY0FBYyxrQkFxRGYsbUNBQW1DLGFBRW5DLG1CQUFtQjsrR0F2RGxCLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFzREksTUFBTTsyQkFBQyxtQ0FBbUM7OzBCQUUxQyxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cclxuLyogZXNsaW50LWRpc2FibGUgY29uc2lzdGVudC1yZXR1cm4gKi9cclxuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05nYk1vZGFsfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWx9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge29wZW5Nb2RhbEZvclZpc2l0U3dpdGNoLCB3YWl0VW50aWx9IGZyb20gJy4uLy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7TWF0dGVydGFnRGF0YX0gZnJvbSAnLi4vLi4vbWF0dGVydGFnRGF0YSc7XHJcbmltcG9ydCB7XHJcbiAgRXZlbnQsXHJcbiAgVGlja2V0LFxyXG4gIFRpY2tldFR5cGUsXHJcbiAgVGlja2V0UHJpb3JpdHksXHJcbiAgVGlja2V0U3RhdHVzLFxyXG4gIEV2ZW50U3RhdHVzLFxyXG4gIEV2ZW50VHlwZSxcclxuICBBZmZlY3RhdGlvbixcclxuICBQT0ksXHJcbiAgUG9pVHlwZSxcclxuICBJVXBkYXRlLFxyXG4gIFpvbmUsXHJcbn0gZnJvbSAnLi4vLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7RmlsdGVyU2VydmljZX0gZnJvbSAnLi4vZmlsdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge05hdmlnYXRvclNlcnZpY2V9IGZyb20gJy4uL25hdmlnYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtCYXNlVXNlclNlcnZpY2V9IGZyb20gJy4uL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7Vmlld2VyU2VydmljZX0gZnJvbSAnLi4vdmlld2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Jhc2VPYmplY3RTZXJ2aWNlfSBmcm9tICcuL2Jhc2Utb2JqZWN0LnNlcnZpY2UnO1xyXG5pbXBvcnQge05hdmlnYXRpb25TZXJ2aWNlfSBmcm9tICcuL25hdmlnYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7T3BlcmF0aW9uU2VydmljZX0gZnJvbSAnLi9vcGVyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7UG9pU2VydmljZX0gZnJvbSAnLi9wb2kuc2VydmljZSc7XHJcbmltcG9ydCBJbmZvcm1hdGlvbkljb24gZnJvbSAnQGljb25pZnkvaWNvbnMtbWRpL2luZm9ybWF0aW9uLW91dGxpbmUnO1xyXG5pbXBvcnQgQWNjaWRlbnRJY29uIGZyb20gJ0BpY29uaWZ5L2ljb25zLW1kaS9hbGVydCc7XHJcbmltcG9ydCBXb3JkT3JkZXJJY29uIGZyb20gJ0BpY29uaWZ5L2ljb25zLW1kaS9hY2NvdW50LWhhcmQtaGF0JztcclxuaW1wb3J0IFJlcG9ydGluZ0ljb24gZnJvbSAnQGljb25pZnkvaWNvbnMtbWRpL2ZpbGUtZG9jdW1lbnQtb3V0bGluZSc7XHJcbmltcG9ydCBNYWludGVuYW5jZUljb24gZnJvbSAnQGljb25pZnkvaWNvbnMtbWRpL3Rvb2xzJztcclxuaW1wb3J0IHtFdmVudFNlcnZpY2V9IGZyb20gJy4vZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SW50ZXJ2ZW50aW9uU2VydmljZX0gZnJvbSAnLi4vaW50ZXJ2ZW50aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FmZmVjdGF0aW9uU2VydmljZX0gZnJvbSAnLi9hZmZlY3RhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtab25lQ2hhbmdlU2VydmljZX0gZnJvbSBcIi4uL3pvbmVDaGFuZ2Uuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpY2tldHNTZXJ2aWNlIGV4dGVuZHMgQmFzZU9iamVjdFNlcnZpY2Uge1xyXG4gIGN1cnJlbnRUaWNrZXRzOiB7IHpvbmU6IFRpY2tldFtdOyBzcGFjZTogVGlja2V0W10gfSA9IHtcclxuICAgIHpvbmU6IFtdLFxyXG4gICAgc3BhY2U6IFtdLFxyXG4gIH07XHJcblxyXG4gIHRpY2tldFRhZ3M6IFN1YmplY3Q8VGlja2V0W10+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgdGlja2V0c0ZpbHRlcmVkOiBUaWNrZXRbXSA9IFtdO1xyXG5cclxuICB0aWNrZXRzVXBkYXRlZDogU3ViamVjdDx7XHJcbiAgICB6b25lOiBUaWNrZXRbXTtcclxuICAgIHNwYWNlOiBUaWNrZXRbXTtcclxuICB9PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gIHpvbmVJREZpbHRlcjogc3RyaW5nO1xyXG5cclxuICBkYXRlRmlsdGVyOiBEYXRlW107XHJcblxyXG4gIHRpY2tldFR5cGVGaWx0ZXI6IFRpY2tldFR5cGVbXTtcclxuXHJcbiAgcmVwb3J0aW5nSWNvbiA9IFJlcG9ydGluZ0ljb247XHJcblxyXG4gIG1haW50ZW5hbmNlSWNvbiA9IE1haW50ZW5hbmNlSWNvbjtcclxuXHJcbiAgd29ya29yZGVySWNvbiA9IFdvcmRPcmRlckljb247XHJcblxyXG4gIGluZm9ybWF0aW9uSWNvbiA9IEluZm9ybWF0aW9uSWNvbjtcclxuXHJcbiAgYWNjaWRlbnRJY29uID0gQWNjaWRlbnRJY29uO1xyXG5cclxuICB1cGRhdGVEb25lOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgdXBkYXRpbmc6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBBUEk6IGFueTtcclxuICBhd3NLaW5lc2lzQW5hbHl0aWNzOiBhbnk7IC8vQVdTXHJcblxyXG4gIGlzTXVzZXVtVXNlciA9IGZhbHNlO1xyXG5cclxuICBuYXZTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgZmlsZXRyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGZsb29yc1BlclNwYWNlOiBab25lW10gPSBudWxsO1xyXG5cclxuICBzZWxlY3RlZEZsb29yOiBab25lID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnY3VycmVudEF3c0tpbmVzaXNBbmFseXRpY3NTZXJ2aWNlJylcclxuICAgICAgYXdzS2luZXNpc0FuYWx5dGljc0luamVjdGVkOiBhbnksXHJcbiAgICBASW5qZWN0KCdjdXJyZW50QVBJU2VydmljZScpIGFwaUluamVjdGVkOiBhbnksXHJcbiAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhZmZlY3RhdGlvblNlcnZpY2U6IEFmZmVjdGF0aW9uU2VydmljZSxcclxuICAgIHBvaVNlcnZpY2U6IFBvaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5hdmlnYXRvclNlcnZpY2U6IE5hdmlnYXRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGludGVydmVudGlvblNlcnZpY2U6IEludGVydmVudGlvblNlcnZpY2UsXHJcbiAgICBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpvbmVDaGFuZ2VTZXJ2aWNlOiBab25lQ2hhbmdlU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxyXG4gICkge1xyXG4gICAgc3VwZXIocG9pU2VydmljZSwgbmF2aWdhdGlvblNlcnZpY2UpO1xyXG4gICAgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzID0gYXdzS2luZXNpc0FuYWx5dGljc0luamVjdGVkO1xyXG4gICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcclxuICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xyXG4gICAgdGhpcy5pbml0U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xyXG4gICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTtcclxuICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF2U3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLm5hdlN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgdGhpcy5maWxldHJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuem9uZUNoYW5nZVNlcnZpY2UuZmxvb3JIYXNDaGFuZ2VkLnN1YnNjcmliZSgoZmxvb3IpID0+IHtcclxuICAgICAgaWYgKGZsb29yKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gZmxvb3I7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdFRpY2tldHMoKSB7XHJcbiAgICBsZXQgdGlja2V0c0ZpbHRlcmVkID0gW107XHJcbiAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICB0aGlzLnVwZGF0aW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VGlja2V0c0J5U3BhY2UodGhpcy5jdXJyZW50U3BhY2VJRCkudGhlbigodGlja2V0cykgPT4ge1xyXG4gICAgICAgIGlmICh0aWNrZXRzKSB7XHJcbiAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQgPSB0aWNrZXRzO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRpY2tldHNGaWx0ZXJlZCA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlclRpY2tldHNGb3JDdXJyZW50VXNlckluU3BhY2UoXHJcbiAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQsXHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZUlEXHJcbiAgICAgICAgKTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAodGhpcy5kYXRlRmlsdGVyICYmIHRoaXMuZGF0ZUZpbHRlclswXSAhPSBcIkludmFsaWQgRGF0ZVwiICYmIHRoaXMuZGF0ZUZpbHRlclsxXSAhPSBcIkludmFsaWQgRGF0ZVwiKSB7XHJcbiAgICAgICAgdGlja2V0c0ZpbHRlcmVkID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3JEYXRlUmFuZ2UoXHJcbiAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQsXHJcbiAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRpY2tldFR5cGVGaWx0ZXIpIHtcclxuICAgICAgICB0aWNrZXRzRmlsdGVyZWQgPSB0aWNrZXRzRmlsdGVyZWQuZmlsdGVyKCh0aWNrZXQpID0+XHJcbiAgICAgICAgICB0aGlzLnRpY2tldFR5cGVGaWx0ZXIuaW5jbHVkZXModGlja2V0LnR5cGUpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1cnJlbnRUaWNrZXRzLnNwYWNlID0gdGlja2V0c0ZpbHRlcmVkO1xyXG5cclxuICAgICAgaWYgKHRoaXMuem9uZUlERmlsdGVyKSB7XHJcbiAgICAgICAgdGlja2V0c0ZpbHRlcmVkID0gYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxyXG4gICAgICAgICAgdGlja2V0c0ZpbHRlcmVkLFxyXG4gICAgICAgICAgdGhpcy56b25lSURGaWx0ZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VycmVudFRpY2tldHMuem9uZSA9IHRpY2tldHNGaWx0ZXJlZDtcclxuICAgICAgdGhpcy50aWNrZXRUYWdzLm5leHQodGlja2V0c0ZpbHRlcmVkKTtcclxuICAgICAgdGhpcy50aWNrZXRzVXBkYXRlZC5uZXh0KHRoaXMuY3VycmVudFRpY2tldHMpO1xyXG4gICAgICB0aGlzLnVwZGF0aW5nLm5leHQoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50aWNrZXRUYWdzLm5leHQobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGFwdFRpY2tldCh0aWNrZXQ6IFRpY2tldCk6IFByb21pc2U8VGlja2V0PiB7XHJcbiAgICBpZiAodGlja2V0LmNvbW1lbnRzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGlja2V0LmNvbW1lbnRzLml0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGIuY3JlYXRlZEF0KSAtIG5ldyBEYXRlKGEuY3JlYXRlZEF0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRpY2tldC5ldmVudHMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBTb3J0IGV2ZW50cyBieSBkYXRlXHJcbiAgICAgIHRpY2tldC5ldmVudHMuaXRlbXMuc29ydCgoZXZlbnQxLCBldmVudDIpID0+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGV2ZW50Mi5jcmVhdGVkQXQpIC0gbmV3IERhdGUoZXZlbnQxLmNyZWF0ZWRBdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGlja2V0LnByZXN0YXRhaXJlID0gYXdhaXQgdGhpcy5pbnRlcnZlbnRpb25TZXJ2aWNlLmdldFByZXN0YXRhaXJlRm9yVGlja2V0KFxyXG4gICAgICB0aWNrZXRcclxuICAgICk7XHJcbiAgICByZXR1cm4gdGlja2V0O1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJpb3JpdHlDb2xvcih0aWNrZXQ6IFRpY2tldCk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRpY2tldC5wcmlvcml0eSkge1xyXG4gICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1BWElNVU06XHJcbiAgICAgICAgcmV0dXJuICdjcmltc29uJztcclxuICAgICAgY2FzZSBUaWNrZXRQcmlvcml0eS5ISUdIOlxyXG4gICAgICAgIHJldHVybiAncmVkJztcclxuICAgICAgY2FzZSBUaWNrZXRQcmlvcml0eS5NRURJVU06XHJcbiAgICAgICAgcmV0dXJuICdvcmFuZ2UnO1xyXG4gICAgICBjYXNlIFRpY2tldFByaW9yaXR5LkxPVzpcclxuICAgICAgICByZXR1cm4gJ2dyZWVuJztcclxuICAgICAgY2FzZSBUaWNrZXRQcmlvcml0eS5NSU5JTVVNOlxyXG4gICAgICAgIHJldHVybiAnYmx1ZSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdibHVlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFN0YXR1c0NvbG9yKHRpY2tldDogVGlja2V0KTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodGlja2V0LnN0YXR1cykge1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5UT19CRV9QUk9DRVNTRUQ6XHJcbiAgICAgICAgcmV0dXJuICcjQjBCMEIxJztcclxuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuUExBTk5FRDpcclxuICAgICAgICByZXR1cm4gJyNFQkRGMjcnO1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5JTl9QUk9HUkVTUzpcclxuICAgICAgICByZXR1cm4gJyNFQkRGMjcnO1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5XQUlUSU5HX0ZPUl9WQUxJREFUSU9OOlxyXG4gICAgICAgIHJldHVybiAnI0VCREYyNyc7XHJcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlZBTElEQVRFRDpcclxuICAgICAgICByZXR1cm4gJyNCQ0UyRTUnO1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5SRUpFQ1RFRDpcclxuICAgICAgICByZXR1cm4gJyNlODRjMzUnO1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5SRVNPTFZFRDpcclxuICAgICAgICByZXR1cm4gJyNCQ0UyRTUnO1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5BUkNISVZFRDpcclxuICAgICAgICByZXR1cm4gJyNCMEIwQjEnO1xyXG4gICAgICBjYXNlIFRpY2tldFN0YXR1cy5MQVRFOlxyXG4gICAgICAgIHJldHVybiAnI2U4NGMzNSc7XHJcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkJMT0NLRUQ6XHJcbiAgICAgICAgcmV0dXJuICcjZTg0YzM1JztcclxuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQ09NUExFVEVEOlxyXG4gICAgICAgIHJldHVybiAnIzM4ODY1OSc7XHJcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkRFTEFZRUQ6XHJcbiAgICAgICAgcmV0dXJuICcjREI3NTQzJztcclxuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQ0FOQ0VMTEVEOlxyXG4gICAgICAgIHJldHVybiAnI2U4NGMzNSc7XHJcbiAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlRPX1JFRE86XHJcbiAgICAgICAgcmV0dXJuICcjREI3NTQzJztcclxuICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQ1JFQVRFRDpcclxuICAgICAgICByZXR1cm4gJyNCMEIwQjEnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnI0JDRTJFNSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUaWNrZXRQcmlvcml0eU51bWJlcih0KTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0LnByaW9yaXR5ID09PSBUaWNrZXRQcmlvcml0eS5NSU5JTVVNXHJcbiAgICAgID8gLTFcclxuICAgICAgOiB0LnByaW9yaXR5ID09PSBUaWNrZXRQcmlvcml0eS5MT1dcclxuICAgICAgICA/IDBcclxuICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1FRElVTVxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5LkhJR0hcclxuICAgICAgICAgICAgPyAyXHJcbiAgICAgICAgICAgIDogdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuTUFYSU1VTVxyXG4gICAgICAgICAgICAgID8gM1xyXG4gICAgICAgICAgICAgIDogLTE7XHJcbiAgfVxyXG5cclxuICBnZXRUaWNrZXRJY29uKHR5cGU6IFRpY2tldFR5cGUpOiBhbnkge1xyXG4gICAgLy8gY29uc3QgdHlwZUljb24gOiBUaWNrZXRUeXBlID0gdGlja2V0LnR5cGU7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBUaWNrZXRUeXBlLlJFUE9SVElORzpcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRpbmdJY29uO1xyXG4gICAgICBjYXNlIFRpY2tldFR5cGUuUkVRVUVTVF9GT1JfSU5URVJWRU5USU9OOlxyXG4gICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcclxuICAgICAgY2FzZSBUaWNrZXRUeXBlLlJFUVVFU1RfRk9SX01BSU5URU5BTkNFOlxyXG4gICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcclxuICAgICAgY2FzZSBUaWNrZXRUeXBlLldPUktfT1JERVI6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ya29yZGVySWNvbjtcclxuICAgICAgY2FzZSBUaWNrZXRUeXBlLklOQ0lERU5UOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjY2lkZW50SWNvbjtcclxuICAgICAgY2FzZSBUaWNrZXRUeXBlLklORk9STUFUSU9OOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmluZm9ybWF0aW9uSWNvbjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdGhpcy5tYWludGVuYW5jZUljb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRFdmVudFRvVGlja2V0KHRpY2tldDogVGlja2V0LCBldmVudDogRXZlbnQpOiBQcm9taXNlPEV2ZW50PiB7XHJcbiAgICBjb25zdCBjdXJyZW50TWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGlja2V0LnNwYWNlSUQpO1xyXG4gICAgZXZlbnQuZ3JvdXAgPSBldmVudC5ncm91cCA/IGV2ZW50Lmdyb3VwIDogJ2RlZmF1bHQnO1xyXG4gICAgZXZlbnQudGlja2V0SUQgPSBldmVudC50aWNrZXRJRCA/IGV2ZW50LnRpY2tldElEIDogdGlja2V0LmlkO1xyXG4gICAgZXZlbnQuc3RhdHVzID0gZXZlbnQuc3RhdHVzID8gZXZlbnQuc3RhdHVzIDogRXZlbnRTdGF0dXMuQ1JFQVRFRDtcclxuICAgIGV2ZW50LnR5cGUgPSBldmVudC50eXBlID8gZXZlbnQudHlwZSA6IEV2ZW50VHlwZS5USUNLRVQ7XHJcbiAgICBldmVudC5vd25lcklEID0gZXZlbnQub3duZXJJRCA/IGV2ZW50Lm93bmVySUQgOiBjdXJyZW50TWlzc2lvbi5pZDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlY2VpdmVkRXZlbnQgPSBhd2FpdCB0aGlzLmV2ZW50U2VydmljZS5jcmVhdGVFdmVudChldmVudCk7XHJcbiAgICAgIGlmICghIXRoaXMuYXdzS2luZXNpc0FuYWx5dGljcyAmJiAhIXRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5yZWNvcmQgJiYgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLnJlY29yZCgpKSB7XHJcbiAgICAgICAgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLmdldEluc3RhbmNlKCkucmVjb3JkKFxyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnVGlja2V0IENoYW5nZScsXHJcbiAgICAgICAgICAgICAgdGlja2V0SWQ6IGV2ZW50LnRpY2tldElELFxyXG4gICAgICAgICAgICAgIHRpY2tldDogdGlja2V0LFxyXG4gICAgICAgICAgICAgIHN0YXR1czogZXZlbnQuc3RhdHVzLFxyXG4gICAgICAgICAgICAgIGV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJTZXJ2aWNlLmN1LFxyXG4gICAgICAgICAgICAgIGxvY2F0aW9uSWQ6IHRoaXMuY3VycmVudFNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgIHpvbmVJZDogdGhpcy56b25lSURGaWx0ZXIsXHJcbiAgICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5zZWxlY3RlZEZsb29yPy5pZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3RyZWFtTmFtZTogJ3NtYXJ0ZXJwbGFuS2luZXNpcy1hbmFseXRpY3MnLFxyXG4gICAgICAgICAgICAvLyBwYXJ0aXRpb25LZXk6IFwiXCIsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgJ0FXU0tpbmVzaXMnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZygnRXZlbnQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgIScpO1xyXG4gICAgICByZXR1cm4gcmVjZWl2ZWRFdmVudDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQgfCB2b2lkPiB7XHJcbiAgICB0aWNrZXQuc3RhdHVzID0gVGlja2V0U3RhdHVzLkNSRUFURUQ7XHJcbiAgICBpZiAoIXRpY2tldC5vd25lck1pc3Npb25JRCkge1xyXG4gICAgICB0aWNrZXQub3duZXJNaXNzaW9uSUQgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKFxyXG4gICAgICAgIHRpY2tldC5zcGFjZUlEXHJcbiAgICAgICkuaWQ7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPISEhIGZpbHRlciBtaXNzaW9ucyBieSBzcGFjZSBvZiB0aWNrZXRcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlY2VpdmVkVGlja2V0ID0gYXdhaXQgdGhpcy5jcmVhdGVUaWNrZXQodGlja2V0KTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJyEhISBSZXNwb25zZSBmcm9tIGNyZWF0aW5nIHRpY2tldCA6Jyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJlY2VpdmVkVGlja2V0KTtcclxuICAgICAgdGhpcy5hZGRFdmVudFRvVGlja2V0KHJlY2VpdmVkVGlja2V0LCB7XHJcbiAgICAgICAgdGl0bGU6ICdDcsOpYXRpb24gZHUgdGlja2V0JyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogYFRpY2tldCBjcsOpw6kgcGFyIC1gLFxyXG4gICAgICAgIHRyYW5zbGF0aW9uUGF0aDogJ3RpY2tldEV2ZW50LnRpY2tldC5jcmVhdGVkJyxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7IC8vIGluc3RlYWQgb2YgdHJ1ZVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1RpY2tldCBjcmVhdGlvbiBGQUlMRUQnKTtcclxuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZVRpY2tldFdpdGhFdmVudChcclxuICAgIHRpY2tldDogSVVwZGF0ZSAmIFBhcnRpYWw8VGlja2V0PixcclxuICAgIGV2ZW50PzogRXZlbnRcclxuICApOiBQcm9taXNlPFRpY2tldD4ge1xyXG4gICAgY29uc3QgcmVjZWl2ZWRUaWNrZXQgPSBhd2FpdCB0aGlzLnVwZGF0ZVRpY2tldCh0aWNrZXQpO1xyXG4gICAgaWYgKHJlY2VpdmVkVGlja2V0KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGVkIHRpY2tldCA6Jyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlY2VpdmVkVGlja2V0KTtcclxuICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRFdmVudFRvVGlja2V0KHJlY2VpdmVkVGlja2V0LCBldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGVEb25lLm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmVBc3NpZ25lZUZyb21UaWNrZXQoXHJcbiAgICB0aWNrZXQ6IFRpY2tldCxcclxuICAgIGFzc2lnbmVlOiBBZmZlY3RhdGlvblxyXG4gICk6IFByb21pc2U8VGlja2V0PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBhZmZlY3RhdGlvbiA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZmZlY3RhdGlvblNlcnZpY2Uuc29mdERlbGV0ZUFmZmVjdGF0aW9uQnlJRChhc3NpZ25lZS5pZCk7XHJcbiAgICAgIGlmICghYWZmZWN0YXRpb24pIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBgcmVtb3ZlQXNzaWduZWVGcm9tVGlja2V0KCR7dGlja2V0LmlkfSwgJHthc3NpZ25lZS5pZH0pIGZhaWxlZGBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aWNrZXQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVUaWNrZXRMb2NhdGlvbihcclxuICAgIHRpY2tldDogVGlja2V0LFxyXG4gICAgdGFnRGF0YTogTWF0dGVydGFnRGF0YVxyXG4gICk6IFByb21pc2U8UE9JPiB7XHJcbiAgICBjb25zdCBwb2lJbnB1dCA9IHtcclxuICAgICAgY29vcmRpbmF0ZTogdGFnRGF0YS5nZXRDb29yZGluYXRlU3RyaW5nKCksXHJcbiAgICAgIHR5cGU6IFBvaVR5cGUuVElDS0VULFxyXG4gICAgICBlbGVtZW50SUQ6IHRpY2tldC5pZCxcclxuICAgICAgbWV0YWRhdGE6IHRhZ0RhdGEuZ2V0TWV0YWRhdGFTdHJpbmcoKSxcclxuICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxyXG4gICAgfSBhcyBQT0k7XHJcbiAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuY3JlYXRlUE9JRm9yU3BhY2VJRChwb2lJbnB1dCk7XHJcbiAgICBhd2FpdCB0aGlzLmFkZEV2ZW50VG9UaWNrZXQodGlja2V0LCB7XHJcbiAgICAgIHRpdGxlOiAnQ2hhbmdlbWVudCBwb3NpdGlvbiBkdSB0aWNrZXQnLFxyXG4gICAgICBkZXNjcmlwdGlvbjogXCJMZSBwb2ludCBkJ2ludMOpcsOqdCBkdSB0aWNrZXQgYSDDqXTDqSBtb2RpZmnDqVwiLFxyXG4gICAgICBzdGF0dXM6IEV2ZW50U3RhdHVzLlBPU0lUSU9OX1NFVCxcclxuICAgICAgdHJhbnNsYXRpb25QYXRoOiAndGlja2V0RXZlbnQucG9zaXRpb24uc2V0JyxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHBvaTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZVN0YXR1c09mVGlja2V0KFxyXG4gICAgdGlja2V0OiBUaWNrZXQsXHJcbiAgICBzdGF0dXM6IFRpY2tldFN0YXR1c1xyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gdGlja2V0LnN0YXR1cztcclxuICAgIGNvbnN0IG9sZFRpY2tldFN0YXR1cyA9IHRpY2tldC5zdGF0dXM7XHJcbiAgICB0aWNrZXQuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgaWYgKGN1cnJlbnRTdGF0dXMgPT09IHN0YXR1cykge1xyXG4gICAgICByZXR1cm4gdGlja2V0O1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ1VwZGF0aW5nIHN0YXR1cycpO1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlVGlja2V0KHtcclxuICAgICAgaWQ6IHRpY2tldC5pZCxcclxuICAgICAgc3RhdHVzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVUeXBlT2ZUaWNrZXQodGlja2V0OiBUaWNrZXQsIHR5cGU6IFRpY2tldFR5cGUpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcHJldmlvdXNUeXBlID0gdGlja2V0LnR5cGU7XHJcbiAgICB0aWNrZXQudHlwZSA9IHR5cGU7XHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVRpY2tldFdpdGhFdmVudChcclxuICAgICAge2lkOiB0aWNrZXQuaWQsIHR5cGU6IHRpY2tldC50eXBlfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiAnVHlwZSBjaGFuZ8OpJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogYENoYW5nZW1lbnQgZGUgJHtwcmV2aW91c1R5cGV9IHZlcnMgJHt0aWNrZXQudHlwZX1gLFxyXG4gICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeSh7dHlwZTogdGlja2V0LnR5cGV9KSxcclxuICAgICAgICB0cmFuc2xhdGlvblBhdGg6ICd0aWNrZXRFdmVudC50aWNrZXQudHlwZScsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gdGlja2V0O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGlja2V0c0ZvclVzZXJGb3JTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPFRpY2tldFtdPiB7XHJcbiAgICBjb25zdCB0aWNrZXRzU3BhY2UgPSBhd2FpdCB0aGlzLmdldFRpY2tldHNCeVNwYWNlKHNwYWNlSUQpO1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJUaWNrZXRzRm9yQ3VycmVudFVzZXJJblNwYWNlKFxyXG4gICAgICB0aWNrZXRzU3BhY2UsXHJcbiAgICAgIHNwYWNlSURcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFzaWMgQ1JVRCBvcGVyYXRpb25zICovXHJcbiAgYXN5bmMgcmVhZFRpY2tldChpZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldFRpY2tldChpZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVUaWNrZXQoaW5wdXQ6IFRpY2tldCk6IFByb21pc2U8VGlja2V0PiB7XHJcbiAgICBpZiAoISF0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MgJiYgISF0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MucmVjb3JkICYmIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5yZWNvcmQoKSkge1xyXG4gICAgICB0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MuZ2V0SW5zdGFuY2UoKS5yZWNvcmQoXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgZXZlbnRUeXBlOiAnT2JqZWN0IENyZWF0aW9uJyxcclxuICAgICAgICAgICAgb2JqZWN0VHlwZTogJ3RpY2tldCcsXHJcbiAgICAgICAgICAgIC8vem9uZUlkOiBpbnB1dC5zcGFjZUlELCAvLyBUT0RPOiBjaGVjayBpZiBzcGFjZUlkID09IHpvbmVJZFxyXG4gICAgICAgICAgICBkb21haW46IGlucHV0LmRvbWFpbixcclxuICAgICAgICAgICAgdXNlcjogdGhpcy51c2VyU2VydmljZS5jdSxcclxuICAgICAgICAgICAgbG9jYXRpb25JZDogdGhpcy5jdXJyZW50U3BhY2VJRCxcclxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICB6b25lSWQ6IHRoaXMuem9uZUlERmlsdGVyLFxyXG4gICAgICAgICAgICBmbG9vcklkOiB0aGlzLnNlbGVjdGVkRmxvb3I/LmlkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0cmVhbU5hbWU6ICdzbWFydGVycGxhbktpbmVzaXMtYW5hbHl0aWNzJyxcclxuICAgICAgICAgIC8vIHBhcnRpdGlvbktleTogXCJcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgICdBV1NLaW5lc2lzJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVUaWNrZXQoaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlVGlja2V0KGlucHV0OiBJVXBkYXRlICYgUGFydGlhbDxUaWNrZXQ+KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uVXBkYXRlVGlja2V0KGlucHV0KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRlbGV0ZVRpY2tldCh0aWNrZXQ6IFRpY2tldCk6IFByb21pc2U8VGlja2V0PiB7XHJcbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZVRpY2tldCh7aWQ6IHRpY2tldC5pZH0pO1xyXG5cclxuICAgIC8vIGRlbGV0ZSBQT0lcclxuICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5nZXRQb2lCeUVsZW1lbnRJZCh0aWNrZXQuaWQpO1xyXG4gICAgaWYgKHBvaSkge1xyXG4gICAgICB0aGlzLnBvaVNlcnZpY2UuZGVsZXRlUG9pKHBvaS5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2xlYW4gcGFyZW50SURcclxuICAgIGlmICh0aWNrZXQuY2hpbGRyZW4uaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aWNrZXQuY2hpbGRyZW4uaXRlbXMubWFwKGFzeW5jIChjaGlsZFRpY2tldCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uVXBkYXRlVGlja2V0KHtcclxuICAgICAgICAgICAgaWQ6IGNoaWxkVGlja2V0LmlkLFxyXG4gICAgICAgICAgICBwYXJlbnRJRDogbnVsbCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgdXBkYXRlIHRpY2tldCcsIGNoaWxkVGlja2V0LmlkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVFdmVudCh7XHJcbiAgICAgICAgICB0aXRsZTogJ1RpY2tldCBwYXJlbnQgc3VwcHJpbcOpJyxcclxuICAgICAgICAgIHRpY2tldElEOiBjaGlsZFRpY2tldC5pZCxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVGlja2V0IFxcXCIkdGlja2V0LnRpdGxlfVxcXCIgYSDDqXTDqSBzdXBwcmltw6lgLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIGRlbGV0ZSBldmVudHNcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICB0aWNrZXQuZXZlbnRzLml0ZW1zLm1hcChhc3luYyAoZXZlbnRfKSA9PiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZUV2ZW50KHtpZDogZXZlbnRfLmlkfSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgLy8gZGVsZXRlIGFmZmVjdGF0aW9ubnNcclxuICAgIGlmICh0aWNrZXQuYXNzaWduZWVzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRpY2tldC5hc3NpZ25lZXMuaXRlbXMpIHtcclxuICAgICAgICB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlQWZmZWN0YXRpb24oe2lkOiBlbGVtZW50LmlkfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRlbGV0ZSBjb21tZW50c1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHRpY2tldC5jb21tZW50cy5pdGVtcy5tYXAoYXN5bmMgKGNvbW1lbnQpID0+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlQ29tbWVudCh7aWQ6IGNvbW1lbnQuaWR9KTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuZGVsZXRlT3BlcmF0aW9uc0ZvclRpY2tldCh0aWNrZXQuaWQpO1xyXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogQ3VzdG9tIHJlcXVlc3RzICovXHJcbiAgYXN5bmMgZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXRbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fX1xyXG4gICAgICAuVGlja2V0c0J5U3BhY2Uoc3BhY2VJRClcclxuICAgICAgLnRoZW4oKHRpY2tldHMpID0+IHRpY2tldHMuaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlSWNvbkZvckFsbFRpY2tldHNJblNwYWNlKFxyXG4gICAgdGFnSWNvbjogc3RyaW5nLFxyXG4gICAgc3BhY2VJRDogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTx7IHRpY2tldHM6IFRpY2tldFtdOyBwb2lzOiBQT0lbXSB9PiB7XHJcbiAgICBjb25zdCB0aWNrZXRzID0gYXdhaXQgdGhpcy5nZXRUaWNrZXRzQnlTcGFjZShzcGFjZUlEKTtcclxuICAgIGNvbnN0IHBvaXMgPSBhd2FpdCB0aGlzLnVwZGF0ZUljb25Gb3JBbGxPYmplY3RzKHRpY2tldHMsIHRhZ0ljb24pO1xyXG4gICAgcmV0dXJuIHt0aWNrZXRzLCBwb2lzfTtcclxuICB9XHJcblxyXG4gIC8qKiBBcmNoaXZlIHJlbGF0ZWQgKi9cclxuICAvKiogUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgYXJjaGl2ZWQgdGhpcyB0aWNrZXQgKi9cclxuICBpc0FyY2hpdmVkKHRpY2tldDogVGlja2V0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklEXHJcbiAgICAgID8gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklELmluY2x1ZGVzKFxyXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGlja2V0LnNwYWNlSUQpLmlkXHJcbiAgICAgIClcclxuICAgICAgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNldEFyY2hpdmVkKHRpY2tldDogVGlja2V0LCBhcmNoaXZlZDogYm9vbGVhbikge1xyXG4gICAgbGV0IGFyY2hpdmVkTGlzdCA9IHRpY2tldC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICA/IHRpY2tldC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgbWlzc2lvbklEID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aWNrZXQuc3BhY2VJRCkuaWQ7XHJcblxyXG4gICAgYXJjaGl2ZWRMaXN0ID0gYXJjaGl2ZWRMaXN0LmZpbHRlcigobSkgPT4gbSAhPT0gbWlzc2lvbklEKTtcclxuXHJcbiAgICBpZiAoYXJjaGl2ZWQpIHtcclxuICAgICAgYXJjaGl2ZWRMaXN0LnB1c2gobWlzc2lvbklEKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVUaWNrZXRXaXRoRXZlbnQoe1xyXG4gICAgICBpZDogdGlja2V0LmlkLFxyXG4gICAgICBhcmNoaXZlZEZvck1pc3Npb25JRDogYXJjaGl2ZWRMaXN0LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuYXZpZ2F0ZVRvVGlja2V0SW4zRChcclxuICAgIHRpY2tldDogVGlja2V0LFxyXG4gICAgZm9yY2VTd2l0Y2hWaXNpdDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgdXJsID0gYHZpc2l0LyR7dGlja2V0LnNwYWNlSUR9YDtcclxuICAgIGlmIChmb3JjZVN3aXRjaFZpc2l0KSB7XHJcbiAgICAgIHVybCArPSBgL2RldGFpbC8ke3RpY2tldC5pZH1gO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2FuR29Ub1RhZyA9IGF3YWl0IHRoaXMudmlld2VyU2VydmljZS5hY3Rpb25fbW92ZV90b190YWcoXHJcbiAgICAgIGAke3RpY2tldC5pZH1gXHJcbiAgICApO1xyXG4gICAgaWYgKGNhbkdvVG9UYWcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRNb2RlbDNkQW5kU3dlZXAodGlja2V0KTtcclxuICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQubW9kZWwzRCkge1xyXG4gICAgICBhbGVydCgnRXJyb3Igd2hpbGUgZ2V0dGluZyB2aXJ0dWFsIHZpc2l0IG1vZGVsJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghZm9yY2VTd2l0Y2hWaXNpdCkge1xyXG4gICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgM0QgbW9kZWxcclxuICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2RlbDNEJyk7XHJcbiAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbCA9PT0gcmVzdWx0Lm1vZGVsM0QpIHtcclxuICAgICAgICAgLy8gd2UgYWRkIHRhZyB0byB0aGUgdmlzaXRcclxuICAgICAgICAgY29uc3QgcG9pID0gdGlja2V0LnBvaXMuaXRlbXNbMF07XHJcbiAgICAgICAgIGlmIChwb2kuY29vcmRpbmF0ZSkge1xyXG4gICAgICAgICAgIC8vIHdlIGZvcmNlIGFkZCBiZWNhdXNlIHdlIG1pZ2h0IGJlIGluIGFuIGFub3RoZXIgem9uZVxyXG4gICAgICAgICAgIGF3YWl0IHRoaXMudmlld2VyU2VydmljZS5hY3Rpb25BZGRPYmplY3RGcm9tUE9JKHRpY2tldCwgcG9pKTtcclxuICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXdlclNlcnZpY2UuYWN0aW9uX21vdmVfdG9fdGFnKHRpY2tldC5pZCk7XHJcbiAgICAgICAgIH1cclxuICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgIC8qKiBTaSBvbiBuZSBmb3JjZSBwYXMgbGEgdmlzaXRlLCBvbiBkZW1hbmRlIHNpIG9uIHZldXQgZXRyZSBzd2l0Y2ggKi9cclxuICAgICAgICAgb3Blbk1vZGFsRm9yVmlzaXRTd2l0Y2goXHJcbiAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UsXHJcbiAgICAgICAgICAgcmVzdWx0Lm1vZGVsM0QsXHJcbiAgICAgICAgICAgdGlja2V0LnNwYWNlSUQsXHJcbiAgICAgICAgICAge3N3ZWVwVG9Nb3ZlOiByZXN1bHQuc3dlZXAsIHJvdGF0aW9uOiByZXN1bHQucm90YXRpb259XHJcbiAgICAgICAgICk7XHJcbiAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvKiogU2kgb24gZm9yY2UgbGUgc3dpdGNoIGRlIGxhIHZpc2l0ICovXHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3VybH0/bW9kZWwzRD0ke3Jlc3VsdC5tb2RlbDNEfSZzd2VlcD10cnVlYCwgJ19ibGFuaycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdFN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNNdXNldW1Vc2VyKSB7XHJcbiAgICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uID0gdGhpcy56b25lQ2hhbmdlU2VydmljZS56b25lQ2hhbmdlLnN1YnNjcmliZShcclxuICAgICAgICAoem9uZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRDtcclxuICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tldFRhZ3MubmV4dChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy50aWNrZXRzVXBkYXRlZC5uZXh0KHtzcGFjZTogW10sIHpvbmU6IG51bGx9KTtcclxuICAgICAgICAgICAgdGhpcy50aWNrZXRUeXBlRmlsdGVyID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSBudWxsO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh6b25lLmlkICE9PSB0aGlzLnpvbmVJREZpbHRlcikge1xyXG4gICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IHpvbmUuaWQ7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ29pbmcgdG8gaW5pdCB0aWNrZXRzIGZyb20gem9uZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0VGlja2V0cygpLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZmlsZXRyU3Vic2NyaXB0aW9uID0gdGhpcy5maWx0ZXJTZXJ2aWNlLnN1YnNjcmliZVRvRGF0YUZpbHRlclVwZGF0ZShcclxuICAgICAgICAoZGF0ZVJhbmdlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIgPSBkYXRlUmFuZ2U7XHJcbiAgICAgICAgICB0aGlzLmluaXRUaWNrZXRzKCkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGUubWVzc2FnZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kYXRlRmlsdGVyID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmN1cnJlbnREYXRlRmlsdGVyO1xyXG4gICAgICB0aGlzLnVwZGF0ZURvbmUuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgdGhpcy5pbml0VGlja2V0cygpLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdW5zdWJzY3JpYmUoKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|