@jeraldj/discussions-ui 8.0.3-v16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/assets/images/Buffer-512.webp +0 -0
- package/assets/images/announcement.svg +25 -0
- package/assets/images/back-img.png +0 -0
- package/assets/images/bookmarks.png +0 -0
- package/assets/images/card-icon.png +0 -0
- package/assets/images/close.png +0 -0
- package/assets/images/delete.svg +13 -0
- package/assets/images/down-arrow.png +0 -0
- package/assets/images/down-chevron.png +0 -0
- package/assets/images/down.svg +12 -0
- package/assets/images/edit.svg +11 -0
- package/assets/images/empty.svg +37 -0
- package/assets/images/eye-icon.png +0 -0
- package/assets/images/general discussion.svg +15 -0
- package/assets/images/import-export-arrows.png +0 -0
- package/assets/images/loader-icon.svg +6 -0
- package/assets/images/profits.png +0 -0
- package/assets/images/search-icon.png +0 -0
- package/assets/images/select-bookmarks.png +0 -0
- package/assets/images/select-down-arrow.png +0 -0
- package/assets/images/select-profits.png +0 -0
- package/assets/images/select-up-arrow.png +0 -0
- package/assets/images/up-arrow.png +0 -0
- package/assets/images/up-chevron.png +0 -0
- package/assets/images/up.svg +12 -0
- package/assets/images/views.svg +9 -0
- package/assets/images/votes.svg +14 -0
- package/assets/styles/global.scss +283 -0
- package/esm2022/jeraldj-discussions-ui.mjs +5 -0
- package/esm2022/lib/common/constants.json +630 -0
- package/esm2022/lib/components/components.module.mjs +105 -0
- package/esm2022/lib/components/discuss-all/discuss-all.component.mjs +269 -0
- package/esm2022/lib/components/discuss-category/discuss-category.component.mjs +152 -0
- package/esm2022/lib/components/discuss-home/discuss-home.component.mjs +142 -0
- package/esm2022/lib/components/discuss-start/discuss-start.component.mjs +199 -0
- package/esm2022/lib/components/discuss-tags/discuss-tags.component.mjs +93 -0
- package/esm2022/lib/components/discussion-details/discussion-details.component.mjs +459 -0
- package/esm2022/lib/components/lib-entry/lib-entry.component.mjs +96 -0
- package/esm2022/lib/components/my-discussion/my-discussion.component.mjs +234 -0
- package/esm2022/lib/components/side-pannel/side-pannel.component.mjs +79 -0
- package/esm2022/lib/components/tag-all-discussion/tag-all-discussion.component.mjs +151 -0
- package/esm2022/lib/components/trending-tags/trending-tags.component.mjs +62 -0
- package/esm2022/lib/config/url.config.mjs +32 -0
- package/esm2022/lib/discussion-events.service.mjs +27 -0
- package/esm2022/lib/discussion-routing/discussion-routing.module.mjs +80 -0
- package/esm2022/lib/discussion-ui.module.mjs +41 -0
- package/esm2022/lib/elements/app-loader/app-loader.component.mjs +36 -0
- package/esm2022/lib/elements/avatar-photo/avatar-photo.component.mjs +81 -0
- package/esm2022/lib/elements/category-card/category-card.component.mjs +17 -0
- package/esm2022/lib/elements/discuss-card/discuss-card.component.mjs +45 -0
- package/esm2022/lib/elements/elements.module.mjs +69 -0
- package/esm2022/lib/elements/load-alert/load-alert.component.mjs +34 -0
- package/esm2022/lib/elements/post-reply/post-reply.component.mjs +69 -0
- package/esm2022/lib/elements/related-discussion/related-discussion.component.mjs +61 -0
- package/esm2022/lib/elements/sliders/sliders.component.mjs +76 -0
- package/esm2022/lib/events.service.mjs +31 -0
- package/esm2022/lib/models/discuss.model.mjs +16 -0
- package/esm2022/lib/models/discussion-config.model.mjs +2 -0
- package/esm2022/lib/navigation-service.service.mjs +39 -0
- package/esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs +20 -0
- package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs +22 -0
- package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs +41 -0
- package/esm2022/lib/pipes/pipes.module.mjs +24 -0
- package/esm2022/lib/pipes/sort-by/sort-by.pipe.mjs +34 -0
- package/esm2022/lib/pipes/split-initials/split-initials.pipe.mjs +23 -0
- package/esm2022/lib/router-service.service.mjs +21 -0
- package/esm2022/lib/services/abstract-config.service.mjs +3 -0
- package/esm2022/lib/services/config.service.mjs +76 -0
- package/esm2022/lib/services/discuss-utils.service.mjs +36 -0
- package/esm2022/lib/services/discussion.service.mjs +254 -0
- package/esm2022/lib/telemetry-utils.service.mjs +103 -0
- package/esm2022/lib/wrapper/base-wrapper/base-wrapper.component.mjs +41 -0
- package/esm2022/lib/wrapper/category-widget/category-widget.component.mjs +37 -0
- package/esm2022/lib/wrapper/tags-widget/tags-widget.component.mjs +33 -0
- package/esm2022/lib/wrapper-navigate.service.mjs +23 -0
- package/esm2022/public-api.mjs +29 -0
- package/fesm2022/jeraldj-discussions-ui.mjs +3929 -0
- package/fesm2022/jeraldj-discussions-ui.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/jeraldj-discussions-ui.d.ts.map +1 -0
- package/lib/components/components.module.d.ts +24 -0
- package/lib/components/components.module.d.ts.map +1 -0
- package/lib/components/discuss-all/discuss-all.component.d.ts +61 -0
- package/lib/components/discuss-all/discuss-all.component.d.ts.map +1 -0
- package/lib/components/discuss-category/discuss-category.component.d.ts +45 -0
- package/lib/components/discuss-category/discuss-category.component.d.ts.map +1 -0
- package/lib/components/discuss-home/discuss-home.component.d.ts +59 -0
- package/lib/components/discuss-home/discuss-home.component.d.ts.map +1 -0
- package/lib/components/discuss-start/discuss-start.component.d.ts +50 -0
- package/lib/components/discuss-start/discuss-start.component.d.ts.map +1 -0
- package/lib/components/discuss-tags/discuss-tags.component.d.ts +41 -0
- package/lib/components/discuss-tags/discuss-tags.component.d.ts.map +1 -0
- package/lib/components/discussion-details/discussion-details.component.d.ts +112 -0
- package/lib/components/discussion-details/discussion-details.component.d.ts.map +1 -0
- package/lib/components/lib-entry/lib-entry.component.d.ts +42 -0
- package/lib/components/lib-entry/lib-entry.component.d.ts.map +1 -0
- package/lib/components/my-discussion/my-discussion.component.d.ts +54 -0
- package/lib/components/my-discussion/my-discussion.component.d.ts.map +1 -0
- package/lib/components/side-pannel/side-pannel.component.d.ts +34 -0
- package/lib/components/side-pannel/side-pannel.component.d.ts.map +1 -0
- package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts +53 -0
- package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts.map +1 -0
- package/lib/components/trending-tags/trending-tags.component.d.ts +26 -0
- package/lib/components/trending-tags/trending-tags.component.d.ts.map +1 -0
- package/lib/config/url.config.d.ts +29 -0
- package/lib/config/url.config.d.ts.map +1 -0
- package/lib/discussion-events.service.d.ts +12 -0
- package/lib/discussion-events.service.d.ts.map +1 -0
- package/lib/discussion-routing/discussion-routing.module.d.ts +9 -0
- package/lib/discussion-routing/discussion-routing.module.d.ts.map +1 -0
- package/lib/discussion-ui.module.d.ts +16 -0
- package/lib/discussion-ui.module.d.ts.map +1 -0
- package/lib/elements/app-loader/app-loader.component.d.ts +17 -0
- package/lib/elements/app-loader/app-loader.component.d.ts.map +1 -0
- package/lib/elements/avatar-photo/avatar-photo.component.d.ts +19 -0
- package/lib/elements/avatar-photo/avatar-photo.component.d.ts.map +1 -0
- package/lib/elements/category-card/category-card.component.d.ts +10 -0
- package/lib/elements/category-card/category-card.component.d.ts.map +1 -0
- package/lib/elements/discuss-card/discuss-card.component.d.ts +17 -0
- package/lib/elements/discuss-card/discuss-card.component.d.ts.map +1 -0
- package/lib/elements/elements.module.d.ts +18 -0
- package/lib/elements/elements.module.d.ts.map +1 -0
- package/lib/elements/load-alert/load-alert.component.d.ts +15 -0
- package/lib/elements/load-alert/load-alert.component.d.ts.map +1 -0
- package/lib/elements/post-reply/post-reply.component.d.ts +22 -0
- package/lib/elements/post-reply/post-reply.component.d.ts.map +1 -0
- package/lib/elements/related-discussion/related-discussion.component.d.ts +26 -0
- package/lib/elements/related-discussion/related-discussion.component.d.ts.map +1 -0
- package/lib/elements/sliders/sliders.component.d.ts +18 -0
- package/lib/elements/sliders/sliders.component.d.ts.map +1 -0
- package/lib/events.service.d.ts +18 -0
- package/lib/events.service.d.ts.map +1 -0
- package/lib/models/discuss.model.d.ts +298 -0
- package/lib/models/discuss.model.d.ts.map +1 -0
- package/lib/models/discussion-config.model.d.ts +42 -0
- package/lib/models/discussion-config.model.d.ts.map +1 -0
- package/lib/navigation-service.service.d.ts +22 -0
- package/lib/navigation-service.service.d.ts.map +1 -0
- package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +8 -0
- package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts.map +1 -0
- package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +8 -0
- package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts.map +1 -0
- package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +8 -0
- package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts.map +1 -0
- package/lib/pipes/pipes.module.d.ts +13 -0
- package/lib/pipes/pipes.module.d.ts.map +1 -0
- package/lib/pipes/sort-by/sort-by.pipe.d.ts +8 -0
- package/lib/pipes/sort-by/sort-by.pipe.d.ts.map +1 -0
- package/lib/pipes/split-initials/split-initials.pipe.d.ts +8 -0
- package/lib/pipes/split-initials/split-initials.pipe.d.ts.map +1 -0
- package/lib/router-service.service.d.ts +10 -0
- package/lib/router-service.service.d.ts.map +1 -0
- package/lib/services/abstract-config.service.d.ts +4 -0
- package/lib/services/abstract-config.service.d.ts.map +1 -0
- package/lib/services/config.service.d.ts +36 -0
- package/lib/services/config.service.d.ts.map +1 -0
- package/lib/services/discuss-utils.service.d.ts +14 -0
- package/lib/services/discuss-utils.service.d.ts.map +1 -0
- package/lib/services/discussion.service.d.ts +76 -0
- package/lib/services/discussion.service.d.ts.map +1 -0
- package/lib/telemetry-utils.service.d.ts +20 -0
- package/lib/telemetry-utils.service.d.ts.map +1 -0
- package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts +22 -0
- package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts.map +1 -0
- package/lib/wrapper/category-widget/category-widget.component.d.ts +23 -0
- package/lib/wrapper/category-widget/category-widget.component.d.ts.map +1 -0
- package/lib/wrapper/tags-widget/tags-widget.component.d.ts +17 -0
- package/lib/wrapper/tags-widget/tags-widget.component.d.ts.map +1 -0
- package/lib/wrapper-navigate.service.d.ts +11 -0
- package/lib/wrapper-navigate.service.d.ts.map +1 -0
- package/package.json +44 -0
- package/public-api.d.ts +26 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { NSDiscussData } from './../../models/discuss.model';
|
|
3
|
+
import * as CONSTANTS from '../../common/constants.json';
|
|
4
|
+
/* tslint:disable */
|
|
5
|
+
import * as _ from 'lodash';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/router";
|
|
8
|
+
import * as i2 from "./../../services/discussion.service";
|
|
9
|
+
import * as i3 from "../../services/config.service";
|
|
10
|
+
import * as i4 from "@angular/forms";
|
|
11
|
+
import * as i5 from "./../../telemetry-utils.service";
|
|
12
|
+
import * as i6 from "@angular/common";
|
|
13
|
+
import * as i7 from "../../navigation-service.service";
|
|
14
|
+
import * as i8 from "../../elements/app-loader/app-loader.component";
|
|
15
|
+
import * as i9 from "../../elements/related-discussion/related-discussion.component";
|
|
16
|
+
import * as i10 from "../../elements/post-reply/post-reply.component";
|
|
17
|
+
import * as i11 from "../discuss-start/discuss-start.component";
|
|
18
|
+
import * as i12 from "../../pipes/pipe-filter/pipe-filter.pipe";
|
|
19
|
+
import * as i13 from "../../pipes/sort-by/sort-by.pipe";
|
|
20
|
+
import * as i14 from "../../pipes/split-initials/split-initials.pipe";
|
|
21
|
+
const MSGS = {
|
|
22
|
+
deletePost: `Are you sure you want to delete this Post? This can't be undone.`,
|
|
23
|
+
deleteTopic: `Are you sure you want to delete this topic? Your action cannot be undone.`
|
|
24
|
+
};
|
|
25
|
+
export class DiscussionDetailsComponent {
|
|
26
|
+
constructor(route, discussionService, configService, formBuilder, router, telemetryUtils, renderer, location, navigationService) {
|
|
27
|
+
this.route = route;
|
|
28
|
+
this.discussionService = discussionService;
|
|
29
|
+
this.configService = configService;
|
|
30
|
+
this.formBuilder = formBuilder;
|
|
31
|
+
this.router = router;
|
|
32
|
+
this.telemetryUtils = telemetryUtils;
|
|
33
|
+
this.renderer = renderer;
|
|
34
|
+
this.location = location;
|
|
35
|
+
this.navigationService = navigationService;
|
|
36
|
+
this.stateChange = new EventEmitter();
|
|
37
|
+
this.currentActivePage = 1;
|
|
38
|
+
this.currentFilter = 'timestamp'; // 'recent
|
|
39
|
+
this.pager = {};
|
|
40
|
+
this.fetchSingleCategoryLoader = false;
|
|
41
|
+
this.editMode = false;
|
|
42
|
+
this.updatedPost = false;
|
|
43
|
+
this.showEditTopicModal = false;
|
|
44
|
+
this.dropdownContent = true;
|
|
45
|
+
this.showLoader = false;
|
|
46
|
+
/**
|
|
47
|
+
* @description - It will check for the outside click while kebab menu is in open mode.
|
|
48
|
+
*/
|
|
49
|
+
this.renderer.listen('window', 'click', (e) => {
|
|
50
|
+
// tslint:disable-next-line:no-string-literal
|
|
51
|
+
if (e.target['id'] !== 'group-actions') {
|
|
52
|
+
this.dropdownContent = true;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
this.initializeFormFiled();
|
|
58
|
+
if (this.widget) {
|
|
59
|
+
this.fetchSingleCategoryLoader = true;
|
|
60
|
+
}
|
|
61
|
+
if (!this.topicId && !this.slug) {
|
|
62
|
+
this.route.params.subscribe(params => {
|
|
63
|
+
this.routeParams = params;
|
|
64
|
+
this.slug = _.get(this.routeParams, 'slug');
|
|
65
|
+
this.topicId = _.get(this.routeParams, 'topicId');
|
|
66
|
+
this.refreshPostData(this.currentActivePage);
|
|
67
|
+
// this.getRealtedDiscussion(this.cid)
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.refreshPostData(this.currentActivePage);
|
|
72
|
+
// this.getRealtedDiscussion(this.cid)
|
|
73
|
+
}
|
|
74
|
+
this.telemetryUtils.logImpression(NSDiscussData.IPageName.DETAILS);
|
|
75
|
+
}
|
|
76
|
+
// tslint:disable-next-line: use-life-cycle-interface
|
|
77
|
+
ngOnChanges() {
|
|
78
|
+
if (!this.topicId && !this.slug) {
|
|
79
|
+
this.route.params.subscribe(params => {
|
|
80
|
+
this.routeParams = params;
|
|
81
|
+
this.slug = _.get(this.routeParams, 'slug');
|
|
82
|
+
this.topicId = _.get(this.routeParams, 'topicId');
|
|
83
|
+
this.refreshPostData(this.currentActivePage);
|
|
84
|
+
// this.getRealtedDiscussion(this.cid)
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.refreshPostData(this.currentActivePage);
|
|
89
|
+
// this.getRealtedDiscussion(this.cid)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// new method
|
|
93
|
+
acceptData(discuss) {
|
|
94
|
+
// debugger
|
|
95
|
+
const matchedTopic = _.find(this.telemetryUtils.getContext(), { type: 'Topic' });
|
|
96
|
+
if (matchedTopic) {
|
|
97
|
+
this.telemetryUtils.deleteContext(matchedTopic);
|
|
98
|
+
}
|
|
99
|
+
this.telemetryUtils.uppendContext({
|
|
100
|
+
id: _.get(discuss, 'tid'),
|
|
101
|
+
type: 'Topic'
|
|
102
|
+
});
|
|
103
|
+
const slug = _.trim(_.get(discuss, 'slug'));
|
|
104
|
+
const input = {
|
|
105
|
+
data: { url: `${this.configService.getRouterSlug()}${CONSTANTS.ROUTES.TOPIC}${slug}`, queryParams: {} },
|
|
106
|
+
action: CONSTANTS.CATEGORY_DETAILS
|
|
107
|
+
};
|
|
108
|
+
this.navigationService.navigate(input);
|
|
109
|
+
this.stateChange.emit({ action: CONSTANTS.CATEGORY_DETAILS, title: discuss.title, tid: discuss.tid });
|
|
110
|
+
}
|
|
111
|
+
initializeFormFiled() {
|
|
112
|
+
this.postAnswerForm = this.formBuilder.group({
|
|
113
|
+
answer: [],
|
|
114
|
+
});
|
|
115
|
+
this.UpdatePostAnswerForm = this.formBuilder.group({
|
|
116
|
+
updatedAnswer: [],
|
|
117
|
+
});
|
|
118
|
+
this.replyForm = this.formBuilder.group({
|
|
119
|
+
reply: []
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async refreshPostData(page) {
|
|
123
|
+
if (this.currentFilter === 'timestamp') {
|
|
124
|
+
this.discussionService.fetchTopicById(this.topicId, this.slug, page).subscribe((data) => {
|
|
125
|
+
this.appendResponse(data);
|
|
126
|
+
this.showLoader = true;
|
|
127
|
+
}, (err) => {
|
|
128
|
+
// error code check
|
|
129
|
+
this.discussionService.showTrafficAlert(err);
|
|
130
|
+
console.log('Error in fetching topics');
|
|
131
|
+
// toast message
|
|
132
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.discussionService.fetchTopicByIdSort(this.topicId, 'voted', page).subscribe((data) => {
|
|
137
|
+
this.appendResponse(data);
|
|
138
|
+
this.showLoader = true;
|
|
139
|
+
}, (err) => {
|
|
140
|
+
// error code check
|
|
141
|
+
this.discussionService.showTrafficAlert(err);
|
|
142
|
+
console.log('Error in fetching topics');
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
appendResponse(data) {
|
|
147
|
+
this.data = data;
|
|
148
|
+
this.paginationData = _.get(data, 'pagination');
|
|
149
|
+
// TODO: After updating the nodebb version to v1.18.6 or above. Remove the fallback after 2/3 releases.
|
|
150
|
+
this.mainUid = _.get(data, 'loggedInUser.uid') || _.get(data, 'privileges.uid');
|
|
151
|
+
this.categoryId = _.get(data, 'cid');
|
|
152
|
+
this.topicId = _.get(data, 'tid');
|
|
153
|
+
}
|
|
154
|
+
setPagination() {
|
|
155
|
+
this.pager = {
|
|
156
|
+
startIndex: this.paginationData.first.page,
|
|
157
|
+
endIndex: this.paginationData.last.page,
|
|
158
|
+
pages: this.paginationData.pages,
|
|
159
|
+
currentPage: this.paginationData.currentPage,
|
|
160
|
+
totalPage: this.paginationData.pageCount,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
upvote(discuss) {
|
|
164
|
+
const req = {
|
|
165
|
+
delta: 1,
|
|
166
|
+
};
|
|
167
|
+
this.processVote(discuss, req);
|
|
168
|
+
}
|
|
169
|
+
downvote(discuss) {
|
|
170
|
+
const req = {
|
|
171
|
+
delta: -1,
|
|
172
|
+
};
|
|
173
|
+
this.processVote(discuss, req);
|
|
174
|
+
}
|
|
175
|
+
async processVote(discuss, req) {
|
|
176
|
+
if (discuss && discuss.uid) {
|
|
177
|
+
this.discussionService.votePost(discuss.pid, req).subscribe(() => {
|
|
178
|
+
// toast
|
|
179
|
+
// this.openSnackbar(this.toastSuccess.nativeElement.value);
|
|
180
|
+
this.postAnswerForm.reset();
|
|
181
|
+
this.refreshPostData(this.currentActivePage);
|
|
182
|
+
}, (err) => {
|
|
183
|
+
// error code check
|
|
184
|
+
this.discussionService.showTrafficAlert(err);
|
|
185
|
+
// toast
|
|
186
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
bookmark(discuss) {
|
|
191
|
+
this.discussionService.bookmarkPost(discuss.pid).subscribe(data => {
|
|
192
|
+
// toast
|
|
193
|
+
// this.openSnackbar('Bookmark added successfully!');
|
|
194
|
+
this.refreshPostData(this.currentActivePage);
|
|
195
|
+
}, (err) => {
|
|
196
|
+
// error code check
|
|
197
|
+
this.discussionService.showTrafficAlert(err);
|
|
198
|
+
// toast
|
|
199
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
unBookMark(discuss) {
|
|
203
|
+
this.discussionService.deleteBookmarkPost(discuss.pid).subscribe(data => {
|
|
204
|
+
// toast
|
|
205
|
+
this.refreshPostData(this.currentActivePage);
|
|
206
|
+
}, (err) => {
|
|
207
|
+
// error code check
|
|
208
|
+
this.discussionService.showTrafficAlert(err);
|
|
209
|
+
// toast
|
|
210
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
deleteVote(discuss) {
|
|
214
|
+
this.discussionService.deleteVotePost(discuss.pid).subscribe(data => {
|
|
215
|
+
// toast
|
|
216
|
+
this.refreshPostData(this.currentActivePage);
|
|
217
|
+
}, (err) => {
|
|
218
|
+
// error code check
|
|
219
|
+
this.discussionService.showTrafficAlert(err);
|
|
220
|
+
// toast
|
|
221
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
postReply(replyContent, post) {
|
|
225
|
+
const req = {
|
|
226
|
+
content: replyContent,
|
|
227
|
+
};
|
|
228
|
+
this.postAnswerForm.controls['answer'].setValue('');
|
|
229
|
+
if (post && post.tid) {
|
|
230
|
+
this.discussionService.replyPost(post.tid, req).subscribe(() => {
|
|
231
|
+
// toast
|
|
232
|
+
// this.openSnackbar('Your reply was saved succesfuly!');
|
|
233
|
+
// this.fetchNewData = true;
|
|
234
|
+
this.refreshPostData(this.currentActivePage);
|
|
235
|
+
}, (err) => {
|
|
236
|
+
// error code check
|
|
237
|
+
this.discussionService.showTrafficAlert(err);
|
|
238
|
+
// toast
|
|
239
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
postCommentsReply(replyContent, post) {
|
|
244
|
+
const req = {
|
|
245
|
+
content: replyContent,
|
|
246
|
+
toPid: post.pid,
|
|
247
|
+
};
|
|
248
|
+
if (post && post.tid) {
|
|
249
|
+
this.discussionService.replyPost(post.tid, req).subscribe(() => {
|
|
250
|
+
// toast
|
|
251
|
+
// this.openSnackbar('Your reply was saved succesfuly!');
|
|
252
|
+
this.refreshPostData(this.currentActivePage);
|
|
253
|
+
}, (err) => {
|
|
254
|
+
// error code check
|
|
255
|
+
this.discussionService.showTrafficAlert(err);
|
|
256
|
+
// toast
|
|
257
|
+
// this.openSnackbar(err.error.message.split('|')[1] || this.defaultError);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
confirmDelete(pid) {
|
|
262
|
+
if (window.confirm(MSGS.deletePost)) {
|
|
263
|
+
this.deletePost(pid);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
filter(key) {
|
|
267
|
+
if (key) {
|
|
268
|
+
this.currentFilter = key;
|
|
269
|
+
this.refreshPostData(this.currentActivePage);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
navigateWithPage(page) {
|
|
273
|
+
if (page !== this.currentActivePage) {
|
|
274
|
+
this.router.navigate([`${this.configService.getRouterSlug()}${CONSTANTS.ROUTES.CATEGORY} ${this.topicId}`], { queryParams: { page }, queryParamsHandling: "merge" });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
showError(meta) {
|
|
278
|
+
if (meta) {
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
getBgColor(tagTitle) {
|
|
284
|
+
const bgColor = this.stringToColor(tagTitle.toLowerCase());
|
|
285
|
+
const color = this.getContrast();
|
|
286
|
+
return { color, 'background-color': bgColor };
|
|
287
|
+
}
|
|
288
|
+
stringToColor(title) {
|
|
289
|
+
let hash = 0;
|
|
290
|
+
for (let i = 0; i < title.length; i++) {
|
|
291
|
+
// tslint:disable-next-line: no-bitwise
|
|
292
|
+
hash = title.charCodeAt(i) + ((hash << 5) - hash);
|
|
293
|
+
}
|
|
294
|
+
const hue = Math.abs(hash % 360);
|
|
295
|
+
// tslint:disable-next-line: prefer-template
|
|
296
|
+
const colour = 'hsl(' + hue + ',100%,30%)';
|
|
297
|
+
return colour;
|
|
298
|
+
}
|
|
299
|
+
getContrast() {
|
|
300
|
+
return 'rgba(255, 255, 255, 80%)';
|
|
301
|
+
}
|
|
302
|
+
logTelemetry(event, data) {
|
|
303
|
+
const pid = _.get(data, 'pid') || _.get(data, 'mainPid') ?
|
|
304
|
+
{ id: _.get(data, 'pid') || _.get(data, 'mainPid'), type: 'Post' } : {};
|
|
305
|
+
this.telemetryUtils.uppendContext(pid);
|
|
306
|
+
this.telemetryUtils.logInteract(event, NSDiscussData.IPageName.DETAILS);
|
|
307
|
+
}
|
|
308
|
+
onEditMode(UpdatePostStatus) {
|
|
309
|
+
if (UpdatePostStatus) {
|
|
310
|
+
this.editMode = true;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.editMode = false;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
getRealtimePost(post, index) {
|
|
317
|
+
this.editMode = true;
|
|
318
|
+
this.editContentIndex = index;
|
|
319
|
+
this.contentPost = _.get(post, 'content').replace(/<[^>]*>/g, '');
|
|
320
|
+
post.toggle = false;
|
|
321
|
+
}
|
|
322
|
+
updatePost(updatedPostContent, pid) {
|
|
323
|
+
this.editMode = false;
|
|
324
|
+
const req = {
|
|
325
|
+
content: updatedPostContent,
|
|
326
|
+
title: '',
|
|
327
|
+
tags: [],
|
|
328
|
+
uid: this.mainUid
|
|
329
|
+
};
|
|
330
|
+
this.discussionService.editPost(pid, req).subscribe((data) => {
|
|
331
|
+
// TODO: Success toast
|
|
332
|
+
this.refreshPostData(this.currentActivePage);
|
|
333
|
+
}, (error) => {
|
|
334
|
+
// error code check
|
|
335
|
+
this.discussionService.showTrafficAlert(error);
|
|
336
|
+
// TODO: error toast
|
|
337
|
+
console.log('e', error);
|
|
338
|
+
});
|
|
339
|
+
console.log(pid);
|
|
340
|
+
}
|
|
341
|
+
deletePost(postId) {
|
|
342
|
+
this.discussionService.deletePost(postId, this.mainUid).subscribe((data) => {
|
|
343
|
+
// TODO: Success toast
|
|
344
|
+
this.refreshPostData(this.currentActivePage);
|
|
345
|
+
}, (error) => {
|
|
346
|
+
// error code check
|
|
347
|
+
this.discussionService.showTrafficAlert(error);
|
|
348
|
+
// TODO: error toast
|
|
349
|
+
console.log('e', error);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
editReplyHandler(event, post) {
|
|
353
|
+
if (_.get(event, 'action') === 'cancel') {
|
|
354
|
+
this.onEditMode(false);
|
|
355
|
+
}
|
|
356
|
+
else if (_.get(event, 'action') === 'edit') {
|
|
357
|
+
this.updatePost(_.get(event, 'content'), _.get(post, 'pid'));
|
|
358
|
+
this.logTelemetry(event, post);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
commentReplyHandler(event, post) {
|
|
362
|
+
if (_.get(event, 'action') === 'cancel') {
|
|
363
|
+
this.togglePost(post);
|
|
364
|
+
}
|
|
365
|
+
else if (_.get(event, 'action') === 'reply') {
|
|
366
|
+
this.postCommentsReply(_.get(event, 'content'), post);
|
|
367
|
+
this.logTelemetry(event, post);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
postReplyHandler(event, post) {
|
|
371
|
+
if (_.get(event, 'action') === 'reply') {
|
|
372
|
+
this.postReply(_.get(event, 'content'), post);
|
|
373
|
+
this.logTelemetry(event, post);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
togglePost(post) {
|
|
377
|
+
post.toggle = !post.toggle;
|
|
378
|
+
this.onEditMode(false);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* @description - It will trigger the event handlers and close the update thread popup.
|
|
382
|
+
*/
|
|
383
|
+
closeModal(event) {
|
|
384
|
+
console.log('close event', event);
|
|
385
|
+
if (_.get(event, 'action') === 'update') {
|
|
386
|
+
this.editTopicHandler(event, _.get(event, 'tid'), _.get(event, 'request'));
|
|
387
|
+
}
|
|
388
|
+
this.showEditTopicModal = false;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* @description - It will open update thread popup.
|
|
392
|
+
*/
|
|
393
|
+
editTopic(event, topicData) {
|
|
394
|
+
this.showEditTopicModal = true;
|
|
395
|
+
this.logTelemetry(event, topicData);
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* @description - It will all the update topic api. If success, then will refresh the data.
|
|
399
|
+
*/
|
|
400
|
+
editTopicHandler(event, tid, updateTopicRequest) {
|
|
401
|
+
this.logTelemetry(event, this.editableTopicDetails);
|
|
402
|
+
this.discussionService.editPost(tid, updateTopicRequest).subscribe(data => {
|
|
403
|
+
console.log('update success', data);
|
|
404
|
+
this.refreshPostData(this.currentActivePage);
|
|
405
|
+
}, error => {
|
|
406
|
+
// error code check
|
|
407
|
+
this.discussionService.showTrafficAlert(error);
|
|
408
|
+
console.log('error while updating', error);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* @description - It will open the confirmation popup before deleting the topic,
|
|
413
|
+
* If clicked yes, then will call the delete topic handler.
|
|
414
|
+
*/
|
|
415
|
+
deleteTopic(event, topicData) {
|
|
416
|
+
if (window.confirm(MSGS.deleteTopic)) {
|
|
417
|
+
this.logTelemetry(event, topicData);
|
|
418
|
+
this.deleteTopicHandler(_.get(topicData, 'tid'));
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* @description - It will all the delete topic api. If success, then will navigate back to the previous page.
|
|
423
|
+
*/
|
|
424
|
+
deleteTopicHandler(topicId) {
|
|
425
|
+
this.discussionService.deleteTopic(topicId).subscribe(data => {
|
|
426
|
+
this.location.back();
|
|
427
|
+
}, error => {
|
|
428
|
+
// error code check
|
|
429
|
+
this.discussionService.showTrafficAlert(error);
|
|
430
|
+
console.log('error while deleting', error);
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* @description - It will toggle the kebab menu click
|
|
435
|
+
*/
|
|
436
|
+
onMenuClick() {
|
|
437
|
+
this.dropdownContent = !this.dropdownContent;
|
|
438
|
+
}
|
|
439
|
+
ngOnDestroy() {
|
|
440
|
+
if (this.paramsSubscription) {
|
|
441
|
+
this.paramsSubscription.unsubscribe();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussionDetailsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.DiscussionService }, { token: i3.ConfigService }, { token: i4.UntypedFormBuilder }, { token: i1.Router }, { token: i5.TelemetryUtilsService }, { token: i0.Renderer2 }, { token: i6.Location }, { token: i7.NavigationServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
445
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DiscussionDetailsComponent, selector: "lib-discussion-details", inputs: { topicId: "topicId", slug: "slug", widget: "widget" }, outputs: { stateChange: "stateChange" }, usesOnChanges: true, ngImport: i0, template: "<lib-app-loader *ngIf=\"!showLoader\"></lib-app-loader>\n<div class=\"discuss-details-content\" *ngIf=\"showLoader\">\n <div class=\"discussion-details\" tabindex=\"0\" role=\"link\">\n\n <!-- header -->\n <div class=\"discuss-card-kabab-menu\">\n <h3 class=\"discussion-card-title df-label-color\" [innerHTML]=\"data?.title\"></h3>\n <div *ngIf=\"data?.uid === mainUid\">\n <div class=\"kabab-menu\" id=\"group-actions\" (click)=\"onMenuClick()\" tabindex=\"0\"></div>\n <div class=\"kabab-menu-dropdown-content\" [hidden]=\"dropdownContent\">\n <div id=\"edit-topic\" class=\"list\" tabindex=\"0\"\n (click)=\"editTopic($event, data); editableTopicDetails = data\">Edit\n </div>\n <div id=\"delete-topic\" class=\"list\" (click)=\"deleteTopic($event, data)\" tabindex=\"0\">Delete</div>\n </div>\n </div>\n </div>\n <!-- /header -->\n\n <ng-container *ngFor=\"let post of data?.posts\">\n <div class=\"post-reply-card\" *ngIf=\"post?.index === 0\">\n <h3 class=\"discussion-heading df-text-color\" [innerHTML]=\"post?.content\"></h3>\n <div class=\"discussion-content\">\n <div class=\"circle-text\">\n <div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div>\n </div>\n <div class=\"discussion-labels\">{{'Asked by '}}</div>\n <div class=\"discussion-labels\" *ngIf=\"post.user.fullname\" [innerHTML]=\"post.user.fullname\"></div>\n <div class=\"discussion-labels\" *ngIf=\"!post.user.fullname\" [innerHTML]=\"post.user.username\"></div>\n </div>\n\n <div class=\"tags\" aria-label=\"tags\">\n <ng-container *ngIf=\"data && data?.tags && data?.tags?.length > 0\">\n <span *ngFor=\"let tag of data?.tags\" class=\"tag\" role=\"link\" tabindex=\"0\"\n [ngStyle]=\"getBgColor(tag.value)\">\n {{tag.value}}\n </span>\n </ng-container>\n </div>\n\n <div class=\"comments-area\">\n <div>\n <span class=\"post-icons mobile\">\n <span role=\"link\" tabindex=\"0\" *ngIf=\"!post.upvoted\" (click)=\"upvote(post);logTelemetry($event, post)\"\n aria-label=\"upvote the post\" id=\"up-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up-arrow\" class=\"icons\"\n alt=\"up arrow icon for like the post\">\n </span>\n <span *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove upvote\" id=\"delete-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up.svg\" alt=\"select-up-arrow\" class=\"icons\" alt=\"up image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote post\" id=\"down-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\"\n alt=\"down arrow icon for unlike post\">\n </span>\n <span *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove down vote\" id=\"delete-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.downvotes}}</span>\n </span>\n <span class=\"post-icons mobile\" role=\"link\" tabindex=\"0\">\n <!-- trending -->\n <img src=\"./assets/discussion-ui/images/views.svg\" alt=\"views icon for seeing the posts\" class=\"icons\">\n <span class=\"vote-value\" aria-label=\"views count\">{{data.viewcount}} Views</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"bookmark(post);logTelemetry($event, post)\" aria-label=\"Bookmark post\" id=\"bookmark\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/bookmarks.png\" class=\"icons\" alt=\"bookmark icon\">\n </span>\n <span *ngIf=\"data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"unBookMark(post);logTelemetry($event, post)\" aria-label=\"unBookmark post\"\n id=\"un-bookmark-vote\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/select-bookmarks.png\" class=\"icons bookmark-icon\"\n alt=\"select bookmark icon\">\n </span>\n </span>\n </div>\n <div class=\"comments-count\">\n <span *ngIf=\"data?.postcount-1 > 0\" aria-label=\"comments count\">\n {{data?.postcount-1}}\n comments\n </span>\n <span *ngIf=\"data?.postcount-1 <=0\" aria-label=\"comments count\">\n 0 comments</span>\n </div>\n </div>\n <!-- /card content -->\n <!-- post reply -->\n <lib-post-reply (actionEvent)=\"postReplyHandler($event, post); logTelemetry($event, post)\" [mode]=\"'reply'\"\n [showCancel]=\"false\"></lib-post-reply>\n \n </div>\n </ng-container>\n <!-- /card end -->\n\n <ng-container *ngIf=\"data?.posts && data?.postcount > 1\">\n <div class=\"recent-tabs\">\n <div class=\"tabs-content\">\n <div class=\"tabs-filter\">\n <a href=\"javascript:void(0)\" class=\"filter-option\" role=\"link\" tabindex=\"0\" [ngClass]=\"{'tabs-active' : currentFilter === 'timestamp',\n 'ws-mat-accent-border':currentFilter !== 'timestamp'}\"\n (click)=\"filter('timestamp');logTelemetry($event)\" id=\"recent-post\">\n Recent </a>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngFor=\"let post of data?.posts | sortBy: 'timestampISO':'desc'; index as i\">\n <!-- card content -->\n <div *ngIf=\"post?.index != 0\" class=\"post-card\">\n <!-- header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <span class=\"circle-text\"><span class=\"circle-label\">{{ post?.user?.username | splitInitials\n }}</span></span>\n <span class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></span>\n <span class=\"post-name df-label-color\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></span>\n </div>\n <div class=\"custom-actions\">\n <span class=\"post-time\">{{ post?.timestamp | date: 'dd MMM yyyy hh:mm a'}}</span>\n <ng-container *ngIf=\"mainUid === post?.uid\">\n <img src=\"./assets/discussion-ui/images/edit.svg\" class=\"edit-icon\" id=\"edit-post\" alt=\"edit icon\"\n (click)=\"getRealtimePost(post, i)\" tabindex=\"0\">\n <img src=\"./assets/discussion-ui/images/delete.svg\" class=\"delete-icon\" id=\"delete-post\" alt=\"delete icon\"\n (click)=\"confirmDelete(post?.pid)\" tabindex=\"0\">\n </ng-container>\n </div>\n </div>\n <!-- / header -->\n <div>\n <div class=\"edit-text\" *ngIf=\"!editMode || editContentIndex !== i\">\n <p [innerHTML]=\"post?.content\" class=\"post-labels df-text-color\"></p>\n <div class=\"edited-text\" *ngIf=\"post?.edited\">(edited)</div>\n </div>\n <div *ngIf=\"editMode && editContentIndex === i\">\n <lib-post-reply (actionEvent)=\"editReplyHandler($event, post)\" [mode]=\"'edit'\" [showCancel]=\"true\"\n [content]=\"contentPost\"></lib-post-reply>\n </div>\n <div class=\"reply-area\">\n <div>\n <span class=\"flex mobile\">\n <!-- upward arrow -->\n <span class=\"up-vote-text\" *ngIf=\"!post?.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"upvote(post);logTelemetry($event, post)\" aria-label=\"upvote comment\" id=\"up-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <!-- upward arrow -->\n <span class=\"down-vote-text\" *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete upvote on comment\"\n id=\"delete-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n <span class=\"vote-value\">{{post?.upvotes}}</span>\n </span>\n\n <span class=\"flex mobile\">\n <span id=\"down-vote\" *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote comment\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\" alt=\"down arrow icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <span id=\"delete-vote\" *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete downvote on comment\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down icon\">\n </span>\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n\n <button (click)=\"togglePost(post); logTelemetry($event, post)\"\n class=\"df-btn df-btn-normal df-btn-primary df-reply-btn\" id=\"reply-comment\">\n Reply </button>\n\n </div>\n <div class=\"replies\" *ngIf=\"post?.toggle\">\n <ng-container [ngTemplateOutlet]=\"reply\" [ngTemplateOutletContext]=\"{post:post}\">\n </ng-container>\n </div>\n <ng-container *ngIf=\"post?.replies?.count > 0\">\n <div>\n <div>\n <div class=\"reply-content\" (click)=\"post.replyCountToggle = !post.replyCountToggle\" tabindex=\"0\">\n <span class=\"replies-count\"> {{post?.replies?.count}} reply(s) </span>\n <div *ngIf=\"post?.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"post?.replyCountToggle\" aria-label=\"reply toggle upwards\">\n <!-- up arrow -->\n <img src=\"./assets/discussion-ui/images/up-chevron.png\" class=\"icons\" alt=\"up chevron icon\">\n </span>\n </div>\n <div *ngIf=\"!post.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"!post.replyCountToggle\" aria-label=\"reply toggle downwards\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down-chevron.png\" class=\"icons\" alt=\"down chevron icon\">\n </span>\n </div>\n </div>\n </div>\n <div class=\"last-reply-data\">\n <span *ngIf=\"!post.replyCountToggle\">Last reply\n {{ post?.replies?.timestampISO | date: 'dd MMM yyyy hh:mm a' }} </span>\n </div>\n </div>\n <div class=\"replies\" *ngIf=\"post?.replyCountToggle\">\n <ng-container [ngTemplateOutlet]=\"replies\"\n [ngTemplateOutletContext]=\"{posts:data.posts, postId:post.pid}\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n <!-- /card content -->\n </div>\n <!-- / card -->\n <!-- Divider -->\n <div *ngIf=\"post.index != 0\"></div>\n </ng-container>\n </div>\n\n <div class=\"related-discuss-part\">\n <div *ngIf=\"fetchSingleCategoryLoader\" class=\"related-discuss-part-content\"></div>\n <lib-related-discussion *ngIf=\"!fetchSingleCategoryLoader\" [catId]=\"categoryId\" [topicId]=\"topicId\">\n </lib-related-discussion>\n </div>\n</div>\n\n<ng-template #reply let-post=\"post\">\n <lib-post-reply (actionEvent)=\"commentReplyHandler($event, post)\" [mode]=\"'reply'\" [showCancel]=\"true\">\n </lib-post-reply>\n</ng-template>\n\n<ng-template #replies let-posts=\"posts\" let-postId=\"postId\">\n <ng-container *ngFor=\"let post of posts | pipeFilter:'toPid': postId; index as index; last as last\">\n <!-- card -->\n <div class=\"post-sub-card\">\n <!-- card-header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <div class=\"circle-text\"><div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div></div>\n <div class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></div>\n <div class=\"df-label-color post-name\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></div>\n </div>\n <div class=\"post-time\">{{ post?.timestamp | date}}</div>\n </div>\n <!-- /card-header -->\n\n <!-- card-content -->\n <div>\n <p role=\"link\" tabindex=\"0\" tabindex=\"0\" [innerHTML]=\"post?.content\"></p>\n <div class=\"reply-area\">\n <div class=\"reply-area-content\">\n <span class=\"post-icons mobile\">\n <!-- up arrow -->\n <img *ngIf=\"!post?.upvoted\" class=\"cursor-pointer\" (click)=\"upvote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up arrow icon\" class=\"icons\" tabindex=\"0\">\n <img *ngIf=\"post?.upvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up.svg\" alt=\"select up arrow icon\" class=\"icons\" tabindex=\"0\">\n <span class=\"vote-value\">{{post.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <img *ngIf=\"!post?.downvoted\" class=\"cursor-pointer\" (click)=\"downvote(post); logTelemetry($event, post)\"\n id=\"up-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down-arrow.png\" alt=\"down arrow icon\"\n class=\"icons\">\n <img *ngIf=\"post?.downvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n id=\"delete-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down.svg\" alt=\"select down arrow icon\"\n class=\"icons\">\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n </div>\n </div>\n </div> \n <!-- /card -->\n </ng-container>\n</ng-template>\n\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Thank you for voting!\" value=\"Thank you for voting!!\"\n #toastSuccess />\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Something went wrong, please try again later!\"\n value=\"Something went wrong, please try again later!\" #toastError />\n\n<lib-discuss-start [mode]=\"'edit'\" [topicData]=\"editableTopicDetails\" (close)=\"closeModal($event)\"\n *ngIf=\"showEditTopicModal\"></lib-discuss-start>", styles: ["@charset \"UTF-8\";.discuss-details-content{display:flex;flex-direction:row}.discussion-details{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;background:var(--df-card-bg);color:var(--df-text);flex:3;height:auto;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);display:block;position:relative;padding:.875rem 1rem;justify-content:space-between;z-index:unset;margin-bottom:1rem}.related-discuss-part{padding:0 0 1rem 1.5rem;position:relative;z-index:2}.related-discuss-part .related-discuss-part-content{padding:0 .25rem}.discussion-card-title{font-size:1.25rem;font-weight:700}.discussion-heading{font-size:.875rem;font-weight:400;pointer-events:none;margin-bottom:0;margin-top:.5rem}.discussion-content{display:flex;align-items:center;margin-bottom:1rem;font-size:.875rem;flex-wrap:wrap;margin-bottom:0;margin-top:1rem}.comment-section{display:flex;align-items:center;justify-content:space-between;margin:.5rem 0;flex-direction:row;flex-wrap:wrap}.post-header-content{display:flex;align-items:center}.circle-text{border-radius:50%;width:1.75rem;height:1.75rem;display:flex;justify-content:center;align-items:center;background-color:#306933}.circle-label{color:var(--white);font-size:1rem;line-height:.75rem;letter-spacing:.2625px;text-transform:uppercase}.discussion-labels{color:var(--gray-400);margin-left:.5rem;font-size:.875rem}.comments-area{display:flex;align-items:center;justify-content:space-between;font-weight:700;flex-direction:row;font-size:.875rem;margin:1rem 0}.text-form-field{display:flex;flex-direction:column}.text-content{min-height:6.75rem;max-height:33.75rem;margin-bottom:.875rem;background-color:var(--df-field-control-bg);border:.0625rem solid var(--gray-200);border-radius:.1875rem;color:var(--df-text);display:block;font-size:.8125rem;font-family:sans-serif;position:relative;cursor:pointer;outline:0;padding:.5rem .875rem}.text-content.is-invalid,.text-content.is-invalid:hover,.text-content.is-invalid:focus{border:.0625rem solid var(--red-100)}.text-content.is-valid,.text-content.is-valid:hover,.text-content.is-valid:focus{border:.0625rem solid var(--primary-400)}.up-vote-text,.down-vote-text{font-size:1rem;color:var(--black);margin-right:.5rem}.post-card,.post-reply-card{border-bottom:.0625rem solid var(--gray-100);margin-bottom:1.5rem}.post-sub-card{margin:0 .5rem .5rem;border:0}.comments-section{display:flex;align-items:center;justify-content:space-between}.post-icons{margin-right:1rem}.post-name{font-size:1rem;font-weight:700;margin-left:1rem;word-break:break-all;text-transform:capitalize}.post-time{color:var(var(--gray-400));margin:0 1rem;font-size:.875rem}.post-labels{font-size:.875rem;margin:0}.reply-area{display:flex;justify-content:space-between;align-items:center}.reply-area-content{position:relative;margin-top:1rem}.margin-gap-tb{margin:1rem 0}.custom-actions{display:flex;align-items:center}.edit-post{margin-right:1.25rem}.border-0{border-bottom:0px}.comments-count{color:var(--primary);font-weight:700;cursor:pointer}@media (max-width: 768px){.discuss-details-content{flex-direction:column}.related-discuss-part{padding:0}.post-btn{width:100%;margin-top:.5rem;cursor:pointer}.post-time{margin-top:.5rem;margin-left:0}.comment-section{display:flex;flex-direction:column;align-items:start;margin-bottom:.5rem}}.df-btn-disabled{background-color:var(--gray-100)!important;color:var(--gray-200)!important}.df-reply-btn{margin-bottom:.5rem}.edited-text{padding-left:.5rem;margin-top:.25rem;font-size:.75rem;color:var(--gray-200)}.delete-icon,.edit-icon{cursor:pointer;width:1rem;height:1rem;margin:0 .5rem}.discuss-card-kabab-menu{display:flex;justify-content:space-between;flex-wrap:wrap}.kabab-menu{color:var(--primary-400);width:1.875rem;height:1.875rem;line-height:1.75rem;text-align:center;border-radius:50%;padding-left:.5rem;position:absolute;right:.5rem}.kabab-menu:hover{background:var(--gray-0);cursor:pointer}.kabab-menu:after{content:\"\\2807\";font-size:1.5rem}.kabab-menu-dropdown-content{position:absolute;border-radius:.125rem;background-color:var(--white);box-shadow:0 3px 5px 4px rgba(var(--rc-rgba-black),.05);padding:.5rem;z-index:1;text-align:left;right:0;top:0;min-width:13.125rem}.kabab-menu-dropdown-content .list{display:flex;align-items:center;width:100%;cursor:pointer;font-size:.875rem;padding:.5rem}.kabab-menu-dropdown-content .list:hover,.kabab-menu-dropdown-content .list:active{background-color:var(--primary-100)}.kabab-menu-dropdown-content .list:last-child .df-btn-normal{color:var(--red-400)}.kabab-menu-dropdown-content .list .df-btn-normal{font-size:.875rem}::ng-deep html[dir=rtl] .kabab-menu-dropdown-content{right:auto;left:0}.vote-value{margin-left:.5rem}.icons{width:.875rem;height:.875rem;position:relative;cursor:pointer}.edit-text{display:flex}.last-reply-data{margin:1rem 0;font-size:.875rem}.reply-content{display:flex;align-items:center}.replies{width:100%}.replies-count{font-size:.875rem;font-weight:700;cursor:pointer}.toggle-icon{padding:0 1rem;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.AppLoaderComponent, selector: "lib-app-loader", inputs: ["data"] }, { kind: "component", type: i9.RelatedDiscussionComponent, selector: "lib-related-discussion", inputs: ["catId", "topicId"], outputs: ["stateChange"] }, { kind: "component", type: i10.PostReplyComponent, selector: "lib-post-reply", inputs: ["showCancel", "mode", "content"], outputs: ["actionEvent"] }, { kind: "component", type: i11.DiscussStartComponent, selector: "lib-discuss-start", inputs: ["categoryId", "topicData", "mode"], outputs: ["close"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i12.PipeFilterPipe, name: "pipeFilter" }, { kind: "pipe", type: i13.SortByPipe, name: "sortBy" }, { kind: "pipe", type: i14.SplitInitialsPipe, name: "splitInitials" }] }); }
|
|
446
|
+
}
|
|
447
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussionDetailsComponent, decorators: [{
|
|
448
|
+
type: Component,
|
|
449
|
+
args: [{ selector: 'lib-discussion-details', template: "<lib-app-loader *ngIf=\"!showLoader\"></lib-app-loader>\n<div class=\"discuss-details-content\" *ngIf=\"showLoader\">\n <div class=\"discussion-details\" tabindex=\"0\" role=\"link\">\n\n <!-- header -->\n <div class=\"discuss-card-kabab-menu\">\n <h3 class=\"discussion-card-title df-label-color\" [innerHTML]=\"data?.title\"></h3>\n <div *ngIf=\"data?.uid === mainUid\">\n <div class=\"kabab-menu\" id=\"group-actions\" (click)=\"onMenuClick()\" tabindex=\"0\"></div>\n <div class=\"kabab-menu-dropdown-content\" [hidden]=\"dropdownContent\">\n <div id=\"edit-topic\" class=\"list\" tabindex=\"0\"\n (click)=\"editTopic($event, data); editableTopicDetails = data\">Edit\n </div>\n <div id=\"delete-topic\" class=\"list\" (click)=\"deleteTopic($event, data)\" tabindex=\"0\">Delete</div>\n </div>\n </div>\n </div>\n <!-- /header -->\n\n <ng-container *ngFor=\"let post of data?.posts\">\n <div class=\"post-reply-card\" *ngIf=\"post?.index === 0\">\n <h3 class=\"discussion-heading df-text-color\" [innerHTML]=\"post?.content\"></h3>\n <div class=\"discussion-content\">\n <div class=\"circle-text\">\n <div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div>\n </div>\n <div class=\"discussion-labels\">{{'Asked by '}}</div>\n <div class=\"discussion-labels\" *ngIf=\"post.user.fullname\" [innerHTML]=\"post.user.fullname\"></div>\n <div class=\"discussion-labels\" *ngIf=\"!post.user.fullname\" [innerHTML]=\"post.user.username\"></div>\n </div>\n\n <div class=\"tags\" aria-label=\"tags\">\n <ng-container *ngIf=\"data && data?.tags && data?.tags?.length > 0\">\n <span *ngFor=\"let tag of data?.tags\" class=\"tag\" role=\"link\" tabindex=\"0\"\n [ngStyle]=\"getBgColor(tag.value)\">\n {{tag.value}}\n </span>\n </ng-container>\n </div>\n\n <div class=\"comments-area\">\n <div>\n <span class=\"post-icons mobile\">\n <span role=\"link\" tabindex=\"0\" *ngIf=\"!post.upvoted\" (click)=\"upvote(post);logTelemetry($event, post)\"\n aria-label=\"upvote the post\" id=\"up-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up-arrow\" class=\"icons\"\n alt=\"up arrow icon for like the post\">\n </span>\n <span *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove upvote\" id=\"delete-vote\">\n <!-- upward arrow -->\n <img src=\"./assets/discussion-ui/images/up.svg\" alt=\"select-up-arrow\" class=\"icons\" alt=\"up image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote post\" id=\"down-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\"\n alt=\"down arrow icon for unlike post\">\n </span>\n <span *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"remove down vote\" id=\"delete-vote\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down image\">\n </span>\n <span class=\"vote-value\" role=\"text\"\n [attr.aria-label]=\"'total upvoat is' + data?.upvotes\">{{data?.downvotes}}</span>\n </span>\n <span class=\"post-icons mobile\" role=\"link\" tabindex=\"0\">\n <!-- trending -->\n <img src=\"./assets/discussion-ui/images/views.svg\" alt=\"views icon for seeing the posts\" class=\"icons\">\n <span class=\"vote-value\" aria-label=\"views count\">{{data.viewcount}} Views</span>\n </span>\n <span class=\"post-icons mobile\">\n <span *ngIf=\"!data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"bookmark(post);logTelemetry($event, post)\" aria-label=\"Bookmark post\" id=\"bookmark\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/bookmarks.png\" class=\"icons\" alt=\"bookmark icon\">\n </span>\n <span *ngIf=\"data?.posts[0]?.bookmarked\" role=\"link\" tabindex=\"0\"\n (click)=\"unBookMark(post);logTelemetry($event, post)\" aria-label=\"unBookmark post\"\n id=\"un-bookmark-vote\">\n <!-- bookmark -->\n <img src=\"./assets/discussion-ui/images/select-bookmarks.png\" class=\"icons bookmark-icon\"\n alt=\"select bookmark icon\">\n </span>\n </span>\n </div>\n <div class=\"comments-count\">\n <span *ngIf=\"data?.postcount-1 > 0\" aria-label=\"comments count\">\n {{data?.postcount-1}}\n comments\n </span>\n <span *ngIf=\"data?.postcount-1 <=0\" aria-label=\"comments count\">\n 0 comments</span>\n </div>\n </div>\n <!-- /card content -->\n <!-- post reply -->\n <lib-post-reply (actionEvent)=\"postReplyHandler($event, post); logTelemetry($event, post)\" [mode]=\"'reply'\"\n [showCancel]=\"false\"></lib-post-reply>\n \n </div>\n </ng-container>\n <!-- /card end -->\n\n <ng-container *ngIf=\"data?.posts && data?.postcount > 1\">\n <div class=\"recent-tabs\">\n <div class=\"tabs-content\">\n <div class=\"tabs-filter\">\n <a href=\"javascript:void(0)\" class=\"filter-option\" role=\"link\" tabindex=\"0\" [ngClass]=\"{'tabs-active' : currentFilter === 'timestamp',\n 'ws-mat-accent-border':currentFilter !== 'timestamp'}\"\n (click)=\"filter('timestamp');logTelemetry($event)\" id=\"recent-post\">\n Recent </a>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngFor=\"let post of data?.posts | sortBy: 'timestampISO':'desc'; index as i\">\n <!-- card content -->\n <div *ngIf=\"post?.index != 0\" class=\"post-card\">\n <!-- header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <span class=\"circle-text\"><span class=\"circle-label\">{{ post?.user?.username | splitInitials\n }}</span></span>\n <span class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></span>\n <span class=\"post-name df-label-color\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></span>\n </div>\n <div class=\"custom-actions\">\n <span class=\"post-time\">{{ post?.timestamp | date: 'dd MMM yyyy hh:mm a'}}</span>\n <ng-container *ngIf=\"mainUid === post?.uid\">\n <img src=\"./assets/discussion-ui/images/edit.svg\" class=\"edit-icon\" id=\"edit-post\" alt=\"edit icon\"\n (click)=\"getRealtimePost(post, i)\" tabindex=\"0\">\n <img src=\"./assets/discussion-ui/images/delete.svg\" class=\"delete-icon\" id=\"delete-post\" alt=\"delete icon\"\n (click)=\"confirmDelete(post?.pid)\" tabindex=\"0\">\n </ng-container>\n </div>\n </div>\n <!-- / header -->\n <div>\n <div class=\"edit-text\" *ngIf=\"!editMode || editContentIndex !== i\">\n <p [innerHTML]=\"post?.content\" class=\"post-labels df-text-color\"></p>\n <div class=\"edited-text\" *ngIf=\"post?.edited\">(edited)</div>\n </div>\n <div *ngIf=\"editMode && editContentIndex === i\">\n <lib-post-reply (actionEvent)=\"editReplyHandler($event, post)\" [mode]=\"'edit'\" [showCancel]=\"true\"\n [content]=\"contentPost\"></lib-post-reply>\n </div>\n <div class=\"reply-area\">\n <div>\n <span class=\"flex mobile\">\n <!-- upward arrow -->\n <span class=\"up-vote-text\" *ngIf=\"!post?.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"upvote(post);logTelemetry($event, post)\" aria-label=\"upvote comment\" id=\"up-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <!-- upward arrow -->\n <span class=\"down-vote-text\" *ngIf=\"post.upvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete upvote on comment\"\n id=\"delete-vote\">\n <img src=\"./assets/discussion-ui/images/up.svg\" class=\"icons\" alt=\"up icon\">\n </span>\n <span class=\"vote-value\">{{post?.upvotes}}</span>\n </span>\n\n <span class=\"flex mobile\">\n <span id=\"down-vote\" *ngIf=\"!post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"downvote(post);logTelemetry($event, post)\" aria-label=\"downvote comment\">\n <!-- downward arrow -->\n <img src=\"./assets/discussion-ui/images/down-arrow.png\" class=\"icons\" alt=\"down arrow icon\">\n </span>\n </span>\n <span class=\"post-icons mobile\">\n <span id=\"delete-vote\" *ngIf=\"post?.downvoted\" role=\"link\" tabindex=\"0\"\n (click)=\"deleteVote(post);logTelemetry($event, post)\" aria-label=\"delete downvote on comment\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down.svg\" class=\"icons\" alt=\"down icon\">\n </span>\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n\n <button (click)=\"togglePost(post); logTelemetry($event, post)\"\n class=\"df-btn df-btn-normal df-btn-primary df-reply-btn\" id=\"reply-comment\">\n Reply </button>\n\n </div>\n <div class=\"replies\" *ngIf=\"post?.toggle\">\n <ng-container [ngTemplateOutlet]=\"reply\" [ngTemplateOutletContext]=\"{post:post}\">\n </ng-container>\n </div>\n <ng-container *ngIf=\"post?.replies?.count > 0\">\n <div>\n <div>\n <div class=\"reply-content\" (click)=\"post.replyCountToggle = !post.replyCountToggle\" tabindex=\"0\">\n <span class=\"replies-count\"> {{post?.replies?.count}} reply(s) </span>\n <div *ngIf=\"post?.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"post?.replyCountToggle\" aria-label=\"reply toggle upwards\">\n <!-- up arrow -->\n <img src=\"./assets/discussion-ui/images/up-chevron.png\" class=\"icons\" alt=\"up chevron icon\">\n </span>\n </div>\n <div *ngIf=\"!post.replyCountToggle\" role=\"link\" tabindex=\"0\" aria-label=\"reply toggle\">\n <span class=\"toggle-icon\" *ngIf=\"!post.replyCountToggle\" aria-label=\"reply toggle downwards\">\n <!-- down arrow -->\n <img src=\"./assets/discussion-ui/images/down-chevron.png\" class=\"icons\" alt=\"down chevron icon\">\n </span>\n </div>\n </div>\n </div>\n <div class=\"last-reply-data\">\n <span *ngIf=\"!post.replyCountToggle\">Last reply\n {{ post?.replies?.timestampISO | date: 'dd MMM yyyy hh:mm a' }} </span>\n </div>\n </div>\n <div class=\"replies\" *ngIf=\"post?.replyCountToggle\">\n <ng-container [ngTemplateOutlet]=\"replies\"\n [ngTemplateOutletContext]=\"{posts:data.posts, postId:post.pid}\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n <!-- /card content -->\n </div>\n <!-- / card -->\n <!-- Divider -->\n <div *ngIf=\"post.index != 0\"></div>\n </ng-container>\n </div>\n\n <div class=\"related-discuss-part\">\n <div *ngIf=\"fetchSingleCategoryLoader\" class=\"related-discuss-part-content\"></div>\n <lib-related-discussion *ngIf=\"!fetchSingleCategoryLoader\" [catId]=\"categoryId\" [topicId]=\"topicId\">\n </lib-related-discussion>\n </div>\n</div>\n\n<ng-template #reply let-post=\"post\">\n <lib-post-reply (actionEvent)=\"commentReplyHandler($event, post)\" [mode]=\"'reply'\" [showCancel]=\"true\">\n </lib-post-reply>\n</ng-template>\n\n<ng-template #replies let-posts=\"posts\" let-postId=\"postId\">\n <ng-container *ngFor=\"let post of posts | pipeFilter:'toPid': postId; index as index; last as last\">\n <!-- card -->\n <div class=\"post-sub-card\">\n <!-- card-header -->\n <div class=\"comment-section\">\n <div class=\"post-header-content\">\n <div class=\"circle-text\"><div class=\"circle-label\">{{ post?.user?.username | splitInitials }}</div></div>\n <div class=\"post-name\" *ngIf=\"post?.user?.fullname\" [innerHTML]=\"post?.user?.fullname\"></div>\n <div class=\"df-label-color post-name\" *ngIf=\"!post?.user?.fullname\"\n [innerHTML]=\"post?.user?.username\"></div>\n </div>\n <div class=\"post-time\">{{ post?.timestamp | date}}</div>\n </div>\n <!-- /card-header -->\n\n <!-- card-content -->\n <div>\n <p role=\"link\" tabindex=\"0\" tabindex=\"0\" [innerHTML]=\"post?.content\"></p>\n <div class=\"reply-area\">\n <div class=\"reply-area-content\">\n <span class=\"post-icons mobile\">\n <!-- up arrow -->\n <img *ngIf=\"!post?.upvoted\" class=\"cursor-pointer\" (click)=\"upvote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up-arrow.png\" alt=\"up arrow icon\" class=\"icons\" tabindex=\"0\">\n <img *ngIf=\"post?.upvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n src=\"./assets/discussion-ui/images/up.svg\" alt=\"select up arrow icon\" class=\"icons\" tabindex=\"0\">\n <span class=\"vote-value\">{{post.upvotes}}</span>\n </span>\n <span class=\"post-icons mobile\">\n <img *ngIf=\"!post?.downvoted\" class=\"cursor-pointer\" (click)=\"downvote(post); logTelemetry($event, post)\"\n id=\"up-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down-arrow.png\" alt=\"down arrow icon\"\n class=\"icons\">\n <img *ngIf=\"post?.downvoted\" class=\"cursor-pointer\" (click)=\"deleteVote(post);logTelemetry($event, post)\"\n id=\"delete-vote\" tabindex=\"0\" src=\"./assets/discussion-ui/images/down.svg\" alt=\"select down arrow icon\"\n class=\"icons\">\n <span class=\"vote-value\">{{post?.downvotes}}</span>\n </span>\n </div>\n </div>\n </div>\n </div> \n <!-- /card -->\n </ng-container>\n</ng-template>\n\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Thank you for voting!\" value=\"Thank you for voting!!\"\n #toastSuccess />\n<input type=\"hidden\" i18-value i18-aria-value aria-value=\"Something went wrong, please try again later!\"\n value=\"Something went wrong, please try again later!\" #toastError />\n\n<lib-discuss-start [mode]=\"'edit'\" [topicData]=\"editableTopicDetails\" (close)=\"closeModal($event)\"\n *ngIf=\"showEditTopicModal\"></lib-discuss-start>", styles: ["@charset \"UTF-8\";.discuss-details-content{display:flex;flex-direction:row}.discussion-details{box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;background:var(--df-card-bg);color:var(--df-text);flex:3;height:auto;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);display:block;position:relative;padding:.875rem 1rem;justify-content:space-between;z-index:unset;margin-bottom:1rem}.related-discuss-part{padding:0 0 1rem 1.5rem;position:relative;z-index:2}.related-discuss-part .related-discuss-part-content{padding:0 .25rem}.discussion-card-title{font-size:1.25rem;font-weight:700}.discussion-heading{font-size:.875rem;font-weight:400;pointer-events:none;margin-bottom:0;margin-top:.5rem}.discussion-content{display:flex;align-items:center;margin-bottom:1rem;font-size:.875rem;flex-wrap:wrap;margin-bottom:0;margin-top:1rem}.comment-section{display:flex;align-items:center;justify-content:space-between;margin:.5rem 0;flex-direction:row;flex-wrap:wrap}.post-header-content{display:flex;align-items:center}.circle-text{border-radius:50%;width:1.75rem;height:1.75rem;display:flex;justify-content:center;align-items:center;background-color:#306933}.circle-label{color:var(--white);font-size:1rem;line-height:.75rem;letter-spacing:.2625px;text-transform:uppercase}.discussion-labels{color:var(--gray-400);margin-left:.5rem;font-size:.875rem}.comments-area{display:flex;align-items:center;justify-content:space-between;font-weight:700;flex-direction:row;font-size:.875rem;margin:1rem 0}.text-form-field{display:flex;flex-direction:column}.text-content{min-height:6.75rem;max-height:33.75rem;margin-bottom:.875rem;background-color:var(--df-field-control-bg);border:.0625rem solid var(--gray-200);border-radius:.1875rem;color:var(--df-text);display:block;font-size:.8125rem;font-family:sans-serif;position:relative;cursor:pointer;outline:0;padding:.5rem .875rem}.text-content.is-invalid,.text-content.is-invalid:hover,.text-content.is-invalid:focus{border:.0625rem solid var(--red-100)}.text-content.is-valid,.text-content.is-valid:hover,.text-content.is-valid:focus{border:.0625rem solid var(--primary-400)}.up-vote-text,.down-vote-text{font-size:1rem;color:var(--black);margin-right:.5rem}.post-card,.post-reply-card{border-bottom:.0625rem solid var(--gray-100);margin-bottom:1.5rem}.post-sub-card{margin:0 .5rem .5rem;border:0}.comments-section{display:flex;align-items:center;justify-content:space-between}.post-icons{margin-right:1rem}.post-name{font-size:1rem;font-weight:700;margin-left:1rem;word-break:break-all;text-transform:capitalize}.post-time{color:var(var(--gray-400));margin:0 1rem;font-size:.875rem}.post-labels{font-size:.875rem;margin:0}.reply-area{display:flex;justify-content:space-between;align-items:center}.reply-area-content{position:relative;margin-top:1rem}.margin-gap-tb{margin:1rem 0}.custom-actions{display:flex;align-items:center}.edit-post{margin-right:1.25rem}.border-0{border-bottom:0px}.comments-count{color:var(--primary);font-weight:700;cursor:pointer}@media (max-width: 768px){.discuss-details-content{flex-direction:column}.related-discuss-part{padding:0}.post-btn{width:100%;margin-top:.5rem;cursor:pointer}.post-time{margin-top:.5rem;margin-left:0}.comment-section{display:flex;flex-direction:column;align-items:start;margin-bottom:.5rem}}.df-btn-disabled{background-color:var(--gray-100)!important;color:var(--gray-200)!important}.df-reply-btn{margin-bottom:.5rem}.edited-text{padding-left:.5rem;margin-top:.25rem;font-size:.75rem;color:var(--gray-200)}.delete-icon,.edit-icon{cursor:pointer;width:1rem;height:1rem;margin:0 .5rem}.discuss-card-kabab-menu{display:flex;justify-content:space-between;flex-wrap:wrap}.kabab-menu{color:var(--primary-400);width:1.875rem;height:1.875rem;line-height:1.75rem;text-align:center;border-radius:50%;padding-left:.5rem;position:absolute;right:.5rem}.kabab-menu:hover{background:var(--gray-0);cursor:pointer}.kabab-menu:after{content:\"\\2807\";font-size:1.5rem}.kabab-menu-dropdown-content{position:absolute;border-radius:.125rem;background-color:var(--white);box-shadow:0 3px 5px 4px rgba(var(--rc-rgba-black),.05);padding:.5rem;z-index:1;text-align:left;right:0;top:0;min-width:13.125rem}.kabab-menu-dropdown-content .list{display:flex;align-items:center;width:100%;cursor:pointer;font-size:.875rem;padding:.5rem}.kabab-menu-dropdown-content .list:hover,.kabab-menu-dropdown-content .list:active{background-color:var(--primary-100)}.kabab-menu-dropdown-content .list:last-child .df-btn-normal{color:var(--red-400)}.kabab-menu-dropdown-content .list .df-btn-normal{font-size:.875rem}::ng-deep html[dir=rtl] .kabab-menu-dropdown-content{right:auto;left:0}.vote-value{margin-left:.5rem}.icons{width:.875rem;height:.875rem;position:relative;cursor:pointer}.edit-text{display:flex}.last-reply-data{margin:1rem 0;font-size:.875rem}.reply-content{display:flex;align-items:center}.replies{width:100%}.replies-count{font-size:.875rem;font-weight:700;cursor:pointer}.toggle-icon{padding:0 1rem;cursor:pointer}\n"] }]
|
|
450
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.DiscussionService }, { type: i3.ConfigService }, { type: i4.UntypedFormBuilder }, { type: i1.Router }, { type: i5.TelemetryUtilsService }, { type: i0.Renderer2 }, { type: i6.Location }, { type: i7.NavigationServiceService }]; }, propDecorators: { topicId: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], slug: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], widget: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], stateChange: [{
|
|
457
|
+
type: Output
|
|
458
|
+
}] } });
|
|
459
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3Vzc2lvbi1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rpc2N1c3Npb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL2Rpc2N1c3Npb24tZGV0YWlscy9kaXNjdXNzaW9uLWRldGFpbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlzY3Vzc2lvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvZGlzY3Vzc2lvbi1kZXRhaWxzL2Rpc2N1c3Npb24tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQWEsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRM0IsTUFBTSxJQUFJLEdBQUc7SUFDWCxVQUFVLEVBQUUsa0VBQWtFO0lBQzlFLFdBQVcsRUFBRSwyRUFBMkU7Q0FDekYsQ0FBQztBQU9GLE1BQU0sT0FBTywwQkFBMEI7SUE4QnJDLFlBQ1UsS0FBcUIsRUFDckIsaUJBQW9DLEVBQ3BDLGFBQTRCLEVBQzVCLFdBQStCLEVBQ2hDLE1BQWMsRUFDYixjQUFxQyxFQUNyQyxRQUFtQixFQUNuQixRQUFrQixFQUNsQixpQkFBMkM7UUFSM0MsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDaEMsV0FBTSxHQUFOLE1BQU0sQ0FB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LFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZWxlbWV0cnlVdGlsc1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3RlbGVtZXRyeS11dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IERpc2N1c3Npb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9kaXNjdXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgUmVuZGVyZXIyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTlNEaXNjdXNzRGF0YSB9IGZyb20gJy4vLi4vLi4vbW9kZWxzL2Rpc2N1c3MubW9kZWwnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgQ09OU1RBTlRTIGZyb20gJy4uLy4uL2NvbW1vbi9jb25zdGFudHMuanNvbic7XG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG4vKiB0c2xpbnQ6ZW5hYmxlICovXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL25hdmlnYXRpb24tc2VydmljZS5zZXJ2aWNlJztcblxuY29uc3QgTVNHUyA9IHtcbiAgZGVsZXRlUG9zdDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBQb3N0PyBUaGlzIGNhbid0IGJlIHVuZG9uZS5gLFxuICBkZWxldGVUb3BpYzogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB0b3BpYz8gWW91ciBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5gXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlzY3Vzc2lvbi1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc2N1c3Npb24tZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rpc2N1c3Npb24tZGV0YWlscy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERpc2N1c3Npb25EZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0b3BpY0lkOiBhbnk7XG4gIEBJbnB1dCgpIHNsdWc6IHN0cmluZztcbiAgQElucHV0KCkgd2lkZ2V0OiBib29sZWFuO1xuXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcm91dGVQYXJhbXM6IGFueTtcbiAgY3VycmVudEFjdGl2ZVBhZ2UgPSAxO1xuICBjdXJyZW50RmlsdGVyID0gJ3RpbWVzdGFtcCc7IC8vICdyZWNlbnRcbiAgZGF0YTogYW55O1xuICBwYWdpbmF0aW9uRGF0YSE6IGFueTtcbiAgcGFnZXIgPSB7fTtcbiAgcG9zdEFuc3dlckZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBVcGRhdGVQb3N0QW5zd2VyRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcmVwbHlGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBmZXRjaFNpbmdsZUNhdGVnb3J5TG9hZGVyID0gZmFsc2U7XG4gIHBhcmFtc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBlZGl0TW9kZSA9IGZhbHNlO1xuICB1cGRhdGVkUG9zdCA9IGZhbHNlO1xuICBjb250ZW50UG9zdDogYW55O1xuICBlZGl0Q29udGVudEluZGV4OiBhbnk7XG4gIG1haW5VaWQ6IG51bWJlcjtcbiAgc2ltaWxhclBvc3RzOiBhbnlbXTtcbiAgc2hvd0VkaXRUb3BpY01vZGFsID0gZmFsc2U7XG4gIGVkaXRhYmxlVG9waWNEZXRhaWxzOiBhbnk7XG4gIGRyb3Bkb3duQ29udGVudCA9IHRydWU7XG4gIGNhdGVnb3J5SWQ6IGFueTtcbiAgc2hvd0xvYWRlciA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZGlzY3Vzc2lvblNlcnZpY2U6IERpc2N1c3Npb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdGVsZW1ldHJ5VXRpbHM6IFRlbGVtZXRyeVV0aWxzU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2VTZXJ2aWNlLFxuICApIHtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIGNoZWNrIGZvciB0aGUgb3V0c2lkZSBjbGljayB3aGlsZSBrZWJhYiBtZW51IGlzIGluIG9wZW4gbW9kZS5cbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgIGlmIChlLnRhcmdldFsnaWQnXSAhPT0gJ2dyb3VwLWFjdGlvbnMnKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25Db250ZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1GaWxlZCgpO1xuICAgIGlmKHRoaXMud2lkZ2V0KXtcbiAgICAgIHRoaXMuZmV0Y2hTaW5nbGVDYXRlZ29yeUxvYWRlciA9IHRydWVcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRvcGljSWQgJiYgIXRoaXMuc2x1Zykge1xuICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMucm91dGVQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHRoaXMuc2x1ZyA9IF8uZ2V0KHRoaXMucm91dGVQYXJhbXMsICdzbHVnJyk7XG4gICAgICAgIHRoaXMudG9waWNJZCA9IF8uZ2V0KHRoaXMucm91dGVQYXJhbXMsICd0b3BpY0lkJyk7XG4gICAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgICAvLyB0aGlzLmdldFJlYWx0ZWREaXNjdXNzaW9uKHRoaXMuY2lkKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgLy8gdGhpcy5nZXRSZWFsdGVkRGlzY3Vzc2lvbih0aGlzLmNpZClcbiAgICB9XG5cblxuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMubG9nSW1wcmVzc2lvbihOU0Rpc2N1c3NEYXRhLklQYWdlTmFtZS5ERVRBSUxTKTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWxpZmUtY3ljbGUtaW50ZXJmYWNlXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICghdGhpcy50b3BpY0lkICYmICF0aGlzLnNsdWcpIHtcbiAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgICB0aGlzLnJvdXRlUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICB0aGlzLnNsdWcgPSBfLmdldCh0aGlzLnJvdXRlUGFyYW1zLCAnc2x1ZycpO1xuICAgICAgICB0aGlzLnRvcGljSWQgPSBfLmdldCh0aGlzLnJvdXRlUGFyYW1zLCAndG9waWNJZCcpO1xuICAgICAgICB0aGlzLnJlZnJlc2hQb3N0RGF0YSh0aGlzLmN1cnJlbnRBY3RpdmVQYWdlKTtcbiAgICAgICAgLy8gdGhpcy5nZXRSZWFsdGVkRGlzY3Vzc2lvbih0aGlzLmNpZClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2hQb3N0RGF0YSh0aGlzLmN1cnJlbnRBY3RpdmVQYWdlKTtcbiAgICAgIC8vIHRoaXMuZ2V0UmVhbHRlZERpc2N1c3Npb24odGhpcy5jaWQpXG4gICAgfVxuICB9XG5cbiAgLy8gbmV3IG1ldGhvZFxuICBhY2NlcHREYXRhKGRpc2N1c3MpIHtcbiAgICAvLyBkZWJ1Z2dlclxuICAgIGNvbnN0IG1hdGNoZWRUb3BpYyA9IF8uZmluZCh0aGlzLnRlbGVtZXRyeVV0aWxzLmdldENvbnRleHQoKSwgeyB0eXBlOiAnVG9waWMnIH0pO1xuICAgIGlmIChtYXRjaGVkVG9waWMpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMuZGVsZXRlQ29udGV4dChtYXRjaGVkVG9waWMpO1xuICAgIH1cblxuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMudXBwZW5kQ29udGV4dCh7XG4gICAgICBpZDogXy5nZXQoZGlzY3VzcywgJ3RpZCcpLFxuICAgICAgdHlwZTogJ1RvcGljJ1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2x1ZyA9IF8udHJpbShfLmdldChkaXNjdXNzLCAnc2x1ZycpKVxuICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgZGF0YTogeyB1cmw6IGAke3RoaXMuY29uZmlnU2VydmljZS5nZXRSb3V0ZXJTbHVnKCl9JHtDT05TVEFOVFMuUk9VVEVTLlRPUElDfSR7c2x1Z31gLCBxdWVyeVBhcmFtczoge30gfSxcbiAgICAgIGFjdGlvbjogQ09OU1RBTlRTLkNBVEVHT1JZX0RFVEFJTFMgfTtcblxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UubmF2aWdhdGUoaW5wdXQpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdCh7IGFjdGlvbjogQ09OU1RBTlRTLkNBVEVHT1JZX0RFVEFJTFMsIHRpdGxlOiBkaXNjdXNzLnRpdGxlLCB0aWQ6IGRpc2N1c3MudGlkIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUZvcm1GaWxlZCgpIHtcbiAgICB0aGlzLnBvc3RBbnN3ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBhbnN3ZXI6IFtdLFxuICAgIH0pO1xuICAgIHRoaXMuVXBkYXRlUG9zdEFuc3dlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHVwZGF0ZWRBbnN3ZXI6IFtdLFxuICAgIH0pO1xuICAgIHRoaXMucmVwbHlGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICByZXBseTogW11cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hQb3N0RGF0YShwYWdlPzogYW55KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEZpbHRlciA9PT0gJ3RpbWVzdGFtcCcpIHtcblxuICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5mZXRjaFRvcGljQnlJZCh0aGlzLnRvcGljSWQsIHRoaXMuc2x1ZywgcGFnZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTlNEaXNjdXNzRGF0YS5JRGlzY3Vzc2lvbkRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZFJlc3BvbnNlKGRhdGEpXG4gICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBmZXRjaGluZyB0b3BpY3MnKVxuICAgICAgICAgIC8vIHRvYXN0IG1lc3NhZ2VcbiAgICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UuZmV0Y2hUb3BpY0J5SWRTb3J0KHRoaXMudG9waWNJZCwgJ3ZvdGVkJywgcGFnZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTlNEaXNjdXNzRGF0YS5JRGlzY3Vzc2lvbkRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZFJlc3BvbnNlKGRhdGEpXG4gICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBmZXRjaGluZyB0b3BpY3MnKVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhcHBlbmRSZXNwb25zZShkYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnBhZ2luYXRpb25EYXRhID0gXy5nZXQoZGF0YSwgJ3BhZ2luYXRpb24nKTtcbiAgICAvLyBUT0RPOiBBZnRlciB1cGRhdGluZyB0aGUgbm9kZWJiIHZlcnNpb24gdG8gdjEuMTguNiBvciBhYm92ZS4gUmVtb3ZlIHRoZSBmYWxsYmFjayBhZnRlciAyLzMgcmVsZWFzZXMuXG4gICAgdGhpcy5tYWluVWlkID0gXy5nZXQoZGF0YSwgJ2xvZ2dlZEluVXNlci51aWQnKSB8fCBfLmdldChkYXRhLCAncHJpdmlsZWdlcy51aWQnKTtcbiAgICB0aGlzLmNhdGVnb3J5SWQgPSBfLmdldChkYXRhLCAnY2lkJyk7XG4gICAgdGhpcy50b3BpY0lkID0gXy5nZXQoZGF0YSwgJ3RpZCcpO1xuICB9XG5cblxuICBzZXRQYWdpbmF0aW9uKCkge1xuICAgIHRoaXMucGFnZXIgPSB7XG4gICAgICBzdGFydEluZGV4OiB0aGlzLnBhZ2luYXRpb25EYXRhLmZpcnN0LnBhZ2UsXG4gICAgICBlbmRJbmRleDogdGhpcy5wYWdpbmF0aW9uRGF0YS5sYXN0LnBhZ2UsXG4gICAgICBwYWdlczogdGhpcy5wYWdpbmF0aW9uRGF0YS5wYWdlcyxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2luYXRpb25EYXRhLmN1cnJlbnRQYWdlLFxuICAgICAgdG90YWxQYWdlOiB0aGlzLnBhZ2luYXRpb25EYXRhLnBhZ2VDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgdXB2b3RlKGRpc2N1c3M6IE5TRGlzY3Vzc0RhdGEuSURpc2N1c3Npb25EYXRhKSB7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgZGVsdGE6IDEsXG4gICAgfTtcbiAgICB0aGlzLnByb2Nlc3NWb3RlKGRpc2N1c3MsIHJlcSk7XG4gIH1cblxuICBkb3dudm90ZShkaXNjdXNzOiBOU0Rpc2N1c3NEYXRhLklEaXNjdXNzaW9uRGF0YSkge1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGRlbHRhOiAtMSxcbiAgICB9O1xuICAgIHRoaXMucHJvY2Vzc1ZvdGUoZGlzY3VzcywgcmVxKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1ZvdGUoZGlzY3VzczogYW55LCByZXE6IGFueSkge1xuICAgIGlmIChkaXNjdXNzICYmIGRpc2N1c3MudWlkKSB7XG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnZvdGVQb3N0KGRpc2N1c3MucGlkLCByZXEpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRvYXN0XG4gICAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIodGhpcy50b2FzdFN1Y2Nlc3MubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgdGhpcy5wb3N0QW5zd2VyRm9ybS5yZXNldCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5zaG93VHJhZmZpY0FsZXJ0KGVycik7XG4gICAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYm9va21hcmsoZGlzY3VzczogYW55KSB7XG4gICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5ib29rbWFya1Bvc3QoZGlzY3Vzcy5waWQpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIC8vIHRvYXN0XG4gICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcignQm9va21hcmsgYWRkZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnIpO1xuICAgICAgICAvLyB0b2FzdFxuICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdW5Cb29rTWFyayhkaXNjdXNzOiBhbnkpIHtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmRlbGV0ZUJvb2ttYXJrUG9zdChkaXNjdXNzLnBpZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgLy8gdG9hc3RcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH0sXG4gICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyKTtcbiAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoZXJyLmVycm9yLm1lc3NhZ2Uuc3BsaXQoJ3wnKVsxXSB8fCB0aGlzLmRlZmF1bHRFcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZVZvdGUoZGlzY3VzczogYW55KSB7XG4gICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5kZWxldGVWb3RlUG9zdChkaXNjdXNzLnBpZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgLy8gdG9hc3RcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH0sXG4gICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyKTtcbiAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoZXJyLmVycm9yLm1lc3NhZ2Uuc3BsaXQoJ3wnKVsxXSB8fCB0aGlzLmRlZmF1bHRFcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBvc3RSZXBseShyZXBseUNvbnRlbnQ6IHN0cmluZywgcG9zdDogTlNEaXNjdXNzRGF0YS5JRGlzY3Vzc2lvbkRhdGEpIHtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBjb250ZW50OiByZXBseUNvbnRlbnQsXG4gICAgfTtcbiAgICB0aGlzLnBvc3RBbnN3ZXJGb3JtLmNvbnRyb2xzWydhbnN3ZXInXS5zZXRWYWx1ZSgnJyk7XG4gICAgaWYgKHBvc3QgJiYgcG9zdC50aWQpIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UucmVwbHlQb3N0KHBvc3QudGlkLCByZXEpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRvYXN0XG4gICAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoJ1lvdXIgcmVwbHkgd2FzIHNhdmVkIHN1Y2Nlc2Z1bHkhJyk7XG4gICAgICAgICAgLy8gdGhpcy5mZXRjaE5ld0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5zaG93VHJhZmZpY0FsZXJ0KGVycik7XG4gICAgICAgICAgLy8gdG9hc3RcbiAgICAgICAgICAvLyB0aGlzLm9wZW5TbmFja2JhcihlcnIuZXJyb3IubWVzc2FnZS5zcGxpdCgnfCcpWzFdIHx8IHRoaXMuZGVmYXVsdEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcG9zdENvbW1lbnRzUmVwbHkocmVwbHlDb250ZW50OiBzdHJpbmcsIHBvc3Q6IE5TRGlzY3Vzc0RhdGEuSVBvc3RzKSB7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgY29udGVudDogcmVwbHlDb250ZW50LFxuICAgICAgdG9QaWQ6IHBvc3QucGlkLFxuICAgIH07XG4gICAgaWYgKHBvc3QgJiYgcG9zdC50aWQpIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UucmVwbHlQb3N0KHBvc3QudGlkLCByZXEpLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRvYXN0XG4gICAgICAgICAgLy8gdGhpcy5vcGVuU25hY2tiYXIoJ1lvdXIgcmVwbHkgd2FzIHNhdmVkIHN1Y2Nlc2Z1bHkhJyk7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGVycm9yIGNvZGUgY2hlY2tcbiAgICAgICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyKTtcbiAgICAgICAgICAvLyB0b2FzdFxuICAgICAgICAgIC8vIHRoaXMub3BlblNuYWNrYmFyKGVyci5lcnJvci5tZXNzYWdlLnNwbGl0KCd8JylbMV0gfHwgdGhpcy5kZWZhdWx0RXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtRGVsZXRlKHBpZCkge1xuICAgIGlmICh3aW5kb3cuY29uZmlybShNU0dTLmRlbGV0ZVBvc3QpKSB7XG4gICAgICB0aGlzLmRlbGV0ZVBvc3QocGlkKTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXIoa2V5OiBzdHJpbmcgfCAndGltZXN0YW1wJyB8ICd1cHZvdGVzJykge1xuICAgIGlmIChrZXkpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlciA9IGtleTtcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlV2l0aFBhZ2UocGFnZTogYW55KSB7XG4gICAgaWYgKHBhZ2UgIT09IHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Um91dGVyU2x1ZygpfSR7Q09OU1RBTlRTLlJPVVRFUy5DQVRFR09SWX0gJHt0aGlzLnRvcGljSWR9YF0sIHsgcXVlcnlQYXJhbXM6IHsgcGFnZSB9LCAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiICB9KTtcbiAgICB9XG4gIH1cblxuICBzaG93RXJyb3IobWV0YTogc3RyaW5nKSB7XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmdDb2xvcih0YWdUaXRsZTogYW55KSB7XG4gICAgY29uc3QgYmdDb2xvciA9IHRoaXMuc3RyaW5nVG9Db2xvcih0YWdUaXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0Q29udHJhc3QoKTtcbiAgICByZXR1cm4geyBjb2xvciwgJ2JhY2tncm91bmQtY29sb3InOiBiZ0NvbG9yIH07XG4gIH1cblxuICBzdHJpbmdUb0NvbG9yKHRpdGxlKSB7XG4gICAgbGV0IGhhc2ggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aXRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXG4gICAgICBoYXNoID0gdGl0bGUuY2hhckNvZGVBdChpKSArICgoaGFzaCA8PCA1KSAtIGhhc2gpO1xuICAgIH1cbiAgICBjb25zdCBodWUgPSBNYXRoLmFicyhoYXNoICUgMzYwKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHByZWZlci10ZW1wbGF0ZVxuICAgIGNvbnN0IGNvbG91ciA9ICdoc2woJyArIGh1ZSArICcsMTAwJSwzMCUpJztcbiAgICByZXR1cm4gY29sb3VyO1xuICB9XG5cbiAgZ2V0Q29udHJhc3QoKSB7XG4gICAgcmV0dXJuICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDgwJSknO1xuICB9XG5cbiAgbG9nVGVsZW1ldHJ5KGV2ZW50LCBkYXRhPykge1xuICAgIGNvbnN0IHBpZCA9IF8uZ2V0KGRhdGEsICdwaWQnKSB8fCBfLmdldChkYXRhLCAnbWFpblBpZCcpID9cbiAgICAgIHsgaWQ6IF8uZ2V0KGRhdGEsICdwaWQnKSB8fCBfLmdldChkYXRhLCAnbWFpblBpZCcpLCB0eXBlOiAnUG9zdCcgfSA6IHt9O1xuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMudXBwZW5kQ29udGV4dChwaWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMubG9nSW50ZXJhY3QoZXZlbnQsIE5TRGlzY3Vzc0RhdGEuSVBhZ2VOYW1lLkRFVEFJTFMpO1xuICB9XG5cbiAgb25FZGl0TW9kZShVcGRhdGVQb3N0U3RhdHVzOiBib29sZWFuKSB7XG4gICAgaWYgKFVwZGF0ZVBvc3RTdGF0dXMpIHtcbiAgICAgIHRoaXMuZWRpdE1vZGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVhbHRpbWVQb3N0KHBvc3Q6IGFueSwgaW5kZXg6IGFueSkge1xuICAgIHRoaXMuZWRpdE1vZGUgPSB0cnVlO1xuICAgIHRoaXMuZWRpdENvbnRlbnRJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuY29udGVudFBvc3QgPSBfLmdldChwb3N0LCAnY29udGVudCcpLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpO1xuICAgIHBvc3QudG9nZ2xlID0gZmFsc2U7XG4gIH1cblxuICB1cGRhdGVQb3N0KHVwZGF0ZWRQb3N0Q29udGVudDogYW55LCBwaWQ6IG51bWJlcikge1xuICAgIHRoaXMuZWRpdE1vZGUgPSBmYWxzZTtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICBjb250ZW50OiB1cGRhdGVkUG9zdENvbnRlbnQsXG4gICAgICB0aXRsZTogJycsXG4gICAgICB0YWdzOiBbXSxcbiAgICAgIHVpZDogdGhpcy5tYWluVWlkXG4gICAgfTtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmVkaXRQb3N0KHBpZCwgcmVxKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVE9ETzogU3VjY2VzcyB0b2FzdFxuICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyb3IpO1xuICAgICAgLy8gVE9ETzogZXJyb3IgdG9hc3RcbiAgICAgIGNvbnNvbGUubG9nKCdlJywgZXJyb3IpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKHBpZCk7XG4gIH1cblxuICBkZWxldGVQb3N0KHBvc3RJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5kZWxldGVQb3N0KHBvc3RJZCwgdGhpcy5tYWluVWlkKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gVE9ETzogU3VjY2VzcyB0b2FzdFxuICAgICAgdGhpcy5yZWZyZXNoUG9zdERhdGEodGhpcy5jdXJyZW50QWN0aXZlUGFnZSk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyb3IpO1xuICAgICAgLy8gVE9ETzogZXJyb3IgdG9hc3RcbiAgICAgIGNvbnNvbGUubG9nKCdlJywgZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdFJlcGx5SGFuZGxlcihldmVudCwgcG9zdCkge1xuICAgIGlmIChfLmdldChldmVudCwgJ2FjdGlvbicpID09PSAnY2FuY2VsJykge1xuICAgICAgdGhpcy5vbkVkaXRNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKF8uZ2V0KGV2ZW50LCAnYWN0aW9uJykgPT09ICdlZGl0Jykge1xuICAgICAgdGhpcy51cGRhdGVQb3N0KF8uZ2V0KGV2ZW50LCAnY29udGVudCcpLCBfLmdldChwb3N0LCAncGlkJykpO1xuICAgICAgdGhpcy5sb2dUZWxlbWV0cnkoZXZlbnQsIHBvc3QpO1xuICAgIH1cbiAgfVxuXG4gIGNvbW1lbnRSZXBseUhhbmRsZXIoZXZlbnQsIHBvc3QpIHtcbiAgICBpZiAoXy5nZXQoZXZlbnQsICdhY3Rpb24nKSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgIHRoaXMudG9nZ2xlUG9zdChwb3N0KTtcbiAgICB9IGVsc2UgaWYgKF8uZ2V0KGV2ZW50LCAnYWN0aW9uJykgPT09ICdyZXBseScpIHtcbiAgICAgIHRoaXMucG9zdENvbW1lbnRzUmVwbHkoXy5nZXQoZXZlbnQsICdjb250ZW50JyksIHBvc3QpO1xuICAgICAgdGhpcy5sb2dUZWxlbWV0cnkoZXZlbnQsIHBvc3QpO1xuICAgIH1cbiAgfVxuXG4gIHBvc3RSZXBseUhhbmRsZXIoZXZlbnQsIHBvc3QpIHtcbiAgICBpZiAoXy5nZXQoZXZlbnQsICdhY3Rpb24nKSA9PT0gJ3JlcGx5Jykge1xuICAgICAgdGhpcy5wb3N0UmVwbHkoXy5nZXQoZXZlbnQsICdjb250ZW50JyksIHBvc3QpO1xuICAgICAgdGhpcy5sb2dUZWxlbWV0cnkoZXZlbnQsIHBvc3QpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVBvc3QocG9zdCkge1xuICAgIHBvc3QudG9nZ2xlID0gIXBvc3QudG9nZ2xlO1xuICAgIHRoaXMub25FZGl0TW9kZShmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCB0cmlnZ2VyIHRoZSBldmVudCBoYW5kbGVycyBhbmQgY2xvc2UgdGhlIHVwZGF0ZSB0aHJlYWQgcG9wdXAuXG4gICAqL1xuICBjbG9zZU1vZGFsKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnY2xvc2UgZXZlbnQnLCBldmVudCk7XG4gICAgaWYgKF8uZ2V0KGV2ZW50LCAnYWN0aW9uJykgPT09ICd1cGRhdGUnKSB7XG4gICAgICB0aGlzLmVkaXRUb3BpY0hhbmRsZXIoZXZlbnQsIF8uZ2V0KGV2ZW50LCAndGlkJyksIF8uZ2V0KGV2ZW50LCAncmVxdWVzdCcpKTtcbiAgICB9XG4gICAgdGhpcy5zaG93RWRpdFRvcGljTW9kYWwgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIG9wZW4gdXBkYXRlIHRocmVhZCBwb3B1cC5cbiAgICovXG4gICBlZGl0VG9waWMoZXZlbnQsIHRvcGljRGF0YSkge1xuICAgIHRoaXMuc2hvd0VkaXRUb3BpY01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmxvZ1RlbGVtZXRyeShldmVudCwgdG9waWNEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIGFsbCB0aGUgdXBkYXRlIHRvcGljIGFwaS4gSWYgc3VjY2VzcywgdGhlbiB3aWxsIHJlZnJlc2ggdGhlIGRhdGEuXG4gICAqL1xuICBlZGl0VG9waWNIYW5kbGVyKGV2ZW50LCB0aWQsIHVwZGF0ZVRvcGljUmVxdWVzdCkge1xuICAgIHRoaXMubG9nVGVsZW1ldHJ5KGV2ZW50LCB0aGlzLmVkaXRhYmxlVG9waWNEZXRhaWxzKTtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmVkaXRQb3N0KHRpZCwgdXBkYXRlVG9waWNSZXF1ZXN0KS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygndXBkYXRlIHN1Y2Nlc3MnLCBkYXRhKTtcbiAgICAgIHRoaXMucmVmcmVzaFBvc3REYXRhKHRoaXMuY3VycmVudEFjdGl2ZVBhZ2UpO1xuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIC8vIGVycm9yIGNvZGUgY2hlY2tcbiAgICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnJvcik7XG4gICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdXBkYXRpbmcnLCBlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCBvcGVuIHRoZSBjb25maXJtYXRpb24gcG9wdXAgYmVmb3JlIGRlbGV0aW5nIHRoZSB0b3BpYyxcbiAgICogICAgICAgICAgICAgICAgSWYgY2xpY2tlZCB5ZXMsIHRoZW4gd2lsbCBjYWxsIHRoZSBkZWxldGUgdG9waWMgaGFuZGxlci5cbiAgICovXG4gIGRlbGV0ZVRvcGljKGV2ZW50LCB0b3BpY0RhdGEpIHtcbiAgICBpZiAod2luZG93LmNvbmZpcm0oTVNHUy5kZWxldGVUb3BpYykpIHtcbiAgICAgIHRoaXMubG9nVGVsZW1ldHJ5KGV2ZW50LCB0b3BpY0RhdGEpO1xuICAgICAgdGhpcy5kZWxldGVUb3BpY0hhbmRsZXIoXy5nZXQodG9waWNEYXRhLCAndGlkJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBJdCB3aWxsIGFsbCB0aGUgZGVsZXRlIHRvcGljIGFwaS4gSWYgc3VjY2VzcywgdGhlbiB3aWxsIG5hdmlnYXRlIGJhY2sgdG8gdGhlIHByZXZpb3VzIHBhZ2UuXG4gICAqL1xuICBkZWxldGVUb3BpY0hhbmRsZXIodG9waWNJZCkge1xuICAgIHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UuZGVsZXRlVG9waWModG9waWNJZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgLy8gZXJyb3IgY29kZSBjaGVja1xuICAgICAgdGhpcy5kaXNjdXNzaW9uU2VydmljZS5zaG93VHJhZmZpY0FsZXJ0KGVycm9yKTtcbiAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSBkZWxldGluZycsIGVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gSXQgd2lsbCB0b2dnbGUgdGhlIGtlYmFiIG1lbnUgY2xpY2tcbiAgICovXG4gIG9uTWVudUNsaWNrKCkge1xuICAgIHRoaXMuZHJvcGRvd25Db250ZW50ID0gIXRoaXMuZHJvcGRvd25Db250ZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucGFyYW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnBhcmFtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8bGliLWFwcC1sb2FkZXIgKm5nSWY9XCIhc2hvd0xvYWRlclwiPjwvbGliLWFwcC1sb2FkZXI+XG48ZGl2IGNsYXNzPVwiZGlzY3Vzcy1kZXRhaWxzLWNvbnRlbnRcIiAqbmdJZj1cInNob3dMb2FkZXJcIj5cbiAgPGRpdiBjbGFzcz1cImRpc2N1c3Npb24tZGV0YWlsc1wiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJsaW5rXCI+XG5cbiAgICAgIDwhLS0gaGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImRpc2N1c3MtY2FyZC1rYWJhYi1tZW51XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImRpc2N1c3Npb24tY2FyZC10aXRsZSBkZi1sYWJlbC1jb2xvclwiIFtpbm5lckhUTUxdPVwiZGF0YT8udGl0bGVcIj48L2gzPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YT8udWlkID09PSBtYWluVWlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImthYmFiLW1lbnVcIiBpZD1cImdyb3VwLWFjdGlvbnNcIiAoY2xpY2spPVwib25NZW51Q2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYWJhYi1tZW51LWRyb3Bkb3duLWNvbnRlbnRcIiBbaGlkZGVuXT1cImRyb3Bkb3duQ29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZWRpdC10b3BpY1wiIGNsYXNzPVwibGlzdFwiIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUb3BpYygkZXZlbnQsIGRhdGEpOyBlZGl0YWJsZVRvcGljRGV0YWlscyA9IGRhdGFcIj5FZGl0XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwiZGVsZXRlLXRvcGljXCIgY2xhc3M9XCJsaXN0XCIgKGNsaWNrKT1cImRlbGV0ZVRvcGljKCRldmVudCwgZGF0YSlcIiB0YWJpbmRleD1cIjBcIj5EZWxldGU8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gL2hlYWRlciAtLT5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcG9zdCBvZiBkYXRhPy5wb3N0c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1yZXBseS1jYXJkXCIgKm5nSWY9XCJwb3N0Py5pbmRleCA9PT0gMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImRpc2N1c3Npb24taGVhZGluZyBkZi10ZXh0LWNvbG9yXCIgW2lubmVySFRNTF09XCJwb3N0Py5jb250ZW50XCI+PC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY3Vzc2lvbi1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlLXRleHRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZS1sYWJlbFwiPnt7IHBvc3Q/LnVzZXI/LnVzZXJuYW1lIHwgc3BsaXRJbml0aWFscyB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY3Vzc2lvbi1sYWJlbHNcIj57eydBc2tlZCBieSAnfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjdXNzaW9uLWxhYmVsc1wiICpuZ0lmPVwicG9zdC51c2VyLmZ1bGxuYW1lXCIgW2lubmVySFRNTF09XCJwb3N0LnVzZXIuZnVsbG5hbWVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjdXNzaW9uLWxhYmVsc1wiICpuZ0lmPVwiIXBvc3QudXNlci5mdWxsbmFtZVwiIFtpbm5lckhUTUxdPVwicG9zdC51c2VyLnVzZXJuYW1lXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFnc1wiIGFyaWEtbGFiZWw9XCJ0YWdzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YSAmJiBkYXRhPy50YWdzICYmIGRhdGE/LnRhZ3M/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHRhZyBvZiBkYXRhPy50YWdzXCIgY2xhc3M9XCJ0YWdcIiByb2xlPVwibGlua1wiIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0QmdDb2xvcih0YWcudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAge3t0YWcudmFsdWV9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy1hcmVhXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIiAqbmdJZj1cIiFwb3N0LnVwdm90ZWRcIiAoY2xpY2spPVwidXB2b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJ1cHZvdGUgdGhlIHBvc3RcIiBpZD1cInVwLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy91cC1hcnJvdy5wbmdcIiBhbHQ9XCJ1cC1hcnJvd1wiIGNsYXNzPVwiaWNvbnNcIlxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ1cCBhcnJvdyBpY29uIGZvciBsaWtlIHRoZSBwb3N0XCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicG9zdC51cHZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIiBhcmlhLWxhYmVsPVwicmVtb3ZlIHVwdm90ZVwiIGlkPVwiZGVsZXRlLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy91cC5zdmdcIiBhbHQ9XCJzZWxlY3QtdXAtYXJyb3dcIiBjbGFzcz1cImljb25zXCIgYWx0PVwidXAgaW1hZ2VcIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2b3RlLXZhbHVlXCIgcm9sZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIndG90YWwgdXB2b2F0IGlzJyArIGRhdGE/LnVwdm90ZXNcIj57e2RhdGE/LnVwdm90ZXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcG9zdD8uZG93bnZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd252b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cImRvd252b3RlIHBvc3RcIiBpZD1cImRvd24tdm90ZVwiPlxuICAgICAgICAgICAgICAgICAgPCEtLSBkb3dud2FyZCBhcnJvdyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZG93bi1hcnJvdy5wbmdcIiBjbGFzcz1cImljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwiZG93biBhcnJvdyBpY29uIGZvciB1bmxpa2UgcG9zdFwiPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBvc3Q/LmRvd252b3RlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWb3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cInJlbW92ZSBkb3duIHZvdGVcIiBpZD1cImRlbGV0ZS12b3RlXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIGRvd253YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9kb3duLnN2Z1wiIGNsYXNzPVwiaWNvbnNcIiBhbHQ9XCJkb3duIGltYWdlXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiIHJvbGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3RvdGFsIHVwdm9hdCBpcycgKyBkYXRhPy51cHZvdGVzXCI+e3tkYXRhPy5kb3dudm90ZXN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICA8IS0tIHRyZW5kaW5nIC0tPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdmlld3Muc3ZnXCIgYWx0PVwidmlld3MgaWNvbiBmb3Igc2VlaW5nIHRoZSBwb3N0c1wiIGNsYXNzPVwiaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvdGUtdmFsdWVcIiBhcmlhLWxhYmVsPVwidmlld3MgY291bnRcIj57e2RhdGEudmlld2NvdW50fX0gVmlld3M8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LWljb25zIG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWRhdGE/LnBvc3RzWzBdPy5ib29rbWFya2VkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJvb2ttYXJrKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cIkJvb2ttYXJrIHBvc3RcIiBpZD1cImJvb2ttYXJrXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIGJvb2ttYXJrIC0tPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9ib29rbWFya3MucG5nXCIgY2xhc3M9XCJpY29uc1wiIGFsdD1cImJvb2ttYXJrIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXRhPy5wb3N0c1swXT8uYm9va21hcmtlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1bkJvb2tNYXJrKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cInVuQm9va21hcmsgcG9zdFwiXG4gICAgICAgICAgICAgICAgICBpZD1cInVuLWJvb2ttYXJrLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gYm9va21hcmsgLS0+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL3NlbGVjdC1ib29rbWFya3MucG5nXCIgY2xhc3M9XCJpY29ucyBib29rbWFyay1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwic2VsZWN0IGJvb2ttYXJrIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YT8ucG9zdGNvdW50LTEgPiAwXCIgYXJpYS1sYWJlbD1cImNvbW1lbnRzIGNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tkYXRhPy5wb3N0Y291bnQtMX19XG4gICAgICAgICAgICAgICAgY29tbWVudHNcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGE/LnBvc3Rjb3VudC0xIDw9MFwiIGFyaWEtbGFiZWw9XCJjb21tZW50cyBjb3VudFwiPlxuICAgICAgICAgICAgICAgIDAgY29tbWVudHM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSAvY2FyZCBjb250ZW50IC0tPlxuICAgICAgICA8IS0tIHBvc3QgcmVwbHkgLS0+XG4gICAgICAgIDxsaWItcG9zdC1yZXBseSAoYWN0aW9uRXZlbnQpPVwicG9zdFJlcGx5SGFuZGxlcigkZXZlbnQsIHBvc3QpOyBsb2dUZWxlbWV0cnkoJGV2ZW50LCBwb3N0KVwiIFttb2RlXT1cIidyZXBseSdcIlxuICAgICAgICAgIFtzaG93Q2FuY2VsXT1cImZhbHNlXCI+PC9saWItcG9zdC1yZXBseT5cbiAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIC9jYXJkIGVuZCAtLT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5wb3N0cyAmJiBkYXRhPy5wb3N0Y291bnQgPiAxXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVjZW50LXRhYnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYnMtY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWZpbHRlclwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvblwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCIgW25nQ2xhc3NdPVwieyd0YWJzLWFjdGl2ZScgOiBjdXJyZW50RmlsdGVyID09PSAndGltZXN0YW1wJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd3MtbWF0LWFjY2VudC1ib3JkZXInOmN1cnJlbnRGaWx0ZXIgIT09ICd0aW1lc3RhbXAnfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXIoJ3RpbWVzdGFtcCcpO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgaWQ9XCJyZWNlbnQtcG9zdFwiPlxuICAgICAgICAgICAgICBSZWNlbnQgPC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcG9zdCBvZiBkYXRhPy5wb3N0cyB8IHNvcnRCeTogJ3RpbWVzdGFtcElTTyc6J2Rlc2MnOyBpbmRleCBhcyBpXCI+XG4gICAgICA8IS0tIGNhcmQgY29udGVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJwb3N0Py5pbmRleCAhPSAwXCIgY2xhc3M9XCJwb3N0LWNhcmRcIj5cbiAgICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50LXNlY3Rpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1oZWFkZXItY29udGVudFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaXJjbGUtdGV4dFwiPjxzcGFuIGNsYXNzPVwiY2lyY2xlLWxhYmVsXCI+e3sgcG9zdD8udXNlcj8udXNlcm5hbWUgfCBzcGxpdEluaXRpYWxzXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LW5hbWVcIiAqbmdJZj1cInBvc3Q/LnVzZXI/LmZ1bGxuYW1lXCIgW2lubmVySFRNTF09XCJwb3N0Py51c2VyPy5mdWxsbmFtZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9zdC1uYW1lIGRmLWxhYmVsLWNvbG9yXCIgKm5nSWY9XCIhcG9zdD8udXNlcj8uZnVsbG5hbWVcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInBvc3Q/LnVzZXI/LnVzZXJuYW1lXCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tYWN0aW9uc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LXRpbWVcIj57eyBwb3N0Py50aW1lc3RhbXAgfCBkYXRlOiAnZGQgTU1NIHl5eXkgaGg6bW0gYSd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYWluVWlkID09PSBwb3N0Py51aWRcIj5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9lZGl0LnN2Z1wiIGNsYXNzPVwiZWRpdC1pY29uXCIgaWQ9XCJlZGl0LXBvc3RcIiBhbHQ9XCJlZGl0IGljb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRSZWFsdGltZVBvc3QocG9zdCwgaSlcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9kZWxldGUuc3ZnXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIGlkPVwiZGVsZXRlLXBvc3RcIiBhbHQ9XCJkZWxldGUgaWNvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1EZWxldGUocG9zdD8ucGlkKVwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIC8gaGVhZGVyIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LXRleHRcIiAqbmdJZj1cIiFlZGl0TW9kZSB8fCBlZGl0Q29udGVudEluZGV4ICE9PSBpXCI+XG4gICAgICAgICAgICA8cCBbaW5uZXJIVE1MXT1cInBvc3Q/LmNvbnRlbnRcIiBjbGFzcz1cInBvc3QtbGFiZWxzIGRmLXRleHQtY29sb3JcIj48L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdGVkLXRleHRcIiAqbmdJZj1cInBvc3Q/LmVkaXRlZFwiPihlZGl0ZWQpPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImVkaXRNb2RlICYmIGVkaXRDb250ZW50SW5kZXggPT09IGlcIj5cbiAgICAgICAgICAgIDxsaWItcG9zdC1yZXBseSAoYWN0aW9uRXZlbnQpPVwiZWRpdFJlcGx5SGFuZGxlcigkZXZlbnQsIHBvc3QpXCIgW21vZGVdPVwiJ2VkaXQnXCIgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb250ZW50XT1cImNvbnRlbnRQb3N0XCI+PC9saWItcG9zdC1yZXBseT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktYXJlYVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXAtdm90ZS10ZXh0XCIgKm5nSWY9XCIhcG9zdD8udXB2b3RlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cHZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIiBhcmlhLWxhYmVsPVwidXB2b3RlIGNvbW1lbnRcIiBpZD1cInVwLXZvdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdXAuc3ZnXCIgY2xhc3M9XCJpY29uc1wiIGFsdD1cInVwIGljb25cIj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3N0LWljb25zIG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gdXB3YXJkIGFycm93IC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG93bi12b3RlLXRleHRcIiAqbmdJZj1cInBvc3QudXB2b3RlZFwiIHJvbGU9XCJsaW5rXCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWb3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cImRlbGV0ZSB1cHZvdGUgb24gY29tbWVudFwiXG4gICAgICAgICAgICAgICAgICBpZD1cImRlbGV0ZS12b3RlXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL3VwLnN2Z1wiIGNsYXNzPVwiaWNvbnNcIiBhbHQ9XCJ1cCBpY29uXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiPnt7cG9zdD8udXB2b3Rlc319PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IG1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwiZG93bi12b3RlXCIgKm5nSWY9XCIhcG9zdD8uZG93bnZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd252b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCIgYXJpYS1sYWJlbD1cImRvd252b3RlIGNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gZG93bndhcmQgYXJyb3cgLS0+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL2Rvd24tYXJyb3cucG5nXCIgY2xhc3M9XCJpY29uc1wiIGFsdD1cImRvd24gYXJyb3cgaWNvblwiPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJkZWxldGUtdm90ZVwiICpuZ0lmPVwicG9zdD8uZG93bnZvdGVkXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIiBhcmlhLWxhYmVsPVwiZGVsZXRlIGRvd252b3RlIG9uIGNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gZG93biBhcnJvdyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZG93bi5zdmdcIiBjbGFzcz1cImljb25zXCIgYWx0PVwiZG93biBpY29uXCI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiPnt7cG9zdD8uZG93bnZvdGVzfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVQb3N0KHBvc3QpOyBsb2dUZWxlbWV0cnkoJGV2ZW50LCBwb3N0KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGYtYnRuIGRmLWJ0bi1ub3JtYWwgZGYtYnRuLXByaW1hcnkgZGYtcmVwbHktYnRuXCIgaWQ9XCJyZXBseS1jb21tZW50XCI+XG4gICAgICAgICAgICAgIFJlcGx5IDwvYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGxpZXNcIiAqbmdJZj1cInBvc3Q/LnRvZ2dsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXBseVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cG9zdDpwb3N0fVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBvc3Q/LnJlcGxpZXM/LmNvdW50ID4gMFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktY29udGVudFwiIChjbGljayk9XCJwb3N0LnJlcGx5Q291bnRUb2dnbGUgPSAhcG9zdC5yZXBseUNvdW50VG9nZ2xlXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcGxpZXMtY291bnRcIj4ge3twb3N0Py5yZXBsaWVzPy5jb3VudH19IHJlcGx5KHMpIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwb3N0Py5yZXBseUNvdW50VG9nZ2xlXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIiBhcmlhLWxhYmVsPVwicmVwbHkgdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWljb25cIiAqbmdJZj1cInBvc3Q/LnJlcGx5Q291bnRUb2dnbGVcIiBhcmlhLWxhYmVsPVwicmVwbHkgdG9nZ2xlIHVwd2FyZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIHVwIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdXAtY2hldnJvbi5wbmdcIiBjbGFzcz1cImljb25zXCIgYWx0PVwidXAgY2hldnJvbiBpY29uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFwb3N0LnJlcGx5Q291bnRUb2dnbGVcIiByb2xlPVwibGlua1wiIHRhYmluZGV4PVwiMFwiIGFyaWEtbGFiZWw9XCJyZXBseSB0b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtaWNvblwiICpuZ0lmPVwiIXBvc3QucmVwbHlDb3VudFRvZ2dsZVwiIGFyaWEtbGFiZWw9XCJyZXBseSB0b2dnbGUgZG93bndhcmRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBkb3duIGFycm93IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvZG93bi1jaGV2cm9uLnBuZ1wiIGNsYXNzPVwiaWNvbnNcIiBhbHQ9XCJkb3duIGNoZXZyb24gaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXN0LXJlcGx5LWRhdGFcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFwb3N0LnJlcGx5Q291bnRUb2dnbGVcIj5MYXN0IHJlcGx5XG4gICAgICAgICAgICAgICAgICB7eyBwb3N0Py5yZXBsaWVzPy50aW1lc3RhbXBJU08gfCBkYXRlOiAnZGQgTU1NIHl5eXkgaGg6bW0gYScgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGxpZXNcIiAqbmdJZj1cInBvc3Q/LnJlcGx5Q291bnRUb2dnbGVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXBsaWVzXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Bvc3RzOmRhdGEucG9zdHMsIHBvc3RJZDpwb3N0LnBpZH1cIj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gL2NhcmQgY29udGVudCAtLT5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSAgLyBjYXJkIC0tPlxuICAgICAgPCEtLSBEaXZpZGVyIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInBvc3QuaW5kZXggIT0gMFwiPjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwicmVsYXRlZC1kaXNjdXNzLXBhcnRcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZmV0Y2hTaW5nbGVDYXRlZ29yeUxvYWRlclwiIGNsYXNzPVwicmVsYXRlZC1kaXNjdXNzLXBhcnQtY29udGVudFwiPjwvZGl2PlxuICAgIDxsaWItcmVsYXRlZC1kaXNjdXNzaW9uICpuZ0lmPVwiIWZldGNoU2luZ2xlQ2F0ZWdvcnlMb2FkZXJcIiBbY2F0SWRdPVwiY2F0ZWdvcnlJZFwiIFt0b3BpY0lkXT1cInRvcGljSWRcIj5cbiAgICA8L2xpYi1yZWxhdGVkLWRpc2N1c3Npb24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcmVwbHkgbGV0LXBvc3Q9XCJwb3N0XCI+XG4gIDxsaWItcG9zdC1yZXBseSAoYWN0aW9uRXZlbnQpPVwiY29tbWVudFJlcGx5SGFuZGxlcigkZXZlbnQsIHBvc3QpXCIgW21vZGVdPVwiJ3JlcGx5J1wiIFtzaG93Q2FuY2VsXT1cInRydWVcIj5cbiAgPC9saWItcG9zdC1yZXBseT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVwbGllcyBsZXQtcG9zdHM9XCJwb3N0c1wiIGxldC1wb3N0SWQ9XCJwb3N0SWRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcG9zdCBvZiBwb3N0cyB8IHBpcGVGaWx0ZXI6J3RvUGlkJzogcG9zdElkOyBpbmRleCBhcyBpbmRleDsgbGFzdCBhcyBsYXN0XCI+XG4gICAgPCEtLSBjYXJkIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwb3N0LXN1Yi1jYXJkXCI+XG4gICAgICA8IS0tIGNhcmQtaGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1oZWFkZXItY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGUtdGV4dFwiPjxkaXYgY2xhc3M9XCJjaXJjbGUtbGFiZWxcIj57eyBwb3N0Py51c2VyPy51c2VybmFtZSB8IHNwbGl0SW5pdGlhbHMgfX08L2Rpdj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zdC1uYW1lXCIgKm5nSWY9XCJwb3N0Py51c2VyPy5mdWxsbmFtZVwiIFtpbm5lckhUTUxdPVwicG9zdD8udXNlcj8uZnVsbG5hbWVcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGYtbGFiZWwtY29sb3IgcG9zdC1uYW1lXCIgKm5nSWY9XCIhcG9zdD8udXNlcj8uZnVsbG5hbWVcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJwb3N0Py51c2VyPy51c2VybmFtZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc3QtdGltZVwiPnt7IHBvc3Q/LnRpbWVzdGFtcCB8IGRhdGV9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIC9jYXJkLWhlYWRlciAtLT5cblxuICAgICAgPCEtLSBjYXJkLWNvbnRlbnQgLS0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8cCByb2xlPVwibGlua1wiIHRhYmluZGV4PVwiMFwiIHRhYmluZGV4PVwiMFwiIFtpbm5lckhUTUxdPVwicG9zdD8uY29udGVudFwiPjwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlcGx5LWFyZWFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktYXJlYS1jb250ZW50XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgIDwhLS0gdXAgYXJyb3cgLS0+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhcG9zdD8udXB2b3RlZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidXB2b3RlKHBvc3QpO2xvZ1RlbGVtZXRyeSgkZXZlbnQsIHBvc3QpXCJcbiAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy91cC1hcnJvdy5wbmdcIiBhbHQ9XCJ1cCBhcnJvdyBpY29uXCIgY2xhc3M9XCJpY29uc1wiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwicG9zdD8udXB2b3RlZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlVm90ZShwb3N0KTtsb2dUZWxlbWV0cnkoJGV2ZW50LCBwb3N0KVwiXG4gICAgICAgICAgICAgICAgc3JjPVwiLi9hc3NldHMvZGlzY3Vzc2lvbi11aS9pbWFnZXMvdXAuc3ZnXCIgYWx0PVwic2VsZWN0IHVwIGFycm93IGljb25cIiBjbGFzcz1cImljb25zXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm90ZS12YWx1ZVwiPnt7cG9zdC51cHZvdGVzfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc3QtaWNvbnMgbW9iaWxlXCI+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhcG9zdD8uZG93bnZvdGVkXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkb3dudm90ZShwb3N0KTsgbG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIlxuICAgICAgICAgICAgICAgIGlkPVwidXAtdm90ZVwiIHRhYmluZGV4PVwiMFwiIHNyYz1cIi4vYXNzZXRzL2Rpc2N1c3Npb24tdWkvaW1hZ2VzL2Rvd24tYXJyb3cucG5nXCIgYWx0PVwiZG93biBhcnJvdyBpY29uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImljb25zXCI+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwb3N0Py5kb3dudm90ZWRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZVZvdGUocG9zdCk7bG9nVGVsZW1ldHJ5KCRldmVudCwgcG9zdClcIlxuICAgICAgICAgICAgICAgIGlkPVwiZGVsZXRlLXZvdGVcIiB0YWJpbmRleD1cIjBcIiBzcmM9XCIuL2Fzc2V0cy9kaXNjdXNzaW9uLXVpL2ltYWdlcy9kb3duLnN2Z1wiIGFsdD1cInNlbGVjdCBkb3duIGFycm93IGljb25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbnNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2b3RlLXZhbHVlXCI+e3twb3N0Py5kb3dudm90ZXN9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICAgIDwhLS0gL2NhcmQgLS0+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpMTgtdmFsdWUgaTE4LWFyaWEtdmFsdWUgYXJpYS12YWx1ZT1cIlRoYW5rIHlvdSBmb3Igdm90aW5nIVwiIHZhbHVlPVwiVGhhbmsgeW91IGZvciB2b3RpbmchIVwiXG4gICN0b2FzdFN1Y2Nlc3MgLz5cbjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaTE4LXZhbHVlIGkxOC1hcmlhLXZhbHVlIGFyaWEtdmFsdWU9XCJTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciFcIlxuICB2YWx1ZT1cIlNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIVwiICN0b2FzdEVycm9yIC8+XG5cbjxsaWItZGlzY3Vzcy1zdGFydCBbbW9kZV09XCInZWRpdCdcIiBbdG9waWNEYXRhXT1cImVkaXRhYmxlVG9waWNEZXRhaWxzXCIgKGNsb3NlKT1cImNsb3NlTW9kYWwoJGV2ZW50KVwiXG4gICpuZ0lmPVwic2hvd0VkaXRUb3BpY01vZGFsXCI+PC9saWItZGlzY3Vzcy1zdGFydD4iXX0=
|