@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.
Files changed (174) hide show
  1. package/README.md +24 -0
  2. package/assets/images/Buffer-512.webp +0 -0
  3. package/assets/images/announcement.svg +25 -0
  4. package/assets/images/back-img.png +0 -0
  5. package/assets/images/bookmarks.png +0 -0
  6. package/assets/images/card-icon.png +0 -0
  7. package/assets/images/close.png +0 -0
  8. package/assets/images/delete.svg +13 -0
  9. package/assets/images/down-arrow.png +0 -0
  10. package/assets/images/down-chevron.png +0 -0
  11. package/assets/images/down.svg +12 -0
  12. package/assets/images/edit.svg +11 -0
  13. package/assets/images/empty.svg +37 -0
  14. package/assets/images/eye-icon.png +0 -0
  15. package/assets/images/general discussion.svg +15 -0
  16. package/assets/images/import-export-arrows.png +0 -0
  17. package/assets/images/loader-icon.svg +6 -0
  18. package/assets/images/profits.png +0 -0
  19. package/assets/images/search-icon.png +0 -0
  20. package/assets/images/select-bookmarks.png +0 -0
  21. package/assets/images/select-down-arrow.png +0 -0
  22. package/assets/images/select-profits.png +0 -0
  23. package/assets/images/select-up-arrow.png +0 -0
  24. package/assets/images/up-arrow.png +0 -0
  25. package/assets/images/up-chevron.png +0 -0
  26. package/assets/images/up.svg +12 -0
  27. package/assets/images/views.svg +9 -0
  28. package/assets/images/votes.svg +14 -0
  29. package/assets/styles/global.scss +283 -0
  30. package/esm2022/jeraldj-discussions-ui.mjs +5 -0
  31. package/esm2022/lib/common/constants.json +630 -0
  32. package/esm2022/lib/components/components.module.mjs +105 -0
  33. package/esm2022/lib/components/discuss-all/discuss-all.component.mjs +269 -0
  34. package/esm2022/lib/components/discuss-category/discuss-category.component.mjs +152 -0
  35. package/esm2022/lib/components/discuss-home/discuss-home.component.mjs +142 -0
  36. package/esm2022/lib/components/discuss-start/discuss-start.component.mjs +199 -0
  37. package/esm2022/lib/components/discuss-tags/discuss-tags.component.mjs +93 -0
  38. package/esm2022/lib/components/discussion-details/discussion-details.component.mjs +459 -0
  39. package/esm2022/lib/components/lib-entry/lib-entry.component.mjs +96 -0
  40. package/esm2022/lib/components/my-discussion/my-discussion.component.mjs +234 -0
  41. package/esm2022/lib/components/side-pannel/side-pannel.component.mjs +79 -0
  42. package/esm2022/lib/components/tag-all-discussion/tag-all-discussion.component.mjs +151 -0
  43. package/esm2022/lib/components/trending-tags/trending-tags.component.mjs +62 -0
  44. package/esm2022/lib/config/url.config.mjs +32 -0
  45. package/esm2022/lib/discussion-events.service.mjs +27 -0
  46. package/esm2022/lib/discussion-routing/discussion-routing.module.mjs +80 -0
  47. package/esm2022/lib/discussion-ui.module.mjs +41 -0
  48. package/esm2022/lib/elements/app-loader/app-loader.component.mjs +36 -0
  49. package/esm2022/lib/elements/avatar-photo/avatar-photo.component.mjs +81 -0
  50. package/esm2022/lib/elements/category-card/category-card.component.mjs +17 -0
  51. package/esm2022/lib/elements/discuss-card/discuss-card.component.mjs +45 -0
  52. package/esm2022/lib/elements/elements.module.mjs +69 -0
  53. package/esm2022/lib/elements/load-alert/load-alert.component.mjs +34 -0
  54. package/esm2022/lib/elements/post-reply/post-reply.component.mjs +69 -0
  55. package/esm2022/lib/elements/related-discussion/related-discussion.component.mjs +61 -0
  56. package/esm2022/lib/elements/sliders/sliders.component.mjs +76 -0
  57. package/esm2022/lib/events.service.mjs +31 -0
  58. package/esm2022/lib/models/discuss.model.mjs +16 -0
  59. package/esm2022/lib/models/discussion-config.model.mjs +2 -0
  60. package/esm2022/lib/navigation-service.service.mjs +39 -0
  61. package/esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs +20 -0
  62. package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs +22 -0
  63. package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs +41 -0
  64. package/esm2022/lib/pipes/pipes.module.mjs +24 -0
  65. package/esm2022/lib/pipes/sort-by/sort-by.pipe.mjs +34 -0
  66. package/esm2022/lib/pipes/split-initials/split-initials.pipe.mjs +23 -0
  67. package/esm2022/lib/router-service.service.mjs +21 -0
  68. package/esm2022/lib/services/abstract-config.service.mjs +3 -0
  69. package/esm2022/lib/services/config.service.mjs +76 -0
  70. package/esm2022/lib/services/discuss-utils.service.mjs +36 -0
  71. package/esm2022/lib/services/discussion.service.mjs +254 -0
  72. package/esm2022/lib/telemetry-utils.service.mjs +103 -0
  73. package/esm2022/lib/wrapper/base-wrapper/base-wrapper.component.mjs +41 -0
  74. package/esm2022/lib/wrapper/category-widget/category-widget.component.mjs +37 -0
  75. package/esm2022/lib/wrapper/tags-widget/tags-widget.component.mjs +33 -0
  76. package/esm2022/lib/wrapper-navigate.service.mjs +23 -0
  77. package/esm2022/public-api.mjs +29 -0
  78. package/fesm2022/jeraldj-discussions-ui.mjs +3929 -0
  79. package/fesm2022/jeraldj-discussions-ui.mjs.map +1 -0
  80. package/index.d.ts +6 -0
  81. package/jeraldj-discussions-ui.d.ts.map +1 -0
  82. package/lib/components/components.module.d.ts +24 -0
  83. package/lib/components/components.module.d.ts.map +1 -0
  84. package/lib/components/discuss-all/discuss-all.component.d.ts +61 -0
  85. package/lib/components/discuss-all/discuss-all.component.d.ts.map +1 -0
  86. package/lib/components/discuss-category/discuss-category.component.d.ts +45 -0
  87. package/lib/components/discuss-category/discuss-category.component.d.ts.map +1 -0
  88. package/lib/components/discuss-home/discuss-home.component.d.ts +59 -0
  89. package/lib/components/discuss-home/discuss-home.component.d.ts.map +1 -0
  90. package/lib/components/discuss-start/discuss-start.component.d.ts +50 -0
  91. package/lib/components/discuss-start/discuss-start.component.d.ts.map +1 -0
  92. package/lib/components/discuss-tags/discuss-tags.component.d.ts +41 -0
  93. package/lib/components/discuss-tags/discuss-tags.component.d.ts.map +1 -0
  94. package/lib/components/discussion-details/discussion-details.component.d.ts +112 -0
  95. package/lib/components/discussion-details/discussion-details.component.d.ts.map +1 -0
  96. package/lib/components/lib-entry/lib-entry.component.d.ts +42 -0
  97. package/lib/components/lib-entry/lib-entry.component.d.ts.map +1 -0
  98. package/lib/components/my-discussion/my-discussion.component.d.ts +54 -0
  99. package/lib/components/my-discussion/my-discussion.component.d.ts.map +1 -0
  100. package/lib/components/side-pannel/side-pannel.component.d.ts +34 -0
  101. package/lib/components/side-pannel/side-pannel.component.d.ts.map +1 -0
  102. package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts +53 -0
  103. package/lib/components/tag-all-discussion/tag-all-discussion.component.d.ts.map +1 -0
  104. package/lib/components/trending-tags/trending-tags.component.d.ts +26 -0
  105. package/lib/components/trending-tags/trending-tags.component.d.ts.map +1 -0
  106. package/lib/config/url.config.d.ts +29 -0
  107. package/lib/config/url.config.d.ts.map +1 -0
  108. package/lib/discussion-events.service.d.ts +12 -0
  109. package/lib/discussion-events.service.d.ts.map +1 -0
  110. package/lib/discussion-routing/discussion-routing.module.d.ts +9 -0
  111. package/lib/discussion-routing/discussion-routing.module.d.ts.map +1 -0
  112. package/lib/discussion-ui.module.d.ts +16 -0
  113. package/lib/discussion-ui.module.d.ts.map +1 -0
  114. package/lib/elements/app-loader/app-loader.component.d.ts +17 -0
  115. package/lib/elements/app-loader/app-loader.component.d.ts.map +1 -0
  116. package/lib/elements/avatar-photo/avatar-photo.component.d.ts +19 -0
  117. package/lib/elements/avatar-photo/avatar-photo.component.d.ts.map +1 -0
  118. package/lib/elements/category-card/category-card.component.d.ts +10 -0
  119. package/lib/elements/category-card/category-card.component.d.ts.map +1 -0
  120. package/lib/elements/discuss-card/discuss-card.component.d.ts +17 -0
  121. package/lib/elements/discuss-card/discuss-card.component.d.ts.map +1 -0
  122. package/lib/elements/elements.module.d.ts +18 -0
  123. package/lib/elements/elements.module.d.ts.map +1 -0
  124. package/lib/elements/load-alert/load-alert.component.d.ts +15 -0
  125. package/lib/elements/load-alert/load-alert.component.d.ts.map +1 -0
  126. package/lib/elements/post-reply/post-reply.component.d.ts +22 -0
  127. package/lib/elements/post-reply/post-reply.component.d.ts.map +1 -0
  128. package/lib/elements/related-discussion/related-discussion.component.d.ts +26 -0
  129. package/lib/elements/related-discussion/related-discussion.component.d.ts.map +1 -0
  130. package/lib/elements/sliders/sliders.component.d.ts +18 -0
  131. package/lib/elements/sliders/sliders.component.d.ts.map +1 -0
  132. package/lib/events.service.d.ts +18 -0
  133. package/lib/events.service.d.ts.map +1 -0
  134. package/lib/models/discuss.model.d.ts +298 -0
  135. package/lib/models/discuss.model.d.ts.map +1 -0
  136. package/lib/models/discussion-config.model.d.ts +42 -0
  137. package/lib/models/discussion-config.model.d.ts.map +1 -0
  138. package/lib/navigation-service.service.d.ts +22 -0
  139. package/lib/navigation-service.service.d.ts.map +1 -0
  140. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +8 -0
  141. package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts.map +1 -0
  142. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +8 -0
  143. package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts.map +1 -0
  144. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +8 -0
  145. package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts.map +1 -0
  146. package/lib/pipes/pipes.module.d.ts +13 -0
  147. package/lib/pipes/pipes.module.d.ts.map +1 -0
  148. package/lib/pipes/sort-by/sort-by.pipe.d.ts +8 -0
  149. package/lib/pipes/sort-by/sort-by.pipe.d.ts.map +1 -0
  150. package/lib/pipes/split-initials/split-initials.pipe.d.ts +8 -0
  151. package/lib/pipes/split-initials/split-initials.pipe.d.ts.map +1 -0
  152. package/lib/router-service.service.d.ts +10 -0
  153. package/lib/router-service.service.d.ts.map +1 -0
  154. package/lib/services/abstract-config.service.d.ts +4 -0
  155. package/lib/services/abstract-config.service.d.ts.map +1 -0
  156. package/lib/services/config.service.d.ts +36 -0
  157. package/lib/services/config.service.d.ts.map +1 -0
  158. package/lib/services/discuss-utils.service.d.ts +14 -0
  159. package/lib/services/discuss-utils.service.d.ts.map +1 -0
  160. package/lib/services/discussion.service.d.ts +76 -0
  161. package/lib/services/discussion.service.d.ts.map +1 -0
  162. package/lib/telemetry-utils.service.d.ts +20 -0
  163. package/lib/telemetry-utils.service.d.ts.map +1 -0
  164. package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts +22 -0
  165. package/lib/wrapper/base-wrapper/base-wrapper.component.d.ts.map +1 -0
  166. package/lib/wrapper/category-widget/category-widget.component.d.ts +23 -0
  167. package/lib/wrapper/category-widget/category-widget.component.d.ts.map +1 -0
  168. package/lib/wrapper/tags-widget/tags-widget.component.d.ts +17 -0
  169. package/lib/wrapper/tags-widget/tags-widget.component.d.ts.map +1 -0
  170. package/lib/wrapper-navigate.service.d.ts +11 -0
  171. package/lib/wrapper-navigate.service.d.ts.map +1 -0
  172. package/package.json +44 -0
  173. package/public-api.d.ts +26 -0
  174. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,152 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { CONTEXT_PROPS } from '../../services/discussion.service';
