@sunbird-cb/utils 1.0.19-ang-13-16 → 1.0.20-ang-13-16
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/esm2022/lib/components/image-crop/image-crop.component.mjs +172 -0
- package/esm2022/lib/components/image-crop/image-crop.module.mjs +55 -0
- package/esm2022/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.mjs +87 -0
- package/esm2022/lib/directives/class-change-on-scroll/class-change-on-scroll.module.mjs +20 -0
- package/{esm2015/lib/directives/default-thumbnail/default-thumbnail.directive.js → esm2022/lib/directives/default-thumbnail/default-thumbnail.directive.mjs} +4 -4
- package/esm2022/lib/directives/default-thumbnail/default-thumbnail.module.mjs +20 -0
- package/{esm2015/lib/directives/image-responsive/image-responsive.directive.js → esm2022/lib/directives/image-responsive/image-responsive.directive.mjs} +4 -4
- package/esm2022/lib/directives/image-responsive/image-responsive.module.mjs +20 -0
- package/{esm2015/lib/directives/in-view-port/in-view-port.directive.js → esm2022/lib/directives/in-view-port/in-view-port.directive.mjs} +4 -4
- package/esm2022/lib/directives/in-view-port/in-view-port.module.mjs +20 -0
- package/esm2022/lib/directives/navigation/navigation.directive.mjs +43 -0
- package/esm2022/lib/directives/navigation/navigation.module.mjs +20 -0
- package/{esm2015/lib/directives/permission/permission.directive.js → esm2022/lib/directives/permission/permission.directive.mjs} +4 -4
- package/esm2022/lib/directives/permission/permission.module.mjs +20 -0
- package/esm2022/lib/helpers/horizontal-scroller/horizontal-scroller.component.mjs +96 -0
- package/esm2022/lib/helpers/horizontal-scroller/horizontal-scroller.module.mjs +32 -0
- package/esm2022/lib/helpers/logout/logout.component.mjs +44 -0
- package/esm2022/lib/helpers/logout/logout.module.mjs +27 -0
- package/esm2022/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.mjs +18 -0
- package/{esm2015/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.js → esm2022/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-count-transform/pipe-count-transform.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.js → esm2022/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-date-concat/pipe-date-concat.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.js → esm2022/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.js → esm2022/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-filter/pipe-filter.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-filter/pipe-filter.pipe.js → esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-filter-search/pipe-filter-search.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.js → esm2022/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.js → esm2022/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-limit-to/pipe-limit-to.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.js → esm2022/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.js → esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-name-transform/pipe-name-transform.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.js → esm2022/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-order-by/pipe-order-by.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-order-by/pipe-order-by.pipe.js → esm2022/lib/pipes/pipe-order-by/pipe-order-by.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-partial-content/pipe-partial-content.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.js → esm2022/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.js → esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs} +4 -4
- package/esm2022/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.mjs +20 -0
- package/{esm2015/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.js → esm2022/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.mjs} +4 -4
- package/{esm2015/lib/resolvers/explore-detail.resolver.js → esm2022/lib/resolvers/explore-detail.resolver.mjs} +4 -4
- package/{esm2015/lib/resolvers/marketing-offering.resolve.js → esm2022/lib/resolvers/marketing-offering.resolve.mjs} +4 -4
- package/{esm2015/lib/resolvers/page.resolver.js → esm2022/lib/resolvers/page.resolver.mjs} +4 -4
- package/esm2022/lib/services/auth-keycloak.service.mjs +52 -0
- package/esm2022/lib/services/auth-microsoft.service.mjs +173 -0
- package/{esm2015/lib/services/configurations.service.js → esm2022/lib/services/configurations.service.mjs} +4 -4
- package/esm2022/lib/services/event.service.mjs +204 -0
- package/{esm2015/lib/services/logger.service.js → esm2022/lib/services/logger.service.mjs} +4 -4
- package/esm2022/lib/services/subapplication-respond.service.mjs +76 -0
- package/esm2022/lib/services/telemetry.service.mjs +502 -0
- package/esm2022/lib/services/user-preference.service.mjs +92 -0
- package/{esm2015/lib/services/utility.service.js → esm2022/lib/services/utility.service.mjs} +4 -4
- package/{esm2015/lib/services/value.service.js → esm2022/lib/services/value.service.mjs} +4 -4
- package/esm2022/lib/services/widget-content.service.mjs +182 -0
- package/{fesm2015/sunbird-cb-utils.js → fesm2022/sunbird-cb-utils.mjs} +573 -545
- package/fesm2022/sunbird-cb-utils.mjs.map +1 -0
- package/lib/components/image-crop/image-crop.component.d.ts +3 -3
- package/lib/components/image-crop/image-crop.component.d.ts.map +1 -1
- package/lib/components/image-crop/image-crop.module.d.ts +6 -6
- package/lib/components/image-crop/image-crop.module.d.ts.map +1 -1
- package/lib/constants/misc.constants.d.ts +2 -2
- package/lib/constants/misc.constants.d.ts.map +1 -1
- package/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.d.ts +1 -1
- package/lib/directives/default-thumbnail/default-thumbnail.directive.d.ts +1 -1
- package/lib/directives/image-responsive/image-responsive.directive.d.ts +1 -1
- package/lib/directives/in-view-port/in-view-port.directive.d.ts +1 -1
- package/lib/directives/navigation/navigation.directive.d.ts +1 -1
- package/lib/directives/permission/permission.directive.d.ts +1 -1
- package/lib/helpers/horizontal-scroller/horizontal-scroller.component.d.ts +1 -1
- package/lib/helpers/horizontal-scroller/horizontal-scroller.module.d.ts +3 -3
- package/lib/helpers/logout/logout.component.d.ts +2 -2
- package/lib/helpers/logout/logout.component.d.ts.map +1 -1
- package/lib/helpers/logout/logout.module.d.ts +3 -3
- package/lib/helpers/logout/logout.module.d.ts.map +1 -1
- package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.d.ts +1 -1
- package/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.d.ts +1 -1
- package/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.d.ts +1 -1
- package/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +1 -1
- package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +1 -1
- package/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.d.ts +1 -1
- package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.d.ts +1 -1
- package/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.d.ts +1 -1
- package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +1 -1
- package/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.d.ts +1 -1
- package/lib/pipes/pipe-order-by/pipe-order-by.pipe.d.ts +5 -5
- package/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.d.ts +1 -1
- package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +1 -1
- package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.d.ts +1 -1
- package/lib/resolvers/explore-detail.resolver.d.ts +2 -2
- package/lib/resolvers/explore-detail.resolver.d.ts.map +1 -1
- package/lib/resolvers/marketing-offering.resolve.d.ts +2 -2
- package/lib/resolvers/marketing-offering.resolve.d.ts.map +1 -1
- package/lib/resolvers/page.resolver.d.ts +2 -2
- package/lib/resolvers/page.resolver.d.ts.map +1 -1
- package/lib/services/widget-resolver.model.d.ts +1 -1
- package/lib/services/widget-resolver.model.d.ts.map +1 -1
- package/package.json +26 -18
- package/sunbird-cb-utils-1.0.20-ang-13-16.tgz +0 -0
- package/bundles/sunbird-cb-utils.umd.js +0 -4785
- package/bundles/sunbird-cb-utils.umd.js.map +0 -1
- package/esm2015/lib/components/image-crop/image-crop.component.js +0 -166
- package/esm2015/lib/components/image-crop/image-crop.module.js +0 -58
- package/esm2015/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.js +0 -87
- package/esm2015/lib/directives/class-change-on-scroll/class-change-on-scroll.module.js +0 -22
- package/esm2015/lib/directives/default-thumbnail/default-thumbnail.module.js +0 -22
- package/esm2015/lib/directives/image-responsive/image-responsive.module.js +0 -22
- package/esm2015/lib/directives/in-view-port/in-view-port.module.js +0 -22
- package/esm2015/lib/directives/navigation/navigation.directive.js +0 -43
- package/esm2015/lib/directives/navigation/navigation.module.js +0 -22
- package/esm2015/lib/directives/permission/permission.module.js +0 -22
- package/esm2015/lib/helpers/horizontal-scroller/horizontal-scroller.component.js +0 -100
- package/esm2015/lib/helpers/horizontal-scroller/horizontal-scroller.module.js +0 -34
- package/esm2015/lib/helpers/logout/logout.component.js +0 -48
- package/esm2015/lib/helpers/logout/logout.module.js +0 -30
- package/esm2015/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.js +0 -18
- package/esm2015/lib/pipes/pipe-count-transform/pipe-count-transform.module.js +0 -22
- package/esm2015/lib/pipes/pipe-date-concat/pipe-date-concat.module.js +0 -22
- package/esm2015/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.js +0 -22
- package/esm2015/lib/pipes/pipe-filter/pipe-filter.module.js +0 -22
- package/esm2015/lib/pipes/pipe-filter-search/pipe-filter-search.module.js +0 -22
- package/esm2015/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.js +0 -22
- package/esm2015/lib/pipes/pipe-limit-to/pipe-limit-to.module.js +0 -22
- package/esm2015/lib/pipes/pipe-list-filter/pipe-list-filter.module.js +0 -22
- package/esm2015/lib/pipes/pipe-name-transform/pipe-name-transform.module.js +0 -22
- package/esm2015/lib/pipes/pipe-order-by/pipe-order-by.module.js +0 -22
- package/esm2015/lib/pipes/pipe-partial-content/pipe-partial-content.module.js +0 -22
- package/esm2015/lib/pipes/pipe-relative-time/pipe-relative-time.module.js +0 -22
- package/esm2015/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.js +0 -22
- package/esm2015/lib/services/auth-keycloak.service.js +0 -57
- package/esm2015/lib/services/auth-microsoft.service.js +0 -184
- package/esm2015/lib/services/event.service.js +0 -199
- package/esm2015/lib/services/subapplication-respond.service.js +0 -70
- package/esm2015/lib/services/telemetry.service.js +0 -434
- package/esm2015/lib/services/user-preference.service.js +0 -82
- package/esm2015/lib/services/widget-content.service.js +0 -182
- package/fesm2015/sunbird-cb-utils.js.map +0 -1
- package/sunbird-cb-utils-1.0.19-ang-13-16.tgz +0 -0
- /package/{esm2015/lib/constants/features.enum.js → esm2022/lib/constants/features.enum.mjs} +0 -0
- /package/{esm2015/lib/constants/instances.enum.js → esm2022/lib/constants/instances.enum.mjs} +0 -0
- /package/{esm2015/lib/constants/misc.constants.js → esm2022/lib/constants/misc.constants.mjs} +0 -0
- /package/{esm2015/lib/helpers/functions/getStringifiedQueryParams.js → esm2022/lib/helpers/functions/getStringifiedQueryParams.mjs} +0 -0
- /package/{esm2015/lib/models/contentRating.model.js → esm2022/lib/models/contentRating.model.mjs} +0 -0
- /package/{esm2015/lib/resolvers/page.constant.js → esm2022/lib/resolvers/page.constant.mjs} +0 -0
- /package/{esm2015/lib/resolvers/page.model.js → esm2022/lib/resolvers/page.model.mjs} +0 -0
- /package/{esm2015/lib/resolvers/resolver.model.js → esm2022/lib/resolvers/resolver.model.mjs} +0 -0
- /package/{esm2015/lib/services/card-content.model.js → esm2022/lib/services/card-content.model.mjs} +0 -0
- /package/{esm2015/lib/services/configurations.model.js → esm2022/lib/services/configurations.model.mjs} +0 -0
- /package/{esm2015/lib/services/content-strip-multiple.model.js → esm2022/lib/services/content-strip-multiple.model.mjs} +0 -0
- /package/{esm2015/lib/services/event.model.js → esm2022/lib/services/event.model.mjs} +0 -0
- /package/{esm2015/lib/services/ms-office.model.js → esm2022/lib/services/ms-office.model.mjs} +0 -0
- /package/{esm2015/lib/services/user-preference.model.js → esm2022/lib/services/user-preference.model.mjs} +0 -0
- /package/{esm2015/lib/services/widget-content.model.js → esm2022/lib/services/widget-content.model.mjs} +0 -0
- /package/{esm2015/lib/services/widget-resolver.model.js → esm2022/lib/services/widget-resolver.model.mjs} +0 -0
- /package/{esm2015/lib/services/widget-search.model.js → esm2022/lib/services/widget-search.model.mjs} +0 -0
- /package/{esm2015/public-api.js → esm2022/public-api.mjs} +0 -0
- /package/{esm2015/sunbird-cb-utils.js → esm2022/sunbird-cb-utils.mjs} +0 -0
- /package/{sunbird-cb-utils.d.ts → index.d.ts} +0 -0
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { WsEvents } from './event.model';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./widget-content.service";
|
|
5
|
-
import * as i2 from "./event.service";
|
|
6
|
-
import * as i3 from "./telemetry.service";
|
|
7
|
-
export class SubapplicationRespondService {
|
|
8
|
-
constructor(contentSvc, eventSvc, teleSvc) {
|
|
9
|
-
this.contentSvc = contentSvc;
|
|
10
|
-
this.eventSvc = eventSvc;
|
|
11
|
-
this.teleSvc = teleSvc;
|
|
12
|
-
this.subAppname = '';
|
|
13
|
-
this.continueLearningData = null;
|
|
14
|
-
this.loaded = false;
|
|
15
|
-
}
|
|
16
|
-
continueLearningRespond(id, continueLearning) {
|
|
17
|
-
this.contentSvc.saveContinueLearning({
|
|
18
|
-
contextPathId: id,
|
|
19
|
-
resourceId: id,
|
|
20
|
-
data: JSON.stringify({ timestamp: Date.now(), data: continueLearning }),
|
|
21
|
-
dateAccessed: Date.now(),
|
|
22
|
-
})
|
|
23
|
-
.toPromise()
|
|
24
|
-
.catch();
|
|
25
|
-
}
|
|
26
|
-
telemetryEvents(tData) {
|
|
27
|
-
if (tData) {
|
|
28
|
-
switch (tData.eventId) {
|
|
29
|
-
case 'INTERACT':
|
|
30
|
-
this.eventSvc.dispatchEvent({
|
|
31
|
-
eventType: WsEvents.WsEventType.Telemetry,
|
|
32
|
-
eventLogLevel: WsEvents.WsEventLogLevel.Warn,
|
|
33
|
-
data: Object.assign(Object.assign({}, tData.data), { eventSubType: WsEvents.EnumTelemetrySubType.Interact }),
|
|
34
|
-
from: tData.subApplicationName,
|
|
35
|
-
to: 'Telemetry',
|
|
36
|
-
});
|
|
37
|
-
break;
|
|
38
|
-
case 'HEARTBEAT':
|
|
39
|
-
this.eventSvc.dispatchEvent({
|
|
40
|
-
eventType: WsEvents.WsEventType.Telemetry,
|
|
41
|
-
eventLogLevel: WsEvents.WsEventLogLevel.Trace,
|
|
42
|
-
data: Object.assign(Object.assign({}, tData.data), { eventSubType: WsEvents.EnumTelemetrySubType.HeartBeat }),
|
|
43
|
-
from: tData.subApplicationName,
|
|
44
|
-
to: 'Telemetry',
|
|
45
|
-
});
|
|
46
|
-
break;
|
|
47
|
-
case 'IMPRESSION':
|
|
48
|
-
this.teleSvc.externalImpression(tData.data);
|
|
49
|
-
break;
|
|
50
|
-
default:
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
unsubscribeResponse() {
|
|
56
|
-
this.subAppname = '';
|
|
57
|
-
this.continueLearningData = null;
|
|
58
|
-
this.contentWindowinfo = null;
|
|
59
|
-
this.loaded = false;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
SubapplicationRespondService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SubapplicationRespondService, deps: [{ token: i1.WidgetContentService }, { token: i2.EventService }, { token: i3.TelemetryService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
63
|
-
SubapplicationRespondService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SubapplicationRespondService, providedIn: 'root' });
|
|
64
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SubapplicationRespondService, decorators: [{
|
|
65
|
-
type: Injectable,
|
|
66
|
-
args: [{
|
|
67
|
-
providedIn: 'root',
|
|
68
|
-
}]
|
|
69
|
-
}], ctorParameters: function () { return [{ type: i1.WidgetContentService }, { type: i2.EventService }, { type: i3.TelemetryService }]; } });
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViYXBwbGljYXRpb24tcmVzcG9uZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3V0aWxzL3NyYy9saWIvc2VydmljZXMvc3ViYXBwbGljYXRpb24tcmVzcG9uZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFLMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTs7Ozs7QUFNeEMsTUFBTSxPQUFPLDRCQUE0QjtJQUt2QyxZQUVVLFVBQWdDLEVBSWhDLFFBQXNCLEVBQ3RCLE9BQXlCO1FBTHpCLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBSWhDLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFYbkMsZUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUNmLHlCQUFvQixHQUFRLElBQUksQ0FBQTtRQUVoQyxXQUFNLEdBQUcsS0FBSyxDQUFBO0lBY2QsQ0FBQztJQTJGRCx1QkFBdUIsQ0FBQyxFQUFVLEVBQUUsZ0JBQXFCO1FBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQ2xDO1lBQ0UsYUFBYSxFQUFFLEVBQUU7WUFDakIsVUFBVSxFQUFFLEVBQUU7WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDdkUsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7U0FDekIsQ0FDRjthQUNFLFNBQVMsRUFBRTthQUNYLEtBQUssRUFBRSxDQUFBO0lBQ1osQ0FBQztJQUNELGVBQWUsQ0FBQyxLQUFVO1FBQ3hCLElBQUksS0FBSyxFQUFFO1lBQ1QsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNyQixLQUFLLFVBQVU7b0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQXFDO3dCQUM5RCxTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO3dCQUN6QyxhQUFhLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJO3dCQUM1QyxJQUFJLGtDQUNDLEtBQUssQ0FBQyxJQUFJLEtBQ2IsWUFBWSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEdBQ3JEO3dCQUNELElBQUksRUFBRSxLQUFLLENBQUMsa0JBQWtCO3dCQUM5QixFQUFFLEVBQUUsV0FBVztxQkFDaEIsQ0FBQyxDQUFBO29CQUNGLE1BQUs7Z0JBQ1AsS0FBSyxXQUFXO29CQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFzQzt3QkFDL0QsU0FBUyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUzt3QkFDekMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSzt3QkFDN0MsSUFBSSxrQ0FDQyxLQUFLLENBQUMsSUFBSSxLQUNiLFlBQVksRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsU0FBUyxHQUN0RDt3QkFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjt3QkFDOUIsRUFBRSxFQUFFLFdBQVc7cUJBQ2hCLENBQUMsQ0FBQTtvQkFDRixNQUFLO2dCQUNQLEtBQUssWUFBWTtvQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDM0MsTUFBSztnQkFDUDtvQkFDRSxNQUFLO2FBQ1I7U0FDRjtJQUNILENBQUM7SUFDRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUE7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQTtRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO0lBQ3JCLENBQUM7OzBIQWpLVSw0QkFBNEI7OEhBQTVCLDRCQUE0QixjQUYzQixNQUFNOzRGQUVQLDRCQUE0QjtrQkFIeEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuLy8gaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcclxuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXHJcbi8vIGltcG9ydCB7IEF1dGhLZXljbG9ha1NlcnZpY2UgfSBmcm9tICcuL2F1dGgta2V5Y2xvYWsuc2VydmljZSdcclxuLy8gaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9ucy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBXc0V2ZW50cyB9IGZyb20gJy4vZXZlbnQubW9kZWwnXHJcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4vZXZlbnQuc2VydmljZSdcclxuaW1wb3J0IHsgVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4vdGVsZW1ldHJ5LnNlcnZpY2UnXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdWJhcHBsaWNhdGlvblJlc3BvbmRTZXJ2aWNlIHtcclxuICBzdWJBcHBuYW1lID0gJydcclxuICBjb250aW51ZUxlYXJuaW5nRGF0YTogYW55ID0gbnVsbFxyXG4gIGNvbnRlbnRXaW5kb3dpbmZvOiBhbnlcclxuICBsb2FkZWQgPSBmYWxzZVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXHJcbiAgICAvLyBwcml2YXRlIGtleUNsb2FrU3ZjOiBBdXRoS2V5Y2xvYWtTZXJ2aWNlLFxyXG4gICAgLy8gcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAvLyBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0ZWxlU3ZjOiBUZWxlbWV0cnlTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgLy8gdGhpcy5jaGFuZ2VDb250ZXh0cmVzcG9uZCgpXHJcbiAgICAvLyB0aGlzLmNvbmZpZ1N2Yy5wcmVmQ2hhbmdlTm90aWZpZXIuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgIC8vICAgdGhpcy5jaGFuZ2VDb250ZXh0cmVzcG9uZCgpXHJcbiAgICAvLyB9KVxyXG4gIH1cclxuICAvLyBsb2FkZWRSZXNwb25kKGNvbnRlbnRXaW5kb3c6IGFueSwgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcsIGlkPzogc3RyaW5nKSB7XHJcbiAgLy8gICBpZiAoaWQgJiYgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy52aWV3TW9kZSAmJiB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLnZpZXdNb2RlID09PSAnUkVTVU1FJykge1xyXG4gIC8vICAgICB0aGlzLmNvbnRpbnVlTGVhcm5pbmdEYXRhID0gbnVsbFxyXG4gIC8vICAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50SGlzdG9yeShpZCkuc3Vic2NyaWJlKFxyXG4gIC8vICAgICAgIGRhdGEgPT4ge1xyXG4gIC8vICAgICAgICAgdGhpcy5jb250aW51ZUxlYXJuaW5nRGF0YSA9IGRhdGEuY29udGludWVEYXRhXHJcbiAgLy8gICAgICAgICBpZiAodGhpcy5jb25maWdTdmMgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcclxuICAvLyAgICAgICAgICAgY29uc3QgZmlyc3ROYW1lID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlck5hbWUgP1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJOYW1lLnNwbGl0KCcgJywgMilbMF0gOiAnJ1xyXG4gIC8vICAgICAgICAgICBjb25zdCBsYXN0TmFtZSA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJOYW1lID9cclxuICAvLyAgICAgICAgICAgICB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VyTmFtZS5zcGxpdCgnICcsIDIpWzFdIDogJydcclxuICAvLyAgICAgICAgICAgY29uc3Qgdmlld01vZGU6IHN0cmluZyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMudmlld01vZGUgP1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMudmlld01vZGUgOiAnJ1xyXG4gIC8vICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMua2V5Q2xvYWtTdmMudG9rZW5cclxuICAvLyAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XHJcbiAgLy8gICAgICAgICAgICAgc3ViQXBwbGljYXRpb25OYW1lOiBhcHBsaWNhdGlvbk5hbWUsXHJcbiAgLy8gICAgICAgICAgICAgcmVxdWVzdElkOiAnTE9BREVEJyxcclxuICAvLyAgICAgICAgICAgICBwYXJlbnRDb250ZXh0OiB7XHJcbiAgLy8gICAgICAgICAgICAgICBkb21haW5OYW1lOiB3aW5kb3cubG9jYXRpb24uaG9zdCxcclxuICAvLyAgICAgICAgICAgICAgIHVybDogdGhpcy5yb3V0ZXIudXJsLFxyXG4gIC8vICAgICAgICAgICAgICAgcm9vdE9yZzogdGhpcy5jb25maWdTdmMucm9vdE9yZyxcclxuICAvLyAgICAgICAgICAgICAgIHRoZW1lOiB0aGlzLmNvbmZpZ1N2Yy5hY3RpdmVUaGVtZU9iamVjdCA/IHtcclxuICAvLyAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb25maWdTdmMuYWN0aXZlVGhlbWVPYmplY3QudGhlbWVOYW1lLFxyXG4gIC8vICAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZ1N2Yy5hY3RpdmVUaGVtZU9iamVjdC5jb2xvcixcclxuICAvLyAgICAgICAgICAgICAgIH0gOiAnJyxcclxuICAvLyAgICAgICAgICAgICAgIGZvbnRTaXplOiB0aGlzLmNvbmZpZ1N2Yy5hY3RpdmVGb250T2JqZWN0ID8gdGhpcy5jb25maWdTdmMuYWN0aXZlRm9udE9iamVjdC5iYXNlRm9udFNpemUgOiAnMTRweCcsXHJcbiAgLy8gICAgICAgICAgICAgICBsb2NhbGU6ICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJlZmVyZW5jZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJlZmVyZW5jZS5zZWxlY3RlZExvY2FsZSkgfHwgJ2VuJyxcclxuICAvLyAgICAgICAgICAgICAgIGRhcmtNb2RlOiB0aGlzLmNvbmZpZ1N2Yy5pc0RhcmtNb2RlLFxyXG4gIC8vICAgICAgICAgICAgICAgc3ViQXBwbGljYXRpb25TdGFydE1vZGU6IHZpZXdNb2RlLnRvVXBwZXJDYXNlKCksXHJcbiAgLy8gICAgICAgICAgICAgICB1c2VyOiB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGZpcnN0TmFtZSxcclxuICAvLyAgICAgICAgICAgICAgICAgbGFzdE5hbWUsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHRva2VuLFxyXG4gIC8vICAgICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCA/IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCA6ICcnLFxyXG4gIC8vICAgICAgICAgICAgICAgICByb2xlczogdGhpcy5jb25maWdTdmMudXNlclJvbGVzID8gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ1N2Yy51c2VyUm9sZXMpIDogW10sXHJcbiAgLy8gICAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgICAgaGVhcnRiZWF0RnJlcXVlbmN5OiAnMjAwJyxcclxuICAvLyAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgIGRhdGE6IHRoaXMuY29udGludWVMZWFybmluZ0RhdGEuZGF0YSA/IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnRpbnVlTGVhcm5pbmc6IHRoaXMuY29udGludWVMZWFybmluZ0RhdGEuZGF0YSxcclxuICAvLyAgICAgICAgICAgICB9IDogbnVsbCxcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBjb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHJlc3BvbnNlLCAnKicpXHJcbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudFdpbmRvd2luZm8gPSBjb250ZW50V2luZG93XHJcbiAgLy8gICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZVxyXG4gIC8vICAgICAgICAgICB0aGlzLnN1YkFwcG5hbWUgPSBhcHBsaWNhdGlvbk5hbWVcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgaWYgKHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XHJcbiAgLy8gICAgICAgY29uc3QgZmlyc3ROYW1lID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlck5hbWUgP1xyXG4gIC8vICAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlck5hbWUuc3BsaXQoJyAnLCAyKVswXSA6ICcnXHJcbiAgLy8gICAgICAgY29uc3QgbGFzdE5hbWUgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VyTmFtZSA/XHJcbiAgLy8gICAgICAgICB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VyTmFtZS5zcGxpdCgnICcsIDIpWzFdIDogJydcclxuICAvLyAgICAgICBjb25zdCB2aWV3TW9kZTogc3RyaW5nID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy52aWV3TW9kZSA/XHJcbiAgLy8gICAgICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLnZpZXdNb2RlIDogJydcclxuICAvLyAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMua2V5Q2xvYWtTdmMudG9rZW5cclxuICAvLyAgICAgICBjb25zdCByZXNwb25zZSA9IHtcclxuICAvLyAgICAgICAgIHN1YkFwcGxpY2F0aW9uTmFtZTogYXBwbGljYXRpb25OYW1lLFxyXG4gIC8vICAgICAgICAgcmVxdWVzdElkOiAnTE9BREVEJyxcclxuICAvLyAgICAgICAgIHBhcmVudENvbnRleHQ6IHtcclxuICAvLyAgICAgICAgICAgZG9tYWluTmFtZTogd2luZG93LmxvY2F0aW9uLmhvc3QsXHJcbiAgLy8gICAgICAgICAgIHVybDogdGhpcy5yb3V0ZXIudXJsLFxyXG4gIC8vICAgICAgICAgICByb290T3JnOiB0aGlzLmNvbmZpZ1N2Yy5yb290T3JnLFxyXG4gIC8vICAgICAgICAgICB0aGVtZTogdGhpcy5jb25maWdTdmMuYWN0aXZlVGhlbWVPYmplY3QgPyB7XHJcbiAgLy8gICAgICAgICAgICAgbmFtZTogdGhpcy5jb25maWdTdmMuYWN0aXZlVGhlbWVPYmplY3QudGhlbWVOYW1lLFxyXG4gIC8vICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnU3ZjLmFjdGl2ZVRoZW1lT2JqZWN0LmNvbG9yLFxyXG4gIC8vICAgICAgICAgICB9IDogJycsXHJcbiAgLy8gICAgICAgICAgIGZvbnRTaXplOiB0aGlzLmNvbmZpZ1N2Yy5hY3RpdmVGb250T2JqZWN0ID8gdGhpcy5jb25maWdTdmMuYWN0aXZlRm9udE9iamVjdC5iYXNlRm9udFNpemUgOiAnMTRweCcsXHJcbiAgLy8gICAgICAgICAgIGxvY2FsZTogKHRoaXMuY29uZmlnU3ZjLnVzZXJQcmVmZXJlbmNlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcmVmZXJlbmNlLnNlbGVjdGVkTG9jYWxlKSB8fCAnZW4nLFxyXG4gIC8vICAgICAgICAgICBkYXJrTW9kZTogdGhpcy5jb25maWdTdmMuaXNEYXJrTW9kZSxcclxuICAvLyAgICAgICAgICAgc3ViQXBwbGljYXRpb25TdGFydE1vZGU6IHZpZXdNb2RlLnRvVXBwZXJDYXNlKCksXHJcbiAgLy8gICAgICAgICAgIHVzZXI6IHtcclxuICAvLyAgICAgICAgICAgICBmaXJzdE5hbWUsXHJcbiAgLy8gICAgICAgICAgICAgbGFzdE5hbWUsXHJcbiAgLy8gICAgICAgICAgICAgdG9rZW4sXHJcbiAgLy8gICAgICAgICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgPyB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgOiAnJyxcclxuICAvLyAgICAgICAgICAgICByb2xlczogdGhpcy5jb25maWdTdmMudXNlclJvbGVzID8gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ1N2Yy51c2VyUm9sZXMpIDogW10sXHJcbiAgLy8gICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgIGhlYXJ0YmVhdEZyZXF1ZW5jeTogJzIwMCcsXHJcbiAgLy8gICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgZGF0YTogbnVsbCxcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShyZXNwb25zZSwgJyonKVxyXG4gIC8vICAgICAgIHRoaXMuY29udGVudFdpbmRvd2luZm8gPSBjb250ZW50V2luZG93XHJcbiAgLy8gICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlXHJcbiAgLy8gICAgICAgdGhpcy5zdWJBcHBuYW1lID0gYXBwbGljYXRpb25OYW1lXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgY29udGludWVMZWFybmluZ1Jlc3BvbmQoaWQ6IHN0cmluZywgY29udGludWVMZWFybmluZzogYW55KSB7XHJcbiAgICB0aGlzLmNvbnRlbnRTdmMuc2F2ZUNvbnRpbnVlTGVhcm5pbmcoXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0UGF0aElkOiBpZCxcclxuICAgICAgICByZXNvdXJjZUlkOiBpZCxcclxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgZGF0YTogY29udGludWVMZWFybmluZyB9KSxcclxuICAgICAgICBkYXRlQWNjZXNzZWQ6IERhdGUubm93KCksXHJcbiAgICAgIH0sXHJcbiAgICApXHJcbiAgICAgIC50b1Byb21pc2UoKVxyXG4gICAgICAuY2F0Y2goKVxyXG4gIH1cclxuICB0ZWxlbWV0cnlFdmVudHModERhdGE6IGFueSkge1xyXG4gICAgaWYgKHREYXRhKSB7XHJcbiAgICAgIHN3aXRjaCAodERhdGEuZXZlbnRJZCkge1xyXG4gICAgICAgIGNhc2UgJ0lOVEVSQUNUJzpcclxuICAgICAgICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0Pih7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxyXG4gICAgICAgICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuV2FybixcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnREYXRhLmRhdGEsXHJcbiAgICAgICAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZnJvbTogdERhdGEuc3ViQXBwbGljYXRpb25OYW1lLFxyXG4gICAgICAgICAgICB0bzogJ1RlbGVtZXRyeScsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICdIRUFSVEJFQVQnOlxyXG4gICAgICAgICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SGVhcnRCZWF0Pih7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxyXG4gICAgICAgICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuVHJhY2UsXHJcbiAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50RGF0YS5kYXRhLFxyXG4gICAgICAgICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuSGVhcnRCZWF0LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmcm9tOiB0RGF0YS5zdWJBcHBsaWNhdGlvbk5hbWUsXHJcbiAgICAgICAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJ0lNUFJFU1NJT04nOlxyXG4gICAgICAgICAgdGhpcy50ZWxlU3ZjLmV4dGVybmFsSW1wcmVzc2lvbih0RGF0YS5kYXRhKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICB1bnN1YnNjcmliZVJlc3BvbnNlKCkge1xyXG4gICAgdGhpcy5zdWJBcHBuYW1lID0gJydcclxuICAgIHRoaXMuY29udGludWVMZWFybmluZ0RhdGEgPSBudWxsXHJcbiAgICB0aGlzLmNvbnRlbnRXaW5kb3dpbmZvID0gbnVsbFxyXG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZVxyXG4gIH1cclxuICAvLyBjaGFuZ2VDb250ZXh0cmVzcG9uZCgpIHtcclxuICAvLyAgIGlmICh0aGlzLmxvYWRlZCAmJiB0aGlzLmNvbnRlbnRXaW5kb3dpbmZvICYmIHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuc3ViQXBwbmFtZSkge1xyXG4gIC8vICAgICBjb25zdCBmaXJzdE5hbWUgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VyTmFtZSA/XHJcbiAgLy8gICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlck5hbWUuc3BsaXQoJyAnLCAyKVswXSA6ICcnXHJcbiAgLy8gICAgIGNvbnN0IGxhc3ROYW1lID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlck5hbWUgP1xyXG4gIC8vICAgICAgIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJOYW1lLnNwbGl0KCcgJywgMilbMV0gOiAnJ1xyXG4gIC8vICAgICBjb25zdCB2aWV3TW9kZTogc3RyaW5nID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy52aWV3TW9kZSA/XHJcbiAgLy8gICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy52aWV3TW9kZSA6ICcnXHJcbiAgLy8gICAgIGNvbnN0IHRva2VuID0gdGhpcy5rZXlDbG9ha1N2Yy50b2tlblxyXG4gIC8vICAgICBjb25zdCByZXNwb25zZSA9IHtcclxuICAvLyAgICAgICBzdWJBcHBsaWNhdGlvbk5hbWU6IHRoaXMuc3ViQXBwbmFtZSxcclxuICAvLyAgICAgICByZXF1ZXN0SWQ6ICdDT05URVhUX0NIQU5HRScsXHJcbiAgLy8gICAgICAgcGFyZW50Q29udGV4dDoge1xyXG4gIC8vICAgICAgICAgZG9tYWluTmFtZTogd2luZG93LmxvY2F0aW9uLmhvc3QsXHJcbiAgLy8gICAgICAgICB1cmw6IHRoaXMucm91dGVyLnVybCxcclxuICAvLyAgICAgICAgIHJvb3RPcmc6IHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcsXHJcbiAgLy8gICAgICAgICB0aGVtZTogdGhpcy5jb25maWdTdmMuYWN0aXZlVGhlbWVPYmplY3QgPyB7XHJcbiAgLy8gICAgICAgICAgIG5hbWU6IHRoaXMuY29uZmlnU3ZjLmFjdGl2ZVRoZW1lT2JqZWN0LnRoZW1lTmFtZSxcclxuICAvLyAgICAgICAgICAgLi4udGhpcy5jb25maWdTdmMuYWN0aXZlVGhlbWVPYmplY3QuY29sb3IsXHJcbiAgLy8gICAgICAgICB9IDogJycsXHJcbiAgLy8gICAgICAgICBmb250U2l6ZTogdGhpcy5jb25maWdTdmMuYWN0aXZlRm9udE9iamVjdCA/IHRoaXMuY29uZmlnU3ZjLmFjdGl2ZUZvbnRPYmplY3QuYmFzZUZvbnRTaXplIDogJzE0cHgnLFxyXG4gIC8vICAgICAgICAgbG9jYWxlOiAodGhpcy5jb25maWdTdmMudXNlclByZWZlcmVuY2UgJiYgdGhpcy5jb25maWdTdmMudXNlclByZWZlcmVuY2Uuc2VsZWN0ZWRMb2NhbGUpIHx8ICdlbicsXHJcbiAgLy8gICAgICAgICBkYXJrTW9kZTogdGhpcy5jb25maWdTdmMuaXNEYXJrTW9kZSxcclxuICAvLyAgICAgICAgIHN1YkFwcGxpY2F0aW9uU3RhcnRNb2RlOiB2aWV3TW9kZS50b1VwcGVyQ2FzZSgpLFxyXG4gIC8vICAgICAgICAgdXNlcjoge1xyXG4gIC8vICAgICAgICAgICBmaXJzdE5hbWUsXHJcbiAgLy8gICAgICAgICAgIGxhc3ROYW1lLFxyXG4gIC8vICAgICAgICAgICB0b2tlbixcclxuICAvLyAgICAgICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgPyB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgOiAnJyxcclxuICAvLyAgICAgICAgICAgcm9sZXM6IHRoaXMuY29uZmlnU3ZjLnVzZXJSb2xlcyA/IEFycmF5LmZyb20odGhpcy5jb25maWdTdmMudXNlclJvbGVzKSA6IFtdLFxyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIGhlYXJ0YmVhdEZyZXF1ZW5jeTogJzIwMCcsXHJcbiAgLy8gICAgICAgfSxcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICB0aGlzLmNvbnRlbnRXaW5kb3dpbmZvLnBvc3RNZXNzYWdlKHJlc3BvbnNlLCAnKicpXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { filter } from 'rxjs/operators';
|
|
3
|
-
import { WsEvents } from './event.model';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "./configurations.service";
|
|
6
|
-
import * as i2 from "./event.service";
|
|
7
|
-
import * as i3 from "./logger.service";
|
|
8
|
-
export class TelemetryService {
|
|
9
|
-
constructor(environment, configSvc, eventsSvc, logger) {
|
|
10
|
-
this.configSvc = configSvc;
|
|
11
|
-
this.eventsSvc = eventsSvc;
|
|
12
|
-
this.logger = logger;
|
|
13
|
-
this.previousUrl = null;
|
|
14
|
-
this.telemetryConfig = null;
|
|
15
|
-
this.pData = null;
|
|
16
|
-
this.contextCdata = [];
|
|
17
|
-
this.externalApps = {
|
|
18
|
-
RBCP: 'rbcp-web-ui',
|
|
19
|
-
};
|
|
20
|
-
this.environment = environment;
|
|
21
|
-
const instanceConfig = this.configSvc.instanceConfig;
|
|
22
|
-
if (instanceConfig) {
|
|
23
|
-
this.telemetryConfig = instanceConfig.telemetryConfig;
|
|
24
|
-
this.telemetryConfig = Object.assign(Object.assign({}, this.telemetryConfig), { pdata: Object.assign(Object.assign({}, this.telemetryConfig.pdata), { id: `${environment.name}.${this.telemetryConfig.pdata.id}` }), uid: this.configSvc.userProfile && this.configSvc.userProfile.userId, channel: this.rootOrgId || this.telemetryConfig.channel, sid: this.getTelemetrySessionId });
|
|
25
|
-
this.pData = this.telemetryConfig.pdata;
|
|
26
|
-
this.addPlayerListener();
|
|
27
|
-
this.addCustomEventListener();
|
|
28
|
-
this.addInteractListener();
|
|
29
|
-
this.addFeedbackListener();
|
|
30
|
-
this.addTimeSpentListener();
|
|
31
|
-
this.addSearchListener();
|
|
32
|
-
this.addHearbeatListener();
|
|
33
|
-
this.addCustomImpressionListener();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
get getTelemetrySessionId() {
|
|
37
|
-
return localStorage.getItem('telemetrySessionId') || '';
|
|
38
|
-
}
|
|
39
|
-
get rootOrgId() {
|
|
40
|
-
if (this.configSvc && this.configSvc.userProfile && this.configSvc.userProfile.rootOrgId) {
|
|
41
|
-
return this.configSvc.userProfile.rootOrgId;
|
|
42
|
-
}
|
|
43
|
-
return '';
|
|
44
|
-
}
|
|
45
|
-
start(edata, data, pageContext) {
|
|
46
|
-
try {
|
|
47
|
-
if (this.telemetryConfig) {
|
|
48
|
-
$t.start(this.telemetryConfig, (pageContext && pageContext.pageId) ?
|
|
49
|
-
pageContext.pageId
|
|
50
|
-
: '', '1.0', {
|
|
51
|
-
type: edata.type,
|
|
52
|
-
mode: edata.mode,
|
|
53
|
-
pageid: (pageContext && pageContext.pageId) ?
|
|
54
|
-
pageContext.pageId
|
|
55
|
-
: '',
|
|
56
|
-
duration: 1,
|
|
57
|
-
}, {
|
|
58
|
-
context: Object.assign({ pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }) }, (pageContext && pageContext.module ? { env: pageContext.module } : null)),
|
|
59
|
-
object: Object.assign({}, (data) && data),
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
this.logger.error('Error Initializing Telemetry. Config missing.');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
catch (e) {
|
|
67
|
-
console.log('Error in telemetry start', e);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
end(edata, data, pageContext) {
|
|
71
|
-
try {
|
|
72
|
-
$t.end({
|
|
73
|
-
type: edata.type,
|
|
74
|
-
mode: edata.mode,
|
|
75
|
-
pageid: (pageContext && pageContext.pageId) ?
|
|
76
|
-
pageContext.pageId
|
|
77
|
-
: '',
|
|
78
|
-
}, {
|
|
79
|
-
context: Object.assign({ pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }) }, (pageContext && pageContext.module ? { env: pageContext.module } : null)),
|
|
80
|
-
object: Object.assign({}, (data) && data),
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
catch (e) {
|
|
84
|
-
console.log('Error in telemetry end', e);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
audit(type, props, data) {
|
|
88
|
-
try {
|
|
89
|
-
$t.audit({
|
|
90
|
-
type,
|
|
91
|
-
props,
|
|
92
|
-
state: data,
|
|
93
|
-
prevstate: '',
|
|
94
|
-
duration: '',
|
|
95
|
-
}, {
|
|
96
|
-
context: {
|
|
97
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }),
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
catch (e) {
|
|
102
|
-
console.log('Error in telemetry audit', e);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
heartbeat(type, id) {
|
|
106
|
-
try {
|
|
107
|
-
$t.heartbeat({
|
|
108
|
-
id,
|
|
109
|
-
type,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
catch (e) {
|
|
113
|
-
console.log('Error in telemetry heartbeat', e);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
impression(data) {
|
|
117
|
-
try {
|
|
118
|
-
const page = this.getPageDetails();
|
|
119
|
-
if (data && data.pageContext) {
|
|
120
|
-
page.module = data.pageContext.module;
|
|
121
|
-
}
|
|
122
|
-
const edata = {
|
|
123
|
-
pageid: page.pageid,
|
|
124
|
-
type: page.pageUrlParts[0],
|
|
125
|
-
uri: page.pageUrl,
|
|
126
|
-
};
|
|
127
|
-
if (page.objectId) {
|
|
128
|
-
const config = {
|
|
129
|
-
context: {
|
|
130
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }),
|
|
131
|
-
env: page.module || (this.telemetryConfig && this.telemetryConfig.env),
|
|
132
|
-
},
|
|
133
|
-
object: Object.assign({ id: page.objectId }, ((data) ? data.object : {})),
|
|
134
|
-
};
|
|
135
|
-
$t.impression(edata, config);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
$t.impression(edata, {
|
|
139
|
-
context: {
|
|
140
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }),
|
|
141
|
-
env: page.module || '',
|
|
142
|
-
},
|
|
143
|
-
object: Object.assign({}, ((data) ? data.object : {})),
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
this.previousUrl = page.pageUrl;
|
|
147
|
-
}
|
|
148
|
-
catch (e) {
|
|
149
|
-
console.log('Error in telemetry impression', e);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
externalImpression(impressionData) {
|
|
153
|
-
try {
|
|
154
|
-
const page = this.getPageDetails();
|
|
155
|
-
if (this.externalApps[impressionData.subApplicationName]) {
|
|
156
|
-
const externalConfig = page.objectId ? {
|
|
157
|
-
context: {
|
|
158
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.externalApps[impressionData.subApplicationName] }),
|
|
159
|
-
},
|
|
160
|
-
object: {
|
|
161
|
-
id: page.objectId,
|
|
162
|
-
},
|
|
163
|
-
} : {
|
|
164
|
-
context: {
|
|
165
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.externalApps[impressionData.subApplicationName] }),
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
$t.impression(impressionData.data, externalConfig);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
console.log('Error in telemetry externalImpression', e);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
addCustomImpressionListener() {
|
|
176
|
-
this.eventsSvc.events$
|
|
177
|
-
.pipe(filter((event) => event &&
|
|
178
|
-
event.data &&
|
|
179
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
180
|
-
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Impression))
|
|
181
|
-
.subscribe(event => {
|
|
182
|
-
try {
|
|
183
|
-
this.impression(event.data);
|
|
184
|
-
}
|
|
185
|
-
catch (e) {
|
|
186
|
-
console.log('Error in telemetry impression', e);
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
addTimeSpentListener() {
|
|
191
|
-
this.eventsSvc.events$
|
|
192
|
-
.pipe(filter(event => event &&
|
|
193
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
194
|
-
event.data.type === WsEvents.WsTimeSpentType.Page &&
|
|
195
|
-
event.data.mode &&
|
|
196
|
-
event.data))
|
|
197
|
-
.subscribe(event => {
|
|
198
|
-
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
|
|
199
|
-
this.start({
|
|
200
|
-
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
201
|
-
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
202
|
-
}, {}, event.pageContext);
|
|
203
|
-
}
|
|
204
|
-
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
|
|
205
|
-
this.end({
|
|
206
|
-
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
207
|
-
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
208
|
-
}, {}, event.pageContext);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
addCustomEventListener() {
|
|
213
|
-
this.eventsSvc.events$
|
|
214
|
-
.pipe(filter(event => event &&
|
|
215
|
-
event.eventType === WsEvents.WsEventType.Telemetry))
|
|
216
|
-
.subscribe(event => {
|
|
217
|
-
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
|
|
218
|
-
event.data.type !== WsEvents.WsTimeSpentType.Player) {
|
|
219
|
-
this.start({
|
|
220
|
-
type: event.data.type,
|
|
221
|
-
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
222
|
-
}, event.data.object, event.pageContext);
|
|
223
|
-
}
|
|
224
|
-
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
|
|
225
|
-
event.data.type !== WsEvents.WsTimeSpentType.Player) {
|
|
226
|
-
this.end({
|
|
227
|
-
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
228
|
-
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
229
|
-
}, event.data.object, event.pageContext);
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
addPlayerListener() {
|
|
234
|
-
this.eventsSvc.events$
|
|
235
|
-
.pipe(filter(event => event &&
|
|
236
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
237
|
-
event.data.type === WsEvents.WsTimeSpentType.Player &&
|
|
238
|
-
event.data.mode &&
|
|
239
|
-
event.data))
|
|
240
|
-
.subscribe(event => {
|
|
241
|
-
const content = event.data.content;
|
|
242
|
-
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
|
|
243
|
-
(!content ||
|
|
244
|
-
(content.isIframeSupported || '').toLowerCase() === 'maybe' ||
|
|
245
|
-
(content.isIframeSupported || '').toLowerCase() === 'yes' ||
|
|
246
|
-
(content.mimeType === 'application/pdf' || 'application/json'))) {
|
|
247
|
-
this.start({
|
|
248
|
-
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
249
|
-
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
250
|
-
}, event.data.object, event.pageContext);
|
|
251
|
-
}
|
|
252
|
-
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
|
|
253
|
-
(!content ||
|
|
254
|
-
(content.isIframeSupported || '').toLowerCase() === 'maybe' ||
|
|
255
|
-
(content.isIframeSupported || '').toLowerCase() === 'yes' ||
|
|
256
|
-
(content.mimeType === 'application/pdf' || 'application/json'))) {
|
|
257
|
-
this.end({
|
|
258
|
-
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
259
|
-
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
260
|
-
}, event.data.object, event.pageContext);
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
addInteractListener() {
|
|
265
|
-
this.eventsSvc.events$
|
|
266
|
-
.pipe(filter((event) => event &&
|
|
267
|
-
event.data &&
|
|
268
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
269
|
-
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Interact))
|
|
270
|
-
.subscribe(event => {
|
|
271
|
-
const page = this.getPageDetails();
|
|
272
|
-
if (typeof event.from === 'string' && this.externalApps[event.from]) {
|
|
273
|
-
const externalConfig = {
|
|
274
|
-
context: {
|
|
275
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.externalApps[event.from] }),
|
|
276
|
-
},
|
|
277
|
-
};
|
|
278
|
-
try {
|
|
279
|
-
$t.interact(event.data, externalConfig);
|
|
280
|
-
}
|
|
281
|
-
catch (e) {
|
|
282
|
-
console.log('Error in telemetry interact', e);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
try {
|
|
287
|
-
$t.interact({
|
|
288
|
-
type: event.data.edata.type,
|
|
289
|
-
subtype: event.data.edata.subType,
|
|
290
|
-
id: (event.data.edata && event.data.edata.id) ?
|
|
291
|
-
event.data.edata.id
|
|
292
|
-
: '',
|
|
293
|
-
pageid: event.data.pageContext && event.data.pageContext.pageId || page.pageid,
|
|
294
|
-
}, {
|
|
295
|
-
context: Object.assign({ pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }) }, (event.data.pageContext && event.data.pageContext.module ? { env: event.data.pageContext.module } : null)),
|
|
296
|
-
object: Object.assign({}, event.data.object),
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
catch (e) {
|
|
300
|
-
console.log('Error in telemetry interact', e);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
addFeedbackListener() {
|
|
306
|
-
this.eventsSvc.events$
|
|
307
|
-
.pipe(filter((event) => event &&
|
|
308
|
-
event.data &&
|
|
309
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
310
|
-
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Feedback))
|
|
311
|
-
.subscribe(event => {
|
|
312
|
-
const page = this.getPageDetails();
|
|
313
|
-
try {
|
|
314
|
-
$t.feedback({
|
|
315
|
-
rating: event.data.object.rating || 0,
|
|
316
|
-
commentid: event.data.object.commentid || '',
|
|
317
|
-
commenttxt: event.data.object.commenttxt || '',
|
|
318
|
-
pageid: page.pageid,
|
|
319
|
-
}, {
|
|
320
|
-
context: {
|
|
321
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }),
|
|
322
|
-
},
|
|
323
|
-
object: {
|
|
324
|
-
id: event.data.object.contentId || event.data.object.id || '',
|
|
325
|
-
type: event.data.edata.type || '',
|
|
326
|
-
ver: `${(event.data.object.version || '1')}${''}`,
|
|
327
|
-
rollup: {},
|
|
328
|
-
},
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
catch (e) {
|
|
332
|
-
console.log('Error in telemetry interact', e);
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
addHearbeatListener() {
|
|
337
|
-
this.eventsSvc.events$
|
|
338
|
-
.pipe(filter((event) => event &&
|
|
339
|
-
event.data &&
|
|
340
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
341
|
-
event.data.eventSubType === WsEvents.EnumTelemetrySubType.HeartBeat))
|
|
342
|
-
.subscribe(event => {
|
|
343
|
-
if (typeof event.from === 'string' && this.externalApps[event.from]) {
|
|
344
|
-
const externalConfig = {
|
|
345
|
-
context: {
|
|
346
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.externalApps[event.from] }),
|
|
347
|
-
},
|
|
348
|
-
};
|
|
349
|
-
try {
|
|
350
|
-
$t.heartbeat(event.data, externalConfig);
|
|
351
|
-
}
|
|
352
|
-
catch (e) {
|
|
353
|
-
console.log('Error in telemetry heartbeat', e);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
try {
|
|
358
|
-
$t.heartbeat({
|
|
359
|
-
type: event.data.type,
|
|
360
|
-
id: event.data.id,
|
|
361
|
-
}, {
|
|
362
|
-
context: {
|
|
363
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }),
|
|
364
|
-
},
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
catch (e) {
|
|
368
|
-
console.log('Error in telemetry heartbeat', e);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
addSearchListener() {
|
|
374
|
-
this.eventsSvc.events$
|
|
375
|
-
.pipe(filter((event) => event &&
|
|
376
|
-
event.data &&
|
|
377
|
-
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
378
|
-
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Search))
|
|
379
|
-
.subscribe(event => {
|
|
380
|
-
try {
|
|
381
|
-
$t.search({
|
|
382
|
-
query: event.data.query,
|
|
383
|
-
filters: event.data.filters,
|
|
384
|
-
size: event.data.size,
|
|
385
|
-
}, {
|
|
386
|
-
context: {
|
|
387
|
-
pdata: Object.assign(Object.assign({}, this.pData), { id: this.pData.id }),
|
|
388
|
-
},
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
catch (e) {
|
|
392
|
-
console.log('Error in telemetry search', e);
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
getPageDetails() {
|
|
397
|
-
const path = window.location.pathname.replace('/', '');
|
|
398
|
-
const url = path + window.location.search;
|
|
399
|
-
return {
|
|
400
|
-
pageid: path,
|
|
401
|
-
pageUrl: url,
|
|
402
|
-
pageUrlParts: path.split('/'),
|
|
403
|
-
refferUrl: this.previousUrl,
|
|
404
|
-
objectId: this.extractContentIdFromUrlParts(path.split('/')),
|
|
405
|
-
module: '',
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
extractContentIdFromUrlParts(urlParts) {
|
|
409
|
-
const tocIdx = urlParts.indexOf('toc');
|
|
410
|
-
const viewerIdx = urlParts.indexOf('viewer');
|
|
411
|
-
if (tocIdx === -1 && viewerIdx === -1) {
|
|
412
|
-
return null;
|
|
413
|
-
}
|
|
414
|
-
if (tocIdx !== -1 && tocIdx < urlParts.length - 1) {
|
|
415
|
-
return urlParts[tocIdx + 1];
|
|
416
|
-
}
|
|
417
|
-
if (viewerIdx !== -1 && viewerIdx < urlParts.length - 2) {
|
|
418
|
-
return urlParts[viewerIdx + 2];
|
|
419
|
-
}
|
|
420
|
-
return null;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
TelemetryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TelemetryService, deps: [{ token: 'environment' }, { token: i1.ConfigurationsService }, { token: i2.EventService }, { token: i3.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
424
|
-
TelemetryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TelemetryService, providedIn: 'root' });
|
|
425
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TelemetryService, decorators: [{
|
|
426
|
-
type: Injectable,
|
|
427
|
-
args: [{
|
|
428
|
-
providedIn: 'root',
|
|
429
|
-
}]
|
|
430
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
431
|
-
type: Inject,
|
|
432
|
-
args: ['environment']
|
|
433
|
-
}] }, { type: i1.ConfigurationsService }, { type: i2.EventService }, { type: i3.LoggerService }]; } });
|
|
434
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdXRpbHMvc3JjL2xpYi9zZXJ2aWNlcy90ZWxlbWV0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFJdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTs7Ozs7QUFVeEMsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQixZQUN5QixXQUFnQixFQUMvQixTQUFnQyxFQUNoQyxTQUF1QixFQUV2QixNQUFxQjtRQUhyQixjQUFTLEdBQVQsU0FBUyxDQUF1QjtRQUNoQyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBRXZCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFkL0IsZ0JBQVcsR0FBa0IsSUFBSSxDQUFBO1FBQ2pDLG9CQUFlLEdBQTZDLElBQUksQ0FBQTtRQUNoRSxVQUFLLEdBQVEsSUFBSSxDQUFBO1FBQ2pCLGlCQUFZLEdBQUcsRUFBRSxDQUFBO1FBR2pCLGlCQUFZLEdBQVE7WUFDbEIsSUFBSSxFQUFFLGFBQWE7U0FDcEIsQ0FBQTtRQVFDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFBO1FBQ3BELElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQTtZQUNyRCxJQUFJLENBQUMsZUFBZSxtQ0FDZixJQUFJLENBQUMsZUFBZSxLQUN2QixLQUFLLGtDQUNBLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUU3QixFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFB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QUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTVDLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQTtTQUNaO1FBRUQsSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUM1QjtRQUVELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RCxPQUFPLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUE7U0FDL0I7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7OzhHQXZtQlUsZ0JBQWdCLGtCQVdqQixhQUFhO2tIQVhaLGdCQUFnQixjQUZmLE1BQU07NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBWUksTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbi8vIGltcG9ydCB7IEF1dGhLZXljbG9ha1NlcnZpY2UgfSBmcm9tICcuL2F1dGgta2V5Y2xvYWsuc2VydmljZSdcclxuaW1wb3J0IHsgTnNJbnN0YW5jZUNvbmZpZyB9IGZyb20gJy4vY29uZmlndXJhdGlvbnMubW9kZWwnXHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbnMuc2VydmljZSdcclxuaW1wb3J0IHsgV3NFdmVudHMgfSBmcm9tICcuL2V2ZW50Lm1vZGVsJ1xyXG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgfSBmcm9tICcuL2V2ZW50LnNlcnZpY2UnXHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuL2xvZ2dlci5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xyXG5cclxuZGVjbGFyZSB2YXIgJHQ6IGFueVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbGVtZXRyeVNlcnZpY2Uge1xyXG4gIHByZXZpb3VzVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbFxyXG4gIHRlbGVtZXRyeUNvbmZpZzogTnNJbnN0YW5jZUNvbmZpZy5JVGVsZW1ldHJ5Q29uZmlnIHwgbnVsbCA9IG51bGxcclxuICBwRGF0YTogYW55ID0gbnVsbFxyXG4gIGNvbnRleHRDZGF0YSA9IFtdXHJcbiAgZW52aXJvbm1lbnQ6IGFueVxyXG5cclxuICBleHRlcm5hbEFwcHM6IGFueSA9IHtcclxuICAgIFJCQ1A6ICdyYmNwLXdlYi11aScsXHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55LFxyXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgZXZlbnRzU3ZjOiBFdmVudFNlcnZpY2UsXHJcbiAgICAvLyBwcml2YXRlIGF1dGhTdmM6IEF1dGhLZXljbG9ha1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxyXG4gICAgY29uc3QgaW5zdGFuY2VDb25maWcgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZ1xyXG4gICAgaWYgKGluc3RhbmNlQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMudGVsZW1ldHJ5Q29uZmlnID0gaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnXHJcbiAgICAgIHRoaXMudGVsZW1ldHJ5Q29uZmlnID0ge1xyXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5Q29uZmlnLFxyXG4gICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUNvbmZpZy5wZGF0YSxcclxuICAgICAgICAgIC8vIHBpZDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcclxuICAgICAgICAgIGlkOiBgJHtlbnZpcm9ubWVudC5uYW1lfS4ke3RoaXMudGVsZW1ldHJ5Q29uZmlnLnBkYXRhLmlkfWAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB1aWQ6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCxcclxuICAgICAgICAvLyBhdXRodG9rZW46IHRoaXMuYXV0aFN2Yy50b2tlbixcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgIGNoYW5uZWw6IHRoaXMucm9vdE9yZ0lkIHx8IHRoaXMudGVsZW1ldHJ5Q29uZmlnLmNoYW5uZWwsXHJcbiAgICAgICAgc2lkOiB0aGlzLmdldFRlbGVtZXRyeVNlc3Npb25JZCxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBEYXRhID0gdGhpcy50ZWxlbWV0cnlDb25maWcucGRhdGFcclxuICAgICAgdGhpcy5hZGRQbGF5ZXJMaXN0ZW5lcigpXHJcbiAgICAgIHRoaXMuYWRkQ3VzdG9tRXZlbnRMaXN0ZW5lcigpXHJcbiAgICAgIHRoaXMuYWRkSW50ZXJhY3RMaXN0ZW5lcigpXHJcbiAgICAgIHRoaXMuYWRkRmVlZGJhY2tMaXN0ZW5lcigpXHJcbiAgICAgIHRoaXMuYWRkVGltZVNwZW50TGlzdGVuZXIoKVxyXG4gICAgICB0aGlzLmFkZFNlYXJjaExpc3RlbmVyKClcclxuICAgICAgdGhpcy5hZGRIZWFyYmVhdExpc3RlbmVyKClcclxuICAgICAgdGhpcy5hZGRDdXN0b21JbXByZXNzaW9uTGlzdGVuZXIoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGdldFRlbGVtZXRyeVNlc3Npb25JZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0ZWxlbWV0cnlTZXNzaW9uSWQnKSB8fCAnJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJvb3RPcmdJZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkXHJcbiAgICB9XHJcbiAgICByZXR1cm4gJydcclxuICB9XHJcblxyXG4gIHN0YXJ0KGVkYXRhOiBhbnksIGRhdGE6IGFueSwgcGFnZUNvbnRleHQ/OiBXc0V2ZW50cy5JVGVsZW1ldHJ5UGFnZUNvbnRleHQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnRlbGVtZXRyeUNvbmZpZykge1xyXG4gICAgICAgICR0LnN0YXJ0KFxyXG4gICAgICAgICAgdGhpcy50ZWxlbWV0cnlDb25maWcsXHJcbiAgICAgICAgICAocGFnZUNvbnRleHQgJiYgcGFnZUNvbnRleHQucGFnZUlkKSA/XHJcbiAgICAgICAgICAgIHBhZ2VDb250ZXh0LnBhZ2VJZFxyXG4gICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgJzEuMCcsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIGlkLFxyXG4gICAgICAgICAgICB0eXBlOiBlZGF0YS50eXBlLFxyXG4gICAgICAgICAgICBtb2RlOiBlZGF0YS5tb2RlLFxyXG4gICAgICAgICAgICBwYWdlaWQ6IChwYWdlQ29udGV4dCAmJiBwYWdlQ29udGV4dC5wYWdlSWQpID9cclxuICAgICAgICAgICAgICBwYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgLi4uKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0Lm1vZHVsZSA/IHsgZW52OiBwYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAuLi4oZGF0YSkgJiYgZGF0YSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIEluaXRpYWxpemluZyBUZWxlbWV0cnkuIENvbmZpZyBtaXNzaW5nLicpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgc3RhcnQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5kKGVkYXRhOiBhbnksIGRhdGE6IGFueSwgcGFnZUNvbnRleHQ/OiBXc0V2ZW50cy5JVGVsZW1ldHJ5UGFnZUNvbnRleHQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICR0LmVuZChcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0eXBlOiBlZGF0YS50eXBlLFxyXG4gICAgICAgICAgbW9kZTogZWRhdGEubW9kZSxcclxuICAgICAgICAgIHBhZ2VpZDogKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0LnBhZ2VJZCkgP1xyXG4gICAgICAgICAgICBwYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi4ocGFnZUNvbnRleHQgJiYgcGFnZUNvbnRleHQubW9kdWxlID8geyBlbnY6IHBhZ2VDb250ZXh0Lm1vZHVsZSB9IDogbnVsbCksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgIC4uLihkYXRhKSAmJiBkYXRhLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICApXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGVuZCcsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpdCh0eXBlOiBzdHJpbmcsIHByb3BzOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgJHQuYXVkaXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIHByb3BzLFxyXG4gICAgICAgICAgLy8gZGF0YSxcclxuICAgICAgICAgIHN0YXRlOiBkYXRhLCAvLyBPcHRpb25hbC4gQ3VycmVudCBTdGF0ZVxyXG4gICAgICAgICAgcHJldnN0YXRlOiAnJywgLy8gT3B0aW9uYWwuIFByZXZpb3VzIFN0YXRlXHJcbiAgICAgICAgICBkdXJhdGlvbjogJycsIC8vIE9wdGlvbmFsLlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIClcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgYXVkaXQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGVhcnRiZWF0KHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgJHQuaGVhcnRiZWF0KHtcclxuICAgICAgICBpZCxcclxuICAgICAgICAvLyBtb2RlLFxyXG4gICAgICAgIHR5cGUsXHJcbiAgICAgIH0pXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGhlYXJ0YmVhdCcsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbXByZXNzaW9uKGRhdGE/OiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5wYWdlQ29udGV4dCkge1xyXG4gICAgICAgIC8vIHBhZ2UucGFnZWlkID0gZGF0YS5wYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICBwYWdlLm1vZHVsZSA9IGRhdGEucGFnZUNvbnRleHQubW9kdWxlXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZWRhdGEgPSB7XHJcbiAgICAgICAgcGFnZWlkOiBwYWdlLnBhZ2VpZCwgLy8gUmVxdWlyZWQuIFVuaXF1ZSBwYWdlIGlkXHJcbiAgICAgICAgdHlwZTogcGFnZS5wYWdlVXJsUGFydHNbMF0sIC8vIFJlcXVpcmVkLiBJbXByZXNzaW9uIHR5cGUgKGxpc3QsIGRldGFpbCwgdmlldywgZWRpdCwgd29ya2Zsb3csIHNlYXJjaClcclxuICAgICAgICB1cmk6IHBhZ2UucGFnZVVybCxcclxuICAgICAgfVxyXG4gICAgICBpZiAocGFnZS5vYmplY3RJZCkge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbnY6IHBhZ2UubW9kdWxlIHx8ICh0aGlzLnRlbGVtZXRyeUNvbmZpZyAmJiB0aGlzLnRlbGVtZXRyeUNvbmZpZy5lbnYpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICBpZDogcGFnZS5vYmplY3RJZCxcclxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGFib3ZlIGlkIGlmIHRoZSBkYXRhIGhhcyBvYmplY3QgaW4gaXQuXHJcbiAgICAgICAgICAgIC4uLigoZGF0YSkgPyBkYXRhLm9iamVjdCA6IHt9KSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICAgICR0LmltcHJlc3Npb24oZWRhdGEsIGNvbmZpZylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkdC5pbXByZXNzaW9uKGVkYXRhLCB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZW52OiBwYWdlLm1vZHVsZSB8fCAnJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgLi4uKChkYXRhKSA/IGRhdGEub2JqZWN0IDoge30pLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucHJldmlvdXNVcmwgPSBwYWdlLnBhZ2VVcmxcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW1wcmVzc2lvbicsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHRlcm5hbEltcHJlc3Npb24oaW1wcmVzc2lvbkRhdGE6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZ2V0UGFnZURldGFpbHMoKVxyXG4gICAgICBpZiAodGhpcy5leHRlcm5hbEFwcHNbaW1wcmVzc2lvbkRhdGEuc3ViQXBwbGljYXRpb25OYW1lXSkge1xyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0gcGFnZS5vYmplY3RJZCA/IHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLmV4dGVybmFsQXBwc1tpbXByZXNzaW9uRGF0YS5zdWJBcHBsaWNhdGlvbk5hbWVdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICBpZDogcGFnZS5vYmplY3RJZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSA6IHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLmV4dGVybmFsQXBwc1tpbXByZXNzaW9uRGF0YS5zdWJBcHBsaWNhdGlvbk5hbWVdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgICAgJHQuaW1wcmVzc2lvbihpbXByZXNzaW9uRGF0YS5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBleHRlcm5hbEltcHJlc3Npb24nLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQ3VzdG9tSW1wcmVzc2lvbkxpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlJbXByZXNzaW9uKSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbXByZXNzaW9uLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdldmVudC5kYXRhOjonLCBldmVudC5kYXRhKVxyXG4gICAgICAgICAgdGhpcy5pbXByZXNzaW9uKGV2ZW50LmRhdGEpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGltcHJlc3Npb24nLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZFRpbWVTcGVudExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICBldmVudCA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLnR5cGUgPT09IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QYWdlICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5VbmxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoe1xyXG4gICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRDdXN0b21FdmVudExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICBldmVudCA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeVxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkICYmXHJcbiAgICAgICAgICBldmVudC5kYXRhLnR5cGUgIT09IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQgJiZcclxuICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSAhPT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllclxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcbiAgYWRkUGxheWVyTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSA9PT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllciAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm1vZGUgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YSxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBldmVudC5kYXRhLmNvbnRlbnRcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQgJiZcclxuICAgICAgICAgICghY29udGVudCB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ21heWJlJyB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3llcycgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnIHx8ICdhcHBsaWNhdGlvbi9qc29uJykpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkICYmXHJcbiAgICAgICAgICAoIWNvbnRlbnQgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQuaXNJZnJhbWVTdXBwb3J0ZWQgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdtYXliZScgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQuaXNJZnJhbWVTdXBwb3J0ZWQgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd5ZXMnIHx8XHJcbiAgICAgICAgICAgIChjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyB8fCAnYXBwbGljYXRpb24vanNvbicpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5lbmQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEludGVyYWN0TGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUludGVyYWN0KSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmZyb20gPT09ICdzdHJpbmcnICYmIHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dKSB7XHJcbiAgICAgICAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IHtcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAkdC5pbnRlcmFjdChldmVudC5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW50ZXJhY3QnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBsZXQgaW50ZXJhY3RpZFxyXG4gICAgICAgICAgLy8gaWYgKGV2ZW50LmRhdGEuZWRhdGEudHlwZSA9PT0gJ2dvYWwnKSB7XHJcbiAgICAgICAgICAvLyAgIGludGVyYWN0aWQgPSBwYWdlLnBhZ2VVcmxQYXJ0c1s0XVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgJHQuaW50ZXJhY3QoXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS5lZGF0YS50eXBlLFxyXG4gICAgICAgICAgICAgICAgc3VidHlwZTogZXZlbnQuZGF0YS5lZGF0YS5zdWJUeXBlLFxyXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0OiBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgIGlkOiAoZXZlbnQuZGF0YS5lZGF0YSAmJiBldmVudC5kYXRhLmVkYXRhLmlkKSA/XHJcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuZWRhdGEuaWRcclxuICAgICAgICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICAgICAgICAgIHBhZ2VpZDogZXZlbnQuZGF0YS5wYWdlQ29udGV4dCAmJiBldmVudC5kYXRhLnBhZ2VDb250ZXh0LnBhZ2VJZCB8fCBwYWdlLnBhZ2VpZCxcclxuICAgICAgICAgICAgICAgIC8vIHRhcmdldDogeyBwYWdlIH0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgLi4uKGV2ZW50LmRhdGEucGFnZUNvbnRleHQgJiYgZXZlbnQuZGF0YS5wYWdlQ29udGV4dC5tb2R1bGUgPyB7IGVudjogZXZlbnQuZGF0YS5wYWdlQ29udGV4dC5tb2R1bGUgfSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5ldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaW50ZXJhY3QnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEZlZWRiYWNrTGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIChldmVudDogV3NFdmVudHMuV3NFdmVudFRlbGVtZXRyeUZlZWRiYWNrKSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5GZWVkYmFjayxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgJHQuZmVlZGJhY2soXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICByYXRpbmc6IGV2ZW50LmRhdGEub2JqZWN0LnJhdGluZyB8fCAwLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnRpZDogZXZlbnQuZGF0YS5vYmplY3QuY29tbWVudGlkIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGNvbW1lbnR0eHQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbW1lbnR0eHQgfHwgJycsXHJcbiAgICAgICAgICAgICAgcGFnZWlkOiBwYWdlLnBhZ2VpZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbnRlbnRJZCB8fCBldmVudC5kYXRhLm9iamVjdC5pZCB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEuZWRhdGEudHlwZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgIHZlcjogYCR7KGV2ZW50LmRhdGEub2JqZWN0LnZlcnNpb24gfHwgJzEnKX0keycnfWAsXHJcbiAgICAgICAgICAgICAgICByb2xsdXA6IHt9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGludGVyYWN0JywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRIZWFyYmVhdExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlIZWFydEJlYXQpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkhlYXJ0QmVhdCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZnJvbSA9PT0gJ3N0cmluZycgJiYgdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0pIHtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICR0LmhlYXJ0YmVhdChldmVudC5kYXRhLCBleHRlcm5hbENvbmZpZylcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaGVhcnRiZWF0JywgZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgJHQuaGVhcnRiZWF0KFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSxcclxuICAgICAgICAgICAgICAgIC8vIHN1YnR5cGU6IGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlLFxyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmRhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICAvLyBtaW1lVHlwZTogZXZlbnQuZGF0YS5taW1lVHlwZSxcclxuICAgICAgICAgICAgICAgIC8vIG1vZGU6IGV2ZW50LmRhdGEubW9kZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBoZWFydGJlYXQnLCBlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZFNlYXJjaExpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlTZWFyY2gpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlNlYXJjaCxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAkdC5zZWFyY2goXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBxdWVyeTogZXZlbnQuZGF0YS5xdWVyeSxcclxuICAgICAgICAgICAgICBmaWx0ZXJzOiBldmVudC5kYXRhLmZpbHRlcnMsXHJcbiAgICAgICAgICAgICAgc2l6ZTogZXZlbnQuZGF0YS5zaXplLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IHNlYXJjaCcsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZURldGFpbHMoKSB7XHJcbiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoJy8nLCAnJylcclxuICAgIGNvbnN0IHVybCA9IHBhdGggKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYWdlaWQ6IHBhdGgsXHJcbiAgICAgIHBhZ2VVcmw6IHVybCxcclxuICAgICAgcGFnZVVybFBhcnRzOiBwYXRoLnNwbGl0KCcvJyksXHJcbiAgICAgIHJlZmZlclVybDogdGhpcy5wcmV2aW91c1VybCxcclxuICAgICAgb2JqZWN0SWQ6IHRoaXMuZXh0cmFjdENvbnRlbnRJZEZyb21VcmxQYXJ0cyhwYXRoLnNwbGl0KCcvJykpLFxyXG4gICAgICBtb2R1bGU6ICcnLFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXh0cmFjdENvbnRlbnRJZEZyb21VcmxQYXJ0cyh1cmxQYXJ0czogc3RyaW5nW10pIHtcclxuICAgIC8vIFRPRE86IHBpY2sgdG9jIGFuZCB2aWV3ZXIgdXJsIGZyb20gc29tZSBjb25maWd1cmF0aW9uXHJcbiAgICBjb25zdCB0b2NJZHggPSB1cmxQYXJ0cy5pbmRleE9mKCd0b2MnKVxyXG4gICAgY29uc3Qgdmlld2VySWR4ID0gdXJsUGFydHMuaW5kZXhPZigndmlld2VyJylcclxuXHJcbiAgICBpZiAodG9jSWR4ID09PSAtMSAmJiB2aWV3ZXJJZHggPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRvY0lkeCAhPT0gLTEgJiYgdG9jSWR4IDwgdXJsUGFydHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm4gdXJsUGFydHNbdG9jSWR4ICsgMV0gLy8gZS5nLiB1cmwgL2FwcC90b2MvPGNvbnRlbnRfaWQ+XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZpZXdlcklkeCAhPT0gLTEgJiYgdmlld2VySWR4IDwgdXJsUGFydHMubGVuZ3RoIC0gMikge1xyXG4gICAgICByZXR1cm4gdXJsUGFydHNbdmlld2VySWR4ICsgMl0gLy8gZS5nLiB1cmwgL2FwcC92aWV3ZXIvPGNvbnRlbnRfdHlwZT4vPGNvbnRlbnRfaWQ+XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcbn1cclxuIl19
|