common.service.js
94.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import * as _ from 'lodash';
import { Observable } from 'rxjs/Observable';
import moment from 'moment-es6';
import { formatDate } from "devextreme/localization";
import { UUID } from 'angular2-uuid';
import { locale } from 'devextreme/localization';
import 'devextreme-intl';
// # Calendar TH
locale('th');
export class Common {
constructor() {
this.DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';
console.log("lib common version 1.11.21");
}
/**
* fn. เช็ค data ทุกประเภท จะ Return กลับไปเป็น true|false
* @param {?} data
* @return {?}
*/
isNotEmpty(data) {
/** @type {?} */
let haveData = false;
/** @type {?} */
const type = typeof data;
// //console.tag('type:').log(type)
switch (type) {
// array|object
case 'object':
if (!data || data == null) {
haveData = false;
}
else if (typeof data[0] !== 'undefined') {
haveData = data.length !== 0 ? true : false;
}
else if (data instanceof Date) {
haveData = true;
}
else {
haveData = Object.keys(data).length ? true : false;
}
break;
// string
case 'string':
if (data) {
haveData = true;
}
break;
// number
case 'number':
// boolean
case 'boolean':
// function
case 'function':
haveData = true;
break;
default:
haveData = false;
break;
}
return haveData;
}
/**
* fn. ปั้น filter สำหรับ Custom Store แบบมี field,filter,orderby
* @param {?} filterOptions : {}
* @return {?}
*/
fnGenFilter(filterOptions) {
/** @type {?} */
const loadOptions = filterOptions.loadOptions || {};
/** @type {?} */
const filterList = filterOptions.filterList || {};
/** @type {?} */
const exceptionList = filterOptions.exceptionList || [];
/** @type {?} */
const options = filterOptions.options || {};
/** @type {?} */
const filter = new Observable(observer => {
/** @type {?} */
const data1 = this.fnCheckLoadOptions(loadOptions);
observer.next(data1);
/** @type {?} */
const data2 = this.fnCheckFilterData(filterList, exceptionList);
observer.next(data2);
/** @type {?} */
const data3 = this.fnCheckOptions(data1, data2, options);
observer.next(data3);
observer.complete();
});
/** @type {?} */
let obj = {};
/** @type {?} */
const observerStep = {
next: data => (obj = data),
error: err => console.error('Observer got an error: ' + err),
complete: () => console.log('obj :', obj)
};
filter.subscribe(observerStep);
// return filter กลับไป
return obj;
}
/**
* @param {?} loadOptions
* @return {?}
*/
fnCheckLoadOptions(loadOptions) {
/** @type {?} */
const options = {
limit: '',
offset: '',
order_by: []
};
if (this.isNotEmpty(loadOptions)) {
options.offset = this.isNotEmpty(loadOptions.skip)
? loadOptions.skip
: '';
options.limit = this.isNotEmpty(loadOptions.take) ? loadOptions.take : '';
if (this.isNotEmpty(loadOptions.sort)) {
console.log("Common -> fnCheckLoadOptions -> loadOptions.sort", loadOptions.sort);
for (let index = 0; index < loadOptions.sort.length; index++) {
/** @type {?} */
const sort = loadOptions.sort[index];
/** @type {?} */
const orderbySelector = sort.selector || '';
if (orderbySelector) {
if (sort.desc) {
options.order_by.push(orderbySelector + ' desc');
}
else {
options.order_by.push(orderbySelector + ' asc');
}
}
}
}
// options.orderby = this.isNotEmpty(loadOptions.sort) ? loadOptions.sort[0].selector : '';
// options.orderby = this.isNotEmpty(loadOptions.sort) && loadOptions.sort[0].desc ? options.orderby + '|DESC' : options.orderby + '|ASC';
}
this.fnRemoveEmptyKey(options);
return options;
}
/**
* @param {?} filterList
* @param {?} exceptionList
* @return {?}
*/
fnCheckFilterData(filterList, exceptionList) {
/** @type {?} */
const filter = {
fields: '',
filter: '',
offset: '',
limit: '',
orderby: ''
};
if (this.isNotEmpty(filterList)) {
filter.fields = this.isNotEmpty(filterList.fields)
? filterList.fields
: '';
if (filterList.filter) {
filter.filter = this.fnConverstFilterDate(filterList.filter, exceptionList);
}
else {
filter.filter = '';
}
// filter.filter = this.isNotEmpty(filterList.filter)
// ? filterList.filter
// : '';
filter.offset = this.isNotEmpty(filterList.offset)
? filterList.offset
: '';
filter.limit = this.isNotEmpty(filterList.limit) ? filterList.limit : '';
filter.orderby = this.isNotEmpty(filterList.orderby)
? filterList.orderby
: '';
}
this.fnRemoveEmptyKey(filter);
return filter;
}
/**
* @param {?} data1
* @param {?} data2
* @param {?} options
* @return {?}
*/
fnCheckOptions(data1, data2, options) {
/** @type {?} */
const mergeData = _.merge(data1, data2);
options = options || {};
/** @type {?} */
const removeFilterEmpty = options.removeFilterEmpty || false; // if empty string will remove parameter
if (removeFilterEmpty) {
mergeData.filter = this.fnRemoveEmptyKey(mergeData.filter);
}
return mergeData;
}
/**
* @param {?} obj
* @return {?}
*/
fnRemoveEmptyKey(obj) {
for (const key in obj) {
if (!this.isNotEmpty(obj[key])) {
delete obj[key];
}
else if (_.isObject(obj[key])) {
obj[key] = this.fnRemoveEmptyKey(obj[key]);
}
}
return obj;
}
/**
* @param {?} filter
* @param {?} exceptionList
* @return {?}
*/
fnConverstFilterDate(filter, exceptionList) {
for (const key in filter) {
/** @type {?} */
let element = filter[key];
if (_.isObject(element)) {
for (const dateKey in element) {
if (element[dateKey] && (dateKey === 'from' || dateKey === 'to')) {
if (exceptionList.includes(key)) {
element[dateKey] = moment(element[dateKey]).format('YYYY-MM-DD HH:mm:ss');
}
else {
if (dateKey === 'from') {
element[dateKey] = moment(element[dateKey]).format('YYYY-MM-DD 00:00:00');
}
else if (dateKey === 'to') {
element[dateKey] = moment(element[dateKey]).format('YYYY-MM-DD 23:59:59');
}
}
}
}
}
}
return filter;
}
/**
* fn. ปั้น filter สำหรับ Custom Store แบบ basic
* @param {?} loadOptions
* @return {?}
*/
fnGenFilterBasic(loadOptions) {
console.log('Common -> fnGenFilterBasic -> loadOptions', loadOptions);
/** @type {?} */
let params = '?';
params += 'skip=' + loadOptions.skip || 0;
params += '&take=' + loadOptions.take || 10;
if (loadOptions.sort) {
params += '&orderby=' + loadOptions.sort[0].selector;
if (loadOptions.sort[0].desc) {
params += ' desc';
}
}
return params;
}
/**
* แปลงวันที่ จาก String เป็น Type Date
* @param {?} date วันที่ ที่ต้องการแปลง
* @param {?=} formatOfDate ถ้ารู้ format ของ date ที่ส่งเข้ามาให้ระบุด้วย
* @return {?}
*/
fnToDate(date, formatOfDate) {
if (date) {
if (formatOfDate) {
return moment(date, formatOfDate).toDate();
}
else {
return moment(date).toDate();
}
}
else {
return null;
}
}
/**
* แปลงวันที่ จาก String เป็น Type Date โดยมีอิง format จาก DB 'YYYY-MM-DD'
* @param {?} date วันที่ ที่ต้องการแปลง
* @return {?}
*/
fnLToDateFromDB(date) {
return moment(date, 'YYYY-MM-DD').toDate();
}
/**
* เปลี่ยนภาษา Date Picker ของ Prime NG
* @param {?} local ภาษา
* @return {?}
*/
fnLocalPCalendar(local) {
switch (local) {
case 'th':
return {
firstDayOfWeek: 1,
dayNames: [
'อาทิตย์',
'จันทร์',
'อังคาร',
'พุธ',
'พฤหัส',
'ศุกร์',
'เสาร์'
],
dayNamesShort: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
dayNamesMin: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
monthNames: [
'มกราคม',
'กุมภาพันธ์',
'มีนาคม',
'เมษายน',
'พฤษภาคม',
'มิถุนายน',
'กรกฎาคม',
'สิงหาคม',
'กันยายน',
'ตุลาคม',
'พฤศจิกายน',
'ธันวาคม'
],
monthNamesShort: [
'ม.ค.',
'ก.พ.',
'มี.ค.',
'เม.ย.',
'พ.ค.',
'มิ.ย.',
'ก.ค.',
'ส.ค.',
'ก.ย.',
'ต.ค.',
'พ.ย.',
'ธ.ค.'
],
today: 'วันนี้',
clear: 'เคลีย'
};
default:
return {
firstDayOfWeek: 0,
dayNames: [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
],
dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
monthNames: [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
],
monthNamesShort: [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
],
today: 'Today',
clear: 'Clear'
};
}
}
/**
* @param {?} id
* @return {?}
*/
collapseFn(id) {
/** @type {?} */
const ibox = $('#' + id + ' div.collapse-link').closest('div.ibox');
/** @type {?} */
const button = $('#' + id + ' div.collapse-link').find('i');
/** @type {?} */
const button1 = $('#' + id + ' div.collapse-link').find('svg');
/** @type {?} */
const body = ibox.find('div.ibox-body');
/** @type {?} */
const content = ibox.find('div.ibox-content');
/** @type {?} */
const footer = ibox.find('div.ibox-footer');
body.slideToggle();
content.slideToggle();
footer.slideToggle();
button.toggleClass('far fa-chevron-up').toggleClass('far fa-chevron-down');
button1.toggleClass('far fa-chevron-up').toggleClass('far fa-chevron-down');
ibox.toggleClass('').toggleClass('border-bottom');
setTimeout(function () {
ibox.resize();
ibox.find('[id^=map-]').resize();
}, 50);
}
/**
* เซ็ต action delete สำหรับส่ง post ไป api
* @param {?} idList id ที่ลบ
* @param {?} dataList array data ที่ต้องการจัดการ
* @return {?}
*/
fnFlagDelete(idList, dataList) {
/** @type {?} */
let resultList = [];
for (let indexDs = 0; indexDs < dataList.length; indexDs++) {
/** @type {?} */
const obj = dataList[indexDs];
/** @type {?} */
const id = _.find(idList, value => value === obj.id);
if (obj.id != id) {
resultList.push(obj);
}
}
return resultList;
}
/**
* เซ็ต action edit สำหรับส่ง post ไป api
* @param {?} dataList array data ที่ต้องการจัดการ
* @return {?}
*/
fnFlagEdit(dataList) {
/** @type {?} */
let resultList = [];
for (let index = 0; index < dataList.length; index++) {
/** @type {?} */
let obj = dataList[index];
if (obj.id > 0) {
obj.action = 'edit';
}
resultList.push(obj);
}
return resultList;
}
/**
* เซ็ตค่าเมื่อกด edit
* @param {?} dataList array data ที่ต้องการจัดการ
* @param {?} data data ของ row ปัจจุบัน หรือ data ที่ต้องการเอาค่าไปอัพเดตให้ array data
* @return {?}
*/
fnSetValueEdit(dataList, data) {
for (let index = 0; index < dataList.length; index++) {
/** @type {?} */
let obj = dataList[index];
if (obj.id === data.id) {
dataList[index] = data;
}
}
return dataList;
}
/**
* ลบ id ชั่วคราวที่สร้างขึ้นมาใช้สำหรับ datagrid
* @param {?} dataList array data ที่ต้องการจัดการ
* @return {?}
*/
fnRemoveFakeId(dataList) {
/** @type {?} */
let resultList = [];
for (let index = 0; index < dataList.length; index++) {
/** @type {?} */
let obj = dataList[index];
if (obj.id < 0) {
delete obj.id;
}
resultList.push(obj);
}
return resultList;
}
/**
* check response และแสดง modal ตาม result code
* @param {?} response data ที่ส่งมาจาก api
* @param {?} modal modal ที่ผูกกับ UI นั้น ๆ
* @return {?}
*/
fnCheckResponse(response, modal) {
if (+response.resultCode === 20000) {
/** @type {?} */
const dataAlert = {
'modalId': 'myModalSuccess',
'userTitle': 'Success',
'userMessage': 'ดำเนินการสำเร็จ'
};
modal.openModal(dataAlert);
}
else {
/** @type {?} */
const dataAlert = {
'modalId': 'myModalError',
'userTitle': 'Error',
'userMessage': 'ดำเนินการไม่สำเร็จ'
};
modal.openModal(dataAlert);
}
}
/**
* fn จัดการ action ของ data CRUD
* @param {?} a datalist ที่เก็บไว้ตอน Get
* @param {?} b datalist ปัจจุบันที่เปลี่ยนแปลง
* @param {?=} idName key key หลักที่ต้องการใช้เปรียบเทียบ
* @return {?}
*/
fnBuildArrayAction(a, b, idName = 'id') {
/** @type {?} */
const aClone = _.cloneDeep(a);
/** @type {?} */
const bClone = _.cloneDeep(b);
/** @type {?} */
const deleted_added = _.xorBy(aClone, bClone, idName);
/** @type {?} */
const deleted = _.filter(deleted_added, (o) => o[idName] > 0);
/** @type {?} */
const combine = _.unionBy(deleted, bClone, idName);
// console.log('combine', combine);
// console.log('----');
for (let item of combine) {
if (_.includes(deleted_added, item)) {
if (item[idName] < 0) {
item['action'] = 'add';
}
else {
for (let field in item) {
if (field !== idName) {
delete item[field];
}
}
item.action = "delete";
}
}
else {
item['action'] = 'edit';
}
if (item.row_number) {
delete item['row_number'];
}
}
return combine;
}
/**
* fn ปั้นข้อความหัว Table
* @param {?} result ผลลัพ data ที่ได้จาก custom store
* @return {?}
*/
fnGenTextTotal(result) {
/** @type {?} */
const resultCount = result.data.length || 0;
/** @type {?} */
const totalCount = result.totalCount || 0;
/** @type {?} */
let textTotal = `ผลลัพธ์ ${resultCount} รายการ จากทั้งหมด ${totalCount} รายการ`;
return textTotal;
}
/**
* fn ปั้นข้อความหัว Table สำหรับ datasource แบบ get ครั้งเดียว
* @param {?} event event ที่ได้จาก event onOptionChanged
* @return {?}
*/
fnGenTextTotalRaw(event) {
/** @type {?} */
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (event.name === 'paging' || event.name === 'dataSource') {
/** @type {?} */
const getVisibleRows = event.component ? event.component.getVisibleRows() : [];
/** @type {?} */
const totalCount = event.component ? event.component.totalCount() : 0;
/** @type {?} */
const resultCount = getVisibleRows.length || 0;
resolve(`ผลลัพธ์ ${resultCount} รายการ จากทั้งหมด ${totalCount} รายการ`);
}
}, 100);
});
return promise;
}
/**
* fn เปลี่ยน calendar devextreme ให้ปี เป็นแบบ พ.ศ.
* @return {?}
*/
fnChangeCalendarYear() {
try {
/** @type {?} */
const yearRegex = /^[0-9]{4}-[0-9]{4}$/g;
/** @type {?} */
const yearRegex2 = /^[0-9]{4}\s-\s[0-9]{4}$/g;
/** @type {?} */
const btnList = document.querySelectorAll('.dx-popup-content .dx-calendar');
for (let indexBtn = 0; indexBtn < btnList.length; indexBtn++) {
/** @type {?} */
const btn = btnList[indexBtn];
btn.removeEventListener('click', (e) => { });
btn.addEventListener('click', () => {
/** *
* เปลี่ยนปีในส่วนของ cell ด้านใน
@type {?} */
const dxCalendarCell = document.querySelectorAll('.dx-calendar-cell');
for (let index = 0; index < dxCalendarCell.length; index++) {
/** @type {?} */
const cell = dxCalendarCell[index];
/** @type {?} */
const text = cell.getAttribute('aria-label');
/** @type {?} */
let num = parseInt(text);
if (text.length === 4 && num !== NaN) {
/** @type {?} */
let num2 = num + 543;
cell.textContent = num2.toString();
}
else if (text.match(yearRegex2)) {
/** @type {?} */
const arr = text.split('-');
/** @type {?} */
const year1 = parseInt(arr[0]);
/** @type {?} */
const year2 = parseInt(arr[1]);
/** @type {?} */
const str = (year1 + 543).toString() + '-' + (year2 + 543).toString();
cell.textContent = str;
}
}
/** *
* เปลี่ยนปีในส่วนของ nav ด้านบน
@type {?} */
const dxCalendarTop = document.querySelectorAll('.dx-calendar-caption-button');
for (let indexTop = 0; indexTop < dxCalendarTop.length; indexTop++) {
/** @type {?} */
const cell = dxCalendarTop[indexTop];
/** @type {?} */
const text = cell.getAttribute('aria-label');
/** @type {?} */
let num = parseInt(text);
if (text.length === 4 && num !== NaN) {
/** @type {?} */
let num2 = num + 543;
/** @type {?} */
let fisrt = cell.children;
/** @type {?} */
let target = fisrt.item(0).children;
target.item(0).textContent = num2.toString();
}
else if (text.match(yearRegex)) {
/** @type {?} */
const arr = text.split('-');
/** @type {?} */
const year1 = parseInt(arr[0]);
/** @type {?} */
const year2 = parseInt(arr[1]);
/** @type {?} */
const str = (year1 + 543).toString() + '-' + (year2 + 543).toString();
/** @type {?} */
let fisrt = cell.children;
/** @type {?} */
let target = fisrt.item(0).children;
target.item(0).textContent = str;
}
}
});
}
}
catch (error) {
console.log("fnChangeCalendarYear -> error", error);
}
}
/**
* @return {?}
*/
fnChangeCalendarYearOnce() {
try {
/** @type {?} */
const yearRegex = /^[0-9]{4}-[0-9]{4}$/g;
/** *
* เปลี่ยนปีในส่วนของ cell ด้านใน
@type {?} */
const dxCalendarCell = document.querySelectorAll('.dx-calendar-cell');
for (let index = 0; index < dxCalendarCell.length; index++) {
/** @type {?} */
const cell = dxCalendarCell[index];
/** @type {?} */
const text = cell.getAttribute('aria-label');
/** @type {?} */
let num = parseInt(text);
if (text.length === 4 && num !== NaN) {
/** @type {?} */
let num2 = num + 543;
cell.textContent = num2.toString();
}
}
/** *
* เปลี่ยนปีในส่วนของ nav ด้านบน
@type {?} */
const dxCalendarTop = document.querySelectorAll('.dx-calendar-caption-button');
for (let indexTop = 0; indexTop < dxCalendarTop.length; indexTop++) {
/** @type {?} */
const cell = dxCalendarTop[indexTop];
/** @type {?} */
const text = cell.getAttribute('aria-label');
/** @type {?} */
let num = parseInt(text);
if (text.length === 4 && num !== NaN) {
/** @type {?} */
let num2 = num + 543;
/** @type {?} */
let fisrt = cell.children;
/** @type {?} */
let target = fisrt.item(0).children;
target.item(0).textContent = num2.toString();
}
else if (text.match(yearRegex)) {
/** @type {?} */
const arr = text.split('-');
/** @type {?} */
const year1 = parseInt(arr[0]);
/** @type {?} */
const year2 = parseInt(arr[1]);
/** @type {?} */
const str = (year1 + 543).toString() + '-' + (year2 + 543).toString();
/** @type {?} */
let fisrt = cell.children;
/** @type {?} */
let target = fisrt.item(0).children;
target.item(0).textContent = str;
}
}
}
catch (error) {
console.log("fnChangeCalendarYear -> error", error);
}
}
/**
* @return {?}
*/
fnGenUuid() {
return UUID.UUID();
}
/**
* fn แปลง date ก่อนส่งไปให้ API
* @param {?} dataList data ที่ต้องการจัดการหรือ model ที่ผูก
* @param {?} fieldList list รายชื่อ field ที่ต้องการแปลง date
* @return {?}
*/
fnFormatDateList(dataList, fieldList) {
/** @type {?} */
const cloneDataList = _.cloneDeep(dataList);
for (let index = 0; index < fieldList.length; index++) {
/** @type {?} */
const field = fieldList[index];
if (cloneDataList[field]) {
cloneDataList[field] = moment(cloneDataList[field]).format(this.DATE_FORMAT);
}
}
return cloneDataList;
}
/**
* fn. แปลง string date จาก db เป็น วัน เวลา ประเทศไทย
* @param {?} value String date ที่ต้องการแปลง
* @return {?}
*/
fnDisplayFormatDate(value) {
/** @type {?} */
let dateString = formatDate(value, "shortDate");
/** @type {?} */
let timeString = formatDate(value, "HH:mm:ss");
return dateString + ' ' + timeString;
}
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
replacer(key, value) {
// Filtering out properties
// console.log("key",key);
// console.log("value",value);
// console.log("type",typeof value);
// const type = typeof value;
// switch (type) {
// case 'string':
// return value.trim();
// case 'Date':
// return moment(value).format('YYYY-MM-dd HH:mm:ss');
// default:
// }
if (typeof value === "string") {
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) {
return moment(value).format('YYYY-MM-DD HH:mm:ss');
}
else {
return value.trim();
}
}
return value;
}
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
replacernotrim(key, value) {
// Filtering out properties
// console.log("key",key);
// console.log("value",value);
// console.log("type",typeof value);
// const type = typeof value;
// switch (type) {
// case 'string':
// return value.trim();
// case 'Date':
// return moment(value).format('YYYY-MM-dd HH:mm:ss');
// default:
// }
if (typeof value === "string") {
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) {
return moment(value).format('YYYY-MM-DD HH:mm:ss');
}
else {
return value;
}
}
return value;
}
/**
* @param {?} date
* @return {?}
*/
convertTHShortDate(date) {
date = moment(date);
/** @type {?} */
let iMonth = parseInt(moment(date).format('MM'));
/** @type {?} */
let iYear = moment(date).format('YYYY');
iYear = iYear.substr(2, 4);
/** @type {?} */
let thShortMonth = ['', 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'];
return this.NumberToThaiNumber(date.format('DD')) + ' ' + thShortMonth[iMonth] + ' ' + this.NumberToThaiNumber(iYear);
}
;
/**
* @param {?} Number
* @return {?}
*/
NumberToThaiNumber(Number) {
Number = Number.toString();
Number = Number.replace(/0/gi, '๐');
Number = Number.replace(/1/gi, '๑');
Number = Number.replace(/2/gi, '๒');
Number = Number.replace(/3/gi, '๓');
Number = Number.replace(/4/gi, '๔');
Number = Number.replace(/5/gi, '๕');
Number = Number.replace(/6/gi, '๖');
Number = Number.replace(/7/gi, '๗');
Number = Number.replace(/8/gi, '๘');
Number = Number.replace(/9/gi, '๙');
return Number;
}
/**
* @param {?} month
* @param {?} short
* @return {?}
*/
fnGetMonthTH(month, short) {
month = month - 1;
/** @type {?} */
let thMonth = ["มกราคม", "กุมภาพันธ์", "มีนาคม",
"เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน",
"ตุลาคม", "พฤศจิกายน", "ธันวาคม"];
/** @type {?} */
let thShortMonth = ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."];
return short === true ? thShortMonth[month] : thMonth[month];
}
;
/**
* @param {?} date
* @param {?} format
* @param {?} typeTH
* @return {?}
*/
convertTHDate(date, format, typeTH) {
moment.locale('th');
console.log(moment(date).add(543, "years").format("DD MMMM YYYY"));
if (typeTH) {
return this.NumberToThaiNumber(moment(date).add(543, "years").format(format));
}
else {
return moment(date).add(543, "years").format(format);
}
}
;
}
Common.decorators = [
{ type: Injectable }
];
/** @nocollapse */
Common.ctorParameters = () => [];
if (false) {
/** @type {?} */
Common.prototype.DATE_FORMAT;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUk3QyxPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8saUJBQWlCLENBQUM7O0FBRXpCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUdiLE1BQU07SUFFSjsyQkFEYyxxQkFBcUI7UUFFakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0tBQzFDOzs7Ozs7SUFNRCxVQUFVLENBQUMsSUFBSTs7UUFDYixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7O1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFDOztRQUV6QixRQUFRLElBQUksRUFBRTs7WUFFWixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDO2lCQUNsQjtxQkFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtvQkFDekMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtB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QU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFHLE1BQU0sRUFBQztZQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2hGO2FBQUk7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RDtLQUNKO0lBQUEsQ0FBQzs7O1lBOXNCSCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgaXMgZnJvbSAnaXNfanMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBsb2FkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMnO1xuaW1wb3J0IHsgR2VuRmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL21vZGVsL2dlbi1maWx0ZXItb3B0aW9ucyc7XG5pbXBvcnQgeyBHZW5GaWx0ZXIgfSBmcm9tICcuLi9tb2RlbC9nZW4tZmlsdGVyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LWVzNic7XG5kZWNsYXJlIHZhciAkOiBhbnk7XG5pbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSBcImRldmV4dHJlbWUvbG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSAnYW5ndWxhcjItdXVpZCc7XG5pbXBvcnQgeyBsb2NhbGUgfSBmcm9tICdkZXZleHRyZW1lL2xvY2FsaXphdGlvbic7IC8vICMgQ2FsZW5kYXIgVEhcbmltcG9ydCAnZGV2ZXh0cmVtZS1pbnRsJztcbi8vICMgQ2FsZW5kYXIgVEhcbmxvY2FsZSgndGgnKTsvLyAjIENhbGVuZGFyIFRIXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21tb24ge1xuICBEQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREIEhIOm1tOnNzJztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc29sZS5sb2coXCJsaWIgY29tbW9uIHZlcnNpb24gMS4xMS4yMVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIGZuLiDguYDguIrguYfguIQgZGF0YSDguJfguLjguIHguJvguKPguLDguYDguKDguJcg4LiI4LiwIFJldHVybiDguIHguKXguLHguJrguYTguJvguYDguJvguYfguJkgdHJ1ZXxmYWxzZVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgaXNOb3RFbXB0eShkYXRhKSB7XG4gICAgbGV0IGhhdmVEYXRhID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhO1xuICAgIC8vIC8vY29uc29sZS50YWcoJ3R5cGU6JykubG9nKHR5cGUpXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAvLyBhcnJheXxvYmplY3RcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICghZGF0YSB8fCBkYXRhID09IG51bGwpIHtcbiAgICAgICAgICBoYXZlRGF0YSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhWzBdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGhhdmVEYXRhID0gZGF0YS5sZW5ndGggIT09IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICBoYXZlRGF0YSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGF2ZURhdGEgPSBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzdHJpbmdcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaGF2ZURhdGEgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbnVtYmVyXG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgLy8gYm9vbGVhblxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAvLyBmdW5jdGlvblxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICBoYXZlRGF0YSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaGF2ZURhdGEgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBoYXZlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmbi4g4Lib4Lix4LmJ4LiZIGZpbHRlciDguKrguLPguKvguKPguLHguJogQ3VzdG9tIFN0b3JlIOC5geC4muC4muC4oeC4tSBmaWVsZCxmaWx0ZXIsb3JkZXJieVxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyA6IHt9XG4gICAqL1xuICBmbkdlbkZpbHRlcihmaWx0ZXJPcHRpb25zOiBHZW5GaWx0ZXIpIHtcbiAgICAvLyAgLy8gY2hlY2sgdmFsdWVcbiAgICBjb25zdCBsb2FkT3B0aW9ucyA9IGZpbHRlck9wdGlvbnMubG9hZE9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmlsdGVyTGlzdCA9IGZpbHRlck9wdGlvbnMuZmlsdGVyTGlzdCB8fCB7fTtcbiAgICBjb25zdCBleGNlcHRpb25MaXN0ID0gZmlsdGVyT3B0aW9ucy5leGNlcHRpb25MaXN0IHx8IFtdO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zLm9wdGlvbnMgfHwge307XG4gICAgLy8gRE9cbiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAvLyDguYDguIrguYfguIQgbG9hZE9wdGlvbnNcbiAgICAgIGNvbnN0IGRhdGExID0gdGhpcy5mbkNoZWNrTG9hZE9wdGlvbnMobG9hZE9wdGlvbnMpO1xuICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhMSk7XG4gICAgICAvLyDguYDguIrguYfguIQgRmlsdGVyXG4gICAgICBjb25zdCBkYXRhMiA9IHRoaXMuZm5DaGVja0ZpbHRlckRhdGEoZmlsdGVyTGlzdCxleGNlcHRpb25MaXN0KTtcbiAgICAgIG9ic2VydmVyLm5leHQoZGF0YTIpO1xuICAgICAgLy8g4LmA4LiK4LmH4LiE4Lin4LmI4Liy4Lih4Li1IG9wdGlvbnMg4Lit4Liw4LmE4Lij4Lia4LmJ4Liy4LiH4LmB4Lil4Liw4LmB4LiB4LmJIGRhdGEg4LiV4Liy4LihIG9wdGlvbnMg4LiZ4Lix4LmJ4LiZXG4gICAgICBjb25zdCBkYXRhMyA9IHRoaXMuZm5DaGVja09wdGlvbnMoZGF0YTEsIGRhdGEyLCBvcHRpb25zKTtcbiAgICAgIG9ic2VydmVyLm5leHQoZGF0YTMpO1xuICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgICAvLyBUSEVOXG4gICAgbGV0IG9iaiA9IHt9O1xuICAgIGNvbnN0IG9ic2VydmVyU3RlcCA9IHtcbiAgICAgIG5leHQ6IGRhdGEgPT4gKG9iaiA9IGRhdGEpLFxuICAgICAgZXJyb3I6IGVyciA9PiBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBnb3QgYW4gZXJyb3I6ICcgKyBlcnIpLFxuICAgICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdvYmogOicsIG9iailcbiAgICB9O1xuICAgIGZpbHRlci5zdWJzY3JpYmUob2JzZXJ2ZXJTdGVwKTtcbiAgICAvLyByZXR1cm4gZmlsdGVyIOC4geC4peC4seC4muC5hOC4m1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBmbkNoZWNrTG9hZE9wdGlvbnMobG9hZE9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbGltaXQ6ICcnLFxuICAgICAgb2Zmc2V0OiAnJyxcbiAgICAgIG9yZGVyX2J5OiBbXVxuICAgIH07XG4gICAgaWYgKHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMub2Zmc2V0ID0gdGhpcy5pc05vdEVtcHR5KGxvYWRPcHRpb25zLnNraXApXG4gICAgICAgID8gbG9hZE9wdGlvbnMuc2tpcFxuICAgICAgICA6ICcnO1xuICAgICAgb3B0aW9ucy5saW1pdCA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy50YWtlKSA/IGxvYWRPcHRpb25zLnRha2UgOiAnJztcbiAgICAgIGlmICh0aGlzLmlzTm90RW1wdHkobG9hZE9wdGlvbnMuc29ydCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLigItDb21tb24gLT4gZm5DaGVja0xvYWRPcHRpb25zIC0+IGxvYWRPcHRpb25zLnNvcnRcIiwgbG9hZE9wdGlvbnMuc29ydClcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxvYWRPcHRpb25zLnNvcnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgY29uc3Qgc29ydCA9IGxvYWRPcHRpb25zLnNvcnRbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IG9yZGVyYnlTZWxlY3RvciA9IHNvcnQuc2VsZWN0b3IgfHwgJyc7XG4gICAgICAgICAgaWYgKG9yZGVyYnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgaWYgKHNvcnQuZGVzYykge1xuICAgICAgICAgICAgICBvcHRpb25zLm9yZGVyX2J5LnB1c2gob3JkZXJieVNlbGVjdG9yICsgJyBkZXNjJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcHRpb25zLm9yZGVyX2J5LnB1c2gob3JkZXJieVNlbGVjdG9yICsgJyBhc2MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9wdGlvbnMub3JkZXJieSA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy5zb3J0KSA/IGxvYWRPcHRpb25zLnNvcnRbMF0uc2VsZWN0b3IgOiAnJztcbiAgICAgIC8vIG9wdGlvbnMub3JkZXJieSA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy5zb3J0KSAmJiBsb2FkT3B0aW9ucy5zb3J0WzBdLmRlc2MgPyBvcHRpb25zLm9yZGVyYnkgKyAnfERFU0MnIDogb3B0aW9ucy5vcmRlcmJ5ICsgJ3xBU0MnO1xuICAgIH1cbiAgICB0aGlzLmZuUmVtb3ZlRW1wdHlLZXkob3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBmbkNoZWNrRmlsdGVyRGF0YShmaWx0ZXJMaXN0LGV4Y2VwdGlvbkxpc3QpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICBmaWVsZHM6ICcnLFxuICAgICAgZmlsdGVyOiAnJyxcbiAgICAgIG9mZnNldDogJycsXG4gICAgICBsaW1pdDogJycsXG4gICAgICBvcmRlcmJ5OiAnJ1xuICAgIH07XG4gICAgaWYgKHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0KSkge1xuICAgICAgZmlsdGVyLmZpZWxkcyA9IHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0LmZpZWxkcylcbiAgICAgICAgPyBmaWx0ZXJMaXN0LmZpZWxkc1xuICAgICAgICA6ICcnO1xuICAgICAgaWYgKGZpbHRlckxpc3QuZmlsdGVyKSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXIgPSB0aGlzLmZuQ29udmVyc3RGaWx0ZXJEYXRlKGZpbHRlckxpc3QuZmlsdGVyLGV4Y2VwdGlvbkxpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyLmZpbHRlciA9ICcnXG4gICAgICB9XG4gICAgICAvLyBmaWx0ZXIuZmlsdGVyID0gdGhpcy5pc05vdEVtcHR5KGZpbHRlckxpc3QuZmlsdGVyKVxuICAgICAgLy8gICA/IGZpbHRlckxpc3QuZmlsdGVyXG4gICAgICAvLyAgIDogJyc7XG4gICAgICBmaWx0ZXIub2Zmc2V0ID0gdGhpcy5pc05vdEVtcHR5KGZpbHRlckxpc3Qub2Zmc2V0KVxuICAgICAgICA/IGZpbHRlckxpc3Qub2Zmc2V0XG4gICAgICAgIDogJyc7XG4gICAgICBmaWx0ZXIubGltaXQgPSB0aGlzLmlzTm90RW1wdHkoZmlsdGVyTGlzdC5saW1pdCkgPyBmaWx0ZXJMaXN0LmxpbWl0IDogJyc7XG4gICAgICBmaWx0ZXIub3JkZXJieSA9IHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0Lm9yZGVyYnkpXG4gICAgICAgID8gZmlsdGVyTGlzdC5vcmRlcmJ5XG4gICAgICAgIDogJyc7XG4gICAgfVxuICAgIHRoaXMuZm5SZW1vdmVFbXB0eUtleShmaWx0ZXIpO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBmbkNoZWNrT3B0aW9ucyhkYXRhMSwgZGF0YTIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBtZXJnZURhdGEgPSBfLm1lcmdlKGRhdGExLCBkYXRhMik7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVtb3ZlRmlsdGVyRW1wdHkgPSBvcHRpb25zLnJlbW92ZUZpbHRlckVtcHR5IHx8IGZhbHNlOyAvLyBpZiBlbXB0eSBzdHJpbmcgd2lsbCByZW1vdmUgcGFyYW1ldGVyXG4gICAgaWYgKHJlbW92ZUZpbHRlckVtcHR5KSB7XG4gICAgICBtZXJnZURhdGEuZmlsdGVyID0gdGhpcy5mblJlbW92ZUVtcHR5S2V5KG1lcmdlRGF0YS5maWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VEYXRhO1xuICB9XG5cbiAgZm5SZW1vdmVFbXB0eUtleShvYmopIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmICghdGhpcy5pc05vdEVtcHR5KG9ialtrZXldKSkge1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3Qob2JqW2tleV0pKSB7XG4gICAgICAgIG9ialtrZXldID0gdGhpcy5mblJlbW92ZUVtcHR5S2V5KG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZuQ29udmVyc3RGaWx0ZXJEYXRlKGZpbHRlcixleGNlcHRpb25MaXN0KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmlsdGVyKSB7XG4gICAgICBsZXQgZWxlbWVudCA9IGZpbHRlcltrZXldO1xuICAgICAgaWYgKF8uaXNPYmplY3QoZWxlbWVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYXRlS2V5IGluIGVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudFtkYXRlS2V5XSAmJiAoZGF0ZUtleSA9PT0gJ2Zyb20nIHx8IGRhdGVLZXkgPT09ICd0bycpKSB7XG4gICAgICAgICAgICBpZihleGNlcHRpb25MaXN0LmluY2x1ZGVzKGtleSkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbZGF0ZUtleV0gPSBtb21lbnQoZWxlbWVudFtkYXRlS2V5XSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgaWYoZGF0ZUtleSA9PT0gJ2Zyb20nKXtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRbZGF0ZUtleV0gPSBtb21lbnQoZWxlbWVudFtkYXRlS2V5XSkuZm9ybWF0KCdZWVlZLU1NLUREIDAwOjAwOjAwJyk7XG4gICAgICAgICAgICAgIH1lbHNlIGlmKGRhdGVLZXkgPT09ICd0bycpe1xuICAgICAgICAgICAgICAgICAgZWxlbWVudFtkYXRlS2V5XSA9IG1vbWVudChlbGVtZW50W2RhdGVLZXldKS5mb3JtYXQoJ1lZWVktTU0tREQgMjM6NTk6NTknKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIGZuLiDguJvguLHguYnguJkgZmlsdGVyIOC4quC4s+C4q+C4o+C4seC4miBDdXN0b20gU3RvcmUg4LmB4Lia4LiaIGJhc2ljXG4gICAqIEBwYXJhbSBsb2FkT3B0aW9uc1xuICAgKi9cbiAgZm5HZW5GaWx0ZXJCYXNpYyhsb2FkT3B0aW9uczogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ+KAi0NvbW1vbiAtPiBmbkdlbkZpbHRlckJhc2ljIC0+IGxvYWRPcHRpb25zJywgbG9hZE9wdGlvbnMpO1xuICAgIGxldCBwYXJhbXMgPSAnPyc7XG4gICAgcGFyYW1zICs9ICdza2lwPScgKyBsb2FkT3B0aW9ucy5za2lwIHx8IDA7XG4gICAgcGFyYW1zICs9ICcmdGFrZT0nICsgbG9hZE9wdGlvbnMudGFrZSB8fCAxMDtcbiAgICBpZiAobG9hZE9wdGlvbnMuc29ydCkge1xuICAgICAgcGFyYW1zICs9ICcmb3JkZXJieT0nICsgbG9hZE9wdGlvbnMuc29ydFswXS5zZWxlY3RvcjtcbiAgICAgIGlmIChsb2FkT3B0aW9ucy5zb3J0WzBdLmRlc2MpIHtcbiAgICAgICAgcGFyYW1zICs9ICcgZGVzYyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbiAgLyoqXG4gICAqIOC5geC4m+C4peC4h+C4p+C4seC4meC4l+C4teC5iCDguIjguLLguIEgU3RyaW5nIOC5gOC4m+C5h+C4mSBUeXBlIERhdGVcbiAgICogQHBhcmFtIGRhdGUg4Lin4Lix4LiZ4LiX4Li14LmIIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4m+C4peC4h1xuICAgKiBAcGFyYW0gZm9ybWF0T2ZEYXRlIOC4luC5ieC4suC4o+C4ueC5iSBmb3JtYXQg4LiC4Lit4LiHIGRhdGUg4LiX4Li14LmI4Liq4LmI4LiH4LmA4LiC4LmJ4Liy4Lih4Liy4LmD4Lir4LmJ4Lij4Liw4Lia4Li44LiU4LmJ4Lin4LiiXG4gICAqL1xuICBmblRvRGF0ZShkYXRlLCBmb3JtYXRPZkRhdGU/KSB7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIGlmIChmb3JtYXRPZkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlLCBmb3JtYXRPZkRhdGUpLnRvRGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS50b0RhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDguYHguJvguKXguIfguKfguLHguJnguJfguLXguYgg4LiI4Liy4LiBIFN0cmluZyDguYDguJvguYfguJkgVHlwZSBEYXRlIOC5guC4lOC4ouC4oeC4teC4reC4tOC4hyBmb3JtYXQg4LiI4Liy4LiBIERCICdZWVlZLU1NLUREJ1xuICAgKiBAcGFyYW0gZGF0ZSDguKfguLHguJnguJfguLXguYgg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Lib4Lil4LiHXG4gICAqL1xuICBmbkxUb0RhdGVGcm9tREIoZGF0ZSkge1xuICAgIHJldHVybiBtb21lbnQoZGF0ZSwgJ1lZWVktTU0tREQnKS50b0RhdGUoKTtcbiAgfVxuICAvKipcbiAgICog4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Lig4Liy4Lip4LiyIERhdGUgUGlja2VyIOC4guC4reC4hyBQcmltZSBOR1xuICAgKiBAcGFyYW0gbG9jYWwg4Lig4Liy4Lip4LiyXG4gICAqL1xuICBmbkxvY2FsUENhbGVuZGFyKGxvY2FsKSB7XG4gICAgc3dpdGNoIChsb2NhbCkge1xuICAgICAgY2FzZSAndGgnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrOiAxLFxuICAgICAgICAgIGRheU5hbWVzOiBbXG4gICAgICAgICAgICAn4Lit4Liy4LiX4Li04LiV4Lii4LmMJyxcbiAgICAgICAgICAgICfguIjguLHguJnguJfguKPguYwnLFxuICAgICAgICAgICAgJ+C4reC4seC4h+C4hOC4suC4oycsXG4gICAgICAgICAgICAn4Lie4Li44LiYJyxcbiAgICAgICAgICAgICfguJ7guKTguKvguLHguKonLFxuICAgICAgICAgICAgJ+C4qOC4uOC4geC4o+C5jCcsXG4gICAgICAgICAgICAn4LmA4Liq4Liy4Lij4LmMJ1xuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF5TmFtZXNTaG9ydDogWyfguK3guLInLCAn4LiIJywgJ+C4rScsICfguJ4nLCAn4Lie4LikJywgJ+C4qCcsICfguKonXSxcbiAgICAgICAgICBkYXlOYW1lc01pbjogWyfguK3guLInLCAn4LiIJywgJ+C4rScsICfguJ4nLCAn4Lie4LikJywgJ+C4qCcsICfguKonXSxcbiAgICAgICAgICBtb250aE5hbWVzOiBbXG4gICAgICAgICAgICAn4Lih4LiB4Lij4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguIHguLjguKHguKDguLLguJ7guLHguJnguJjguYwnLFxuICAgICAgICAgICAgJ+C4oeC4teC4meC4suC4hOC4oScsXG4gICAgICAgICAgICAn4LmA4Lih4Lip4Liy4Lii4LiZJyxcbiAgICAgICAgICAgICfguJ7guKTguKnguKDguLLguITguKEnLFxuICAgICAgICAgICAgJ+C4oeC4tOC4luC4uOC4meC4suC4ouC4mScsXG4gICAgICAgICAgICAn4LiB4Lij4LiB4LiO4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguKrguLTguIfguKvguLLguITguKEnLFxuICAgICAgICAgICAgJ+C4geC4seC4meC4ouC4suC4ouC4mScsXG4gICAgICAgICAgICAn4LiV4Li44Lil4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguJ7guKTguKjguIjguLTguIHguLLguKLguJknLFxuICAgICAgICAgICAgJ+C4mOC4seC4meC4p+C4suC4hOC4oSdcbiAgICAgICAgICBdLFxuICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogW1xuICAgICAgICAgICAgJ+C4oS7guIQuJyxcbiAgICAgICAgICAgICfguIEu4LieLicsXG4gICAgICAgICAgICAn4Lih4Li1LuC4hC4nLFxuICAgICAgICAgICAgJ+C5gOC4oS7guKIuJyxcbiAgICAgICAgICAgICfguJ4u4LiELicsXG4gICAgICAgICAgICAn4Lih4Li0LuC4oi4nLFxuICAgICAgICAgICAgJ+C4gS7guIQuJyxcbiAgICAgICAgICAgICfguKou4LiELicsXG4gICAgICAgICAgICAn4LiBLuC4oi4nLFxuICAgICAgICAgICAgJ+C4lS7guIQuJyxcbiAgICAgICAgICAgICfguJ4u4LiiLicsXG4gICAgICAgICAgICAn4LiYLuC4hC4nXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b2RheTogJ+C4p+C4seC4meC4meC4teC5iScsXG4gICAgICAgICAgY2xlYXI6ICfguYDguITguKXguLXguKInXG4gICAgICAgIH07XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmlyc3REYXlPZldlZWs6IDAsXG4gICAgICAgICAgZGF5TmFtZXM6IFtcbiAgICAgICAgICAgICdTdW5kYXknLFxuICAgICAgICAgICAgJ01vbmRheScsXG4gICAgICAgICAgICAnVHVlc2RheScsXG4gICAgICAgICAgICAnV2VkbmVzZGF5JyxcbiAgICAgICAgICAgICdUaHVyc2RheScsXG4gICAgICAgICAgICAnRnJpZGF5JyxcbiAgICAgICAgICAgICdTYXR1cmRheSdcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgICAgICAgZGF5TmFtZXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICAgICAgICBtb250aE5hbWVzOiBbXG4gICAgICAgICAgICAnSmFudWFyeScsXG4gICAgICAgICAgICAnRmVicnVhcnknLFxuICAgICAgICAgICAgJ01hcmNoJyxcbiAgICAgICAgICAgICdBcHJpbCcsXG4gICAgICAgICAgICAnTWF5JyxcbiAgICAgICAgICAgICdKdW5lJyxcbiAgICAgICAgICAgICdKdWx5JyxcbiAgICAgICAgICAgICdBdWd1c3QnLFxuICAgICAgICAgICAgJ1NlcHRlbWJlcicsXG4gICAgICAgICAgICAnT2N0b2JlcicsXG4gICAgICAgICAgICAnTm92ZW1iZXInLFxuICAgICAgICAgICAgJ0RlY2VtYmVyJ1xuICAgICAgICAgIF0sXG4gICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbXG4gICAgICAgICAgICAnSmFuJyxcbiAgICAgICAgICAgICdGZWInLFxuICAgICAgICAgICAgJ01hcicsXG4gICAgICAgICAgICAnQXByJyxcbiAgICAgICAgICAgICdNYXknLFxuICAgICAgICAgICAgJ0p1bicsXG4gICAgICAgICAgICAnSnVsJyxcbiAgICAgICAgICAgICdBdWcnLFxuICAgICAgICAgICAgJ1NlcCcsXG4gICAgICAgICAgICAnT2N0JyxcbiAgICAgICAgICAgICdOb3YnLFxuICAgICAgICAgICAgJ0RlYydcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvZGF5OiAnVG9kYXknLFxuICAgICAgICAgIGNsZWFyOiAnQ2xlYXInXG4gICAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbGxhcHNlRm4oaWQpIHtcbiAgICBjb25zdCBpYm94ID0gJCgnIycgKyBpZCArICcgZGl2LmNvbGxhcHNlLWxpbmsnKS5jbG9zZXN0KCdkaXYuaWJveCcpO1xuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJyMnICsgaWQgKyAnIGRpdi5jb2xsYXBzZS1saW5rJykuZmluZCgnaScpO1xuICAgIGNvbnN0IGJ1dHRvbjEgPSAkKCcjJyArIGlkICsgJyBkaXYuY29sbGFwc2UtbGluaycpLmZpbmQoJ3N2ZycpO1xuICAgIGNvbnN0IGJvZHkgPSBpYm94LmZpbmQoJ2Rpdi5pYm94LWJvZHknKTtcbiAgICBjb25zdCBjb250ZW50ID0gaWJveC5maW5kKCdkaXYuaWJveC1jb250ZW50Jyk7XG4gICAgY29uc3QgZm9vdGVyID0gaWJveC5maW5kKCdkaXYuaWJveC1mb290ZXInKTtcbiAgICBib2R5LnNsaWRlVG9nZ2xlKCk7XG4gICAgY29udGVudC5zbGlkZVRvZ2dsZSgpO1xuICAgIGZvb3Rlci5zbGlkZVRvZ2dsZSgpO1xuICAgIGJ1dHRvbi50b2dnbGVDbGFzcygnZmFyIGZhLWNoZXZyb24tdXAnKS50b2dnbGVDbGFzcygnZmFyIGZhLWNoZXZyb24tZG93bicpO1xuICAgIGJ1dHRvbjEudG9nZ2xlQ2xhc3MoJ2ZhciBmYS1jaGV2cm9uLXVwJykudG9nZ2xlQ2xhc3MoJ2ZhciBmYS1jaGV2cm9uLWRvd24nKTtcbiAgICBpYm94LnRvZ2dsZUNsYXNzKCcnKS50b2dnbGVDbGFzcygnYm9yZGVyLWJvdHRvbScpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWJveC5yZXNpemUoKTtcbiAgICAgIGlib3guZmluZCgnW2lkXj1tYXAtXScpLnJlc2l6ZSgpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguYDguIvguYfguJUgYWN0aW9uIGRlbGV0ZSDguKrguLPguKvguKPguLHguJrguKrguYjguIcgcG9zdCDguYTguJsgYXBpXG4gICAqIEBwYXJhbSBpZExpc3QgaWQg4LiX4Li14LmI4Lil4LiaXG4gICAqIEBwYXJhbSBkYXRhTGlzdCBhcnJheSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4iOC4seC4lOC4geC4suC4o1xuICAgKi9cbiAgZm5GbGFnRGVsZXRlKGlkTGlzdDogYW55W10sIGRhdGFMaXN0OiBhbnlbXSkge1xuICAgIGxldCByZXN1bHRMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaW5kZXhEcyA9IDA7IGluZGV4RHMgPCBkYXRhTGlzdC5sZW5ndGg7IGluZGV4RHMrKykge1xuICAgICAgY29uc3Qgb2JqID0gZGF0YUxpc3RbaW5kZXhEc107XG4gICAgICBjb25zdCBpZCA9IF8uZmluZChpZExpc3QsIHZhbHVlID0+IHZhbHVlID09PSBvYmouaWQpO1xuICAgICAgaWYgKG9iai5pZCAhPSBpZCkge1xuICAgICAgICByZXN1bHRMaXN0LnB1c2gob2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdExpc3Q7XG4gIH1cbiAgLyoqXG4gICAqICDguYDguIvguYfguJUgYWN0aW9uIGVkaXQg4Liq4Liz4Lir4Lij4Lix4Lia4Liq4LmI4LiHIHBvc3Qg4LmE4LibIGFwaVxuICAgKiBAcGFyYW0gZGF0YUxpc3QgYXJyYXkgZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguIjguLHguJTguIHguLLguKNcbiAgICogQHBhcmFtIG5hbWVJZCDguIrguLfguYjguK0gcmVmIGlkIOC4guC4reC4hyB0YWJsZVxuICAgKiBAcGFyYW0gbWFpbklkIOC4hOC5iOC4siByZWYgaWQg4LiC4Lit4LiHIHRhYmxlXG4gICAqL1xuICBmbkZsYWdFZGl0KGRhdGFMaXN0OiBhbnlbXSkge1xuICAgIGxldCByZXN1bHRMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgbGV0IG9iaiA9IGRhdGFMaXN0W2luZGV4XTtcbiAgICAgIGlmIChvYmouaWQgPiAwKSB7XG4gICAgICAgIG9iai5hY3Rpb24gPSAnZWRpdCc7XG4gICAgICB9XG4gICAgICByZXN1bHRMaXN0LnB1c2gob2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdExpc3Q7XG4gIH1cbiAgLyoqXG4gICAqIOC5gOC4i+C5h+C4leC4hOC5iOC4suC5gOC4oeC4t+C5iOC4reC4geC4lCBlZGl0XG4gICAqIEBwYXJhbSBkYXRhTGlzdCBhcnJheSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4iOC4seC4lOC4geC4suC4o1xuICAgKiBAcGFyYW0gZGF0YSBkYXRhIOC4guC4reC4hyByb3cg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZIOC4q+C4o+C4t+C4rSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5gOC4reC4suC4hOC5iOC4suC5hOC4m+C4reC4seC4nuC5gOC4lOC4leC5g+C4q+C5iSBhcnJheSBkYXRhXG4gICAqIEBwYXJhbSBuYW1lSWQg4LiK4Li34LmI4LitIHJlZiBpZCDguILguK3guIcgdGFibGVcbiAgICogQHBhcmFtIG1haW5JZCDguITguYjguLIgcmVmIGlkIOC4guC4reC4hyB0YWJsZVxuICAgKi9cbiAgZm5TZXRWYWx1ZUVkaXQoZGF0YUxpc3Q6IGFueVtdLCBkYXRhOiBhbnkpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBsZXQgb2JqID0gZGF0YUxpc3RbaW5kZXhdO1xuICAgICAgaWYgKG9iai5pZCA9PT0gZGF0YS5pZCkge1xuICAgICAgICBkYXRhTGlzdFtpbmRleF0gPSBkYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YUxpc3Q7XG4gIH1cbiAgLyoqXG4gICAqIOC4peC4miBpZCDguIrguLHguYjguKfguITguKPguLLguKfguJfguLXguYjguKrguKPguYnguLLguIfguILguLbguYnguJnguKHguLLguYPguIrguYnguKrguLPguKvguKPguLHguJogZGF0YWdyaWRcbiAgICogQHBhcmFtIGRhdGFMaXN0IGFycmF5IGRhdGEg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiI4Lix4LiU4LiB4Liy4LijXG4gICAqL1xuICBmblJlbW92ZUZha2VJZChkYXRhTGlzdDogYW55W10pIHtcbiAgICBsZXQgcmVzdWx0TGlzdCA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBvYmogPSBkYXRhTGlzdFtpbmRleF07XG4gICAgICBpZiAob2JqLmlkIDwgMCkge1xuICAgICAgICBkZWxldGUgb2JqLmlkO1xuICAgICAgfVxuICAgICAgcmVzdWx0TGlzdC5wdXNoKG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRMaXN0O1xuICB9XG4gIC8qKlxuICAgKiBjaGVjayByZXNwb25zZSDguYHguKXguLDguYHguKrguJTguIcgbW9kYWwg4LiV4Liy4LihIHJlc3VsdCBjb2RlXG4gICAqIEBwYXJhbSByZXNwb25zZSBkYXRhIOC4l+C4teC5iOC4quC5iOC4h+C4oeC4suC4iOC4suC4gSBhcGlcbiAgICogQHBhcmFtIG1vZGFsIG1vZGFsIOC4l+C4teC5iOC4nOC4ueC4geC4geC4seC4miBVSSDguJnguLHguYnguJkg4LmGXG4gICAqL1xuICBmbkNoZWNrUmVzcG9uc2UocmVzcG9uc2UsIG1vZGFsKSB7XG4gICAgaWYgKCtyZXNwb25zZS5yZXN1bHRDb2RlID09PSAyMDAwMCkge1xuICAgICAgY29uc3QgZGF0YUFsZXJ0ID0ge1xuICAgICAgICAnbW9kYWxJZCc6ICdteU1vZGFsU3VjY2VzcycsXG4gICAgICAgICd1c2VyVGl0bGUnOiAnU3VjY2VzcycsXG4gICAgICAgICd1c2VyTWVzc2FnZSc6ICfguJTguLPguYDguJnguLTguJnguIHguLLguKPguKrguLPguYDguKPguYfguIgnXG4gICAgICB9O1xuICAgICAgbW9kYWwub3Blbk1vZGFsKGRhdGFBbGVydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGFBbGVydCA9IHtcbiAgICAgICAgJ21vZGFsSWQnOiAnbXlNb2RhbEVycm9yJyxcbiAgICAgICAgJ3VzZXJUaXRsZSc6ICdFcnJvcicsXG4gICAgICAgICd1c2VyTWVzc2FnZSc6ICfguJTguLPguYDguJnguLTguJnguIHguLLguKPguYTguKHguYjguKrguLPguYDguKPguYfguIgnXG4gICAgICB9O1xuICAgICAgbW9kYWwub3Blbk1vZGFsKGRhdGFBbGVydCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBmbiDguIjguLHguJTguIHguLLguKMgYWN0aW9uIOC4guC4reC4hyBkYXRhIENSVURcbiAgICogQHBhcmFtIGEgZGF0YWxpc3Qg4LiX4Li14LmI4LmA4LiB4LmH4Lia4LmE4Lin4LmJ4LiV4Lit4LiZIEdldFxuICAgKiBAcGFyYW0gYiBkYXRhbGlzdCDguJvguLHguIjguIjguLjguJrguLHguJnguJfguLXguYjguYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIdcbiAgICogQHBhcmFtIGlkTmFtZSBrZXkga2V5IOC4q+C4peC4seC4geC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5g+C4iuC5ieC5gOC4m+C4o+C4teC4ouC4muC5gOC4l+C4teC4ouC4mlxuICAgKi9cbiAgZm5CdWlsZEFycmF5QWN0aW9uKGEsIGIsIGlkTmFtZSA9ICdpZCcpIHtcbiAgICBjb25zdCBhQ2xvbmUgPSBfLmNsb25lRGVlcChhKTtcbiAgICBjb25zdCBiQ2xvbmUgPSBfLmNsb25lRGVlcChiKTtcbiAgICBjb25zdCBkZWxldGVkX2FkZGVkID0gXy54b3JCeShhQ2xvbmUsIGJDbG9uZSwgaWROYW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZygnZGVsZXRlZF9hZGQnLCBkZWxldGVkX2FkZGVkKTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLScpO1xuXG4gICAgY29uc3QgZGVsZXRlZCA9IF8uZmlsdGVyKGRlbGV0ZWRfYWRkZWQsIChvKSA9PiBvW2lkTmFtZV0gPiAwKTtcbiAgICAvLyBjb25zb2xlLmxvZygnZGVsZXRlZCcsIGRlbGV0ZWQpO1xuICAgIC8vIGNvbnNvbGUubG9nKCctLS0tJyk7XG5cbiAgICBjb25zdCBjb21iaW5lID0gXy51bmlvbkJ5KGRlbGV0ZWQsIGJDbG9uZSwgaWROYW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZygnY29tYmluZScsIGNvbWJpbmUpO1xuICAgIC8vIGNvbnNvbGUubG9nKCctLS0tJyk7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbWJpbmUpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGRlbGV0ZWRfYWRkZWQsIGl0ZW0pKSB7XG4gICAgICAgIGlmIChpdGVtW2lkTmFtZV0gPCAwKSB7XG4gICAgICAgICAgaXRlbVsnYWN0aW9uJ10gPSAnYWRkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IobGV0IGZpZWxkIGluIGl0ZW0pe1xuICAgICAgICAgICAgaWYoZmllbGQgIT09IGlkTmFtZSl7XG4gICAgICAgICAgICAgIGRlbGV0ZSBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaXRlbS5hY3Rpb24gPSBcImRlbGV0ZVwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGl0ZW1bJ2FjdGlvbiddID0gJ2VkaXQnO1xuICAgICAgfVxuICAgICAgaWYoaXRlbS5yb3dfbnVtYmVyKXtcbiAgICAgICAgZGVsZXRlIGl0ZW1bJ3Jvd19udW1iZXInXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbWJpbmU7XG4gIH1cblxuICAvKipcbiAgICogZm4g4Lib4Lix4LmJ4LiZ4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4Lir4Lix4LinIFRhYmxlXG4gICAqIEBwYXJhbSByZXN1bHQg4Lic4Lil4Lil4Lix4LieIGRhdGEg4LiX4Li14LmI4LmE4LiU4LmJ4LiI4Liy4LiBIGN1c3RvbSBzdG9yZVxuICAgKi9cbiAgZm5HZW5UZXh0VG90YWwocmVzdWx0OiBhbnkpIHtcbiAgICBjb25zdCByZXN1bHRDb3VudCA9IHJlc3VsdC5kYXRhLmxlbmd0aCB8fCAwO1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSByZXN1bHQudG90YWxDb3VudCB8fCAwO1xuICAgIGxldCB0ZXh0VG90YWwgPSBg4Lic4Lil4Lil4Lix4Lie4LiY4LmMICR7cmVzdWx0Q291bnR9IOC4o+C4suC4ouC4geC4suC4oyDguIjguLLguIHguJfguLHguYnguIfguKvguKHguJQgJHt0b3RhbENvdW50fSDguKPguLLguKLguIHguLLguKNgO1xuICAgIHJldHVybiB0ZXh0VG90YWw7XG4gIH1cblxuICAvKipcbiAgICogZm4g4Lib4Lix4LmJ4LiZ4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4Lir4Lix4LinIFRhYmxlIOC4quC4s+C4q+C4o+C4seC4miBkYXRhc291cmNlIOC5geC4muC4miBnZXQg4LiE4Lij4Lix4LmJ4LiH4LmA4LiU4Li14Lii4LinXG4gICAqIEBwYXJhbSBldmVudCBldmVudCDguJfguLXguYjguYTguJTguYnguIjguLLguIEgZXZlbnQgb25PcHRpb25DaGFuZ2VkXG4gICAqL1xuICBmbkdlblRleHRUb3RhbFJhdyhldmVudDogYW55KSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ3BhZ2luZycgfHwgZXZlbnQubmFtZSA9PT0gJ2RhdGFTb3VyY2UnKSB7XG4gICAgICAgICAgY29uc3QgZ2V0VmlzaWJsZVJvd3MgPSBldmVudC5jb21wb25lbnQgPyBldmVudC5jb21wb25lbnQuZ2V0VmlzaWJsZVJvd3MoKSA6IFtdO1xuICAgICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBldmVudC5jb21wb25lbnQgPyBldmVudC5jb21wb25lbnQudG90YWxDb3VudCgpIDogMDtcbiAgICAgICAgICBjb25zdCByZXN1bHRDb3VudCA9IGdldFZpc2libGVSb3dzLmxlbmd0aCB8fCAwO1xuICAgICAgICAgIHJlc29sdmUoYOC4nOC4peC4peC4seC4nuC4mOC5jCAke3Jlc3VsdENvdW50fSDguKPguLLguKLguIHguLLguKMg4LiI4Liy4LiB4LiX4Lix4LmJ4LiH4Lir4Lih4LiUICR7dG90YWxDb3VudH0g4Lij4Liy4Lii4LiB4Liy4LijYCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogZm4g4LmA4Lib4Lil4Li14LmI4Lii4LiZIGNhbGVuZGFyIGRldmV4dHJlbWUg4LmD4Lir4LmJ4Lib4Li1IOC5gOC4m+C5h+C4meC5geC4muC4miDguJ4u4LioLiAqL1xuICBmbkNoYW5nZUNhbGVuZGFyWWVhcigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWVhclJlZ2V4ID0gL15bMC05XXs0fS1bMC05XXs0fSQvZztcbiAgICAgIGNvbnN0IHllYXJSZWdleDIgPSAvXlswLTldezR9XFxzLVxcc1swLTldezR9JC9nO1xuICAgICAgY29uc3QgYnRuTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5keC1wb3B1cC1jb250ZW50IC5keC1jYWxlbmRhcicpO1xuICAgICAgZm9yIChsZXQgaW5kZXhCdG4gPSAwOyBpbmRleEJ0biA8IGJ0bkxpc3QubGVuZ3RoOyBpbmRleEJ0bisrKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IGJ0bkxpc3RbaW5kZXhCdG5dO1xuICAgICAgICBidG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyB9KTtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIC8qKiDguYDguJvguKXguLXguYjguKLguJnguJvguLXguYPguJnguKrguYjguKfguJnguILguK3guIcgY2VsbCDguJTguYnguLLguJnguYPguJkgKi9cbiAgICAgICAgICBjb25zdCBkeENhbGVuZGFyQ2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5keC1jYWxlbmRhci1jZWxsJyk7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGR4Q2FsZW5kYXJDZWxsLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGR4Q2FsZW5kYXJDZWxsW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjZWxsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KHRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSA0ICYmIG51bSAhPT0gTmFOKSB7XG4gICAgICAgICAgICAgIGxldCBudW0yID0gbnVtICsgNTQzO1xuICAgICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gbnVtMi50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0Lm1hdGNoKHllYXJSZWdleDIpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgY29uc3QgeWVhcjEgPSBwYXJzZUludChhcnJbMF0pO1xuICAgICAgICAgICAgICBjb25zdCB5ZWFyMiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ciA9ICh5ZWFyMSArIDU0MykudG9TdHJpbmcoKSArICctJyArICh5ZWFyMiArIDU0MykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqIOC5gOC4m+C4peC4teC5iOC4ouC4meC4m+C4teC5g+C4meC4quC5iOC4p+C4meC4guC4reC4hyBuYXYg4LiU4LmJ4Liy4LiZ4Lia4LiZICovXG4gICAgICAgICAgY29uc3QgZHhDYWxlbmRhclRvcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5keC1jYWxlbmRhci1jYXB0aW9uLWJ1dHRvbicpO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4VG9wID0gMDsgaW5kZXhUb3AgPCBkeENhbGVuZGFyVG9wLmxlbmd0aDsgaW5kZXhUb3ArKykge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGR4Q2FsZW5kYXJUb3BbaW5kZXhUb3BdO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNlbGwuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG4gICAgICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQodGV4dCk7XG4gICAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDQgJiYgbnVtICE9PSBOYU4pIHtcbiAgICAgICAgICAgICAgbGV0IG51bTIgPSBudW0gKyA1NDM7XG4gICAgICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaXNydC5pdGVtKDApLmNoaWxkcmVuO1xuICAgICAgICAgICAgICB0YXJnZXQuaXRlbSgwKS50ZXh0Q29udGVudCA9IG51bTIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCh5ZWFyUmVnZXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgY29uc3QgeWVhcjEgPSBwYXJzZUludChhcnJbMF0pO1xuICAgICAgICAgICAgICBjb25zdCB5ZWFyMiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ciA9ICh5ZWFyMSArIDU0MykudG9TdHJpbmcoKSArICctJyArICh5ZWFyMiArIDU0MykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgbGV0IGZpc3J0ID0gY2VsbC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpc3J0Lml0ZW0oMCkuY2hpbGRyZW47XG4gICAgICAgICAgICAgIHRhcmdldC5pdGVtKDApLnRleHRDb250ZW50ID0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXCJmbkNoYW5nZUNhbGVuZGFyWWVhciAtPiBlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gIH1cbiAgZm5DaGFuZ2VDYWxlbmRhclllYXJPbmNlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB5ZWFyUmVnZXggPSAvXlswLTldezR9LVswLTldezR9JC9nO1xuICAgICAgLyoqIOC5gOC4m+C4peC4teC5iOC4ouC4meC4m+C4teC5g+C4meC4quC5iOC4p+C4meC4guC4reC4hyBjZWxsIOC4lOC5ieC4suC4meC5g+C4mSAqL1xuICAgICAgY29uc3QgZHhDYWxlbmRhckNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtY2FsZW5kYXItY2VsbCcpO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGR4Q2FsZW5kYXJDZWxsLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBjZWxsID0gZHhDYWxlbmRhckNlbGxbaW5kZXhdO1xuICAgICAgICBjb25zdCB0ZXh0ID0gY2VsbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KHRleHQpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDQgJiYgbnVtICE9PSBOYU4pIHtcbiAgICAgICAgICBsZXQgbnVtMiA9IG51bSArIDU0MztcbiAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gbnVtMi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiog4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Lib4Li14LmD4LiZ4Liq4LmI4Lin4LiZ4LiC4Lit4LiHIG5hdiDguJTguYnguLLguJnguJrguJkgKi9cbiAgICAgIGNvbnN0IGR4Q2FsZW5kYXJUb3AgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtY2FsZW5kYXItY2FwdGlvbi1idXR0b24nKTtcbiAgICAgIGZvciAobGV0IGluZGV4VG9wID0gMDsgaW5kZXhUb3AgPCBkeENhbGVuZGFyVG9wLmxlbmd0aDsgaW5kZXhUb3ArKykge1xuICAgICAgICBjb25zdCBjZWxsID0gZHhDYWxlbmRhclRvcFtpbmRleFRvcF07XG4gICAgICAgIGNvbnN0IHRleHQgPSBjZWxsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQodGV4dCk7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PT0gNCAmJiBudW0gIT09IE5hTikge1xuICAgICAgICAgIGxldCBudW0yID0gbnVtICsgNTQzO1xuICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgbGV0IHRhcmdldCA9IGZpc3J0Lml0ZW0oMCkuY2hpbGRyZW47XG4gICAgICAgICAgdGFyZ2V0Lml0ZW0oMCkudGV4dENvbnRlbnQgPSBudW0yLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCh5ZWFyUmVnZXgpKSB7XG4gICAgICAgICAgY29uc3QgYXJyID0gdGV4dC5zcGxpdCgnLScpO1xuICAgICAgICAgIGNvbnN0IHllYXIxID0gcGFyc2VJbnQoYXJyWzBdKTtcbiAgICAgICAgICBjb25zdCB5ZWFyMiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgICAgY29uc3Qgc3RyID0gKHllYXIxICsgNTQzKS50b1N0cmluZygpICsgJy0nICsgKHllYXIyICsgNTQzKS50b1N0cmluZygpO1xuICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgbGV0IHRhcmdldCA9IGZpc3J0Lml0ZW0oMCkuY2hpbGRyZW47XG4gICAgICAgICAgdGFyZ2V0Lml0ZW0oMCkudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXCJmbkNoYW5nZUNhbGVuZGFyWWVhciAtPiBlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBnZW4gdXVpZFxuICBmbkdlblV1aWQoKXtcbiAgICByZXR1cm4gVVVJRC5VVUlEKCk7XG4gIH1cblxuICAvKipcbiAgICogZm4g4LmB4Lib4Lil4LiHIGRhdGUg4LiB4LmI4Lit4LiZ4Liq4LmI4LiH4LmE4Lib4LmD4Lir4LmJIEFQSVxuICAgKiBAcGFyYW0gZGF0YUxpc3QgZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguIjguLHguJTguIHguLLguKPguKvguKPguLfguK0gbW9kZWwg4LiX4Li14LmI4Lic4Li54LiBXG4gICAqIEBwYXJhbSBmaWVsZExpc3QgbGlzdCDguKPguLLguKLguIrguLfguYjguK0gZmllbGQg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Lib4Lil4LiHIGRhdGVcbiAgICovXG4gIGZuRm9ybWF0RGF0ZUxpc3QoZGF0YUxpc3Q6YW55LCBmaWVsZExpc3Q6YW55W10pIHtcbiAgICAgIGNvbnN0IGNsb25lRGF0YUxpc3QgPSBfLmNsb25lRGVlcChkYXRhTGlzdCk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmllbGRMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRMaXN0W2luZGV4XTtcbiAgICAgICAgICBpZiAoY2xvbmVEYXRhTGlzdFtmaWVsZF0pIHtcbiAgICAgICAgICAgICAgY2xvbmVEYXRhTGlzdFtmaWVsZF0gPSBtb21lbnQoY2xvbmVEYXRhTGlzdFtmaWVsZF0pLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmVEYXRhTGlzdDtcbiAgfVxuICAvKipcbiAgICAgKiBmbi4g4LmB4Lib4Lil4LiHIHN0cmluZyBkYXRlIOC4iOC4suC4gSBkYiDguYDguJvguYfguJkg4Lin4Lix4LiZIOC5gOC4p+C4peC4siDguJvguKPguLDguYDguJfguKjguYTguJfguKJcbiAgICAgKiBAcGFyYW0gdmFsdWUgU3RyaW5nIGRhdGUg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Lib4Lil4LiHXG4gICAgICovXG4gIGZuRGlzcGxheUZvcm1hdERhdGUodmFsdWUpIHtcbiAgICAgIGxldCBkYXRlU3RyaW5nID0gZm9ybWF0RGF0ZSh2YWx1ZSwgXCJzaG9ydERhdGVcIik7XG4gICAgICBsZXQgdGltZVN0cmluZyA9IGZvcm1hdERhdGUodmFsdWUsIFwiSEg6bW06c3NcIik7XG4gICAgICByZXR1cm4gZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmdcbiAgfVxuXG4gIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgIC8vIEZpbHRlcmluZyBvdXQgcHJvcGVydGllc1xuICAgICAgLy8gY29uc29sZS5sb2coXCJrZXlcIixrZXkpO1xuICAgICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLHZhbHVlKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIC8vIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIC8vICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgLy8gICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpO1xuICAgICAgLy8gICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgLy8gICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAgIC8vICAgICBkZWZhdWx0OlxuICAgICAgLy8gfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZigvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9LlxcZHszfVokLy50ZXN0KHZhbHVlKSl7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmVwbGFjZXJub3RyaW0oa2V5LCB2YWx1ZSkge1xuICAgIC8vIEZpbHRlcmluZyBvdXQgcHJvcGVydGllc1xuICAgIC8vIGNvbnNvbGUubG9nKFwia2V5XCIsa2V5KTtcbiAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlXCIsdmFsdWUpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAvLyBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIC8vIHN3aXRjaCAodHlwZSkge1xuICAgIC8vICAgICBjYXNlICdzdHJpbmcnOlxuICAgIC8vICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICAvLyAgICAgY2FzZSAnRGF0ZSc6XG4gICAgLy8gICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAvLyAgICAgZGVmYXVsdDpcbiAgICAvLyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYoL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfS5cXGR7M31aJC8udGVzdCh2YWx1ZSkpe1xuICAgICAgICAgIHJldHVybiBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpO1xuICAgICAgfWVsc2V7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4gIGNvbnZlcnRUSFNob3J0RGF0ZShkYXRlKSB7XG4gICAgICBkYXRlID0gbW9tZW50KGRhdGUpO1xuICAgICAgbGV0IGlNb250aCA9IHBhcnNlSW50KG1vbWVudChkYXRlKS5mb3JtYXQoJ01NJykpLCBpWWVhciA9IG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVknKTtcbiAgICAgIGlZZWFyID0gaVllYXIuc3Vic3RyKDIsIDQpO1xuICAgICAgbGV0IHRoU2hvcnRNb250aCA9IFsnJywgJ+C4oS7guIQuJywgJ+C4gS7guJ4uJywgJ+C4oeC4tS7guIQuJywgJ+C5gOC4oS7guKIuJywgJ+C4ni7guIQuJywgJ+C4oeC4tC7guKIuJywgJ+C4gS7guIQuJywgJ+C4qi7guIQuJywgJ+C4gS7guKIuJywgJ+C4lS7guIQuJywgJ+C4ni7guKIuJywgJ+C4mC7guIQuJ107XG4gICAgICByZXR1cm4gdGhpcy5OdW1iZXJUb1RoYWlOdW1iZXIoZGF0ZS5mb3JtYXQoJ0REJykpICsgJyAnICsgdGhTaG9ydE1vbnRoW2lNb250aF0gKyAnICcgKyB0aGlzLk51bWJlclRvVGhhaU51bWJlcihpWWVhcikgO1xuICB9O1xuXG4gIE51bWJlclRvVGhhaU51bWJlcihOdW1iZXIpIHtcbiAgICAgIE51bWJlciA9IE51bWJlci50b1N0cmluZygpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzAvZ2ksICfguZAnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC8xL2dpLCAn4LmRJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvMi9naSwgJ+C5kicpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzMvZ2ksICfguZMnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC80L2dpLCAn4LmUJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvNS9naSwgJ+C5lScpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzYvZ2ksICfguZYnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC83L2dpLCAn4LmXJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvOC9naSwgJ+C5mCcpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzkvZ2ksICfguZknKTtcbiAgICAgIHJldHVybiBOdW1iZXI7XG4gIH1cblxuICBmbkdldE1vbnRoVEgobW9udGgsIHNob3J0KSB7XG4gICAgICBtb250aCA9IG1vbnRoIC0gMTtcbiAgICAgIGxldCB0aE1vbnRoID0gW1wi4Lih4LiB4Lij4Liy4LiE4LihXCIsIFwi4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMXCIsIFwi4Lih4Li14LiZ4Liy4LiE4LihXCIsXG4gICAgICAgICAgXCLguYDguKHguKnguLLguKLguJlcIiwgXCLguJ7guKTguKnguKDguLLguITguKFcIiwgXCLguKHguLTguJbguLjguJnguLLguKLguJlcIiwgXCLguIHguKPguIHguI7guLLguITguKFcIiwgXCLguKrguLTguIfguKvguLLguITguKFcIiwgXCLguIHguLHguJnguKLguLLguKLguJlcIixcbiAgICAgICAgICBcIuC4leC4uOC4peC4suC4hOC4oVwiLCBcIuC4nuC4pOC4qOC4iOC4tOC4geC4suC4ouC4mVwiLCBcIuC4mOC4seC4meC4p+C4suC4hOC4oVwiXTtcbiAgICAgIGxldCB0aFNob3J0TW9udGggPSBbXCLguKEu4LiELlwiLCBcIuC4gS7guJ4uXCIsIFwi4Lih4Li1LuC4hC5cIiwgXCLguYDguKEu4LiiLlwiLCBcIuC4ni7guIQuXCIsIFwi4Lih4Li0LuC4oi5cIiwgXCLguIEu4LiELlwiLCBcIuC4qi7guIQuXCIsIFwi4LiBLuC4oi5cIiwgXCLguJUu4LiELlwiLCBcIuC4ni7guKIuXCIsIFwi4LiYLuC4hC5cIl07XG4gICAgICByZXR1cm4gc2hvcnQgPT09IHRydWUgPyB0aFNob3J0TW9udGhbbW9udGhdIDogdGhNb250aFttb250aF07XG4gIH07XG5cbiAgY29udmVydFRIRGF0ZShkYXRlLCBmb3JtYXQsdHlwZVRIKSB7XG4gICAgICBtb21lbnQubG9jYWxlKCd0aCcpO1xuICAgICAgY29uc29sZS5sb2cobW9tZW50KGRhdGUpLmFkZCg1NDMsXCJ5ZWFyc1wiKS5mb3JtYXQoXCJERCBNTU1NIFlZWVlcIikpO1xuICAgICAgaWYodHlwZVRIKXtcbiAgICAgICAgICByZXR1cm4gdGhpcy5OdW1iZXJUb1RoYWlOdW1iZXIobW9tZW50KGRhdGUpLmFkZCg1NDMsXCJ5ZWFyc1wiKS5mb3JtYXQoZm9ybWF0KSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmFkZCg1NDMsXCJ5ZWFyc1wiKS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgIH1cbiAgfTtcbn1cbiJdfQ==