@sunbird-cb/consumption 0.0.11 → 0.0.13

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 (101) hide show
  1. package/bundles/sunbird-cb-consumption.umd.js +4435 -1462
  2. package/bundles/sunbird-cb-consumption.umd.js.map +1 -1
  3. package/bundles/sunbird-cb-consumption.umd.min.js +2 -2
  4. package/bundles/sunbird-cb-consumption.umd.min.js.map +1 -1
  5. package/esm2015/lib/_common/avatar-photo-lib/avatar-photo-lib.component.js +147 -0
  6. package/esm2015/lib/_common/avatar-photo-lib/avatar-photo-lib.module.js +29 -0
  7. package/esm2015/lib/_common/calender/calender-day/calender-day.component.js +90 -0
  8. package/esm2015/lib/_common/calender/calender.component.js +300 -0
  9. package/esm2015/lib/_common/calender/calender.module.js +31 -0
  10. package/esm2015/lib/_common/cards/card-portrait/card-portrait.component.js +5 -1
  11. package/esm2015/lib/_common/cards/card-user/card-user.component.js +5 -5
  12. package/esm2015/lib/_common/cards/card-wide/card-wide.component.js +166 -0
  13. package/esm2015/lib/_common/cards/cards.component.js +2 -2
  14. package/esm2015/lib/_common/cards/cards.module.js +5 -3
  15. package/esm2015/lib/_common/common-strip/common-strip.component.js +646 -0
  16. package/esm2015/lib/_common/common-strip/common-strip.model.js +216 -0
  17. package/esm2015/lib/_common/common-strip/common-strip.module.js +62 -0
  18. package/esm2015/lib/_common/competency-passbook/competency-passbook.component.js +24 -4
  19. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +36 -6
  20. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +1 -1
  21. package/esm2015/lib/_common/data-points/data-points.component.js +2 -2
  22. package/esm2015/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +63 -12
  23. package/esm2015/lib/_common/pills/pills.component.js +2 -2
  24. package/esm2015/lib/_common/sliders/sliders.component.js +3 -3
  25. package/esm2015/lib/_common/sliders-ng-content/sliders-ng-content.component.js +197 -0
  26. package/esm2015/lib/_common/sliders-ng-content/sliders-ng-content.model.js +61 -0
  27. package/esm2015/lib/_common/sliders-ng-content/sliders-ng-content.module.js +50 -0
  28. package/esm2015/lib/_common/user-content-rating/user-content-rating.component.js +710 -0
  29. package/esm2015/lib/_common/user-content-rating/user-content-rating.module.js +35 -0
  30. package/esm2015/lib/_models/card-users.model.js +7 -5
  31. package/esm2015/lib/_models/rating.model.js +44 -0
  32. package/esm2015/lib/_services/common-methods.service.js +1 -1
  33. package/esm2015/lib/_services/insite-data.service.js +10 -2
  34. package/esm2015/lib/_services/rating.service.js +171 -0
  35. package/esm2015/lib/consumption.module.js +6 -2
  36. package/esm2015/public-api.js +4 -1
  37. package/esm2015/sunbird-cb-consumption.js +29 -19
  38. package/esm5/lib/_common/avatar-photo-lib/avatar-photo-lib.component.js +164 -0
  39. package/esm5/lib/_common/avatar-photo-lib/avatar-photo-lib.module.js +33 -0
  40. package/esm5/lib/_common/calender/calender-day/calender-day.component.js +101 -0
  41. package/esm5/lib/_common/calender/calender.component.js +335 -0
  42. package/esm5/lib/_common/calender/calender.module.js +35 -0
  43. package/esm5/lib/_common/cards/card-portrait/card-portrait.component.js +5 -1
  44. package/esm5/lib/_common/cards/card-user/card-user.component.js +5 -5
  45. package/esm5/lib/_common/cards/card-wide/card-wide.component.js +172 -0
  46. package/esm5/lib/_common/cards/cards.component.js +2 -2
  47. package/esm5/lib/_common/cards/cards.module.js +5 -3
  48. package/esm5/lib/_common/common-strip/common-strip.component.js +760 -0
  49. package/esm5/lib/_common/common-strip/common-strip.model.js +216 -0
  50. package/esm5/lib/_common/common-strip/common-strip.module.js +66 -0
  51. package/esm5/lib/_common/competency-passbook/competency-passbook.component.js +28 -5
  52. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +41 -6
  53. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +1 -1
  54. package/esm5/lib/_common/data-points/data-points.component.js +2 -2
  55. package/esm5/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +60 -12
  56. package/esm5/lib/_common/pills/pills.component.js +2 -2
  57. package/esm5/lib/_common/sliders/sliders.component.js +3 -3
  58. package/esm5/lib/_common/sliders-ng-content/sliders-ng-content.component.js +224 -0
  59. package/esm5/lib/_common/sliders-ng-content/sliders-ng-content.model.js +61 -0
  60. package/esm5/lib/_common/sliders-ng-content/sliders-ng-content.module.js +67 -0
  61. package/esm5/lib/_common/user-content-rating/user-content-rating.component.js +726 -0
  62. package/esm5/lib/_common/user-content-rating/user-content-rating.module.js +39 -0
  63. package/esm5/lib/_models/card-users.model.js +7 -5
  64. package/esm5/lib/_models/rating.model.js +44 -0
  65. package/esm5/lib/_services/common-methods.service.js +1 -1
  66. package/esm5/lib/_services/insite-data.service.js +14 -2
  67. package/esm5/lib/_services/rating.service.js +214 -0
  68. package/esm5/lib/consumption.module.js +6 -2
  69. package/esm5/public-api.js +4 -1
  70. package/esm5/sunbird-cb-consumption.js +29 -19
  71. package/fesm2015/sunbird-cb-consumption.js +3945 -1280
  72. package/fesm2015/sunbird-cb-consumption.js.map +1 -1
  73. package/fesm5/sunbird-cb-consumption.js +4406 -1447
  74. package/fesm5/sunbird-cb-consumption.js.map +1 -1
  75. package/lib/_common/avatar-photo-lib/avatar-photo-lib.component.d.ts +19 -0
  76. package/lib/_common/avatar-photo-lib/avatar-photo-lib.module.d.ts +2 -0
  77. package/lib/_common/calender/calender-day/calender-day.component.d.ts +18 -0
  78. package/lib/_common/calender/calender.component.d.ts +34 -0
  79. package/lib/_common/calender/calender.module.d.ts +2 -0
  80. package/lib/_common/cards/card-wide/card-wide.component.d.ts +30 -0
  81. package/lib/_common/common-strip/common-strip.component.d.ts +104 -0
  82. package/lib/_common/common-strip/common-strip.model.d.ts +141 -0
  83. package/lib/_common/common-strip/common-strip.module.d.ts +2 -0
  84. package/lib/_common/competency-passbook/competency-passbook.component.d.ts +1 -0
  85. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.d.ts +6 -1
  86. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.d.ts +8 -0
  87. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +8 -6
  88. package/lib/_common/sliders-ng-content/sliders-ng-content.component.d.ts +28 -0
  89. package/lib/_common/sliders-ng-content/sliders-ng-content.model.d.ts +34 -0
  90. package/lib/_common/sliders-ng-content/sliders-ng-content.module.d.ts +6 -0
  91. package/lib/_common/user-content-rating/user-content-rating.component.d.ts +167 -0
  92. package/lib/_common/user-content-rating/user-content-rating.module.d.ts +2 -0
  93. package/lib/_models/card-users.model.d.ts +5 -4
  94. package/lib/_models/rating.model.d.ts +17 -0
  95. package/lib/_services/common-methods.service.d.ts +3 -2
  96. package/lib/_services/insite-data.service.d.ts +1 -0
  97. package/lib/_services/rating.service.d.ts +15 -0
  98. package/package.json +1 -1
  99. package/public-api.d.ts +3 -0
  100. package/sunbird-cb-consumption.d.ts +27 -17
  101. package/sunbird-cb-consumption.metadata.json +1 -1