3
+ import { NSDiscussData } from './../../models/discuss.model';
4
+ import * as CONSTANTS from './../../common/constants.json';
5
+ /* tslint:disable */
6
+ import * as _ from 'lodash';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../services/discussion.service";
9
+ import * as i2 from "../../services/config.service";
10
+ import * as i3 from "@angular/router";
11
+ import * as i4 from "./../../telemetry-utils.service";
12
+ import * as i5 from "../../navigation-service.service";
13
+ import * as i6 from "@angular/common";
14
+ import * as i7 from "../../elements/category-card/category-card.component";
15
+ import * as i8 from "../../elements/app-loader/app-loader.component";
16
+ import * as i9 from "../discuss-start/discuss-start.component";
17
+ /* tslint:enable */
18
+ export class DiscussCategoryComponent {
19
+ constructor(discussService, configService, router, activatedRoute, telemetryUtils, navigationService) {
20
+ this.discussService = discussService;
21
+ this.configService = configService;
22
+ this.router = router;
23
+ this.activatedRoute = activatedRoute;
24
+ this.telemetryUtils = telemetryUtils;
25
+ this.navigationService = navigationService;
26
+ this.categories = [];
27
+ this.stateChange = new EventEmitter();
28
+ this.pageId = 0;
29
+ this.isTopicCreator = false;
30
+ this.showStartDiscussionModal = false;
31
+ this.showLoader = false;
32
+ }
33
+ ngOnInit() {
34
+ /** It will look for the queryParams, if back button is clicked,
35
+ * the queryParams will change and it will fetch the categories
36
+ * if there is no queryParams available, then it will fetch the default categories of the forumIds
37
+ */
38
+ this.telemetryUtils.setContext([]);
39
+ this.telemetryUtils.logImpression(NSDiscussData.IPageName.CATEGORY);
40
+ this.forumIds = this.categoryIds ? this.categoryIds : this.discussService.forumIds;
41
+ this.paramsSubscription = this.activatedRoute.queryParams.subscribe((params) => {
42
+ if (_.get(params, 'cid')) {
43
+ this.navigateToDiscussionPage(_.get(params, 'cid'));
44
+ }
45
+ else {
46
+ this.categories = [];
47
+ if (this.forumIds.length) {
48
+ this.fetchAllAvailableCategories(this.forumIds);
49
+ }
50
+ else {
51
+ this.fetchAllCategories();
52
+ }
53
+ }
54
+ });
55
+ }
56
+ fetchAllAvailableCategories(ids) {
57
+ this.showLoader = true;
58
+ ids.forEach((cid) => {
59
+ this.fetchCategory(cid).subscribe(data => {
60
+ this.showLoader = false;
61
+ this.categories.push(data);
62
+ }, error => {
63
+ // TODO: Toast error
64
+ // error code check
65
+ this.discussService.showTrafficAlert(error);
66
+ console.log('issue fetching category', error);
67
+ this.showLoader = false;
68
+ });
69
+ });
70
+ }
71
+ fetchAllCategories() {
72
+ this.showLoader = true;
73
+ this.discussService.fetchAllCategories().subscribe(data => {
74
+ this.showLoader = false;
75
+ this.categories = data;
76
+ }, error => {
77
+ // TODO: Toast error
78
+ // error code check
79
+ this.discussService.showTrafficAlert(error);
80
+ console.log('issue fetching category', error);
81
+ this.showLoader = false;
82
+ });
83
+ }
84
+ fetchCategory(cid) {
85
+ return this.discussService.fetchSingleCategoryDetails(cid);
86
+ }
87
+ /**
88
+ * It will fetch the children for each category click.
89
+ * if there is no children available the it will redirect to the topic list page
90
+ */
91
+ navigateToDiscussionPage(cid, slug) {
92
+ this.showLoader = true;
93
+ this.telemetryUtils.uppendContext({ id: cid, type: 'Category' });
94
+ this.discussService.fetchSingleCategoryDetails(cid).subscribe(response => {
95
+ this.showLoader = false;
96
+ this.categoryId = _.get(response, 'cid');
97
+ this.isTopicCreator = _.get(response, 'privileges.topics:create') === true ? true : false;
98
+ this.showStartDiscussionModal = false;
99
+ let input;
100
+ if (_.get(response, 'children').length > 0) {
101
+ this.router.navigate([], { relativeTo: this.activatedRoute.parent, queryParams: { cid: this.categoryId } });
102
+ // input = { data: { url: '', queryParams: { cid: this.categoryId } }, action: this.categoryAction}
103
+ // this.navigationService.navigate(input)
104
+ _.get(response, 'children').forEach(subCategoryData => {
105
+ this.categories.push(subCategoryData);
106
+ });
107
+ }
108
+ else {
109
+ this.discussService.setContext(CONTEXT_PROPS.cid, this.categoryId);
110
+ this.configService.setCategoryid(this.categoryId);
111
+ let routerSlug = this.configService.getConfig().routerSlug ? this.configService.getConfig().routerSlug : '';
112
+ input = { data: { url: `${routerSlug}${CONSTANTS.ROUTES.CATEGORY}${this.categoryId}`, queryParams: {} }, action: CONSTANTS.CATEGORY_HOME, };
113
+ this.navigationService.navigate(input);
114
+ this.stateChange.emit({ action: this.categoryAction, categoryId: this.categoryId });
115
+ }
116
+ }, error => {
117
+ // error code check
118
+ this.discussService.showTrafficAlert(error);
119
+ this.showLoader = false;
120
+ // TODO: Toast error
121
+ console.log('issue fetching category', error);
122
+ });
123
+ }
124
+ startDiscussion() {
125
+ this.showStartDiscussionModal = true;
126
+ }
127
+ closeModal(event) {
128
+ this.showStartDiscussionModal = false;
129
+ }
130
+ logTelemetry(event) {
131
+ this.telemetryUtils.logInteract(event, NSDiscussData.IPageName.CATEGORY);
132
+ }
133
+ ;
134
+ ngOnDestroy() {
135
+ if (this.paramsSubscription) {
136
+ this.paramsSubscription.unsubscribe();
137
+ }
138
+ }
139
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussCategoryComponent, deps: [{ token: i1.DiscussionService }, { token: i2.ConfigService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.TelemetryUtilsService }, { token: i5.NavigationServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
140
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DiscussCategoryComponent, selector: "lib-discuss-category", inputs: { categoryIds: "categoryIds", categoryAction: "categoryAction" }, outputs: { stateChange: "stateChange" }, ngImport: i0, template: "<lib-app-loader *ngIf=\"showLoader\"></lib-app-loader>\n <button (click)=\"startDiscussion();logTelemetry($event)\" *ngIf=\"isTopicCreator\" class=\"df-btn df-btn-primary df-btn-normal mb-16\" id=\"start-discussion\">Start Discussion</button>\n <div class=\"discuss-category-cards\">\n <ng-container *ngFor=\"let data of categories\">\n <div (click)=\"navigateToDiscussionPage(data?.cid, data?.slug);logTelemetry($event)\" class=\"categories-card-content\" id=\"category-card\">\n <lib-category-card [category]=\"data\" ></lib-category-card>\n </div>\n </ng-container>\n </div>\n\n <lib-discuss-start (close)=\"closeModal($event)\" [categoryId]=\"categoryId\" *ngIf=\"showStartDiscussionModal\" ></lib-discuss-start>\n", styles: [".discuss-category-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(292px,1fr));grid-gap:1.5rem;margin-bottom:1.5rem;cursor:pointer;position:relative;z-index:unset}@media (max-width: 700px){.discuss-category-cards{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.CategoryCardComponent, selector: "lib-category-card", inputs: ["category"] }, { kind: "component", type: i8.AppLoaderComponent, selector: "lib-app-loader", inputs: ["data"] }, { kind: "component", type: i9.DiscussStartComponent, selector: "lib-discuss-start", inputs: ["categoryId", "topicData", "mode"], outputs: ["close"] }] }); }
141
+ }
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussCategoryComponent, decorators: [{
143
+ type: Component,
144
+ args: [{ selector: 'lib-discuss-category', template: "<lib-app-loader *ngIf=\"showLoader\"></lib-app-loader>\n <button (click)=\"startDiscussion();logTelemetry($event)\" *ngIf=\"isTopicCreator\" class=\"df-btn df-btn-primary df-btn-normal mb-16\" id=\"start-discussion\">Start Discussion</button>\n <div class=\"discuss-category-cards\">\n <ng-container *ngFor=\"let data of categories\">\n <div (click)=\"navigateToDiscussionPage(data?.cid, data?.slug);logTelemetry($event)\" class=\"categories-card-content\" id=\"category-card\">\n <lib-category-card [category]=\"data\" ></lib-category-card>\n </div>\n </ng-container>\n </div>\n\n <lib-discuss-start (close)=\"closeModal($event)\" [categoryId]=\"categoryId\" *ngIf=\"showStartDiscussionModal\" ></lib-discuss-start>\n", styles: [".discuss-category-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(292px,1fr));grid-gap:1.5rem;margin-bottom:1.5rem;cursor:pointer;position:relative;z-index:unset}@media (max-width: 700px){.discuss-category-cards{grid-template-columns:1fr}}\n"] }]
145
+ }], ctorParameters: function () { return [{ type: i1.DiscussionService }, { type: i2.ConfigService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.TelemetryUtilsService }, { type: i5.NavigationServiceService }]; }, propDecorators: { categoryIds: [{
146
+ type: Input
147
+ }], categoryAction: [{
148
+ type: Input
149
+ }], stateChange: [{
150
+ type: Output
151
+ }] } });
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3Vzcy1jYXRlZ29yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kaXNjdXNzaW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy9kaXNjdXNzLWNhdGVnb3J5L2Rpc2N1c3MtY2F0ZWdvcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlzY3Vzc2lvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvZGlzY3Vzcy1jYXRlZ29yeS9kaXNjdXNzLWNhdGVnb3J5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBcUIsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSTdELE9BQU8sS0FBSyxTQUFTLE1BQU0sK0JBQStCLENBQUM7QUFDM0Qsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBOzs7Ozs7Ozs7OztBQUczQixtQkFBbUI7QUFPbkIsTUFBTSxPQUFPLHdCQUF3QjtJQXFCbkMsWUFDUyxjQUFpQyxFQUNqQyxhQUE0QixFQUM1QixNQUFjLEVBQ2QsY0FBOEIsRUFDN0IsY0FBcUMsRUFDckMsaUJBQTJDO1FBTDVDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBekJyRCxlQUFVLEdBQStCLEVBQUUsQ0FBQztRQUtsQyxnQkFBVyxH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QkFBb0I7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQUs7UUFDZCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQUEsQ0FBQztJQUVGLFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdkM7SUFDSCxDQUFDOytHQTlJVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwrS0NuQnJDLHl1QkFXQTs7NEZEUWEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtpUUFTdkIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlzY3Vzc2lvblNlcnZpY2UsIENPTlRFWFRfUFJPUFMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaXNjdXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTlNEaXNjdXNzRGF0YSB9IGZyb20gJy4vLi4vLi4vbW9kZWxzL2Rpc2N1c3MubW9kZWwnO1xuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUZWxlbWV0cnlVdGlsc1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3RlbGVtZXRyeS11dGlscy5zZXJ2aWNlJztcblxuaW1wb3J0ICogYXMgQ09OU1RBTlRTIGZyb20gJy4vLi4vLi4vY29tbW9uL2NvbnN0YW50cy5qc29uJztcbi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9uYXZpZ2F0aW9uLXNlcnZpY2Uuc2VydmljZSc7XG4vKiB0c2xpbnQ6ZW5hYmxlICovXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kaXNjdXNzLWNhdGVnb3J5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc2N1c3MtY2F0ZWdvcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kaXNjdXNzLWNhdGVnb3J5LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEaXNjdXNzQ2F0ZWdvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgY2F0ZWdvcmllczogTlNEaXNjdXNzRGF0YS5JQ2F0ZWdvcmllW10gPSBbXTtcblxuICBmb3J1bUlkczogYW55O1xuICBASW5wdXQoKSBjYXRlZ29yeUlkcztcbiAgQElucHV0KCkgY2F0ZWdvcnlBY3Rpb247XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcGFnZUlkID0gMDtcblxuICBpc1RvcGljQ3JlYXRvciA9IGZhbHNlO1xuXG4gIHNob3dTdGFydERpc2N1c3Npb25Nb2RhbCA9IGZhbHNlO1xuXG4gIGNhdGVnb3J5SWQ6IGFueTtcblxuICBwYXJhbXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBzaG93TG9hZGVyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpc2N1c3NTZXJ2aWNlOiBEaXNjdXNzaW9uU2VydmljZSxcbiAgICBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHVibGljIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHRlbGVtZXRyeVV0aWxzOiBUZWxlbWV0cnlVdGlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2VTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLyoqIEl0IHdpbGwgbG9vayBmb3IgdGhlIHF1ZXJ5UGFyYW1zLCBpZiBiYWNrIGJ1dHRvbiBpcyBjbGlja2VkLFxuICAgICAqIHRoZSBxdWVyeVBhcmFtcyB3aWxsIGNoYW5nZSBhbmQgaXQgd2lsbCBmZXRjaCB0aGUgY2F0ZWdvcmllc1xuICAgICAqIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5UGFyYW1zIGF2YWlsYWJsZSwgdGhlbiBpdCB3aWxsIGZldGNoIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMgb2YgdGhlIGZvcnVtSWRzXG4gICAgICovXG4gICAgdGhpcy50ZWxlbWV0cnlVdGlscy5zZXRDb250ZXh0KFtdKTtcbiAgICB0aGlzLnRlbGVtZXRyeVV0aWxzLmxvZ0ltcHJlc3Npb24oTlNEaXNjdXNzRGF0YS5JUGFnZU5hbWUuQ0FURUdPUlkpO1xuICAgIHRoaXMuZm9ydW1JZHMgPSB0aGlzLmNhdGVnb3J5SWRzID8gdGhpcy5jYXRlZ29yeUlkcyA6IHRoaXMuZGlzY3Vzc1NlcnZpY2UuZm9ydW1JZHM7XG4gICAgdGhpcy5wYXJhbXNTdWJzY3JpcHRpb24gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICBpZiAoXy5nZXQocGFyYW1zLCAnY2lkJykpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvRGlzY3Vzc2lvblBhZ2UoXy5nZXQocGFyYW1zLCAnY2lkJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gW107XG4gICAgICAgIGlmICh0aGlzLmZvcnVtSWRzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmV0Y2hBbGxBdmFpbGFibGVDYXRlZ29yaWVzKHRoaXMuZm9ydW1JZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmV0Y2hBbGxDYXRlZ29yaWVzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoQWxsQXZhaWxhYmxlQ2F0ZWdvcmllcyhpZHMpIHtcbiAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgIGlkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hDYXRlZ29yeShjaWQpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllcy5wdXNoKGRhdGEpO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAvLyBUT0RPOiBUb2FzdCBlcnJvclxuICAgICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnJvcik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpc3N1ZSBmZXRjaGluZyBjYXRlZ29yeScsIGVycm9yKTtcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoQWxsQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2UuZmV0Y2hBbGxDYXRlZ29yaWVzKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMgPSBkYXRhXG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgLy8gVE9ETzogVG9hc3QgZXJyb3JcbiAgICAgIC8vIGVycm9yIGNvZGUgY2hlY2tcbiAgICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2Uuc2hvd1RyYWZmaWNBbGVydChlcnJvcik7XG4gICAgICBjb25zb2xlLmxvZygnaXNzdWUgZmV0Y2hpbmcgY2F0ZWdvcnknLCBlcnJvcik7XG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoQ2F0ZWdvcnkoY2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzY3Vzc1NlcnZpY2UuZmV0Y2hTaW5nbGVDYXRlZ29yeURldGFpbHMoY2lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB3aWxsIGZldGNoIHRoZSBjaGlsZHJlbiBmb3IgZWFjaCBjYXRlZ29yeSBjbGljay5cbiAgICogaWYgdGhlcmUgaXMgbm8gY2hpbGRyZW4gYXZhaWxhYmxlIHRoZSBpdCB3aWxsIHJlZGlyZWN0IHRvIHRoZSB0b3BpYyBsaXN0IHBhZ2VcbiAgICovXG4gIG5hdmlnYXRlVG9EaXNjdXNzaW9uUGFnZShjaWQsIHNsdWc/KSB7XG4gICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcbiAgICB0aGlzLnRlbGVtZXRyeVV0aWxzLnVwcGVuZENvbnRleHQoeyBpZDogY2lkLCB0eXBlOiAnQ2F0ZWdvcnknIH0pO1xuICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2UuZmV0Y2hTaW5nbGVDYXRlZ29yeURldGFpbHMoY2lkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmNhdGVnb3J5SWQgPSBfLmdldChyZXNwb25zZSwgJ2NpZCcpO1xuICAgICAgdGhpcy5pc1RvcGljQ3JlYXRvciA9IF8uZ2V0KHJlc3BvbnNlLCAncHJpdmlsZWdlcy50b3BpY3M6Y3JlYXRlJykgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLnNob3dTdGFydERpc2N1c3Npb25Nb2RhbCA9IGZhbHNlO1xuICAgICAgbGV0IGlucHV0XG4gICAgICBpZiAoXy5nZXQocmVzcG9uc2UsICdjaGlsZHJlbicpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHsgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZS5wYXJlbnQsIHF1ZXJ5UGFyYW1zOiB7IGNpZDogdGhpcy5jYXRlZ29yeUlkIH0gfSk7XG5cbiAgICAgICAgLy8gaW5wdXQgPSB7IGRhdGE6IHsgdXJsOiAnJywgcXVlcnlQYXJhbXM6IHsgY2lkOiB0aGlzLmNhdGVnb3J5SWQgfSB9LCBhY3Rpb246IHRoaXMuY2F0ZWdvcnlBY3Rpb259XG4gICAgICAgIC8vIHRoaXMubmF2aWdhdGlvblNlcnZpY2UubmF2aWdhdGUoaW5wdXQpXG5cbiAgICAgICAgXy5nZXQocmVzcG9uc2UsICdjaGlsZHJlbicpLmZvckVhY2goc3ViQ2F0ZWdvcnlEYXRhID0+IHtcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMucHVzaChzdWJDYXRlZ29yeURhdGEpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzY3Vzc1NlcnZpY2Uuc2V0Q29udGV4dChDT05URVhUX1BST1BTLmNpZCwgdGhpcy5jYXRlZ29yeUlkKTtcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnNldENhdGVnb3J5aWQodGhpcy5jYXRlZ29yeUlkKVxuXG4gICAgICAgIGxldCByb3V0ZXJTbHVnID0gdGhpcy5jb25maWdTZXJ2aWNlLmdldENvbmZpZygpLnJvdXRlclNsdWcgPyB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkucm91dGVyU2x1ZyA6ICcnXG4gICAgICAgIGlucHV0ID0geyBkYXRhOiB7IHVybDogYCR7cm91dGVyU2x1Z30ke0NPTlNUQU5UUy5ST1VURVMuQ0FURUdPUll9JHt0aGlzLmNhdGVnb3J5SWR9YCwgcXVlcnlQYXJhbXM6IHt9IH0sIGFjdGlvbjogQ09OU1RBTlRTLkNBVEVHT1JZX0hPTUUsIH1cbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5uYXZpZ2F0ZShpbnB1dClcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KHsgYWN0aW9uOiB0aGlzLmNhdGVnb3J5QWN0aW9uLCBjYXRlZ29yeUlkOiB0aGlzLmNhdGVnb3J5SWQgfSlcbiAgICAgIH1cbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICB0aGlzLmRpc2N1c3NTZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyb3IpO1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAvLyBUT0RPOiBUb2FzdCBlcnJvclxuICAgICAgY29uc29sZS5sb2coJ2lzc3VlIGZldGNoaW5nIGNhdGVnb3J5JywgZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhcnREaXNjdXNzaW9uKCkge1xuICAgIHRoaXMuc2hvd1N0YXJ0RGlzY3Vzc2lvbk1vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlTW9kYWwoZXZlbnQpIHtcbiAgICB0aGlzLnNob3dTdGFydERpc2N1c3Npb25Nb2RhbCA9IGZhbHNlO1xuICB9XG5cbiAgbG9nVGVsZW1ldHJ5KGV2ZW50KSB7XG4gICAgdGhpcy50ZWxlbWV0cnlVdGlscy5sb2dJbnRlcmFjdChldmVudCwgTlNEaXNjdXNzRGF0YS5JUGFnZU5hbWUuQ0FURUdPUlkpO1xuICB9O1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnBhcmFtc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wYXJhbXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxsaWItYXBwLWxvYWRlciAqbmdJZj1cInNob3dMb2FkZXJcIj48L2xpYi1hcHAtbG9hZGVyPlxuIDxidXR0b24gKGNsaWNrKT1cInN0YXJ0RGlzY3Vzc2lvbigpO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgKm5nSWY9XCJpc1RvcGljQ3JlYXRvclwiIGNsYXNzPVwiZGYtYnRuIGRmLWJ0bi1wcmltYXJ5IGRmLWJ0bi1ub3JtYWwgbWItMTZcIiBpZD1cInN0YXJ0LWRpc2N1c3Npb25cIj5TdGFydCBEaXNjdXNzaW9uPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJkaXNjdXNzLWNhdGVnb3J5LWNhcmRzXCI+XG4gICAgPG5nLWNvbnRhaW5lciAgKm5nRm9yPVwibGV0IGRhdGEgb2YgY2F0ZWdvcmllc1wiPlxuICAgICAgPGRpdiAoY2xpY2spPVwibmF2aWdhdGVUb0Rpc2N1c3Npb25QYWdlKGRhdGE/LmNpZCwgZGF0YT8uc2x1Zyk7bG9nVGVsZW1ldHJ5KCRldmVudClcIiBjbGFzcz1cImNhdGVnb3JpZXMtY2FyZC1jb250ZW50XCIgaWQ9XCJjYXRlZ29yeS1jYXJkXCI+XG4gICAgICA8bGliLWNhdGVnb3J5LWNhcmQgW2NhdGVnb3J5XT1cImRhdGFcIiA+PC9saWItY2F0ZWdvcnktY2FyZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8bGliLWRpc2N1c3Mtc3RhcnQgKGNsb3NlKT1cImNsb3NlTW9kYWwoJGV2ZW50KVwiIFtjYXRlZ29yeUlkXT1cImNhdGVnb3J5SWRcIiAqbmdJZj1cInNob3dTdGFydERpc2N1c3Npb25Nb2RhbFwiID48L2xpYi1kaXNjdXNzLXN0YXJ0PlxuIl19
@@ -0,0 +1,142 @@
1
+ import { CONTEXT_PROPS } from './../../services/discussion.service';
2
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
+ import * as CONSTANTS from './../../common/constants.json';
4
+ /* tslint:disable */
5
+ import * as _ from 'lodash';
6
+ import { NSDiscussData } from '../../models/discuss.model';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ import * as i2 from "../../services/discussion.service";
10
+ import * as i3 from "../../services/config.service";
11
+ import * as i4 from "./../../telemetry-utils.service";
12
+ import * as i5 from "../../navigation-service.service";
13
+ import * as i6 from "@angular/common";
14
+ import * as i7 from "../../elements/discuss-card/discuss-card.component";
15
+ import * as i8 from "../../elements/app-loader/app-loader.component";
16
+ import * as i9 from "ngx-infinite-scroll";
17
+ import * as i10 from "../discuss-start/discuss-start.component";
18
+ /* tslint:enable */
19
+ export class DiscussHomeComponent {
20
+ constructor(router, route, discussionService, configService, telemetryUtils, navigationService) {
21
+ this.router = router;
22
+ this.route = route;
23
+ this.discussionService = discussionService;
24
+ this.configService = configService;
25
+ this.telemetryUtils = telemetryUtils;
26
+ this.navigationService = navigationService;
27
+ this.stateChange = new EventEmitter();
28
+ this.discussionList = [];
29
+ this.showStartDiscussionModal = false;
30
+ // categoryId: string;
31
+ this.isTopicCreator = false;
32
+ this.showLoader = false;
33
+ this.currentActivePage = 1;
34
+ this.pagination = Object.create({});
35
+ // Input parameters for infinite scroll
36
+ this.InfiniteScrollConfig = {
37
+ modalScrollDistance: 2,
38
+ modalScrollThrottle: 50
39
+ };
40
+ // Input parameters for infinite scroll
41
+ this.modalScrollDistance = -12;
42
+ this.modalScrollThrottle = 500;
43
+ this.scrollUpDistance = 5;
44
+ this.currentPage = 0;
45
+ }
46
+ ngOnInit() {
47
+ this.telemetryUtils.logImpression(NSDiscussData.IPageName.HOME);
48
+ this.route.params.subscribe(params => {
49
+ this.configService.setCategoryId.subscribe((categoryIds) => {
50
+ this.routeParams = categoryIds;
51
+ // categoryIds = this.discussionService.getContext(CONTEXT_PROPS.cid)
52
+ categoryIds = this.categoryId ? this.categoryId : categoryIds;
53
+ this.getDiscussionList(categoryIds);
54
+ });
55
+ this.routeParams = params;
56
+ this.categoryId = this.discussionService.getContext(CONTEXT_PROPS.cid);
57
+ // this.getDiscussionList(_.get(this.routeParams, 'slug'));
58
+ });
59
+ }
60
+ /**
61
+ * @description - set the scroll container height
62
+ */
63
+ ngAfterViewChecked() {
64
+ if (this.elementView && this.elementView.nativeElement && !this.elementView.nativeElement.style.height) {
65
+ // the number 10 is just a random value to reduce the height of the parent container to the infinite scroll
66
+ this.elementView.nativeElement.style.height = (this.elementView.nativeElement.clientHeight - 10) + 'px';
67
+ }
68
+ }
69
+ navigateToDiscussionDetails(discussionData) {
70
+ const matchedTopic = _.find(this.telemetryUtils.getContext(), { type: 'Topic' });
71
+ if (matchedTopic) {
72
+ this.telemetryUtils.deleteContext(matchedTopic);
73
+ }
74
+ this.telemetryUtils.uppendContext({
75
+ id: _.get(discussionData, 'tid'),
76
+ type: 'Topic'
77
+ });
78
+ let routerSlug = this.configService.getConfig().routerSlug ? this.configService.getConfig().routerSlug : '';
79
+ let input = { data: { url: `${routerSlug}${CONSTANTS.ROUTES.TOPIC}${_.trim(_.get(discussionData, 'slug'))}`, queryParams: {}, tid: discussionData.tid, title: discussionData.title }, action: CONSTANTS.CATEGORY_DETAILS };
80
+ this.navigationService.navigate(input);
81
+ this.stateChange.emit({ tid: discussionData.tid, title: discussionData.title, action: this.categoryHomeAction });
82
+ }
83
+ /**
84
+ * @description - To get all the topics
85
+ * @param - required cid as a slug
86
+ */
87
+ getDiscussionList(slug) {
88
+ this.showLoader = true;
89
+ const scrollIndex = this.pagination.currentPage ? this.pagination.currentPage : 1;
90
+ this.discussionService.getContextBasedTopic(slug, scrollIndex).subscribe(data => {
91
+ this.pagination = data.pagination;
92
+ this.showLoader = false;
93
+ this.isTopicCreator = _.get(data, 'privileges.topics:create') === true ? true : false;
94
+ this.discussionList = [...this.discussionList, ...(_.union(_.get(data, 'topics'), _.get(data, 'children')))];
95
+ }, error => {
96
+ this.showLoader = false;
97
+ // error code check
98
+ this.discussionService.showTrafficAlert(error);
99
+ // TODO: Toaster
100
+ console.log('error fetching topic list', error);
101
+ });
102
+ }
103
+ startDiscussion() {
104
+ this.showStartDiscussionModal = true;
105
+ }
106
+ logTelemetry(event) {
107
+ this.telemetryUtils.logInteract(event, NSDiscussData.IPageName.HOME);
108
+ }
109
+ closeModal(event) {
110
+ if (_.get(event, 'message') === 'success') {
111
+ this.discussionList = [];
112
+ this.pagination.currentPage = this.pagination.first.page;
113
+ this.getDiscussionList(_.get(this.routeParams, 'slug'));
114
+ }
115
+ this.showStartDiscussionModal = false;
116
+ }
117
+ /**
118
+ * @description - call the topic get api when scrolled down
119
+ */
120
+ onModalScrollDown() {
121
+ if (this.pagination.currentPage !== this.pagination.pageCount) {
122
+ this.pagination.currentPage = this.pagination.next.page;
123
+ this.getDiscussionList(_.get(this.routeParams, 'slug'));
124
+ }
125
+ }
126
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussHomeComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.DiscussionService }, { token: i3.ConfigService }, { token: i4.TelemetryUtilsService }, { token: i5.NavigationServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
127
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DiscussHomeComponent, selector: "lib-discuss-home", inputs: { categoryId: "categoryId", categoryHomeAction: "categoryHomeAction" }, outputs: { stateChange: "stateChange" }, viewQueries: [{ propertyName: "elementView", first: true, predicate: ["scrollContainerHeight"], descendants: true }], ngImport: i0, template: "<button *ngIf=\"isTopicCreator\" (click)=\"startDiscussion();logTelemetry($event)\" role=\"link\" tabindex=\"0\"\n class=\"df-btn df-btn-normal df-btn-primary df-start-btn\" data-toggle=\"modal\" data-target=\"#myModal\" data-backdrop=\"static\" data-keyboard=\"false\"\n id=\"start-discussion\">Start Discussion</button>\n<div *ngIf=\"discussionList && discussionList.length > 0\" class=\"topic-list-container\" id=\"topic-scroll\" #scrollContainerHeight>\n <div [infiniteScrollContainer]=\"'.topic-list-container'\" infinite-scroll class=\"infinite-scroll\"\n [scrollWindow]=\"false\" [infiniteScrollDistance]=\"InfiniteScrollConfig.modalScrollDistance\" [fromRoot]=\"true\"\n [infiniteScrollThrottle]=\"InfiniteScrollConfig.modalScrollThrottle\" (scrolled)=\"onModalScrollDown()\">\n <div *ngFor=\"let discussionData of discussionList\"\n (click)=\"navigateToDiscussionDetails(discussionData);logTelemetry($event)\" id=\"topic-card\">\n <lib-discuss-card [discussionData]=\"discussionData\"></lib-discuss-card>\n </div>\n </div>\n</div>\n<ng-container *ngIf=\"!(discussionList && discussionList.length > 0)\">\n <div class=\"no-card-content\" id=\"topic-card\" tabindex=\"0\">\n <div class=\"no-data-label\">No Data</div>\n <div>\n <span>&nbsp;</span>\n </div>\n </div>\n</ng-container>\n<lib-app-loader *ngIf=\"showLoader\"></lib-app-loader>\n<lib-discuss-start [categoryId]=\"categoryId\" (close)=\"closeModal($event)\" *ngIf=\"showStartDiscussionModal\">\n</lib-discuss-start>", styles: [".df-start-btn{margin-bottom:1rem}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.DiscussCardComponent, selector: "lib-discuss-card", inputs: ["discussionData"] }, { kind: "component", type: i8.AppLoaderComponent, selector: "lib-app-loader", inputs: ["data"] }, { kind: "directive", type: i9.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i10.DiscussStartComponent, selector: "lib-discuss-start", inputs: ["categoryId", "topicData", "mode"], outputs: ["close"] }] }); }
128
+ }
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DiscussHomeComponent, decorators: [{
130
+ type: Component,
131
+ args: [{ selector: 'lib-discuss-home', template: "<button *ngIf=\"isTopicCreator\" (click)=\"startDiscussion();logTelemetry($event)\" role=\"link\" tabindex=\"0\"\n class=\"df-btn df-btn-normal df-btn-primary df-start-btn\" data-toggle=\"modal\" data-target=\"#myModal\" data-backdrop=\"static\" data-keyboard=\"false\"\n id=\"start-discussion\">Start Discussion</button>\n<div *ngIf=\"discussionList && discussionList.length > 0\" class=\"topic-list-container\" id=\"topic-scroll\" #scrollContainerHeight>\n <div [infiniteScrollContainer]=\"'.topic-list-container'\" infinite-scroll class=\"infinite-scroll\"\n [scrollWindow]=\"false\" [infiniteScrollDistance]=\"InfiniteScrollConfig.modalScrollDistance\" [fromRoot]=\"true\"\n [infiniteScrollThrottle]=\"InfiniteScrollConfig.modalScrollThrottle\" (scrolled)=\"onModalScrollDown()\">\n <div *ngFor=\"let discussionData of discussionList\"\n (click)=\"navigateToDiscussionDetails(discussionData);logTelemetry($event)\" id=\"topic-card\">\n <lib-discuss-card [discussionData]=\"discussionData\"></lib-discuss-card>\n </div>\n </div>\n</div>\n<ng-container *ngIf=\"!(discussionList && discussionList.length > 0)\">\n <div class=\"no-card-content\" id=\"topic-card\" tabindex=\"0\">\n <div class=\"no-data-label\">No Data</div>\n <div>\n <span>&nbsp;</span>\n </div>\n </div>\n</ng-container>\n<lib-app-loader *ngIf=\"showLoader\"></lib-app-loader>\n<lib-discuss-start [categoryId]=\"categoryId\" (close)=\"closeModal($event)\" *ngIf=\"showStartDiscussionModal\">\n</lib-discuss-start>", styles: [".df-start-btn{margin-bottom:1rem}\n"] }]
132
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.DiscussionService }, { type: i3.ConfigService }, { type: i4.TelemetryUtilsService }, { type: i5.NavigationServiceService }]; }, propDecorators: { categoryId: [{
133
+ type: Input
134
+ }], categoryHomeAction: [{
135
+ type: Input
136
+ }], stateChange: [{
137
+ type: Output
138
+ }], elementView: [{
139
+ type: ViewChild,
140
+ args: ['scrollContainerHeight']
141
+ }] } });
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3Vzcy1ob21lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rpc2N1c3Npb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL2Rpc2N1c3MtaG9tZS9kaXNjdXNzLWhvbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGlzY3Vzc2lvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvZGlzY3Vzcy1ob21lL2Rpc2N1c3MtaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJdEcsT0FBTyxLQUFLLFNBQVMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7QUFHM0QsbUJBQW1CO0FBT25CLE1BQU0sT0FBTyxvQkFBb0I7SUErQi9CLFlBQ1MsTUFBYyxFQUNiLEtBQXFCLEVBQ3JCLGlCQUFvQyxFQUNwQyxhQUE0QixFQUM1QixjQUFxQyxFQUNyQyxpQkFBMkM7UUFMNUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNiLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFsQzNDLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHOUQsbUJB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TSxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUM3RCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQzsrR0E3SFUsb0JBQW9CO21HQUFwQixvQkFBb0IsdVNDbEJqQyxnakRBdUJvQjs7NEZETFAsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGtCQUFrQjtpUUFLbkIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFFNkIsV0FBVztzQkFBOUMsU0FBUzt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT05URVhUX1BST1BTIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9kaXNjdXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERpc2N1c3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlzY3Vzc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFRlbGVtZXRyeVV0aWxzU2VydmljZSB9IGZyb20gJy4vLi4vLi4vdGVsZW1ldHJ5LXV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgQ09OU1RBTlRTIGZyb20gJy4vLi4vLi4vY29tbW9uL2NvbnN0YW50cy5qc29uJztcbi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IE5TRGlzY3Vzc0RhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlzY3Vzcy5tb2RlbCc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbmF2aWdhdGlvbi1zZXJ2aWNlLnNlcnZpY2UnO1xuLyogdHNsaW50OmVuYWJsZSAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlzY3Vzcy1ob21lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc2N1c3MtaG9tZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rpc2N1c3MtaG9tZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlzY3Vzc0hvbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBjYXRlZ29yeUlkO1xuICBASW5wdXQoKSBjYXRlZ29yeUhvbWVBY3Rpb247XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVySGVpZ2h0JykgZWxlbWVudFZpZXc6IEVsZW1lbnRSZWY7XG4gIGRpc2N1c3Npb25MaXN0ID0gW107XG4gIHJvdXRlUGFyYW1zOiBhbnk7XG4gIHNob3dTdGFydERpc2N1c3Npb25Nb2RhbCA9IGZhbHNlO1xuICAvLyBjYXRlZ29yeUlkOiBzdHJpbmc7XG4gIGlzVG9waWNDcmVhdG9yID0gZmFsc2U7XG4gIHNob3dMb2FkZXIgPSBmYWxzZTtcbiAgY3VycmVudEFjdGl2ZVBhZ2U6IG51bWJlciA9IDE7XG4gIHBhZ2luYXRpb24gPSBPYmplY3QuY3JlYXRlKHt9KTtcblxuICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGZvciBpbmZpbml0ZSBzY3JvbGxcbiAgSW5maW5pdGVTY3JvbGxDb25maWcgPSB7XG4gICAgbW9kYWxTY3JvbGxEaXN0YW5jZTogMixcbiAgICBtb2RhbFNjcm9sbFRocm90dGxlOiA1MFxuICB9O1xuXG4gIC8vIElucHV0IHBhcmFtZXRlcnMgZm9yIGluZmluaXRlIHNjcm9sbFxuICBtb2RhbFNjcm9sbERpc3RhbmNlID0gLTEyO1xuICBtb2RhbFNjcm9sbFRocm90dGxlID0gNTAwO1xuICBzY3JvbGxVcERpc3RhbmNlID0gNTtcblxuICBjdXJyZW50UGFnZSA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXI7XG4gIHRvdGFsVG9waWNzOiBudW1iZXI7XG4gIHRpdGxlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZGlzY3Vzc2lvblNlcnZpY2U6IERpc2N1c3Npb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRlbGVtZXRyeVV0aWxzOiBUZWxlbWV0cnlVdGlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2VTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnRlbGVtZXRyeVV0aWxzLmxvZ0ltcHJlc3Npb24oTlNEaXNjdXNzRGF0YS5JUGFnZU5hbWUuSE9NRSk7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2Uuc2V0Q2F0ZWdvcnlJZC5zdWJzY3JpYmUoKGNhdGVnb3J5SWRzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5yb3V0ZVBhcmFtcyA9IGNhdGVnb3J5SWRzO1xuICAgICAgICAvLyBjYXRlZ29yeUlkcyA9IHRoaXMuZGlzY3Vzc2lvblNlcnZpY2UuZ2V0Q29udGV4dChDT05URVhUX1BST1BTLmNpZClcbiAgICAgICAgY2F0ZWdvcnlJZHMgPSB0aGlzLmNhdGVnb3J5SWQgPyB0aGlzLmNhdGVnb3J5SWQgOiBjYXRlZ29yeUlkc1xuICAgICAgICB0aGlzLmdldERpc2N1c3Npb25MaXN0KGNhdGVnb3J5SWRzKTtcbiAgICAgIH0pXG4gICAgICB0aGlzLnJvdXRlUGFyYW1zID0gcGFyYW1zO1xuICAgICAgdGhpcy5jYXRlZ29yeUlkID0gdGhpcy5kaXNjdXNzaW9uU2VydmljZS5nZXRDb250ZXh0KENPTlRFWFRfUFJPUFMuY2lkKTtcbiAgICAgIC8vIHRoaXMuZ2V0RGlzY3Vzc2lvbkxpc3QoXy5nZXQodGhpcy5yb3V0ZVBhcmFtcywgJ3NsdWcnKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBAZGVzY3JpcHRpb24gLSBzZXQgdGhlIHNjcm9sbCBjb250YWluZXIgaGVpZ2h0XG4gICovXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50VmlldyAmJiB0aGlzLmVsZW1lbnRWaWV3Lm5hdGl2ZUVsZW1lbnQgJiYgIXRoaXMuZWxlbWVudFZpZXcubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQpIHtcbiAgICAgIC8vIHRoZSBudW1iZXIgMTAgaXMganVzdCBhIHJhbmRvbSB2YWx1ZSB0byByZWR1Y2UgdGhlIGhlaWdodCBvZiB0aGUgcGFyZW50IGNvbnRhaW5lciB0byB0aGUgaW5maW5pdGUgc2Nyb2xsXG4gICAgICB0aGlzLmVsZW1lbnRWaWV3Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gKHRoaXMuZWxlbWVudFZpZXcubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgLSAxMCkgKyAncHgnO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlVG9EaXNjdXNzaW9uRGV0YWlscyhkaXNjdXNzaW9uRGF0YSkge1xuICAgIGNvbnN0IG1hdGNoZWRUb3BpYyA9IF8uZmluZCh0aGlzLnRlbGVtZXRyeVV0aWxzLmdldENvbnRleHQoKSwgeyB0eXBlOiAnVG9waWMnIH0pO1xuICAgIGlmIChtYXRjaGVkVG9waWMpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMuZGVsZXRlQ29udGV4dChtYXRjaGVkVG9waWMpO1xuICAgIH1cblxuICAgIHRoaXMudGVsZW1ldHJ5VXRpbHMudXBwZW5kQ29udGV4dCh7XG4gICAgICBpZDogXy5nZXQoZGlzY3Vzc2lvbkRhdGEsICd0aWQnKSxcbiAgICAgIHR5cGU6ICdUb3BpYydcbiAgICB9KTtcbiAgICBsZXQgcm91dGVyU2x1ZyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDb25maWcoKS5yb3V0ZXJTbHVnID8gdGhpcy5jb25maWdTZXJ2aWNlLmdldENvbmZpZygpLnJvdXRlclNsdWcgOiAnJ1xuICAgIGxldCBpbnB1dCA9IHsgZGF0YTogeyB1cmw6IGAke3JvdXRlclNsdWd9JHtDT05TVEFOVFMuUk9VVEVTLlRPUElDfSR7Xy50cmltKF8uZ2V0KGRpc2N1c3Npb25EYXRhLCAnc2x1ZycpKX1gLCBxdWVyeVBhcmFtczoge30sIHRpZDogZGlzY3Vzc2lvbkRhdGEudGlkLCB0aXRsZTogZGlzY3Vzc2lvbkRhdGEudGl0bGUgfSwgYWN0aW9uOiBDT05TVEFOVFMuQ0FURUdPUllfREVUQUlMUyB9XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5uYXZpZ2F0ZShpbnB1dClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoeyB0aWQ6IGRpc2N1c3Npb25EYXRhLnRpZCwgdGl0bGU6IGRpc2N1c3Npb25EYXRhLnRpdGxlLCBhY3Rpb246IHRoaXMuY2F0ZWdvcnlIb21lQWN0aW9uIH0pXG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiAtIFRvIGdldCBhbGwgdGhlIHRvcGljc1xuICAgKiBAcGFyYW0gLSByZXF1aXJlZCBjaWQgYXMgYSBzbHVnXG4gICAqL1xuICBnZXREaXNjdXNzaW9uTGlzdChzbHVnOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgIGNvbnN0IHNjcm9sbEluZGV4ID0gdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlID8gdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlIDogMTtcbiAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLmdldENvbnRleHRCYXNlZFRvcGljKHNsdWcsIHNjcm9sbEluZGV4KS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSBkYXRhLnBhZ2luYXRpb247XG4gICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNUb3BpY0NyZWF0b3IgPSBfLmdldChkYXRhLCAncHJpdmlsZWdlcy50b3BpY3M6Y3JlYXRlJykgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLmRpc2N1c3Npb25MaXN0ID0gWy4uLnRoaXMuZGlzY3Vzc2lvbkxpc3QsIC4uLihfLnVuaW9uKF8uZ2V0KGRhdGEsICd0b3BpY3MnKSwgXy5nZXQoZGF0YSwgJ2NoaWxkcmVuJykpKV07XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAvLyBlcnJvciBjb2RlIGNoZWNrXG4gICAgICB0aGlzLmRpc2N1c3Npb25TZXJ2aWNlLnNob3dUcmFmZmljQWxlcnQoZXJyb3IpO1xuICAgICAgLy8gVE9ETzogVG9hc3RlclxuICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZldGNoaW5nIHRvcGljIGxpc3QnLCBlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICBzdGFydERpc2N1c3Npb24oKSB7XG4gICAgdGhpcy5zaG93U3RhcnREaXNjdXNzaW9uTW9kYWwgPSB0cnVlO1xuICB9XG5cbiAgbG9nVGVsZW1ldHJ5KGV2ZW50KSB7XG4gICAgdGhpcy50ZWxlbWV0cnlVdGlscy5sb2dJbnRlcmFjdChldmVudCwgTlNEaXNjdXNzRGF0YS5JUGFnZU5hbWUuSE9NRSk7XG4gIH1cblxuICBjbG9zZU1vZGFsKGV2ZW50KSB7XG4gICAgaWYgKF8uZ2V0KGV2ZW50LCAnbWVzc2FnZScpID09PSAnc3VjY2VzcycpIHtcbiAgICAgIHRoaXMuZGlzY3Vzc2lvbkxpc3QgPSBbXTtcbiAgICAgIHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSA9IHRoaXMucGFnaW5hdGlvbi5maXJzdC5wYWdlO1xuICAgICAgdGhpcy5nZXREaXNjdXNzaW9uTGlzdChfLmdldCh0aGlzLnJvdXRlUGFyYW1zLCAnc2x1ZycpKTtcbiAgICB9XG4gICAgdGhpcy5zaG93U3RhcnREaXNjdXNzaW9uTW9kYWwgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gLSBjYWxsIHRoZSB0b3BpYyBnZXQgYXBpIHdoZW4gc2Nyb2xsZWQgZG93blxuICAgKi9cbiAgb25Nb2RhbFNjcm9sbERvd24oKSB7XG4gICAgaWYgKHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSAhPT0gdGhpcy5wYWdpbmF0aW9uLnBhZ2VDb3VudCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdpbmF0aW9uLm5leHQucGFnZTtcbiAgICAgIHRoaXMuZ2V0RGlzY3Vzc2lvbkxpc3QoXy5nZXQodGhpcy5yb3V0ZVBhcmFtcywgJ3NsdWcnKSk7XG4gICAgfVxuICB9XG59IiwiPGJ1dHRvbiAqbmdJZj1cImlzVG9waWNDcmVhdG9yXCIgKGNsaWNrKT1cInN0YXJ0RGlzY3Vzc2lvbigpO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgcm9sZT1cImxpbmtcIiB0YWJpbmRleD1cIjBcIlxuICAgIGNsYXNzPVwiZGYtYnRuIGRmLWJ0bi1ub3JtYWwgZGYtYnRuLXByaW1hcnkgZGYtc3RhcnQtYnRuXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI215TW9kYWxcIiBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCIgZGF0YS1rZXlib2FyZD1cImZhbHNlXCJcbiAgICBpZD1cInN0YXJ0LWRpc2N1c3Npb25cIj5TdGFydCBEaXNjdXNzaW9uPC9idXR0b24+XG48ZGl2ICpuZ0lmPVwiZGlzY3Vzc2lvbkxpc3QgJiYgZGlzY3Vzc2lvbkxpc3QubGVuZ3RoID4gMFwiIGNsYXNzPVwidG9waWMtbGlzdC1jb250YWluZXJcIiBpZD1cInRvcGljLXNjcm9sbFwiICNzY3JvbGxDb250YWluZXJIZWlnaHQ+XG4gICAgPGRpdiBbaW5maW5pdGVTY3JvbGxDb250YWluZXJdPVwiJy50b3BpYy1saXN0LWNvbnRhaW5lcidcIiBpbmZpbml0ZS1zY3JvbGwgY2xhc3M9XCJpbmZpbml0ZS1zY3JvbGxcIlxuICAgICAgICBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCIgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiSW5maW5pdGVTY3JvbGxDb25maWcubW9kYWxTY3JvbGxEaXN0YW5jZVwiIFtmcm9tUm9vdF09XCJ0cnVlXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiSW5maW5pdGVTY3JvbGxDb25maWcubW9kYWxTY3JvbGxUaHJvdHRsZVwiIChzY3JvbGxlZCk9XCJvbk1vZGFsU2Nyb2xsRG93bigpXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRpc2N1c3Npb25EYXRhIG9mIGRpc2N1c3Npb25MaXN0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvRGlzY3Vzc2lvbkRldGFpbHMoZGlzY3Vzc2lvbkRhdGEpO2xvZ1RlbGVtZXRyeSgkZXZlbnQpXCIgaWQ9XCJ0b3BpYy1jYXJkXCI+XG4gICAgICAgICAgICA8bGliLWRpc2N1c3MtY2FyZCBbZGlzY3Vzc2lvbkRhdGFdPVwiZGlzY3Vzc2lvbkRhdGFcIj48L2xpYi1kaXNjdXNzLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48bmctY29udGFpbmVyICpuZ0lmPVwiIShkaXNjdXNzaW9uTGlzdCAmJiBkaXNjdXNzaW9uTGlzdC5sZW5ndGggPiAwKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJuby1jYXJkLWNvbnRlbnRcIiBpZD1cInRvcGljLWNhcmRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbGFiZWxcIj5ObyBEYXRhPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3Bhbj4mbmJzcDs8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bGliLWFwcC1sb2FkZXIgKm5nSWY9XCJzaG93TG9hZGVyXCI+PC9saWItYXBwLWxvYWRlcj5cbjxsaWItZGlzY3Vzcy1zdGFydCBbY2F0ZWdvcnlJZF09XCJjYXRlZ29yeUlkXCIgKGNsb3NlKT1cImNsb3NlTW9kYWwoJGV2ZW50KVwiICpuZ0lmPVwic2hvd1N0YXJ0RGlzY3Vzc2lvbk1vZGFsXCI+XG48L2xpYi1kaXNjdXNzLXN0YXJ0PiJdfQ==