@@ -0,0 +1,646 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Component, Input, HostBinding, Inject } from '@angular/core';
7
+ import { WidgetBaseComponent } from '@sunbird-cb/resolver-v2';
8
+ // import { HttpClient } from '@angular/common/http'
9
+ import { WidgetContentService } from '../../_services/widget-content.service';
10
+ import { MultilingualTranslationsService } from '../../_services/multilingual-translations.service';
11
+ import { LoggerService, EventService, ConfigurationsService, UtilityService, } from '@sunbird-cb/utils-v2';
12
+ import { filter } from 'rxjs/operators';
13
+ import { WidgetUserService } from '../../_services/widget-user.service';
14
+ // import { environment } from 'src/environments/environment'
15
+ // tslint:disable-next-line
16
+ import * as _ from 'lodash';
17
+ import { TranslateService } from '@ngx-translate/core';
18
+ import { CommonMethodsService } from '../../_services/common-methods.service';
19
+ /**
20
+ * @record
21
+ */
22
+ function IStripUnitCommonData() { }
23
+ if (false) {
24
+ /** @type {?} */
25
+ IStripUnitCommonData.prototype.key;
26
+ /** @type {?} */
27
+ IStripUnitCommonData.prototype.canHideStrip;
28
+ /** @type {?|undefined} */
29
+ IStripUnitCommonData.prototype.mode;
30
+ /** @type {?} */
31
+ IStripUnitCommonData.prototype.showStrip;
32
+ /** @type {?} */
33
+ IStripUnitCommonData.prototype.disableTranslate;
34
+ /** @type {?|undefined} */
35
+ IStripUnitCommonData.prototype.widgets;
36
+ /** @type {?} */
37
+ IStripUnitCommonData.prototype.stripTitle;
38
+ /** @type {?|undefined} */
39
+ IStripUnitCommonData.prototype.stripTitleLink;
40
+ /** @type {?|undefined} */
41
+ IStripUnitCommonData.prototype.sliderConfig;
42
+ /** @type {?} */
43
+ IStripUnitCommonData.prototype.stripConfig;
44
+ /** @type {?|undefined} */
45
+ IStripUnitCommonData.prototype.tabs;
46
+ /** @type {?|undefined} */
47
+ IStripUnitCommonData.prototype.stripName;
48
+ /** @type {?|undefined} */
49
+ IStripUnitCommonData.prototype.stripLogo;
50
+ /** @type {?|undefined} */
51
+ IStripUnitCommonData.prototype.description;
52
+ /** @type {?|undefined} */
53
+ IStripUnitCommonData.prototype.stripInfo;
54
+ /** @type {?|undefined} */
55
+ IStripUnitCommonData.prototype.noDataWidget;
56
+ /** @type {?|undefined} */
57
+ IStripUnitCommonData.prototype.errorWidget;
58
+ /** @type {?} */
59
+ IStripUnitCommonData.prototype.showOnNoData;
60
+ /** @type {?} */
61
+ IStripUnitCommonData.prototype.showOnLoader;
62
+ /** @type {?} */
63
+ IStripUnitCommonData.prototype.showOnError;
64
+ /** @type {?|undefined} */
65
+ IStripUnitCommonData.prototype.loaderWidgets;
66
+ /** @type {?|undefined} */
67
+ IStripUnitCommonData.prototype.stripBackground;
68
+ /** @type {?|undefined} */
69
+ IStripUnitCommonData.prototype.secondaryHeading;
70
+ /** @type {?} */
71
+ IStripUnitCommonData.prototype.viewMoreUrl;
72
+ }
73
+ export class CommonStripComponent extends WidgetBaseComponent {
74
+ /**
75
+ * @param {?} environment
76
+ * @param {?} contentSvc
77
+ * @param {?} loggerSvc
78
+ * @param {?} eventSvc
79
+ * @param {?} configSvc
80
+ * @param {?} utilitySvc
81
+ * @param {?} userSvc
82
+ * @param {?} translate
83
+ * @param {?} langtranslations
84
+ * @param {?} commonMethodsSvc
85
+ */
86
+ constructor(environment, contentSvc, loggerSvc, eventSvc, configSvc, utilitySvc, userSvc, translate, langtranslations, commonMethodsSvc) {
87
+ super();
88
+ this.contentSvc = contentSvc;
89
+ this.loggerSvc = loggerSvc;
90
+ this.eventSvc = eventSvc;
91
+ this.configSvc = configSvc;
92
+ this.utilitySvc = utilitySvc;
93
+ this.userSvc = userSvc;
94
+ this.translate = translate;
95
+ this.langtranslations = langtranslations;
96
+ this.commonMethodsSvc = commonMethodsSvc;
97
+ this.id = `ws-strip-miltiple_${Math.random()}`;
98
+ this.stripsResultDataMap = {};
99
+ this.stripsKeyOrder = [];
100
+ this.showAccordionData = true;
101
+ this.showParentLoader = false;
102
+ this.showParentError = false;
103
+ this.showParentNoData = false;
104
+ this.errorDataCount = 0;
105
+ this.noDataCount = 0;
106
+ this.successDataCount = 0;
107
+ this.contentAvailable = true;
108
+ this.baseUrl = this.configSvc.sitePath || '';
109
+ this.veifiedKarmayogi = false;
110
+ this.changeEventSubscription = null;
111
+ this.defaultMaxWidgets = 12;
112
+ this.todaysEvents = [];
113
+ this.environment = environment;
114
+ }
115
+ /**
116
+ * @return {?}
117
+ */
118
+ ngOnInit() {
119
+ // const url = window.location.href
120
+ this.initData();
121
+ }
122
+ /**
123
+ * @return {?}
124
+ */
125
+ ngOnDestroy() {
126
+ if (this.changeEventSubscription) {
127
+ this.changeEventSubscription.unsubscribe();
128
+ }
129
+ }
130
+ /**
131
+ * @param {?} key
132
+ * @return {?}
133
+ */
134
+ showAccordion(key) {
135
+ if (this.utilitySvc.isMobile && this.stripsResultDataMap[key].mode === 'accordion') {
136
+ return this.showAccordionData;
137
+ }
138
+ return true;
139
+ }
140
+ /**
141
+ * @param {?} key
142
+ * @return {?}
143
+ */
144
+ setHiddenForStrip(key) {
145
+ this.stripsResultDataMap[key].showStrip = false;
146
+ sessionStorage.setItem(`cstrip_${key}`, '1');
147
+ }
148
+ /**
149
+ * @private
150
+ * @param {?} key
151
+ * @return {?}
152
+ */
153
+ getIfStripHidden(key) {
154
+ /** @type {?} */
155
+ const storageItem = sessionStorage.getItem(`cstrip_${key}`);
156
+ return Boolean(storageItem !== '1');
157
+ }
158
+ /**
159
+ * @private
160
+ * @return {?}
161
+ */
162
+ initData() {
163
+ this.stripsKeyOrder = this.widgetData && this.widgetData.strips && this.widgetData.strips.map((/**
164
+ * @param {?} strip
165
+ * @return {?}
166
+ */
167
+ strip => strip.key)) || [];
168
+ if (this.widgetData.loader && this.widgetData.strips.length) {
169
+ this.showParentLoader = true;
170
+ }
171
+ // null check if in case no strips key in config
172
+ if (this.widgetData && this.widgetData.strips) {
173
+ // Fetch the data
174
+ for (const strip of this.widgetData.strips) {
175
+ this.processStrip(strip, [], 'fetching', false, null);
176
+ if (strip.dataType === 'in-hand' && this.widgetData[strip.dataKey]) {
177
+ this.processStrip(strip, this.commonMethodsSvc.transformContentsToWidgets(this.widgetData[strip.dataKey], strip), 'done', true, strip.viewMoreUrl || '');
178
+ }
179
+ else {
180
+ if (this.checkForEmptyWidget(strip)) {
181
+ // this.fetchStripFromRequestData(strip, false);
182
+ }
183
+ else {
184
+ this.processStrip(strip, [], 'done', true, null);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ // Subscription for changes
190
+ /** @type {?} */
191
+ const keyAndEvent = this.widgetData.strips
192
+ .map((/**
193
+ * @param {?} strip
194
+ * @return {?}
195
+ */
196
+ strip => ({
197
+ key: strip.key,
198
+ type: (strip.refreshEvent && strip.refreshEvent.eventType) || '',
199
+ from: (strip.refreshEvent && strip.refreshEvent.from.toString()) || '',
200
+ })))
201
+ .filter((/**
202
+ * @param {?} __0
203
+ * @return {?}
204
+ */
205
+ ({ key, type, from }) => key && type && from));
206
+ /** @type {?} */
207
+ const eventTypeSet = new Set(keyAndEvent.map((/**
208
+ * @param {?} e
209
+ * @return {?}
210
+ */
211
+ e => e.type)));
212
+ this.changeEventSubscription = this.eventSvc.events$
213
+ .pipe(filter((/**
214
+ * @param {?} event
215
+ * @return {?}
216
+ */
217
+ event => eventTypeSet.has(event.eventType))))
218
+ .subscribe((/**
219
+ * @param {?} event
220
+ * @return {?}
221
+ */
222
+ event => {
223
+ keyAndEvent
224
+ .filter((/**
225
+ * @param {?} e
226
+ * @return {?}
227
+ */
228
+ e => e.type === event.eventType && e.from === event.from))
229
+ .map((/**
230
+ * @param {?} e
231
+ * @return {?}
232
+ */
233
+ e => e.key))
234
+ .forEach((/**
235
+ * @param {?} k
236
+ * @return {?}
237
+ */
238
+ k => this.fetchStripFromKey(k, false)));
239
+ }));
240
+ }
241
+ /**
242
+ * @private
243
+ * @param {?} key
244
+ * @param {?=} calculateParentStatus
245
+ * @return {?}
246
+ */
247
+ fetchStripFromKey(key, calculateParentStatus = true) {
248
+ /** @type {?} */
249
+ const stripData = this.widgetData.strips.find((/**
250
+ * @param {?} strip
251
+ * @return {?}
252
+ */
253
+ strip => strip.key === key));
254
+ if (stripData) {
255
+ // this.fetchStripFromRequestData(stripData, calculateParentStatus);
256
+ }
257
+ }
258
+ /**
259
+ * @param {?} data
260
+ * @return {?}
261
+ */
262
+ isStripShowing(data) {
263
+ /** @type {?} */
264
+ let count = 0;
265
+ if (data && data.key === this.environment.programStripKey && (!data.tabs || !data.tabs.length) &&
266
+ data.stripTitle === this.environment.programStripName && data.widgets.length > 0) {
267
+ data.widgets.forEach((/**
268
+ * @param {?} key
269
+ * @return {?}
270
+ */
271
+ (key) => {
272
+ if (key && key.widgetData.content.primaryCategory === this.environment.programStripPrimaryCategory) {
273
+ count = count + 1;
274
+ }
275
+ }));
276
+ if (count > 0) {
277
+ data.showStrip = true;
278
+ }
279
+ else {
280
+ data.showStrip = false;
281
+ }
282
+ }
283
+ return data.showStrip;
284
+ }
285
+ /**
286
+ * @return {?}
287
+ */
288
+ get isMobile() {
289
+ return this.utilitySvc.isMobile || false;
290
+ }
291
+ /**
292
+ * @param {?} data
293
+ * @return {?}
294
+ */
295
+ getdata(data) {
296
+ if (data.stripInfo) {
297
+ return data.stripInfo.widget;
298
+ }
299
+ return {};
300
+ }
301
+ /**
302
+ * @param {?} wData
303
+ * @param {?} data
304
+ * @return {?}
305
+ */
306
+ checkCondition(wData, data) {
307
+ if (wData.strips[0].stripConfig && wData.strips[0].stripConfig.hideShowAll) {
308
+ return !wData.strips[0].stripConfig.hideShowAll;
309
+ }
310
+ return wData.strips[0].viewMoreUrl && data.widgets && data.widgets.length >= 4;
311
+ }
312
+ /**
313
+ * @param {?} data
314
+ * @return {?}
315
+ */
316
+ checkVisible(data) {
317
+ return data.stripInfo && data.stripInfo.visibilityMode === 'visible';
318
+ }
319
+ /**
320
+ * @param {?} data
321
+ * @return {?}
322
+ */
323
+ getContineuLearningLenth(data) {
324
+ return data.widgets ? data.widgets.length : 0;
325
+ }
326
+ /**
327
+ * @param {?} data
328
+ * @return {?}
329
+ */
330
+ getLength(data) {
331
+ if (!data.tabs || !data.tabs.length) {
332
+ return data.widgets ? data.widgets.length : 0;
333
+ }
334
+ {
335
+ // if tabs are there check if each tab has widgets and get the tab with max widgets
336
+ /** @type {?} */
337
+ const tabWithMaxWidgets = data.tabs.reduce((/**
338
+ * @param {?} prev
339
+ * @param {?} current
340
+ * @return {?}
341
+ */
342
+ (prev, current) => {
343
+ if (!prev.widgets && !current.widgets) {
344
+ return current;
345
+ }
346
+ if (prev.widgets && current.widgets) {
347
+ return (prev.widgets.length > current.widgets.length) ? prev : current;
348
+ }
349
+ if (current.widgets && !prev.widgets) {
350
+ return current;
351
+ }
352
+ if (!current.widgets && prev.widgets) {
353
+ return prev;
354
+ }
355
+ return current;
356
+ // return (prev.widgets && current.widgets && (prev.widgets.length > current.widgets.length) ) ? prev : current
357
+ // tslint:disable-next-line: align
358
+ }), data.tabs[0]);
359
+ // if tabs has atleast 1 widgets then strip will show or else not
360
+ return tabWithMaxWidgets.widgets ? tabWithMaxWidgets.widgets.length : 0;
361
+ }
362
+ }
363
+ /**
364
+ * @private
365
+ * @param {?} strip
366
+ * @param {?=} results
367
+ * @param {?=} fetchStatus
368
+ * @param {?=} calculateParentStatus
369
+ * @param {?=} _viewMoreUrl
370
+ * @param {?=} tabsResults
371
+ * @return {?}
372
+ */
373
+ processStrip(strip, results = [], fetchStatus, calculateParentStatus = true, _viewMoreUrl, tabsResults) {
374
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
375
+ /** @type {?} */
376
+ const stripData = {
377
+ viewMoreUrl: strip.viewMoreUrl,
378
+ key: strip.key,
379
+ canHideStrip: Boolean(strip.canHideStrip),
380
+ showStrip: this.getIfStripHidden(strip.key),
381
+ noDataWidget: strip.noDataWidget,
382
+ errorWidget: strip.errorWidget,
383
+ stripInfo: strip.info,
384
+ stripTitle: strip.title,
385
+ stripTitleLink: strip.stripTitleLink,
386
+ dataType: strip.dataType,
387
+ dataKey: strip.dataKey,
388
+ disableTranslate: strip.disableTranslate,
389
+ sliderConfig: strip.sliderConfig,
390
+ tabs: tabsResults ? tabsResults : strip.tabs,
391
+ stripName: strip.name,
392
+ mode: strip.mode,
393
+ stripConfig: strip.stripConfig,
394
+ stripBackground: strip.stripBackground,
395
+ secondaryHeading: strip.secondaryHeading,
396
+ loaderWidgets: strip.loaderWidgets || [],
397
+ widgets: fetchStatus === 'done'
398
+ ? [
399
+ ...(strip.preWidgets || []).map((/**
400
+ * @param {?} w
401
+ * @return {?}
402
+ */
403
+ w => (Object.assign({}, w, { widgetHostClass: `mb-2 ${w.widgetHostClass}` })))),
404
+ ...results,
405
+ ...(strip.postWidgets || []).map((/**
406
+ * @param {?} w
407
+ * @return {?}
408
+ */
409
+ w => (Object.assign({}, w, { widgetHostClass: `mb-2 ${w.widgetHostClass}` })))),
410
+ ]
411
+ : [],
412
+ showOnNoData: Boolean(strip.noDataWidget &&
413
+ !((strip.preWidgets || []).length + results.length + (strip.postWidgets || []).length) &&
414
+ fetchStatus === 'done'),
415
+ showOnLoader: Boolean(strip.loader && fetchStatus === 'fetching'),
416
+ showOnError: Boolean(strip.errorWidget && fetchStatus === 'error'),
417
+ };
418
+ // const stripData = this.stripsResultDataMap[strip.key]
419
+ this.stripsResultDataMap = Object.assign({}, this.stripsResultDataMap, { [strip.key]: stripData });
420
+ if (!tabsResults) {
421
+ if (calculateParentStatus &&
422
+ (fetchStatus === 'done' || fetchStatus === 'error') &&
423
+ stripData.widgets) {
424
+ this.checkParentStatus(fetchStatus, stripData.widgets.length);
425
+ }
426
+ if (calculateParentStatus && !(results && results.length > 0)) {
427
+ this.contentAvailable = false;
428
+ }
429
+ else if (results && results.length > 0) {
430
+ this.contentAvailable = true;
431
+ }
432
+ }
433
+ else {
434
+ this.contentAvailable = true;
435
+ }
436
+ });
437
+ }
438
+ /**
439
+ * @param {?} stripsResultDataMap
440
+ * @param {?} key
441
+ * @return {?}
442
+ */
443
+ getSelectedIndex(stripsResultDataMap, key) {
444
+ /** @type {?} */
445
+ let returnValue = 0;
446
+ if (key === 'cbpPlan') {
447
+ if (stripsResultDataMap.tabs.length) {
448
+ /** @type {?} */
449
+ const data = stripsResultDataMap.tabs.filter((/**
450
+ * @param {?} ele
451
+ * @return {?}
452
+ */
453
+ (ele) => ele.value === 'upcoming'));
454
+ returnValue = data[0].widgets && data[0].widgets.length > 0 ? 1 : 0;
455
+ }
456
+ }
457
+ return returnValue;
458
+ }
459
+ /**
460
+ * @private
461
+ * @param {?} fetchStatus
462
+ * @param {?} stripWidgetsCount
463
+ * @return {?}
464
+ */
465
+ checkParentStatus(fetchStatus, stripWidgetsCount) {
466
+ if (fetchStatus === 'done' && !stripWidgetsCount) {
467
+ this.noDataCount += 1;
468
+ }
469
+ else if (fetchStatus === 'done' && stripWidgetsCount) {
470
+ this.successDataCount += 1;
471
+ }
472
+ else if (fetchStatus === 'error') {
473
+ this.errorDataCount += 1;
474
+ }
475
+ /** @type {?} */
476
+ const settledCount = this.noDataCount + this.successDataCount + this.errorDataCount;
477
+ /** @type {?} */
478
+ const totalCount = this.widgetData.strips.length;
479
+ if (this.successDataCount > 0 && settledCount < totalCount) {
480
+ return;
481
+ }
482
+ this.showParentLoader = settledCount !== totalCount;
483
+ this.showParentNoData =
484
+ this.noDataCount > 0 && this.noDataCount + this.errorDataCount === totalCount;
485
+ this.showParentError = this.errorDataCount === totalCount;
486
+ }
487
+ /**
488
+ * @param {?} strip
489
+ * @return {?}
490
+ */
491
+ checkForEmptyWidget(strip) {
492
+ if (strip.request &&
493
+ ((strip.request.api && Object.keys(strip.request.api).length) ||
494
+ (strip.request.search && Object.keys(strip.request.search).length) ||
495
+ (strip.request.searchRegionRecommendation &&
496
+ Object.keys(strip.request.searchRegionRecommendation).length) ||
497
+ (strip.request.searchV6 && Object.keys(strip.request.searchV6).length) ||
498
+ (strip.request.enrollmentList && Object.keys(strip.request.enrollmentList).length) ||
499
+ (strip.request.cbpList && Object.keys(strip.request.cbpList).length) ||
500
+ (strip.request.trendingSearch && Object.keys(strip.request.trendingSearch).length))) {
501
+ return true;
502
+ }
503
+ return false;
504
+ }
505
+ /**
506
+ * @param {?} tabEvent
507
+ * @param {?} stripMap
508
+ * @param {?} stripKey
509
+ * @return {?}
510
+ */
511
+ tabClicked(tabEvent, stripMap, stripKey) {
512
+ }
513
+ /**
514
+ * @param {?} label
515
+ * @param {?} type
516
+ * @return {?}
517
+ */
518
+ translateLabels(label, type) {
519
+ return this.langtranslations.translateLabel(label, type, '');
520
+ }
521
+ /**
522
+ * @param {?} index
523
+ * @param {?} item
524
+ * @return {?}
525
+ */
526
+ identify(index, item) {
527
+ if (index >= 0) { }
528
+ return item;
529
+ }
530
+ /**
531
+ * @param {?} index
532
+ * @param {?} item
533
+ * @return {?}
534
+ */
535
+ tracker(index, item) {
536
+ if (index >= 0) { }
537
+ return _.get(item, 'widgetData.content.identifier');
538
+ }
539
+ }
540
+ CommonStripComponent.decorators = [
541
+ { type: Component, args: [{
542
+ selector: 'sb-uic-common-strip',
543
+ template: "<ng-container *ngIf=\"!contentAvailable; else otherTemplate\"></ng-container>\n<ng-template #otherTemplate>\n <!-- <div *ngIf=\"showParentLoader\" class=\"text-center my-2\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div> -->\n <ng-container *ngIf=\"showParentError\" [sbUiResolverWidget]=\"widgetData.errorWidget\"></ng-container>\n <ng-container *ngIf=\"showParentNoData\" [sbUiResolverWidget]=\"widgetData.noDataWidget\"></ng-container>\n <ng-container *ngFor=\"let key of stripsKeyOrder; let i = index; trackBy: identify\">\n <ng-container *ngIf=\"isStripShowing(stripsResultDataMap[key])\">\n <a name=\"{{stripsResultDataMap[key]?.stripTitle}}\" [class]=\"key\">\n <div *ngIf=\"stripsResultDataMap && (getLength(stripsResultDataMap[key]) ||\n stripsResultDataMap[key]?.showOnNoData ||\n stripsResultDataMap[key]?.showOnLoader ||\n stripsResultDataMap[key]?.showOnError)\n \" [ngClass]=\"\n !widgetData?.isChannelStrip ? 'xs:px-8 sx:px-10ss' : i > 0 ? 'mt-12' : ''\n \" [id]=\"key\" [ngClass]=\"!widgetData?.isChannelStrip ? margin-bottom-custom : margin-bottom-xs\">\n <div [ngClass]=\"{ pad: stripsResultDataMap[key]?.stripBackground }\"\n [ngStyle]=\"{ 'background-color': stripsResultDataMap[key]?.stripBackground }\">\n <div class=\"flex flex-col pl-4 pr-4 md:pr-0 md:pl-0 \" [ngClass]=\"\n !widgetData?.isChannelStrip\n ? ''\n : stripsResultDataMap[key]?.stripTitle\n ? 'mb-8'\n : ''\n \">\n <div class=\"flex flex-1 items-center\">\n <p class=\"mat-subheading-1 margin-remove inline-block \" *ngIf=\"stripsResultDataMap[key]?.stripTitle\">\n <span class=\"capitalize\" *ngIf=\"stripsResultDataMap[key]?.disableTranslate\">\n {{stripsResultDataMap[key]?.stripTitle}}\n </span>\n <span *ngIf=\"!stripsResultDataMap[key]?.disableTranslate\">\n {{ translateLabels(stripsResultDataMap[key]?.stripTitle, 'home') }}\n </span>\n </p>\n\n <a *ngIf=\"stripsResultDataMap[key]?.stripTitleLink?.link\"\n [routerLink]=\"stripsResultDataMap[key]?.stripTitleLink?.link\"\n [queryParams]=\"stripsResultDataMap[key]?.stripTitleLink?.link?.queryParams\">\n <mat-icon class=\"ws-mat-primary-primary-text ws-mat-default-text\" [color]=\"'accent'\">{{\n stripsResultDataMap[key]?.stripTitleLink?.icon }}</mat-icon>\n </a>\n <span class=\"spacer\"></span>\n <!-- viewAll start-->\n <div *ngIf=\"checkCondition(widgetData , stripsResultDataMap[key])\"\n class=\"ml-4 view-more ws-mat-default-text\">\n <a class=\"flex ws-mat-default-text items-center justify-center mat-body-1\" [routerLink]=\"stripsResultDataMap[key]?.viewMoreUrl?.path\"\n [queryParams]=\"stripsResultDataMap[key]?.viewMoreUrl?.queryParams\">\n <span i18n class=\"ws-mat-default-text\">{{translateLabels(widgetData.strips[0].viewMoreUrl.viewMoreText,'home') || 'See all'}}</span>\n <mat-icon class=\"ws-mat-default-text mat-icon notranslate material-icons mat-icon-no-color\" color=\"accent\">navigate_next</mat-icon>\n </a>\n </div>\n <!-- viewAll end-->\n </div>\n <button mat-icon-button (click)=\"setHiddenForStrip(key)\" *ngIf=\"stripsResultDataMap[key]?.canHideStrip\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-icon class=\"cursor-pointer\" *ngIf=\"stripsResultDataMap[key]?.mode === 'accordion' && isMobile\"\n (click)=\"showAccordionData = !showAccordionData\">{{ showAccordionData ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"checkVisible(stripsResultDataMap[key])\">\n <ng-container [sbUiResolverWidget]=\"getdata(stripsResultDataMap[key])\">\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnNoData\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.noDataWidget\"></ng-container>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnError\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.errorWidget\"></ng-container>\n <!-- IF no errors then proceed to show tabs or non tabs strip -->\n <ng-container *ngIf=\"!stripsResultDataMap[key]?.showOnNoData && !stripsResultDataMap[key]?.showOnError\">\n <ng-container *ngIf=\"stripsResultDataMap[key].tabs && stripsResultDataMap[key].tabs.length\">\n <mat-tab-group animationDuration=\"0ms\" [selectedIndex]=\"getSelectedIndex(stripsResultDataMap[key], key)\"\n class=\"mat-tab-labels w-full strips-tabgroup\" dynamicHeight\n (selectedTabChange)=\"tabClicked($event, stripsResultDataMap[key], key)\">\n <mat-tab label=\"{{tab?.label}}\" *ngFor=\"let tab of stripsResultDataMap[key].tabs; let last = last;\">\n <ng-template mat-tab-label>\n <span>{{ translateLabels(tab?.label, 'home') }} &nbsp;</span>\n <span *ngIf=\"tab?.showTabDataCount && tab?.widgets?.length\">({{tab?.widgets?.length}})</span>\n </ng-template>\n <div>\n <!-- <ng-container [ngTemplateOutlet]=\"loader\" *ngIf=\"stripsResultDataMap[key]?.showOnLoader\">\n </ng-container> -->\n <div *ngIf=\"stripsResultDataMap && stripsResultDataMap[key]?.showOnLoader ||\n !tab.fetchTabStatus\"\n class=\"text-center my-2\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n <div *ngIf=\"((tab?.fetchTabStatus && tab?.fetchTabStatus === 'done') &&\n (!tab?.widgets || !tab?.widgets?.length))\">\n <ng-container *ngIf=\"tab?.value === 'inprogress'; else msgTemp\">\n <div class=\"w-full flex flex-col items-center justify-center\">\n <img alt=\"\" class=\"mt-4 mb-4\" src=\"assets/icons/home/nodataDefault.svg\">\n <div class=\"mat-subheading-1 text-center info-content\">{{ 'contentstripmultiple.getReadyForLearningAdventure' | translate }} -\n <a class=\"click-here\" [routerLink]=\"'/page/learn'\">{{ 'contentstripmultiple.clickHere' | translate }}</a> {{ 'contentstripmultiple.toEnrollNextCourse' | translate }}</div>\n </div>\n </ng-container>\n <ng-template #msgTemp>\n <div class=\"w-full flex flex-col items-center justify-center\">\n <img alt=\"\" class=\"mt-4 mb-4\" src=\"assets/icons/home/nodataDefault.png\">\n <div class=\"mat-subheading-1 text-center\">{{ translateLabels(tab.nodataMsg, 'home') }}</div>\n </div>\n </ng-template>\n </div>\n <ng-container *ngIf=\"(tab?.fetchTabStatus === 'done' || tab?.widgets?.length)\">\n <ng-container *ngIf=\"!tab?.tabLoading\">\n\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [widgetsLength]=\"tab?.widgets?.length\"\n *ngIf=\"getContineuLearningLenth(stripsResultDataMap[key]) && showAccordion(key)\"\n [loadStatus]=\"'done'\" [defaultMaxWidgets]=\"tab?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of tab?.widgets| slice:0:(tab?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets); trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </ng-container>\n </ng-container>\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n <ng-container *ngIf=\"!stripsResultDataMap[key].tabs || !stripsResultDataMap[key].tabs.length\">\n <div *ngIf=\"stripsResultDataMap && stripsResultDataMap[key]?.showOnLoader\" class=\"text-center my-2\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [id]=\"key+'-scroller'\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n <div class=\"\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [id]=\"key+'-scroller'\"\n [widgetsLength]=\"stripsResultDataMap[key]?.widgets?.length\" [loadStatus]=\"'done'\" [defaultMaxWidgets]=\"stripsResultDataMap[key].sliderConfig?.maxWidgets || defaultMaxWidgets\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.widgets| slice:0:(stripsResultDataMap[key].sliderConfig?.maxWidgets || defaultMaxWidgets); trackBy: tracker\">\n <!-- <ng-container *ngIf=\"widget.widgetData.context.pageSection === 'continueLearning' \"> -->\n <!-- <ng-container *ngIf=\"widget.widgetData.content.completionPercentage !== 100\"\n [sbUiResolverWidget]=\"widget\"></ng-container> -->\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n <!-- </ng-container> -->\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </a>\n\n </ng-container>\n </ng-container>\n</ng-template>",
544
+ styles: [".view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.view-more .icon{font-size:24px;width:24px;height:24px;border:1px solid;border-radius:50%;padding:8px;margin-bottom:8px}.margin-bottom-custom{margin-bottom:60px}.view-more:hover{background-color:#dcdfe5}::ng-deep.strips-tabgroup .mat-tab-header{border-bottom:2px solid rgba(0,0,0,.12)}::ng-deep.strips-tabgroup .mat-tab-body{padding:20px 0!important;box-sizing:border-box;overflow-y:initial!important}::ng-deep.strips-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep.strips-tabgroup .mat-tab-label{border-bottom:0 solid rgba(0,0,0,.1);margin-right:0;opacity:1}::ng-deep.strips-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:inherit;font:400 14px/20px Lato}::ng-deep.strips-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.click-here{color:#1b4ca1}.info-content{opacity:1;color:rgba(0,0,0,.87);font:700 14px/20px Lato-Bold;text-align:center}"]
545
+ }] }
546
+ ];
547
+ /** @nocollapse */
548
+ CommonStripComponent.ctorParameters = () => [
549
+ { type: undefined, decorators: [{ type: Inject, args: ['environment',] }] },
550
+ { type: WidgetContentService },
551
+ { type: LoggerService },
552
+ { type: EventService },
553
+ { type: ConfigurationsService },
554
+ { type: UtilityService },
555
+ { type: WidgetUserService },
556
+ { type: TranslateService },
557
+ { type: MultilingualTranslationsService },
558
+ { type: CommonMethodsService }
559
+ ];
560
+ CommonStripComponent.propDecorators = {
561
+ widgetData: [{ type: Input }],
562
+ id: [{ type: HostBinding, args: ['id',] }]
563
+ };
564
+ if (false) {
565
+ /** @type {?} */
566
+ CommonStripComponent.prototype.widgetData;
567
+ /** @type {?} */
568
+ CommonStripComponent.prototype.id;
569
+ /** @type {?} */
570
+ CommonStripComponent.prototype.stripsResultDataMap;
571
+ /** @type {?} */
572
+ CommonStripComponent.prototype.stripsKeyOrder;
573
+ /** @type {?} */
574
+ CommonStripComponent.prototype.showAccordionData;
575
+ /** @type {?} */
576
+ CommonStripComponent.prototype.showParentLoader;
577
+ /** @type {?} */
578
+ CommonStripComponent.prototype.showParentError;
579
+ /** @type {?} */
580
+ CommonStripComponent.prototype.showParentNoData;
581
+ /** @type {?} */
582
+ CommonStripComponent.prototype.errorDataCount;
583
+ /** @type {?} */
584
+ CommonStripComponent.prototype.noDataCount;
585
+ /** @type {?} */
586
+ CommonStripComponent.prototype.successDataCount;
587
+ /** @type {?} */
588
+ CommonStripComponent.prototype.contentAvailable;
589
+ /** @type {?} */
590
+ CommonStripComponent.prototype.baseUrl;
591
+ /** @type {?} */
592
+ CommonStripComponent.prototype.veifiedKarmayogi;
593
+ /** @type {?} */
594
+ CommonStripComponent.prototype.environment;
595
+ /** @type {?} */
596
+ CommonStripComponent.prototype.changeEventSubscription;
597
+ /** @type {?} */
598
+ CommonStripComponent.prototype.defaultMaxWidgets;
599
+ /** @type {?} */
600
+ CommonStripComponent.prototype.enrollInterval;
601
+ /** @type {?} */
602
+ CommonStripComponent.prototype.todaysEvents;
603
+ /**
604
+ * @type {?}
605
+ * @private
606
+ */
607
+ CommonStripComponent.prototype.contentSvc;
608
+ /**
609
+ * @type {?}
610
+ * @private
611
+ */
612
+ CommonStripComponent.prototype.loggerSvc;
613
+ /**
614
+ * @type {?}
615
+ * @private
616
+ */
617
+ CommonStripComponent.prototype.eventSvc;
618
+ /**
619
+ * @type {?}
620
+ * @private
621
+ */
622
+ CommonStripComponent.prototype.configSvc;
623
+ /** @type {?} */
624
+ CommonStripComponent.prototype.utilitySvc;
625
+ /**
626
+ * @type {?}
627
+ * @private
628
+ */
629
+ CommonStripComponent.prototype.userSvc;
630
+ /**
631
+ * @type {?}
632
+ * @private
633
+ */
634
+ CommonStripComponent.prototype.translate;
635
+ /**
636
+ * @type {?}
637
+ * @private
638
+ */
639
+ CommonStripComponent.prototype.langtranslations;
640
+ /**
641
+ * @type {?}
642
+ * @private
643
+ */
644
+ CommonStripComponent.prototype.commonMethodsSvc;
645
+ }
646
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXN0cmlwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uLyIsInNvdXJjZXMiOlsibGliL19jb21tb24vY29tbW9uLXN0cmlwL2NvbW1vbi1zdHJpcC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBb0IsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFHaEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFOUUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDcEcsT0FBTyxFQUVMLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBR3hFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBRTNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7O0FBRzlFLG1DQW9DQzs7O0lBbkNDLG1DQUFZOztJQUNaLDRDQUFzQjs7SUFDdEIsb0NBQWM7O0lBQ2QseUNBQW1COztJQUNuQixnREFBMEI7O0lBQzFCLHVDQUFzRDs7SUFDdEQsMENBQW1COztJQUNuQiw4Q0FNRTs7SUFDRiw0Q0FLRTs7SUFDRiwyQ0FBaUI7O0lBQ2pCLG9DQUFtRDs7SUFDbkQseUNBQW1COztJQUNuQix5Q0FBbUI7O0lBQ25CLDJDQUFxQjs7SUFDckIseUNB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bkMsZ0RBQXlEOzs7OztJQUN6RCxnREFBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgSG9zdEJpbmRpbmcsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciwgV2lkZ2V0QmFzZUNvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJztcbmltcG9ydCB7IE5zQ29tbW9uU3RyaXAgfSBmcm9tICcuL2NvbW1vbi1zdHJpcC5tb2RlbCc7XG4vLyBpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19tb2RlbHMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnO1xuaW1wb3J0IHsgTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy9tdWx0aWxpbmd1YWwtdHJhbnNsYXRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVEZldGNoU3RhdHVzLFxuICBMb2dnZXJTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgVXRpbGl0eVNlcnZpY2UsXG59IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgV2lkZ2V0VXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LXVzZXIuc2VydmljZSc7XG4vLyBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJ3NyYy9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgTWF0VGFiQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBDb21tb25NZXRob2RzU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy9jb21tb24tbWV0aG9kcy5zZXJ2aWNlJztcblxuXG5pbnRlcmZhY2UgSVN0cmlwVW5pdENvbW1vbkRhdGEge1xuICBrZXk6IHN0cmluZztcbiAgY2FuSGlkZVN0cmlwOiBib29sZWFuO1xuICBtb2RlPzogc3RyaW5nO1xuICBzaG93U3RyaXA6IGJvb2xlYW47XG4gIGRpc2FibGVUcmFuc2xhdGU6IGJvb2xlYW47XG4gIHdpZGdldHM/OiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YVtdO1xuICBzdHJpcFRpdGxlOiBzdHJpbmc7XG4gIHN0cmlwVGl0bGVMaW5rPzoge1xuICAgIGxpbms6ICB7XG4gICAgICBxdWVyeVBhcmFtczogc3RyaW5nXG4gICAgfSxcbiAgICBpY29uOiBzdHJpbmcsXG4gICAgcXVlcnlQYXJhbXM6IHN0cmluZ1xuICB9O1xuICBzbGlkZXJDb25maWc/OiB7XG4gICAgc2hvd05hdnM6IGJvb2xlYW4sXG4gICAgc2hvd0RvdHM6IGJvb2xlYW4sXG4gICAgbWF4V2lkZ2V0cz86IG51bWJlclxuICAgIGNlcmlmaWNhdGVDYXJkTWFyZ2luPzogYm9vbGVhblxuICB9O1xuICBzdHJpcENvbmZpZzogYW55O1xuICB0YWJzPzogTnNDb21tb25TdHJpcC5JQ29tbW9uU3RyaXBUYWJbXSB8IHVuZGVmaW5lZDtcbiAgc3RyaXBOYW1lPzogc3RyaW5nO1xuICBzdHJpcExvZ28/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBzdHJpcEluZm8/OiBOc0NvbW1vblN0cmlwLklTdHJpcEluZm87XG4gIG5vRGF0YVdpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhO1xuICBlcnJvcldpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhO1xuICBzaG93T25Ob0RhdGE6IGJvb2xlYW47XG4gIHNob3dPbkxvYWRlcjogYm9vbGVhbjtcbiAgc2hvd09uRXJyb3I6IGJvb2xlYW47XG4gIGxvYWRlcldpZGdldHM/OiBhbnk7XG4gIHN0cmlwQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2Vjb25kYXJ5SGVhZGluZz86IGFueTtcbiAgdmlld01vcmVVcmw6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ItdWljLWNvbW1vbi1zdHJpcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21tb24tc3RyaXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21tb24tc3RyaXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDb21tb25TdHJpcENvbXBvbmVudCBleHRlbmRzIFdpZGdldEJhc2VDb21wb25lbnRcbmltcGxlbWVudHNcbk9uSW5pdCxcbk9uRGVzdHJveSxcbk5zV2lkZ2V0UmVzb2x2ZXIuSVdpZGdldERhdGE8TnNDb21tb25TdHJpcC5JQ29tbW9uU3RyaXA+IHtcbiAgQElucHV0KCkgd2lkZ2V0RGF0YSE6IE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwO1xuICBASG9zdEJpbmRpbmcoJ2lkJylcbiAgcHVibGljIGlkID0gYHdzLXN0cmlwLW1pbHRpcGxlXyR7TWF0aC5yYW5kb20oKX1gO1xuICBzdHJpcHNSZXN1bHREYXRhTWFwOiB7IFtrZXk6IHN0cmluZ106IElTdHJpcFVuaXRDb21tb25EYXRhIH0gPSB7fTtcbiAgc3RyaXBzS2V5T3JkZXI6IHN0cmluZ1tdID0gW107XG4gIHNob3dBY2NvcmRpb25EYXRhID0gdHJ1ZTtcbiAgc2hvd1BhcmVudExvYWRlciA9IGZhbHNlO1xuICBzaG93UGFyZW50RXJyb3IgPSBmYWxzZTtcbiAgc2hvd1BhcmVudE5vRGF0YSA9IGZhbHNlO1xuICBlcnJvckRhdGFDb3VudCA9IDA7XG4gIG5vRGF0YUNvdW50ID0gMDtcbiAgc3VjY2Vzc0RhdGFDb3VudCA9IDA7XG4gIGNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICBiYXNlVXJsID0gdGhpcy5jb25maWdTdmMuc2l0ZVBhdGggfHwgJyc7XG4gIHZlaWZpZWRLYXJtYXlvZ2kgPSBmYWxzZTtcbiAgZW52aXJvbm1lbnQhOiBhbnk7XG4gIGNoYW5nZUV2ZW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgZGVmYXVsdE1heFdpZGdldHMgPSAxMjtcbiAgZW5yb2xsSW50ZXJ2YWw6IGFueTtcbiAgdG9kYXlzRXZlbnRzOiBhbnkgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIGVudmlyb25tZW50OiBhbnksXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlclN2YzogTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U3ZjOiBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwdWJsaWMgdXRpbGl0eVN2YzogVXRpbGl0eVNlcnZpY2UsXG4gICAgLy8gcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIC8vIHByaXZhdGUgc2VhcmNoU2VydlN2YzogU2VhcmNoU2VydlNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU3ZjOiBXaWRnZXRVc2VyU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd0cmFuc2xhdGlvbnM6IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21tb25NZXRob2RzU3ZjOiBDb21tb25NZXRob2RzU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICB0aGlzLmluaXREYXRhKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jaGFuZ2VFdmVudFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGFuZ2VFdmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dBY2NvcmRpb24oa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLm1vZGUgPT09ICdhY2NvcmRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93QWNjb3JkaW9uRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRIaWRkZW5Gb3JTdHJpcChrZXk6IHN0cmluZykge1xuICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLnNob3dTdHJpcCA9IGZhbHNlO1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYGNzdHJpcF8ke2tleX1gLCAnMScpO1xuICB9XG4gIHByaXZhdGUgZ2V0SWZTdHJpcEhpZGRlbihrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgY3N0cmlwXyR7a2V5fWApO1xuICAgIHJldHVybiBCb29sZWFuKHN0b3JhZ2VJdGVtICE9PSAnMScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RGF0YSgpIHtcbiAgICB0aGlzLnN0cmlwc0tleU9yZGVyID0gdGhpcy53aWRnZXREYXRhICYmIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMgJiYgdGhpcy53aWRnZXREYXRhLnN0cmlwcy5tYXAoc3RyaXAgPT4gc3RyaXAua2V5KSB8fCBbXTtcbiAgICBpZiAodGhpcy53aWRnZXREYXRhLmxvYWRlciAmJiB0aGlzLndpZGdldERhdGEuc3RyaXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zaG93UGFyZW50TG9hZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gbnVsbCBjaGVjayBpZiBpbiBjYXNlIG5vIHN0cmlwcyBrZXkgaW4gY29uZmlnXG4gICAgaWYodGhpcy53aWRnZXREYXRhICYmIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMpIHtcbiAgICAgIC8vIEZldGNoIHRoZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IHN0cmlwIG9mIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZmV0Y2hpbmcnLCBmYWxzZSwgbnVsbCk7XG4gICAgICAgIGlmKHN0cmlwLmRhdGFUeXBlID09PSAnaW4taGFuZCcgJiYgdGhpcy53aWRnZXREYXRhW3N0cmlwLmRhdGFLZXldKXtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgdGhpcy5jb21tb25NZXRob2RzU3ZjLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKHRoaXMud2lkZ2V0RGF0YVtzdHJpcC5kYXRhS2V5XSwgc3RyaXApLFxuICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHN0cmlwLnZpZXdNb3JlVXJsIHx8ICcnLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuY2hlY2tGb3JFbXB0eVdpZGdldChzdHJpcCkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuZmV0Y2hTdHJpcEZyb21SZXF1ZXN0RGF0YShzdHJpcCwgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgdHJ1ZSwgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFN1YnNjcmlwdGlvbiBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IGtleUFuZEV2ZW50OiB7IGtleTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGZyb206IHN0cmluZyB9W10gPSB0aGlzLndpZGdldERhdGEuc3RyaXBzXG4gICAgICAubWFwKHN0cmlwID0+ICh7XG4gICAgICAgIGtleTogc3RyaXAua2V5LFxuICAgICAgICB0eXBlOiAoc3RyaXAucmVmcmVzaEV2ZW50ICYmIHN0cmlwLnJlZnJlc2hFdmVudC5ldmVudFR5cGUpIHx8ICcnLFxuICAgICAgICBmcm9tOiAoc3RyaXAucmVmcmVzaEV2ZW50ICYmIHN0cmlwLnJlZnJlc2hFdmVudC5mcm9tLnRvU3RyaW5nKCkpIHx8ICcnLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKCh7IGtleSwgdHlwZSwgZnJvbSB9KSA9PiBrZXkgJiYgdHlwZSAmJiBmcm9tKTtcbiAgICBjb25zdCBldmVudFR5cGVTZXQgPSBuZXcgU2V0KGtleUFuZEV2ZW50Lm1hcChlID0+IGUudHlwZSkpO1xuICAgIHRoaXMuY2hhbmdlRXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50U3ZjLmV2ZW50cyRcbiAgICAgIC5waXBlKGZpbHRlcihldmVudCA9PiBldmVudFR5cGVTZXQuaGFzKGV2ZW50LmV2ZW50VHlwZSkpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIGtleUFuZEV2ZW50XG4gICAgICAgICAgLmZpbHRlcihlID0+IGUudHlwZSA9PT0gZXZlbnQuZXZlbnRUeXBlICYmIGUuZnJvbSA9PT0gZXZlbnQuZnJvbSlcbiAgICAgICAgICAubWFwKGUgPT4gZS5rZXkpXG4gICAgICAgICAgLmZvckVhY2goayA9PiB0aGlzLmZldGNoU3RyaXBGcm9tS2V5KGssIGZhbHNlKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hTdHJpcEZyb21LZXkoa2V5OiBzdHJpbmcsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUpIHtcbiAgICBjb25zdCBzdHJpcERhdGEgPSB0aGlzLndpZGdldERhdGEuc3RyaXBzLmZpbmQoc3RyaXAgPT4gc3RyaXAua2V5ID09PSBrZXkpO1xuICAgIGlmIChzdHJpcERhdGEpIHtcbiAgICAgIC8vIHRoaXMuZmV0Y2hTdHJpcEZyb21SZXF1ZXN0RGF0YShzdHJpcERhdGEsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpcFNob3dpbmcoZGF0YTogYW55KSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmtleSA9PT0gdGhpcy5lbnZpcm9ubWVudC5wcm9ncmFtU3RyaXBLZXkgJiYgKCFkYXRhLnRhYnMgfHwgIWRhdGEudGFicy5sZW5ndGgpICYmXG4gICAgICBkYXRhLnN0cmlwVGl0bGUgPT09IHRoaXMuZW52aXJvbm1lbnQucHJvZ3JhbVN0cmlwTmFtZSAmJiBkYXRhLndpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgZGF0YS53aWRnZXRzLmZvckVhY2goKGtleTogYW55KSA9PiB7XG4gICAgICAgIGlmIChrZXkgJiYga2V5LndpZGdldERhdGEuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMuZW52aXJvbm1lbnQucHJvZ3JhbVN0cmlwUHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICAgICAgY291bnQgPSBjb3VudCArIDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBkYXRhLnNob3dTdHJpcCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLnNob3dTdHJpcCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zaG93U3RyaXA7XG4gIH1cblxuICBnZXQgaXNNb2JpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbGl0eVN2Yy5pc01vYmlsZSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldGRhdGEoZGF0YTogSVN0cmlwVW5pdENvbW1vbkRhdGEpIHtcbiAgICBpZiAoZGF0YS5zdHJpcEluZm8pIHtcbiAgICAgIHJldHVybiBkYXRhLnN0cmlwSW5mby53aWRnZXQ7XG4gICAgfVxuICAgIHJldHVybiB7fTtcblxuICB9XG4gIGNoZWNrQ29uZGl0aW9uKHdEYXRhOiBOc0NvbW1vblN0cmlwLklDb21tb25TdHJpcCwgZGF0YTogSVN0cmlwVW5pdENvbW1vbkRhdGEpIHtcbiAgICBpZiAod0RhdGEuc3RyaXBzWzBdLnN0cmlwQ29uZmlnICYmIHdEYXRhLnN0cmlwc1swXS5zdHJpcENvbmZpZy5oaWRlU2hvd0FsbCkge1xuICAgICAgcmV0dXJuICF3RGF0YS5zdHJpcHNbMF0uc3RyaXBDb25maWcuaGlkZVNob3dBbGw7XG4gICAgfVxuICAgIHJldHVybiB3RGF0YS5zdHJpcHNbMF0udmlld01vcmVVcmwgJiYgZGF0YS53aWRnZXRzICYmIGRhdGEud2lkZ2V0cy5sZW5ndGggPj0gNDtcbiAgfVxuICBjaGVja1Zpc2libGUoZGF0YTogSVN0cmlwVW5pdENvbW1vbkRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5zdHJpcEluZm8gJiYgZGF0YS5zdHJpcEluZm8udmlzaWJpbGl0eU1vZGUgPT09ICd2aXNpYmxlJztcbiAgfVxuXG4gIGdldENvbnRpbmV1TGVhcm5pbmdMZW50aChkYXRhOiBJU3RyaXBVbml0Q29tbW9uRGF0YSkge1xuICAgIHJldHVybiBkYXRhLndpZGdldHMgPyBkYXRhLndpZGdldHMubGVuZ3RoIDogMDtcbiAgfVxuICBnZXRMZW5ndGgoZGF0YTogSVN0cmlwVW5pdENvbW1vbkRhdGEpIHtcbiAgICBpZiAoIWRhdGEudGFicyB8fCAhZGF0YS50YWJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGEud2lkZ2V0cyA/IGRhdGEud2lkZ2V0cy5sZW5ndGggOiAwO1xuICAgIH0ge1xuICAgICAgLy8gaWYgdGFicyBhcmUgdGhlcmUgY2hlY2sgaWYgZWFjaCB0YWIgaGFzIHdpZGdldHMgYW5kIGdldCB0aGUgdGFiIHdpdGggbWF4IHdpZGdldHNcbiAgICAgIGNvbnN0IHRhYldpdGhNYXhXaWRnZXRzID0gZGF0YS50YWJzLnJlZHVjZShcbiAgICAgICAgKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXByZXYud2lkZ2V0cyAmJiAhY3VycmVudC53aWRnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXYud2lkZ2V0cyAmJiBjdXJyZW50LndpZGdldHMpIHtcbiAgICAgICAgICAgIHJldHVybiAocHJldi53aWRnZXRzLmxlbmd0aCA+IGN1cnJlbnQud2lkZ2V0cy5sZW5ndGgpID8gcHJldiA6IGN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50LndpZGdldHMgJiYgIXByZXYud2lkZ2V0cykge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY3VycmVudC53aWRnZXRzICYmIHByZXYud2lkZ2V0cykge1xuICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIC8vIHJldHVybiAocHJldi53aWRnZXRzICYmIGN1cnJlbnQud2lkZ2V0cyAmJiAocHJldi53aWRnZXRzLmxlbmd0aCA+IGN1cnJlbnQud2lkZ2V0cy5sZW5ndGgpICkgPyBwcmV2IDogY3VycmVudFxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogYWxpZ25cbiAgICAgICAgfSwgZGF0YS50YWJzWzBdKTtcbiAgICAgIC8vIGlmIHRhYnMgaGFzIGF0bGVhc3QgMSB3aWRnZXRzIHRoZW4gc3RyaXAgd2lsbCBzaG93IG9yIGVsc2Ugbm90XG4gICAgICByZXR1cm4gdGFiV2l0aE1heFdpZGdldHMud2lkZ2V0cyA/IHRhYldpdGhNYXhXaWRnZXRzLndpZGdldHMubGVuZ3RoIDogMDtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1N0cmlwKFxuICAgIHN0cmlwOiBOc0NvbW1vblN0cmlwLklDb21tb25TdHJpcFVuaXQsXG4gICAgcmVzdWx0czogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXSA9IFtdLFxuICAgIGZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSxcbiAgICBfdmlld01vcmVVcmw6IGFueSxcbiAgICB0YWJzUmVzdWx0cz86IE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwVGFiW10gfCB1bmRlZmluZWQsXG4gICAgLy8gY2FsY3VsYXRlUGFyZW50U3RhdHVzIGlzIHVzZWQgc28gdGhhdCBwYXJlbnRzJyBzdGF0dXMgaXMgbm90IHJlLWNhbGN1bGF0ZWQgaWYgdGhlIEFQSSBpcyBjYWxsZWQgYWdhaW4gY296IG9mIGZpbHRlcnMsIGV0Yy5cbiAgKSB7XG4gICAgY29uc3Qgc3RyaXBEYXRhID0ge1xuICAgICAgdmlld01vcmVVcmw6IHN0cmlwLnZpZXdNb3JlVXJsLFxuICAgICAga2V5OiBzdHJpcC5rZXksXG4gICAgICBjYW5IaWRlU3RyaXA6IEJvb2xlYW4oc3RyaXAuY2FuSGlkZVN0cmlwKSxcbiAgICAgIHNob3dTdHJpcDogdGhpcy5nZXRJZlN0cmlwSGlkZGVuKHN0cmlwLmtleSksXG4gICAgICBub0RhdGFXaWRnZXQ6IHN0cmlwLm5vRGF0YVdpZGdldCxcbiAgICAgIGVycm9yV2lkZ2V0OiBzdHJpcC5lcnJvcldpZGdldCxcbiAgICAgIHN0cmlwSW5mbzogc3RyaXAuaW5mbyxcbiAgICAgIHN0cmlwVGl0bGU6IHN0cmlwLnRpdGxlLFxuICAgICAgc3RyaXBUaXRsZUxpbms6IHN0cmlwLnN0cmlwVGl0bGVMaW5rLFxuICAgICAgZGF0YVR5cGU6IHN0cmlwLmRhdGFUeXBlLFxuICAgICAgZGF0YUtleTogc3RyaXAuZGF0YUtleSxcbiAgICAgIGRpc2FibGVUcmFuc2xhdGU6IHN0cmlwLmRpc2FibGVUcmFuc2xhdGUsXG4gICAgICBzbGlkZXJDb25maWc6IHN0cmlwLnNsaWRlckNvbmZpZyxcbiAgICAgIHRhYnM6IHRhYnNSZXN1bHRzID8gdGFic1Jlc3VsdHMgOiBzdHJpcC50YWJzLFxuICAgICAgc3RyaXBOYW1lOiBzdHJpcC5uYW1lLFxuICAgICAgbW9kZTogc3RyaXAubW9kZSxcbiAgICAgIHN0cmlwQ29uZmlnOiBzdHJpcC5zdHJpcENvbmZpZyxcbiAgICAgIHN0cmlwQmFja2dyb3VuZDogc3RyaXAuc3RyaXBCYWNrZ3JvdW5kLFxuICAgICAgc2Vjb25kYXJ5SGVhZGluZzogc3RyaXAuc2Vjb25kYXJ5SGVhZGluZyxcbiAgICAgIGxvYWRlcldpZGdldHM6IHN0cmlwLmxvYWRlcldpZGdldHMgfHwgW10sXG4gICAgICB3aWRnZXRzOlxuICAgICAgICBmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi4oc3RyaXAucHJlV2lkZ2V0cyB8fCBbXSkubWFwKHcgPT4gKHtcbiAgICAgICAgICAgICAgLi4udyxcbiAgICAgICAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiBgbWItMiAke3cud2lkZ2V0SG9zdENsYXNzfWAsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAuLi5yZXN1bHRzLFxuICAgICAgICAgICAgLi4uKHN0cmlwLnBvc3RXaWRnZXRzIHx8IFtdKS5tYXAodyA9PiAoe1xuICAgICAgICAgICAgICAuLi53LFxuICAgICAgICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6IGBtYi0yICR7dy53aWRnZXRIb3N0Q2xhc3N9YCxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICAgIHNob3dPbk5vRGF0YTogQm9vbGVhbihcbiAgICAgICAgc3RyaXAubm9EYXRhV2lkZ2V0ICYmXG4gICAgICAgICEoKHN0cmlwLnByZVdpZGdldHMgfHwgW10pLmxlbmd0aCArIHJlc3VsdHMubGVuZ3RoICsgKHN0cmlwLnBvc3RXaWRnZXRzIHx8IFtdKS5sZW5ndGgpICYmXG4gICAgICAgIGZldGNoU3RhdHVzID09PSAnZG9uZScsXG4gICAgICApLFxuICAgICAgc2hvd09uTG9hZGVyOiBCb29sZWFuKHN0cmlwLmxvYWRlciAmJiBmZXRjaFN0YXR1cyA9PT0gJ2ZldGNoaW5nJyksXG4gICAgICBzaG93T25FcnJvcjogQm9vbGVhbihzdHJpcC5lcnJvcldpZGdldCAmJiBmZXRjaFN0YXR1cyA9PT0gJ2Vycm9yJyksXG4gICAgfTtcbiAgICAvLyBjb25zdCBzdHJpcERhdGEgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XVxuICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcCA9IHtcbiAgICAgIC4uLnRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcCxcbiAgICAgIFtzdHJpcC5rZXldOiBzdHJpcERhdGEsXG4gICAgfTtcbiAgICBpZiAoIXRhYnNSZXN1bHRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyAmJlxuICAgICAgICAoZmV0Y2hTdGF0dXMgPT09ICdkb25lJyB8fCBmZXRjaFN0YXR1cyA9PT0gJ2Vycm9yJykgJiZcbiAgICAgICAgc3RyaXBEYXRhLndpZGdldHNcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoZWNrUGFyZW50U3RhdHVzKGZldGNoU3RhdHVzLCBzdHJpcERhdGEud2lkZ2V0cy5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKGNhbGN1bGF0ZVBhcmVudFN0YXR1cyAmJiAhKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSkge1xuICAgICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RlZEluZGV4KHN0cmlwc1Jlc3VsdERhdGFNYXA6IGFueSwga2V5OiBhbnkpOiBudW1iZXIge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IDA7XG4gICAgaWYgKGtleSA9PT0gJ2NicFBsYW4nKSB7XG4gICAgICBpZiAoc3RyaXBzUmVzdWx0RGF0YU1hcC50YWJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkYXRhID0gc3RyaXBzUmVzdWx0RGF0YU1hcC50YWJzLmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS52YWx1ZSA9PT0gJ3VwY29taW5nJyk7XG4gICAgICAgIHJldHVyblZhbHVlID0gZGF0YVswXS53aWRnZXRzICYmIGRhdGFbMF0ud2lkZ2V0cy5sZW5ndGggPiAwID8gMSA6IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBjaGVja1BhcmVudFN0YXR1cyhmZXRjaFN0YXR1czogVEZldGNoU3RhdHVzLCBzdHJpcFdpZGdldHNDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGZldGNoU3RhdHVzID09PSAnZG9uZScgJiYgIXN0cmlwV2lkZ2V0c0NvdW50KSB7XG4gICAgICB0aGlzLm5vRGF0YUNvdW50ICs9IDE7XG4gICAgfSBlbHNlIGlmIChmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnICYmIHN0cmlwV2lkZ2V0c0NvdW50KSB7XG4gICAgICB0aGlzLnN1Y2Nlc3NEYXRhQ291bnQgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGZldGNoU3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLmVycm9yRGF0YUNvdW50ICs9IDE7XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZWRDb3VudCA9IHRoaXMubm9EYXRhQ291bnQgKyB0aGlzLnN1Y2Nlc3NEYXRhQ291bnQgKyB0aGlzLmVycm9yRGF0YUNvdW50O1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLndpZGdldERhdGEuc3RyaXBzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5zdWNjZXNzRGF0YUNvdW50ID4gMCAmJiBzZXR0bGVkQ291bnQgPCB0b3RhbENvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd1BhcmVudExvYWRlciA9IHNldHRsZWRDb3VudCAhPT0gdG90YWxDb3VudDtcbiAgICB0aGlzLnNob3dQYXJlbnROb0RhdGEgPVxuICAgICAgdGhpcy5ub0RhdGFDb3VudCA+IDAgJiYgdGhpcy5ub0RhdGFDb3VudCArIHRoaXMuZXJyb3JEYXRhQ291bnQgPT09IHRvdGFsQ291bnQ7XG4gICAgdGhpcy5zaG93UGFyZW50RXJyb3IgPSB0aGlzLmVycm9yRGF0YUNvdW50ID09PSB0b3RhbENvdW50O1xuICB9XG4gIGNoZWNrRm9yRW1wdHlXaWRnZXQoc3RyaXA6IE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwVW5pdCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICgoc3RyaXAucmVxdWVzdC5hcGkgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5hcGkpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3Quc2VhcmNoICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3Quc2VhcmNoKS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LnNlYXJjaFJlZ2lvblJlY29tbWVuZGF0aW9uICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5zZWFyY2hSZWdpb25SZWNvbW1lbmRhdGlvbikubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5zZWFyY2hWNiAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2KS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LmVucm9sbG1lbnRMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuZW5yb2xsbWVudExpc3QpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmNicExpc3QpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2ggJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaCkubGVuZ3RoKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyB0YWJDbGlja2VkKHRhYkV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCwgc3RyaXBNYXA6IElTdHJpcFVuaXRDb21tb25EYXRhLCBzdHJpcEtleTogc3RyaW5nKSB7XG5cbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVscyhsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsKGxhYmVsLCB0eXBlLCAnJyk7XG4gIH1cblxuICBpZGVudGlmeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgICBpZiAoaW5kZXggPj0gMCkgeyB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgdHJhY2tlcihpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgICBpZiAoaW5kZXggPj0gMCkgeyB9XG4gICAgcmV0dXJuIF8uZ2V0KGl0ZW0sICd3aWRnZXREYXRhLmNvbnRlbnQuaWRlbnRpZmllcicpXG4gIH1cblxufVxuIl19