/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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'); var Common = /** @class */ (function () { function Common() { this.DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss'; console.log("lib common version 1.11.21"); } /** * fn. เช็ค data ทุกประเภท จะ Return กลับไปเป็น true|false * @param data */ /** * fn. เช็ค data ทุกประเภท จะ Return กลับไปเป็น true|false * @param {?} data * @return {?} */ Common.prototype.isNotEmpty = /** * fn. เช็ค data ทุกประเภท จะ Return กลับไปเป็น true|false * @param {?} data * @return {?} */ function (data) { /** @type {?} */ var haveData = false; /** @type {?} */ var 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 : {} */ /** * fn. ปั้น filter สำหรับ Custom Store แบบมี field,filter,orderby * @param {?} filterOptions : {} * @return {?} */ Common.prototype.fnGenFilter = /** * fn. ปั้น filter สำหรับ Custom Store แบบมี field,filter,orderby * @param {?} filterOptions : {} * @return {?} */ function (filterOptions) { var _this = this; /** @type {?} */ var loadOptions = filterOptions.loadOptions || {}; /** @type {?} */ var filterList = filterOptions.filterList || {}; /** @type {?} */ var exceptionList = filterOptions.exceptionList || []; /** @type {?} */ var options = filterOptions.options || {}; /** @type {?} */ var filter = new Observable(function (observer) { /** @type {?} */ var data1 = _this.fnCheckLoadOptions(loadOptions); observer.next(data1); /** @type {?} */ var data2 = _this.fnCheckFilterData(filterList, exceptionList); observer.next(data2); /** @type {?} */ var data3 = _this.fnCheckOptions(data1, data2, options); observer.next(data3); observer.complete(); }); /** @type {?} */ var obj = {}; /** @type {?} */ var observerStep = { next: function (data) { return (obj = data); }, error: function (err) { return console.error('Observer got an error: ' + err); }, complete: function () { return console.log('obj :', obj); } }; filter.subscribe(observerStep); // return filter กลับไป return obj; }; /** * @param {?} loadOptions * @return {?} */ Common.prototype.fnCheckLoadOptions = /** * @param {?} loadOptions * @return {?} */ function (loadOptions) { /** @type {?} */ var 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 (var index = 0; index < loadOptions.sort.length; index++) { /** @type {?} */ var sort = loadOptions.sort[index]; /** @type {?} */ var 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 {?} */ Common.prototype.fnCheckFilterData = /** * @param {?} filterList * @param {?} exceptionList * @return {?} */ function (filterList, exceptionList) { /** @type {?} */ var 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 {?} */ Common.prototype.fnCheckOptions = /** * @param {?} data1 * @param {?} data2 * @param {?} options * @return {?} */ function (data1, data2, options) { /** @type {?} */ var mergeData = _.merge(data1, data2); options = options || {}; /** @type {?} */ var removeFilterEmpty = options.removeFilterEmpty || false; // if empty string will remove parameter if (removeFilterEmpty) { mergeData.filter = this.fnRemoveEmptyKey(mergeData.filter); } return mergeData; }; /** * @param {?} obj * @return {?} */ Common.prototype.fnRemoveEmptyKey = /** * @param {?} obj * @return {?} */ function (obj) { for (var 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 {?} */ Common.prototype.fnConverstFilterDate = /** * @param {?} filter * @param {?} exceptionList * @return {?} */ function (filter, exceptionList) { for (var key in filter) { /** @type {?} */ var element = filter[key]; if (_.isObject(element)) { for (var 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 */ /** * fn. ปั้น filter สำหรับ Custom Store แบบ basic * @param {?} loadOptions * @return {?} */ Common.prototype.fnGenFilterBasic = /** * fn. ปั้น filter สำหรับ Custom Store แบบ basic * @param {?} loadOptions * @return {?} */ function (loadOptions) { console.log('​Common -> fnGenFilterBasic -> loadOptions', loadOptions); /** @type {?} */ var 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 ที่ส่งเข้ามาให้ระบุด้วย */ /** * แปลงวันที่ จาก String เป็น Type Date * @param {?} date วันที่ ที่ต้องการแปลง * @param {?=} formatOfDate ถ้ารู้ format ของ date ที่ส่งเข้ามาให้ระบุด้วย * @return {?} */ Common.prototype.fnToDate = /** * แปลงวันที่ จาก String เป็น Type Date * @param {?} date วันที่ ที่ต้องการแปลง * @param {?=} formatOfDate ถ้ารู้ format ของ date ที่ส่งเข้ามาให้ระบุด้วย * @return {?} */ function (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 วันที่ ที่ต้องการแปลง */ /** * แปลงวันที่ จาก String เป็น Type Date โดยมีอิง format จาก DB 'YYYY-MM-DD' * @param {?} date วันที่ ที่ต้องการแปลง * @return {?} */ Common.prototype.fnLToDateFromDB = /** * แปลงวันที่ จาก String เป็น Type Date โดยมีอิง format จาก DB 'YYYY-MM-DD' * @param {?} date วันที่ ที่ต้องการแปลง * @return {?} */ function (date) { return moment(date, 'YYYY-MM-DD').toDate(); }; /** * เปลี่ยนภาษา Date Picker ของ Prime NG * @param local ภาษา */ /** * เปลี่ยนภาษา Date Picker ของ Prime NG * @param {?} local ภาษา * @return {?} */ Common.prototype.fnLocalPCalendar = /** * เปลี่ยนภาษา Date Picker ของ Prime NG * @param {?} local ภาษา * @return {?} */ function (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 {?} */ Common.prototype.collapseFn = /** * @param {?} id * @return {?} */ function (id) { /** @type {?} */ var ibox = $('#' + id + ' div.collapse-link').closest('div.ibox'); /** @type {?} */ var button = $('#' + id + ' div.collapse-link').find('i'); /** @type {?} */ var button1 = $('#' + id + ' div.collapse-link').find('svg'); /** @type {?} */ var body = ibox.find('div.ibox-body'); /** @type {?} */ var content = ibox.find('div.ibox-content'); /** @type {?} */ var 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 ที่ต้องการจัดการ */ /** * เซ็ต action delete สำหรับส่ง post ไป api * @param {?} idList id ที่ลบ * @param {?} dataList array data ที่ต้องการจัดการ * @return {?} */ Common.prototype.fnFlagDelete = /** * เซ็ต action delete สำหรับส่ง post ไป api * @param {?} idList id ที่ลบ * @param {?} dataList array data ที่ต้องการจัดการ * @return {?} */ function (idList, dataList) { /** @type {?} */ var resultList = []; var _loop_1 = function (indexDs) { /** @type {?} */ var obj = dataList[indexDs]; /** @type {?} */ var id = _.find(idList, function (value) { return value === obj.id; }); if (obj.id != id) { resultList.push(obj); } }; for (var indexDs = 0; indexDs < dataList.length; indexDs++) { _loop_1(indexDs); } return resultList; }; /** * เซ็ต action edit สำหรับส่ง post ไป api * @param dataList array data ที่ต้องการจัดการ * @param nameId ชื่อ ref id ของ table * @param mainId ค่า ref id ของ table */ /** * เซ็ต action edit สำหรับส่ง post ไป api * @param {?} dataList array data ที่ต้องการจัดการ * @return {?} */ Common.prototype.fnFlagEdit = /** * เซ็ต action edit สำหรับส่ง post ไป api * @param {?} dataList array data ที่ต้องการจัดการ * @return {?} */ function (dataList) { /** @type {?} */ var resultList = []; for (var index = 0; index < dataList.length; index++) { /** @type {?} */ var 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 * @param nameId ชื่อ ref id ของ table * @param mainId ค่า ref id ของ table */ /** * เซ็ตค่าเมื่อกด edit * @param {?} dataList array data ที่ต้องการจัดการ * @param {?} data data ของ row ปัจจุบัน หรือ data ที่ต้องการเอาค่าไปอัพเดตให้ array data * @return {?} */ Common.prototype.fnSetValueEdit = /** * เซ็ตค่าเมื่อกด edit * @param {?} dataList array data ที่ต้องการจัดการ * @param {?} data data ของ row ปัจจุบัน หรือ data ที่ต้องการเอาค่าไปอัพเดตให้ array data * @return {?} */ function (dataList, data) { for (var index = 0; index < dataList.length; index++) { /** @type {?} */ var obj = dataList[index]; if (obj.id === data.id) { dataList[index] = data; } } return dataList; }; /** * ลบ id ชั่วคราวที่สร้างขึ้นมาใช้สำหรับ datagrid * @param dataList array data ที่ต้องการจัดการ */ /** * ลบ id ชั่วคราวที่สร้างขึ้นมาใช้สำหรับ datagrid * @param {?} dataList array data ที่ต้องการจัดการ * @return {?} */ Common.prototype.fnRemoveFakeId = /** * ลบ id ชั่วคราวที่สร้างขึ้นมาใช้สำหรับ datagrid * @param {?} dataList array data ที่ต้องการจัดการ * @return {?} */ function (dataList) { /** @type {?} */ var resultList = []; for (var index = 0; index < dataList.length; index++) { /** @type {?} */ var 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 นั้น ๆ */ /** * check response และแสดง modal ตาม result code * @param {?} response data ที่ส่งมาจาก api * @param {?} modal modal ที่ผูกกับ UI นั้น ๆ * @return {?} */ Common.prototype.fnCheckResponse = /** * check response และแสดง modal ตาม result code * @param {?} response data ที่ส่งมาจาก api * @param {?} modal modal ที่ผูกกับ UI นั้น ๆ * @return {?} */ function (response, modal) { if (+response.resultCode === 20000) { /** @type {?} */ var dataAlert = { 'modalId': 'myModalSuccess', 'userTitle': 'Success', 'userMessage': 'ดำเนินการสำเร็จ' }; modal.openModal(dataAlert); } else { /** @type {?} */ var dataAlert = { 'modalId': 'myModalError', 'userTitle': 'Error', 'userMessage': 'ดำเนินการไม่สำเร็จ' }; modal.openModal(dataAlert); } }; /** * fn จัดการ action ของ data CRUD * @param a datalist ที่เก็บไว้ตอน Get * @param b datalist ปัจจุบันที่เปลี่ยนแปลง * @param idName key key หลักที่ต้องการใช้เปรียบเทียบ */ /** * fn จัดการ action ของ data CRUD * @param {?} a datalist ที่เก็บไว้ตอน Get * @param {?} b datalist ปัจจุบันที่เปลี่ยนแปลง * @param {?=} idName key key หลักที่ต้องการใช้เปรียบเทียบ * @return {?} */ Common.prototype.fnBuildArrayAction = /** * fn จัดการ action ของ data CRUD * @param {?} a datalist ที่เก็บไว้ตอน Get * @param {?} b datalist ปัจจุบันที่เปลี่ยนแปลง * @param {?=} idName key key หลักที่ต้องการใช้เปรียบเทียบ * @return {?} */ function (a, b, idName) { if (idName === void 0) { idName = 'id'; } var e_1, _a; /** @type {?} */ var aClone = _.cloneDeep(a); /** @type {?} */ var bClone = _.cloneDeep(b); /** @type {?} */ var deleted_added = _.xorBy(aClone, bClone, idName); /** @type {?} */ var deleted = _.filter(deleted_added, function (o) { return o[idName] > 0; }); /** @type {?} */ var combine = _.unionBy(deleted, bClone, idName); try { // console.log('combine', combine); // console.log('----'); for (var combine_1 = tslib_1.__values(combine), combine_1_1 = combine_1.next(); !combine_1_1.done; combine_1_1 = combine_1.next()) { var item = combine_1_1.value; if (_.includes(deleted_added, item)) { if (item[idName] < 0) { item['action'] = 'add'; } else { for (var field in item) { if (field !== idName) { delete item[field]; } } item.action = "delete"; } } else { item['action'] = 'edit'; } if (item.row_number) { delete item['row_number']; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (combine_1_1 && !combine_1_1.done && (_a = combine_1.return)) _a.call(combine_1); } finally { if (e_1) throw e_1.error; } } return combine; }; /** * fn ปั้นข้อความหัว Table * @param result ผลลัพ data ที่ได้จาก custom store */ /** * fn ปั้นข้อความหัว Table * @param {?} result ผลลัพ data ที่ได้จาก custom store * @return {?} */ Common.prototype.fnGenTextTotal = /** * fn ปั้นข้อความหัว Table * @param {?} result ผลลัพ data ที่ได้จาก custom store * @return {?} */ function (result) { /** @type {?} */ var resultCount = result.data.length || 0; /** @type {?} */ var totalCount = result.totalCount || 0; /** @type {?} */ var textTotal = "\u0E1C\u0E25\u0E25\u0E31\u0E1E\u0E18\u0E4C " + resultCount + " \u0E23\u0E32\u0E22\u0E01\u0E32\u0E23 \u0E08\u0E32\u0E01\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14 " + totalCount + " \u0E23\u0E32\u0E22\u0E01\u0E32\u0E23"; return textTotal; }; /** * fn ปั้นข้อความหัว Table สำหรับ datasource แบบ get ครั้งเดียว * @param event event ที่ได้จาก event onOptionChanged */ /** * fn ปั้นข้อความหัว Table สำหรับ datasource แบบ get ครั้งเดียว * @param {?} event event ที่ได้จาก event onOptionChanged * @return {?} */ Common.prototype.fnGenTextTotalRaw = /** * fn ปั้นข้อความหัว Table สำหรับ datasource แบบ get ครั้งเดียว * @param {?} event event ที่ได้จาก event onOptionChanged * @return {?} */ function (event) { /** @type {?} */ var promise = new Promise(function (resolve, reject) { setTimeout(function () { if (event.name === 'paging' || event.name === 'dataSource') { /** @type {?} */ var getVisibleRows = event.component ? event.component.getVisibleRows() : []; /** @type {?} */ var totalCount = event.component ? event.component.totalCount() : 0; /** @type {?} */ var resultCount = getVisibleRows.length || 0; resolve("\u0E1C\u0E25\u0E25\u0E31\u0E1E\u0E18\u0E4C " + resultCount + " \u0E23\u0E32\u0E22\u0E01\u0E32\u0E23 \u0E08\u0E32\u0E01\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14 " + totalCount + " \u0E23\u0E32\u0E22\u0E01\u0E32\u0E23"); } }, 100); }); return promise; }; /** fn เปลี่ยน calendar devextreme ให้ปี เป็นแบบ พ.ศ. */ /** * fn เปลี่ยน calendar devextreme ให้ปี เป็นแบบ พ.ศ. * @return {?} */ Common.prototype.fnChangeCalendarYear = /** * fn เปลี่ยน calendar devextreme ให้ปี เป็นแบบ พ.ศ. * @return {?} */ function () { try { /** @type {?} */ var yearRegex_1 = /^[0-9]{4}-[0-9]{4}$/g; /** @type {?} */ var yearRegex2_1 = /^[0-9]{4}\s-\s[0-9]{4}$/g; /** @type {?} */ var btnList = document.querySelectorAll('.dx-popup-content .dx-calendar'); for (var indexBtn = 0; indexBtn < btnList.length; indexBtn++) { /** @type {?} */ var btn = btnList[indexBtn]; btn.removeEventListener('click', function (e) { }); btn.addEventListener('click', function () { /** * * เปลี่ยนปีในส่วนของ cell ด้านใน @type {?} */ var dxCalendarCell = document.querySelectorAll('.dx-calendar-cell'); for (var index = 0; index < dxCalendarCell.length; index++) { /** @type {?} */ var cell = dxCalendarCell[index]; /** @type {?} */ var text = cell.getAttribute('aria-label'); /** @type {?} */ var num = parseInt(text); if (text.length === 4 && num !== NaN) { /** @type {?} */ var num2 = num + 543; cell.textContent = num2.toString(); } else if (text.match(yearRegex2_1)) { /** @type {?} */ var arr = text.split('-'); /** @type {?} */ var year1 = parseInt(arr[0]); /** @type {?} */ var year2 = parseInt(arr[1]); /** @type {?} */ var str = (year1 + 543).toString() + '-' + (year2 + 543).toString(); cell.textContent = str; } } /** * * เปลี่ยนปีในส่วนของ nav ด้านบน @type {?} */ var dxCalendarTop = document.querySelectorAll('.dx-calendar-caption-button'); for (var indexTop = 0; indexTop < dxCalendarTop.length; indexTop++) { /** @type {?} */ var cell = dxCalendarTop[indexTop]; /** @type {?} */ var text = cell.getAttribute('aria-label'); /** @type {?} */ var num = parseInt(text); if (text.length === 4 && num !== NaN) { /** @type {?} */ var num2 = num + 543; /** @type {?} */ var fisrt = cell.children; /** @type {?} */ var target = fisrt.item(0).children; target.item(0).textContent = num2.toString(); } else if (text.match(yearRegex_1)) { /** @type {?} */ var arr = text.split('-'); /** @type {?} */ var year1 = parseInt(arr[0]); /** @type {?} */ var year2 = parseInt(arr[1]); /** @type {?} */ var str = (year1 + 543).toString() + '-' + (year2 + 543).toString(); /** @type {?} */ var fisrt = cell.children; /** @type {?} */ var target = fisrt.item(0).children; target.item(0).textContent = str; } } }); } } catch (error) { console.log("fnChangeCalendarYear -> error", error); } }; /** * @return {?} */ Common.prototype.fnChangeCalendarYearOnce = /** * @return {?} */ function () { try { /** @type {?} */ var yearRegex = /^[0-9]{4}-[0-9]{4}$/g; /** * * เปลี่ยนปีในส่วนของ cell ด้านใน @type {?} */ var dxCalendarCell = document.querySelectorAll('.dx-calendar-cell'); for (var index = 0; index < dxCalendarCell.length; index++) { /** @type {?} */ var cell = dxCalendarCell[index]; /** @type {?} */ var text = cell.getAttribute('aria-label'); /** @type {?} */ var num = parseInt(text); if (text.length === 4 && num !== NaN) { /** @type {?} */ var num2 = num + 543; cell.textContent = num2.toString(); } } /** * * เปลี่ยนปีในส่วนของ nav ด้านบน @type {?} */ var dxCalendarTop = document.querySelectorAll('.dx-calendar-caption-button'); for (var indexTop = 0; indexTop < dxCalendarTop.length; indexTop++) { /** @type {?} */ var cell = dxCalendarTop[indexTop]; /** @type {?} */ var text = cell.getAttribute('aria-label'); /** @type {?} */ var num = parseInt(text); if (text.length === 4 && num !== NaN) { /** @type {?} */ var num2 = num + 543; /** @type {?} */ var fisrt = cell.children; /** @type {?} */ var target = fisrt.item(0).children; target.item(0).textContent = num2.toString(); } else if (text.match(yearRegex)) { /** @type {?} */ var arr = text.split('-'); /** @type {?} */ var year1 = parseInt(arr[0]); /** @type {?} */ var year2 = parseInt(arr[1]); /** @type {?} */ var str = (year1 + 543).toString() + '-' + (year2 + 543).toString(); /** @type {?} */ var fisrt = cell.children; /** @type {?} */ var target = fisrt.item(0).children; target.item(0).textContent = str; } } } catch (error) { console.log("fnChangeCalendarYear -> error", error); } }; // gen uuid /** * @return {?} */ Common.prototype.fnGenUuid = /** * @return {?} */ function () { return UUID.UUID(); }; /** * fn แปลง date ก่อนส่งไปให้ API * @param dataList data ที่ต้องการจัดการหรือ model ที่ผูก * @param fieldList list รายชื่อ field ที่ต้องการแปลง date */ /** * fn แปลง date ก่อนส่งไปให้ API * @param {?} dataList data ที่ต้องการจัดการหรือ model ที่ผูก * @param {?} fieldList list รายชื่อ field ที่ต้องการแปลง date * @return {?} */ Common.prototype.fnFormatDateList = /** * fn แปลง date ก่อนส่งไปให้ API * @param {?} dataList data ที่ต้องการจัดการหรือ model ที่ผูก * @param {?} fieldList list รายชื่อ field ที่ต้องการแปลง date * @return {?} */ function (dataList, fieldList) { /** @type {?} */ var cloneDataList = _.cloneDeep(dataList); for (var index = 0; index < fieldList.length; index++) { /** @type {?} */ var 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 ที่ต้องการแปลง */ /** * fn. แปลง string date จาก db เป็น วัน เวลา ประเทศไทย * @param {?} value String date ที่ต้องการแปลง * @return {?} */ Common.prototype.fnDisplayFormatDate = /** * fn. แปลง string date จาก db เป็น วัน เวลา ประเทศไทย * @param {?} value String date ที่ต้องการแปลง * @return {?} */ function (value) { /** @type {?} */ var dateString = formatDate(value, "shortDate"); /** @type {?} */ var timeString = formatDate(value, "HH:mm:ss"); return dateString + ' ' + timeString; }; /** * @param {?} key * @param {?} value * @return {?} */ Common.prototype.replacer = /** * @param {?} key * @param {?} value * @return {?} */ function (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 {?} */ Common.prototype.replacernotrim = /** * @param {?} key * @param {?} value * @return {?} */ function (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 {?} */ Common.prototype.convertTHShortDate = /** * @param {?} date * @return {?} */ function (date) { date = moment(date); /** @type {?} */ var iMonth = parseInt(moment(date).format('MM')); /** @type {?} */ var iYear = moment(date).format('YYYY'); iYear = iYear.substr(2, 4); /** @type {?} */ var thShortMonth = ['', 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.']; return this.NumberToThaiNumber(date.format('DD')) + ' ' + thShortMonth[iMonth] + ' ' + this.NumberToThaiNumber(iYear); }; ; /** * @param {?} Number * @return {?} */ Common.prototype.NumberToThaiNumber = /** * @param {?} Number * @return {?} */ function (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 {?} */ Common.prototype.fnGetMonthTH = /** * @param {?} month * @param {?} short * @return {?} */ function (month, short) { month = month - 1; /** @type {?} */ var thMonth = ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"]; /** @type {?} */ var thShortMonth = ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."]; return short === true ? thShortMonth[month] : thMonth[month]; }; ; /** * @param {?} date * @param {?} format * @param {?} typeTH * @return {?} */ Common.prototype.convertTHDate = /** * @param {?} date * @param {?} format * @param {?} typeTH * @return {?} */ function (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 = function () { return []; }; return Common; }()); export { Common }; if (false) { /** @type {?} */ Common.prototype.DATE_FORMAT; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvX3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJN0MsT0FBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLGlCQUFpQixDQUFDOztBQUV6QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBS1g7MkJBRGMscUJBQXFCO1FBRWpDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtLQUMxQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0gsMkJBQVU7Ozs7O0lBQVYsVUFBVyxJQUFJOztRQUNiLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQzs7UUFDckIsSUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLENBQUM7O1FBRXpCLFFBQVEsSUFBSSxFQUFFOztZQUVaLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7b0JBQ3pCLFFBQVEsR0FBRyxLQUFLLENBQUM7aUJBQ2xCO3FCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxFQUFFO29CQUN6QyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FB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RyxFQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2hGO2FBQUk7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RDtLQUNKO0lBQUEsQ0FBQzs7Z0JBOXNCSCxVQUFVOzs7O2lCQWhCWDs7U0FpQmEsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIGlzIGZyb20gJ2lzX2pzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgbG9hZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zJztcbmltcG9ydCB7IEdlbkZpbHRlck9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbC9nZW4tZmlsdGVyLW9wdGlvbnMnO1xuaW1wb3J0IHsgR2VuRmlsdGVyIH0gZnJvbSAnLi4vbW9kZWwvZ2VuLWZpbHRlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC1lczYnO1xuZGVjbGFyZSB2YXIgJDogYW55O1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gXCJkZXZleHRyZW1lL2xvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IHsgbG9jYWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS9sb2NhbGl6YXRpb24nOyAvLyAjIENhbGVuZGFyIFRIXG5pbXBvcnQgJ2RldmV4dHJlbWUtaW50bCc7XG4vLyAjIENhbGVuZGFyIFRIXG5sb2NhbGUoJ3RoJyk7Ly8gIyBDYWxlbmRhciBUSFxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29tbW9uIHtcbiAgREFURV9GT1JNQVQgPSAnWVlZWS1NTS1ERCBISDptbTpzcyc7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnNvbGUubG9nKFwibGliIGNvbW1vbiB2ZXJzaW9uIDEuMTEuMjFcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBmbi4g4LmA4LiK4LmH4LiEIGRhdGEg4LiX4Li44LiB4Lib4Lij4Liw4LmA4Lig4LiXIOC4iOC4sCBSZXR1cm4g4LiB4Lil4Lix4Lia4LmE4Lib4LmA4Lib4LmH4LiZIHRydWV8ZmFsc2VcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIGlzTm90RW1wdHkoZGF0YSkge1xuICAgIGxldCBoYXZlRGF0YSA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YTtcbiAgICAvLyAvL2NvbnNvbGUudGFnKCd0eXBlOicpLmxvZyh0eXBlKVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgLy8gYXJyYXl8b2JqZWN0XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgaGF2ZURhdGEgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVswXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBoYXZlRGF0YSA9IGRhdGEubGVuZ3RoICE9PSAwID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgaGF2ZURhdGEgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhdmVEYXRhID0gT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc3RyaW5nXG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGhhdmVEYXRhID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIG51bWJlclxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIC8vIGJvb2xlYW5cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgLy8gZnVuY3Rpb25cbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgaGF2ZURhdGEgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGhhdmVEYXRhID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaGF2ZURhdGE7XG4gIH1cblxuICAvKipcbiAgICogZm4uIOC4m+C4seC5ieC4mSBmaWx0ZXIg4Liq4Liz4Lir4Lij4Lix4LiaIEN1c3RvbSBTdG9yZSDguYHguJrguJrguKHguLUgZmllbGQsZmlsdGVyLG9yZGVyYnlcbiAgICogQHBhcmFtIGZpbHRlck9wdGlvbnMgOiB7fVxuICAgKi9cbiAgZm5HZW5GaWx0ZXIoZmlsdGVyT3B0aW9uczogR2VuRmlsdGVyKSB7XG4gICAgLy8gIC8vIGNoZWNrIHZhbHVlXG4gICAgY29uc3QgbG9hZE9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zLmxvYWRPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZpbHRlckxpc3QgPSBmaWx0ZXJPcHRpb25zLmZpbHRlckxpc3QgfHwge307XG4gICAgY29uc3QgZXhjZXB0aW9uTGlzdCA9IGZpbHRlck9wdGlvbnMuZXhjZXB0aW9uTGlzdCB8fCBbXTtcbiAgICBjb25zdCBvcHRpb25zID0gZmlsdGVyT3B0aW9ucy5vcHRpb25zIHx8IHt9O1xuICAgIC8vIERPXG4gICAgY29uc3QgZmlsdGVyID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgLy8g4LmA4LiK4LmH4LiEIGxvYWRPcHRpb25zXG4gICAgICBjb25zdCBkYXRhMSA9IHRoaXMuZm5DaGVja0xvYWRPcHRpb25zKGxvYWRPcHRpb25zKTtcbiAgICAgIG9ic2VydmVyLm5leHQoZGF0YTEpO1xuICAgICAgLy8g4LmA4LiK4LmH4LiEIEZpbHRlclxuICAgICAgY29uc3QgZGF0YTIgPSB0aGlzLmZuQ2hlY2tGaWx0ZXJEYXRhKGZpbHRlckxpc3QsZXhjZXB0aW9uTGlzdCk7XG4gICAgICBvYnNlcnZlci5uZXh0KGRhdGEyKTtcbiAgICAgIC8vIOC5gOC4iuC5h+C4hOC4p+C5iOC4suC4oeC4tSBvcHRpb25zIOC4reC4sOC5hOC4o+C4muC5ieC4suC4h+C5geC4peC4sOC5geC4geC5iSBkYXRhIOC4leC4suC4oSBvcHRpb25zIOC4meC4seC5ieC4mVxuICAgICAgY29uc3QgZGF0YTMgPSB0aGlzLmZuQ2hlY2tPcHRpb25zKGRhdGExLCBkYXRhMiwgb3B0aW9ucyk7XG4gICAgICBvYnNlcnZlci5uZXh0KGRhdGEzKTtcbiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gICAgLy8gVEhFTlxuICAgIGxldCBvYmogPSB7fTtcbiAgICBjb25zdCBvYnNlcnZlclN0ZXAgPSB7XG4gICAgICBuZXh0OiBkYXRhID0+IChvYmogPSBkYXRhKSxcbiAgICAgIGVycm9yOiBlcnIgPT4gY29uc29sZS5lcnJvcignT2JzZXJ2ZXIgZ290IGFuIGVycm9yOiAnICsgZXJyKSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiBjb25zb2xlLmxvZygnb2JqIDonLCBvYmopXG4gICAgfTtcbiAgICBmaWx0ZXIuc3Vic2NyaWJlKG9ic2VydmVyU3RlcCk7XG4gICAgLy8gcmV0dXJuIGZpbHRlciDguIHguKXguLHguJrguYTguJtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgZm5DaGVja0xvYWRPcHRpb25zKGxvYWRPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGxpbWl0OiAnJyxcbiAgICAgIG9mZnNldDogJycsXG4gICAgICBvcmRlcl9ieTogW11cbiAgICB9O1xuICAgIGlmICh0aGlzLmlzTm90RW1wdHkobG9hZE9wdGlvbnMpKSB7XG4gICAgICBvcHRpb25zLm9mZnNldCA9IHRoaXMuaXNOb3RFbXB0eShsb2FkT3B0aW9ucy5za2lwKVxuICAgICAgICA/IGxvYWRPcHRpb25zLnNraXBcbiAgICAgICAgOiAnJztcbiAgICAgIG9wdGlvbnMubGltaXQgPSB0aGlzLmlzTm90RW1wdHkobG9hZE9wdGlvbnMudGFrZSkgPyBsb2FkT3B0aW9ucy50YWtlIDogJyc7XG4gICAgICBpZiAodGhpcy5pc05vdEVtcHR5KGxvYWRPcHRpb25zLnNvcnQpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4oCLQ29tbW9uIC0+IGZuQ2hlY2tMb2FkT3B0aW9ucyAtPiBsb2FkT3B0aW9ucy5zb3J0XCIsIGxvYWRPcHRpb25zLnNvcnQpXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsb2FkT3B0aW9ucy5zb3J0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IHNvcnQgPSBsb2FkT3B0aW9ucy5zb3J0W2luZGV4XTtcbiAgICAgICAgICBjb25zdCBvcmRlcmJ5U2VsZWN0b3IgPSBzb3J0LnNlbGVjdG9yIHx8ICcnO1xuICAgICAgICAgIGlmIChvcmRlcmJ5U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGlmIChzb3J0LmRlc2MpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5vcmRlcl9ieS5wdXNoKG9yZGVyYnlTZWxlY3RvciArICcgZGVzYycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5vcmRlcl9ieS5wdXNoKG9yZGVyYnlTZWxlY3RvciArICcgYXNjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvcHRpb25zLm9yZGVyYnkgPSB0aGlzLmlzTm90RW1wdHkobG9hZE9wdGlvbnMuc29ydCkgPyBsb2FkT3B0aW9ucy5zb3J0WzBdLnNlbGVjdG9yIDogJyc7XG4gICAgICAvLyBvcHRpb25zLm9yZGVyYnkgPSB0aGlzLmlzTm90RW1wdHkobG9hZE9wdGlvbnMuc29ydCkgJiYgbG9hZE9wdGlvbnMuc29ydFswXS5kZXNjID8gb3B0aW9ucy5vcmRlcmJ5ICsgJ3xERVNDJyA6IG9wdGlvbnMub3JkZXJieSArICd8QVNDJztcbiAgICB9XG4gICAgdGhpcy5mblJlbW92ZUVtcHR5S2V5KG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgZm5DaGVja0ZpbHRlckRhdGEoZmlsdGVyTGlzdCxleGNlcHRpb25MaXN0KSB7XG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgZmllbGRzOiAnJyxcbiAgICAgIGZpbHRlcjogJycsXG4gICAgICBvZmZzZXQ6ICcnLFxuICAgICAgbGltaXQ6ICcnLFxuICAgICAgb3JkZXJieTogJydcbiAgICB9O1xuICAgIGlmICh0aGlzLmlzTm90RW1wdHkoZmlsdGVyTGlzdCkpIHtcbiAgICAgIGZpbHRlci5maWVsZHMgPSB0aGlzLmlzTm90RW1wdHkoZmlsdGVyTGlzdC5maWVsZHMpXG4gICAgICAgID8gZmlsdGVyTGlzdC5maWVsZHNcbiAgICAgICAgOiAnJztcbiAgICAgIGlmIChmaWx0ZXJMaXN0LmZpbHRlcikge1xuICAgICAgICBmaWx0ZXIuZmlsdGVyID0gdGhpcy5mbkNvbnZlcnN0RmlsdGVyRGF0ZShmaWx0ZXJMaXN0LmZpbHRlcixleGNlcHRpb25MaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbHRlci5maWx0ZXIgPSAnJ1xuICAgICAgfVxuICAgICAgLy8gZmlsdGVyLmZpbHRlciA9IHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0LmZpbHRlcilcbiAgICAgIC8vICAgPyBmaWx0ZXJMaXN0LmZpbHRlclxuICAgICAgLy8gICA6ICcnO1xuICAgICAgZmlsdGVyLm9mZnNldCA9IHRoaXMuaXNOb3RFbXB0eShmaWx0ZXJMaXN0Lm9mZnNldClcbiAgICAgICAgPyBmaWx0ZXJMaXN0Lm9mZnNldFxuICAgICAgICA6ICcnO1xuICAgICAgZmlsdGVyLmxpbWl0ID0gdGhpcy5pc05vdEVtcHR5KGZpbHRlckxpc3QubGltaXQpID8gZmlsdGVyTGlzdC5saW1pdCA6ICcnO1xuICAgICAgZmlsdGVyLm9yZGVyYnkgPSB0aGlzLmlzTm90RW1wdHkoZmlsdGVyTGlzdC5vcmRlcmJ5KVxuICAgICAgICA/IGZpbHRlckxpc3Qub3JkZXJieVxuICAgICAgICA6ICcnO1xuICAgIH1cbiAgICB0aGlzLmZuUmVtb3ZlRW1wdHlLZXkoZmlsdGVyKTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgZm5DaGVja09wdGlvbnMoZGF0YTEsIGRhdGEyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbWVyZ2VEYXRhID0gXy5tZXJnZShkYXRhMSwgZGF0YTIpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlbW92ZUZpbHRlckVtcHR5ID0gb3B0aW9ucy5yZW1vdmVGaWx0ZXJFbXB0eSB8fCBmYWxzZTsgLy8gaWYgZW1wdHkgc3RyaW5nIHdpbGwgcmVtb3ZlIHBhcmFtZXRlclxuICAgIGlmIChyZW1vdmVGaWx0ZXJFbXB0eSkge1xuICAgICAgbWVyZ2VEYXRhLmZpbHRlciA9IHRoaXMuZm5SZW1vdmVFbXB0eUtleShtZXJnZURhdGEuZmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRGF0YTtcbiAgfVxuXG4gIGZuUmVtb3ZlRW1wdHlLZXkob2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoIXRoaXMuaXNOb3RFbXB0eShvYmpba2V5XSkpIHtcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KG9ialtrZXldKSkge1xuICAgICAgICBvYmpba2V5XSA9IHRoaXMuZm5SZW1vdmVFbXB0eUtleShvYmpba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBmbkNvbnZlcnN0RmlsdGVyRGF0ZShmaWx0ZXIsZXhjZXB0aW9uTGlzdCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGZpbHRlcikge1xuICAgICAgbGV0IGVsZW1lbnQgPSBmaWx0ZXJba2V5XTtcbiAgICAgIGlmIChfLmlzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGF0ZUtleSBpbiBlbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnRbZGF0ZUtleV0gJiYgKGRhdGVLZXkgPT09ICdmcm9tJyB8fCBkYXRlS2V5ID09PSAndG8nKSkge1xuICAgICAgICAgICAgaWYoZXhjZXB0aW9uTGlzdC5pbmNsdWRlcyhrZXkpKXtcbiAgICAgICAgICAgICAgICBlbGVtZW50W2RhdGVLZXldID0gbW9tZW50KGVsZW1lbnRbZGF0ZUtleV0pLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgIGlmKGRhdGVLZXkgPT09ICdmcm9tJyl7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50W2RhdGVLZXldID0gbW9tZW50KGVsZW1lbnRbZGF0ZUtleV0pLmZvcm1hdCgnWVlZWS1NTS1ERCAwMDowMDowMCcpO1xuICAgICAgICAgICAgICB9ZWxzZSBpZihkYXRlS2V5ID09PSAndG8nKXtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRbZGF0ZUtleV0gPSBtb21lbnQoZWxlbWVudFtkYXRlS2V5XSkuZm9ybWF0KCdZWVlZLU1NLUREIDIzOjU5OjU5Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBmbi4g4Lib4Lix4LmJ4LiZIGZpbHRlciDguKrguLPguKvguKPguLHguJogQ3VzdG9tIFN0b3JlIOC5geC4muC4miBiYXNpY1xuICAgKiBAcGFyYW0gbG9hZE9wdGlvbnNcbiAgICovXG4gIGZuR2VuRmlsdGVyQmFzaWMobG9hZE9wdGlvbnM6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCfigItDb21tb24gLT4gZm5HZW5GaWx0ZXJCYXNpYyAtPiBsb2FkT3B0aW9ucycsIGxvYWRPcHRpb25zKTtcbiAgICBsZXQgcGFyYW1zID0gJz8nO1xuICAgIHBhcmFtcyArPSAnc2tpcD0nICsgbG9hZE9wdGlvbnMuc2tpcCB8fCAwO1xuICAgIHBhcmFtcyArPSAnJnRha2U9JyArIGxvYWRPcHRpb25zLnRha2UgfHwgMTA7XG4gICAgaWYgKGxvYWRPcHRpb25zLnNvcnQpIHtcbiAgICAgIHBhcmFtcyArPSAnJm9yZGVyYnk9JyArIGxvYWRPcHRpb25zLnNvcnRbMF0uc2VsZWN0b3I7XG4gICAgICBpZiAobG9hZE9wdGlvbnMuc29ydFswXS5kZXNjKSB7XG4gICAgICAgIHBhcmFtcyArPSAnIGRlc2MnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG4gIC8qKlxuICAgKiDguYHguJvguKXguIfguKfguLHguJnguJfguLXguYgg4LiI4Liy4LiBIFN0cmluZyDguYDguJvguYfguJkgVHlwZSBEYXRlXG4gICAqIEBwYXJhbSBkYXRlIOC4p+C4seC4meC4l+C4teC5iCDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguYHguJvguKXguIdcbiAgICogQHBhcmFtIGZvcm1hdE9mRGF0ZSDguJbguYnguLLguKPguLnguYkgZm9ybWF0IOC4guC4reC4hyBkYXRlIOC4l+C4teC5iOC4quC5iOC4h+C5gOC4guC5ieC4suC4oeC4suC5g+C4q+C5ieC4o+C4sOC4muC4uOC4lOC5ieC4p+C4olxuICAgKi9cbiAgZm5Ub0RhdGUoZGF0ZSwgZm9ybWF0T2ZEYXRlPykge1xuICAgIGlmIChkYXRlKSB7XG4gICAgICBpZiAoZm9ybWF0T2ZEYXRlKSB7XG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSwgZm9ybWF0T2ZEYXRlKS50b0RhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkudG9EYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICog4LmB4Lib4Lil4LiH4Lin4Lix4LiZ4LiX4Li14LmIIOC4iOC4suC4gSBTdHJpbmcg4LmA4Lib4LmH4LiZIFR5cGUgRGF0ZSDguYLguJTguKLguKHguLXguK3guLTguIcgZm9ybWF0IOC4iOC4suC4gSBEQiAnWVlZWS1NTS1ERCdcbiAgICogQHBhcmFtIGRhdGUg4Lin4Lix4LiZ4LiX4Li14LmIIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4m+C4peC4h1xuICAgKi9cbiAgZm5MVG9EYXRlRnJvbURCKGRhdGUpIHtcbiAgICByZXR1cm4gbW9tZW50KGRhdGUsICdZWVlZLU1NLUREJykudG9EYXRlKCk7XG4gIH1cbiAgLyoqXG4gICAqIOC5gOC4m+C4peC4teC5iOC4ouC4meC4oOC4suC4qeC4siBEYXRlIFBpY2tlciDguILguK3guIcgUHJpbWUgTkdcbiAgICogQHBhcmFtIGxvY2FsIOC4oOC4suC4qeC4slxuICAgKi9cbiAgZm5Mb2NhbFBDYWxlbmRhcihsb2NhbCkge1xuICAgIHN3aXRjaCAobG9jYWwpIHtcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaXJzdERheU9mV2VlazogMSxcbiAgICAgICAgICBkYXlOYW1lczogW1xuICAgICAgICAgICAgJ+C4reC4suC4l+C4tOC4leC4ouC5jCcsXG4gICAgICAgICAgICAn4LiI4Lix4LiZ4LiX4Lij4LmMJyxcbiAgICAgICAgICAgICfguK3guLHguIfguITguLLguKMnLFxuICAgICAgICAgICAgJ+C4nuC4uOC4mCcsXG4gICAgICAgICAgICAn4Lie4Lik4Lir4Lix4LiqJyxcbiAgICAgICAgICAgICfguKjguLjguIHguKPguYwnLFxuICAgICAgICAgICAgJ+C5gOC4quC4suC4o+C5jCdcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsn4Lit4LiyJywgJ+C4iCcsICfguK0nLCAn4LieJywgJ+C4nuC4pCcsICfguKgnLCAn4LiqJ10sXG4gICAgICAgICAgZGF5TmFtZXNNaW46IFsn4Lit4LiyJywgJ+C4iCcsICfguK0nLCAn4LieJywgJ+C4nuC4pCcsICfguKgnLCAn4LiqJ10sXG4gICAgICAgICAgbW9udGhOYW1lczogW1xuICAgICAgICAgICAgJ+C4oeC4geC4o+C4suC4hOC4oScsXG4gICAgICAgICAgICAn4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMJyxcbiAgICAgICAgICAgICfguKHguLXguJnguLLguITguKEnLFxuICAgICAgICAgICAgJ+C5gOC4oeC4qeC4suC4ouC4mScsXG4gICAgICAgICAgICAn4Lie4Lik4Lip4Lig4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguKHguLTguJbguLjguJnguLLguKLguJknLFxuICAgICAgICAgICAgJ+C4geC4o+C4geC4juC4suC4hOC4oScsXG4gICAgICAgICAgICAn4Liq4Li04LiH4Lir4Liy4LiE4LihJyxcbiAgICAgICAgICAgICfguIHguLHguJnguKLguLLguKLguJknLFxuICAgICAgICAgICAgJ+C4leC4uOC4peC4suC4hOC4oScsXG4gICAgICAgICAgICAn4Lie4Lik4Lio4LiI4Li04LiB4Liy4Lii4LiZJyxcbiAgICAgICAgICAgICfguJjguLHguJnguKfguLLguITguKEnXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFtcbiAgICAgICAgICAgICfguKEu4LiELicsXG4gICAgICAgICAgICAn4LiBLuC4ni4nLFxuICAgICAgICAgICAgJ+C4oeC4tS7guIQuJyxcbiAgICAgICAgICAgICfguYDguKEu4LiiLicsXG4gICAgICAgICAgICAn4LieLuC4hC4nLFxuICAgICAgICAgICAgJ+C4oeC4tC7guKIuJyxcbiAgICAgICAgICAgICfguIEu4LiELicsXG4gICAgICAgICAgICAn4LiqLuC4hC4nLFxuICAgICAgICAgICAgJ+C4gS7guKIuJyxcbiAgICAgICAgICAgICfguJUu4LiELicsXG4gICAgICAgICAgICAn4LieLuC4oi4nLFxuICAgICAgICAgICAgJ+C4mC7guIQuJ1xuICAgICAgICAgIF0sXG4gICAgICAgICAgdG9kYXk6ICfguKfguLHguJnguJnguLXguYknLFxuICAgICAgICAgIGNsZWFyOiAn4LmA4LiE4Lil4Li14LiiJ1xuICAgICAgICB9O1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrOiAwLFxuICAgICAgICAgIGRheU5hbWVzOiBbXG4gICAgICAgICAgICAnU3VuZGF5JyxcbiAgICAgICAgICAgICdNb25kYXknLFxuICAgICAgICAgICAgJ1R1ZXNkYXknLFxuICAgICAgICAgICAgJ1dlZG5lc2RheScsXG4gICAgICAgICAgICAnVGh1cnNkYXknLFxuICAgICAgICAgICAgJ0ZyaWRheScsXG4gICAgICAgICAgICAnU2F0dXJkYXknXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxuICAgICAgICAgIGRheU5hbWVzTWluOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG4gICAgICAgICAgbW9udGhOYW1lczogW1xuICAgICAgICAgICAgJ0phbnVhcnknLFxuICAgICAgICAgICAgJ0ZlYnJ1YXJ5JyxcbiAgICAgICAgICAgICdNYXJjaCcsXG4gICAgICAgICAgICAnQXByaWwnLFxuICAgICAgICAgICAgJ01heScsXG4gICAgICAgICAgICAnSnVuZScsXG4gICAgICAgICAgICAnSnVseScsXG4gICAgICAgICAgICAnQXVndXN0JyxcbiAgICAgICAgICAgICdTZXB0ZW1iZXInLFxuICAgICAgICAgICAgJ09jdG9iZXInLFxuICAgICAgICAgICAgJ05vdmVtYmVyJyxcbiAgICAgICAgICAgICdEZWNlbWJlcidcbiAgICAgICAgICBdLFxuICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogW1xuICAgICAgICAgICAgJ0phbicsXG4gICAgICAgICAgICAnRmViJyxcbiAgICAgICAgICAgICdNYXInLFxuICAgICAgICAgICAgJ0FwcicsXG4gICAgICAgICAgICAnTWF5JyxcbiAgICAgICAgICAgICdKdW4nLFxuICAgICAgICAgICAgJ0p1bCcsXG4gICAgICAgICAgICAnQXVnJyxcbiAgICAgICAgICAgICdTZXAnLFxuICAgICAgICAgICAgJ09jdCcsXG4gICAgICAgICAgICAnTm92JyxcbiAgICAgICAgICAgICdEZWMnXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b2RheTogJ1RvZGF5JyxcbiAgICAgICAgICBjbGVhcjogJ0NsZWFyJ1xuICAgICAgICB9O1xuICAgIH1cbiAgfVxuICBjb2xsYXBzZUZuKGlkKSB7XG4gICAgY29uc3QgaWJveCA9ICQoJyMnICsgaWQgKyAnIGRpdi5jb2xsYXBzZS1saW5rJykuY2xvc2VzdCgnZGl2Lmlib3gnKTtcbiAgICBjb25zdCBidXR0b24gPSAkKCcjJyArIGlkICsgJyBkaXYuY29sbGFwc2UtbGluaycpLmZpbmQoJ2knKTtcbiAgICBjb25zdCBidXR0b24xID0gJCgnIycgKyBpZCArICcgZGl2LmNvbGxhcHNlLWxpbmsnKS5maW5kKCdzdmcnKTtcbiAgICBjb25zdCBib2R5ID0gaWJveC5maW5kKCdkaXYuaWJveC1ib2R5Jyk7XG4gICAgY29uc3QgY29udGVudCA9IGlib3guZmluZCgnZGl2Lmlib3gtY29udGVudCcpO1xuICAgIGNvbnN0IGZvb3RlciA9IGlib3guZmluZCgnZGl2Lmlib3gtZm9vdGVyJyk7XG4gICAgYm9keS5zbGlkZVRvZ2dsZSgpO1xuICAgIGNvbnRlbnQuc2xpZGVUb2dnbGUoKTtcbiAgICBmb290ZXIuc2xpZGVUb2dnbGUoKTtcbiAgICBidXR0b24udG9nZ2xlQ2xhc3MoJ2ZhciBmYS1jaGV2cm9uLXVwJykudG9nZ2xlQ2xhc3MoJ2ZhciBmYS1jaGV2cm9uLWRvd24nKTtcbiAgICBidXR0b24xLnRvZ2dsZUNsYXNzKCdmYXIgZmEtY2hldnJvbi11cCcpLnRvZ2dsZUNsYXNzKCdmYXIgZmEtY2hldnJvbi1kb3duJyk7XG4gICAgaWJveC50b2dnbGVDbGFzcygnJykudG9nZ2xlQ2xhc3MoJ2JvcmRlci1ib3R0b20nKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlib3gucmVzaXplKCk7XG4gICAgICBpYm94LmZpbmQoJ1tpZF49bWFwLV0nKS5yZXNpemUoKTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICAvKipcbiAgICog4LmA4LiL4LmH4LiVIGFjdGlvbiBkZWxldGUg4Liq4Liz4Lir4Lij4Lix4Lia4Liq4LmI4LiHIHBvc3Qg4LmE4LibIGFwaVxuICAgKiBAcGFyYW0gaWRMaXN0IGlkIOC4l+C4teC5iOC4peC4mlxuICAgKiBAcGFyYW0gZGF0YUxpc3QgYXJyYXkgZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguIjguLHguJTguIHguLLguKNcbiAgICovXG4gIGZuRmxhZ0RlbGV0ZShpZExpc3Q6IGFueVtdLCBkYXRhTGlzdDogYW55W10pIHtcbiAgICBsZXQgcmVzdWx0TGlzdCA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4RHMgPSAwOyBpbmRleERzIDwgZGF0YUxpc3QubGVuZ3RoOyBpbmRleERzKyspIHtcbiAgICAgIGNvbnN0IG9iaiA9IGRhdGFMaXN0W2luZGV4RHNdO1xuICAgICAgY29uc3QgaWQgPSBfLmZpbmQoaWRMaXN0LCB2YWx1ZSA9PiB2YWx1ZSA9PT0gb2JqLmlkKTtcbiAgICAgIGlmIChvYmouaWQgIT0gaWQpIHtcbiAgICAgICAgcmVzdWx0TGlzdC5wdXNoKG9iaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRMaXN0O1xuICB9XG4gIC8qKlxuICAgKiAg4LmA4LiL4LmH4LiVIGFjdGlvbiBlZGl0IOC4quC4s+C4q+C4o+C4seC4muC4quC5iOC4hyBwb3N0IOC5hOC4myBhcGlcbiAgICogQHBhcmFtIGRhdGFMaXN0IGFycmF5IGRhdGEg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiI4Lix4LiU4LiB4Liy4LijXG4gICAqIEBwYXJhbSBuYW1lSWQg4LiK4Li34LmI4LitIHJlZiBpZCDguILguK3guIcgdGFibGVcbiAgICogQHBhcmFtIG1haW5JZCDguITguYjguLIgcmVmIGlkIOC4guC4reC4hyB0YWJsZVxuICAgKi9cbiAgZm5GbGFnRWRpdChkYXRhTGlzdDogYW55W10pIHtcbiAgICBsZXQgcmVzdWx0TGlzdCA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBvYmogPSBkYXRhTGlzdFtpbmRleF07XG4gICAgICBpZiAob2JqLmlkID4gMCkge1xuICAgICAgICBvYmouYWN0aW9uID0gJ2VkaXQnO1xuICAgICAgfVxuICAgICAgcmVzdWx0TGlzdC5wdXNoKG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRMaXN0O1xuICB9XG4gIC8qKlxuICAgKiDguYDguIvguYfguJXguITguYjguLLguYDguKHguLfguYjguK3guIHguJQgZWRpdFxuICAgKiBAcGFyYW0gZGF0YUxpc3QgYXJyYXkgZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguIjguLHguJTguIHguLLguKNcbiAgICogQHBhcmFtIGRhdGEgZGF0YSDguILguK3guIcgcm93IOC4m+C4seC4iOC4iOC4uOC4muC4seC4mSDguKvguKPguLfguK0gZGF0YSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguYDguK3guLLguITguYjguLLguYTguJvguK3guLHguJ7guYDguJTguJXguYPguKvguYkgYXJyYXkgZGF0YVxuICAgKiBAcGFyYW0gbmFtZUlkIOC4iuC4t+C5iOC4rSByZWYgaWQg4LiC4Lit4LiHIHRhYmxlXG4gICAqIEBwYXJhbSBtYWluSWQg4LiE4LmI4LiyIHJlZiBpZCDguILguK3guIcgdGFibGVcbiAgICovXG4gIGZuU2V0VmFsdWVFZGl0KGRhdGFMaXN0OiBhbnlbXSwgZGF0YTogYW55KSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgbGV0IG9iaiA9IGRhdGFMaXN0W2luZGV4XTtcbiAgICAgIGlmIChvYmouaWQgPT09IGRhdGEuaWQpIHtcbiAgICAgICAgZGF0YUxpc3RbaW5kZXhdID0gZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFMaXN0O1xuICB9XG4gIC8qKlxuICAgKiDguKXguJogaWQg4LiK4Lix4LmI4Lin4LiE4Lij4Liy4Lin4LiX4Li14LmI4Liq4Lij4LmJ4Liy4LiH4LiC4Li24LmJ4LiZ4Lih4Liy4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4LiaIGRhdGFncmlkXG4gICAqIEBwYXJhbSBkYXRhTGlzdCBhcnJheSBkYXRhIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4iOC4seC4lOC4geC4suC4o1xuICAgKi9cbiAgZm5SZW1vdmVGYWtlSWQoZGF0YUxpc3Q6IGFueVtdKSB7XG4gICAgbGV0IHJlc3VsdExpc3QgPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBsZXQgb2JqID0gZGF0YUxpc3RbaW5kZXhdO1xuICAgICAgaWYgKG9iai5pZCA8IDApIHtcbiAgICAgICAgZGVsZXRlIG9iai5pZDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdExpc3QucHVzaChvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0TGlzdDtcbiAgfVxuICAvKipcbiAgICogY2hlY2sgcmVzcG9uc2Ug4LmB4Lil4Liw4LmB4Liq4LiU4LiHIG1vZGFsIOC4leC4suC4oSByZXN1bHQgY29kZVxuICAgKiBAcGFyYW0gcmVzcG9uc2UgZGF0YSDguJfguLXguYjguKrguYjguIfguKHguLLguIjguLLguIEgYXBpXG4gICAqIEBwYXJhbSBtb2RhbCBtb2RhbCDguJfguLXguYjguJzguLnguIHguIHguLHguJogVUkg4LiZ4Lix4LmJ4LiZIOC5hlxuICAgKi9cbiAgZm5DaGVja1Jlc3BvbnNlKHJlc3BvbnNlLCBtb2RhbCkge1xuICAgIGlmICgrcmVzcG9uc2UucmVzdWx0Q29kZSA9PT0gMjAwMDApIHtcbiAgICAgIGNvbnN0IGRhdGFBbGVydCA9IHtcbiAgICAgICAgJ21vZGFsSWQnOiAnbXlNb2RhbFN1Y2Nlc3MnLFxuICAgICAgICAndXNlclRpdGxlJzogJ1N1Y2Nlc3MnLFxuICAgICAgICAndXNlck1lc3NhZ2UnOiAn4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4Lij4Liq4Liz4LmA4Lij4LmH4LiIJ1xuICAgICAgfTtcbiAgICAgIG1vZGFsLm9wZW5Nb2RhbChkYXRhQWxlcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhQWxlcnQgPSB7XG4gICAgICAgICdtb2RhbElkJzogJ215TW9kYWxFcnJvcicsXG4gICAgICAgICd1c2VyVGl0bGUnOiAnRXJyb3InLFxuICAgICAgICAndXNlck1lc3NhZ2UnOiAn4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4Lij4LmE4Lih4LmI4Liq4Liz4LmA4Lij4LmH4LiIJ1xuICAgICAgfTtcbiAgICAgIG1vZGFsLm9wZW5Nb2RhbChkYXRhQWxlcnQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogZm4g4LiI4Lix4LiU4LiB4Liy4LijIGFjdGlvbiDguILguK3guIcgZGF0YSBDUlVEXG4gICAqIEBwYXJhbSBhIGRhdGFsaXN0IOC4l+C4teC5iOC5gOC4geC5h+C4muC5hOC4p+C5ieC4leC4reC4mSBHZXRcbiAgICogQHBhcmFtIGIgZGF0YWxpc3Qg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZ4LiX4Li14LmI4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LmB4Lib4Lil4LiHXG4gICAqIEBwYXJhbSBpZE5hbWUga2V5IGtleSDguKvguKXguLHguIHguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguYPguIrguYnguYDguJvguKPguLXguKLguJrguYDguJfguLXguKLguJpcbiAgICovXG4gIGZuQnVpbGRBcnJheUFjdGlvbihhLCBiLCBpZE5hbWUgPSAnaWQnKSB7XG4gICAgY29uc3QgYUNsb25lID0gXy5jbG9uZURlZXAoYSk7XG4gICAgY29uc3QgYkNsb25lID0gXy5jbG9uZURlZXAoYik7XG4gICAgY29uc3QgZGVsZXRlZF9hZGRlZCA9IF8ueG9yQnkoYUNsb25lLCBiQ2xvbmUsIGlkTmFtZSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2RlbGV0ZWRfYWRkJywgZGVsZXRlZF9hZGRlZCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0nKTtcblxuICAgIGNvbnN0IGRlbGV0ZWQgPSBfLmZpbHRlcihkZWxldGVkX2FkZGVkLCAobykgPT4gb1tpZE5hbWVdID4gMCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2RlbGV0ZWQnLCBkZWxldGVkKTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLScpO1xuXG4gICAgY29uc3QgY29tYmluZSA9IF8udW5pb25CeShkZWxldGVkLCBiQ2xvbmUsIGlkTmFtZSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2NvbWJpbmUnLCBjb21iaW5lKTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLScpO1xuXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21iaW5lKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhkZWxldGVkX2FkZGVkLCBpdGVtKSkge1xuICAgICAgICBpZiAoaXRlbVtpZE5hbWVdIDwgMCkge1xuICAgICAgICAgIGl0ZW1bJ2FjdGlvbiddID0gJ2FkZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yKGxldCBmaWVsZCBpbiBpdGVtKXtcbiAgICAgICAgICAgIGlmKGZpZWxkICE9PSBpZE5hbWUpe1xuICAgICAgICAgICAgICBkZWxldGUgaXRlbVtmaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGl0ZW0uYWN0aW9uID0gXCJkZWxldGVcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpdGVtWydhY3Rpb24nXSA9ICdlZGl0JztcbiAgICAgIH1cbiAgICAgIGlmKGl0ZW0ucm93X251bWJlcil7XG4gICAgICAgIGRlbGV0ZSBpdGVtWydyb3dfbnVtYmVyJ107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21iaW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIGZuIOC4m+C4seC5ieC4meC4guC5ieC4reC4hOC4p+C4suC4oeC4q+C4seC4pyBUYWJsZVxuICAgKiBAcGFyYW0gcmVzdWx0IOC4nOC4peC4peC4seC4niBkYXRhIOC4l+C4teC5iOC5hOC4lOC5ieC4iOC4suC4gSBjdXN0b20gc3RvcmVcbiAgICovXG4gIGZuR2VuVGV4dFRvdGFsKHJlc3VsdDogYW55KSB7XG4gICAgY29uc3QgcmVzdWx0Q291bnQgPSByZXN1bHQuZGF0YS5sZW5ndGggfHwgMDtcbiAgICBjb25zdCB0b3RhbENvdW50ID0gcmVzdWx0LnRvdGFsQ291bnQgfHwgMDtcbiAgICBsZXQgdGV4dFRvdGFsID0gYOC4nOC4peC4peC4seC4nuC4mOC5jCAke3Jlc3VsdENvdW50fSDguKPguLLguKLguIHguLLguKMg4LiI4Liy4LiB4LiX4Lix4LmJ4LiH4Lir4Lih4LiUICR7dG90YWxDb3VudH0g4Lij4Liy4Lii4LiB4Liy4LijYDtcbiAgICByZXR1cm4gdGV4dFRvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIGZuIOC4m+C4seC5ieC4meC4guC5ieC4reC4hOC4p+C4suC4oeC4q+C4seC4pyBUYWJsZSDguKrguLPguKvguKPguLHguJogZGF0YXNvdXJjZSDguYHguJrguJogZ2V0IOC4hOC4o+C4seC5ieC4h+C5gOC4lOC4teC4ouC4p1xuICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQg4LiX4Li14LmI4LmE4LiU4LmJ4LiI4Liy4LiBIGV2ZW50IG9uT3B0aW9uQ2hhbmdlZFxuICAgKi9cbiAgZm5HZW5UZXh0VG90YWxSYXcoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdwYWdpbmcnIHx8IGV2ZW50Lm5hbWUgPT09ICdkYXRhU291cmNlJykge1xuICAgICAgICAgIGNvbnN0IGdldFZpc2libGVSb3dzID0gZXZlbnQuY29tcG9uZW50ID8gZXZlbnQuY29tcG9uZW50LmdldFZpc2libGVSb3dzKCkgOiBbXTtcbiAgICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gZXZlbnQuY29tcG9uZW50ID8gZXZlbnQuY29tcG9uZW50LnRvdGFsQ291bnQoKSA6IDA7XG4gICAgICAgICAgY29uc3QgcmVzdWx0Q291bnQgPSBnZXRWaXNpYmxlUm93cy5sZW5ndGggfHwgMDtcbiAgICAgICAgICByZXNvbHZlKGDguJzguKXguKXguLHguJ7guJjguYwgJHtyZXN1bHRDb3VudH0g4Lij4Liy4Lii4LiB4Liy4LijIOC4iOC4suC4geC4l+C4seC5ieC4h+C4q+C4oeC4lCAke3RvdGFsQ291bnR9IOC4o+C4suC4ouC4geC4suC4o2ApO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLyoqIGZuIOC5gOC4m+C4peC4teC5iOC4ouC4mSBjYWxlbmRhciBkZXZleHRyZW1lIOC5g+C4q+C5ieC4m+C4tSDguYDguJvguYfguJnguYHguJrguJog4LieLuC4qC4gKi9cbiAgZm5DaGFuZ2VDYWxlbmRhclllYXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHllYXJSZWdleCA9IC9eWzAtOV17NH0tWzAtOV17NH0kL2c7XG4gICAgICBjb25zdCB5ZWFyUmVnZXgyID0gL15bMC05XXs0fVxccy1cXHNbMC05XXs0fSQvZztcbiAgICAgIGNvbnN0IGJ0bkxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtcG9wdXAtY29udGVudCAuZHgtY2FsZW5kYXInKTtcbiAgICAgIGZvciAobGV0IGluZGV4QnRuID0gMDsgaW5kZXhCdG4gPCBidG5MaXN0Lmxlbmd0aDsgaW5kZXhCdG4rKykge1xuICAgICAgICBjb25zdCBidG4gPSBidG5MaXN0W2luZGV4QnRuXTtcbiAgICAgICAgYnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgfSk7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAvKiog4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Lib4Li14LmD4LiZ4Liq4LmI4Lin4LiZ4LiC4Lit4LiHIGNlbGwg4LiU4LmJ4Liy4LiZ4LmD4LiZICovXG4gICAgICAgICAgY29uc3QgZHhDYWxlbmRhckNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtY2FsZW5kYXItY2VsbCcpO1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkeENhbGVuZGFyQ2VsbC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkeENhbGVuZGFyQ2VsbFtpbmRleF07XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gY2VsbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgICAgICAgIGxldCBudW0gPSBwYXJzZUludCh0ZXh0KTtcbiAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PT0gNCAmJiBudW0gIT09IE5hTikge1xuICAgICAgICAgICAgICBsZXQgbnVtMiA9IG51bSArIDU0MztcbiAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IG51bTIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCh5ZWFyUmVnZXgyKSkge1xuICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0ZXh0LnNwbGl0KCctJyk7XG4gICAgICAgICAgICAgIGNvbnN0IHllYXIxID0gcGFyc2VJbnQoYXJyWzBdKTtcbiAgICAgICAgICAgICAgY29uc3QgeWVhcjIgPSBwYXJzZUludChhcnJbMV0pO1xuICAgICAgICAgICAgICBjb25zdCBzdHIgPSAoeWVhcjEgKyA1NDMpLnRvU3RyaW5nKCkgKyAnLScgKyAoeWVhcjIgKyA1NDMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKiDguYDguJvguKXguLXguYjguKLguJnguJvguLXguYPguJnguKrguYjguKfguJnguILguK3guIcgbmF2IOC4lOC5ieC4suC4meC4muC4mSAqL1xuICAgICAgICAgIGNvbnN0IGR4Q2FsZW5kYXJUb3AgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHgtY2FsZW5kYXItY2FwdGlvbi1idXR0b24nKTtcbiAgICAgICAgICBmb3IgKGxldCBpbmRleFRvcCA9IDA7IGluZGV4VG9wIDwgZHhDYWxlbmRhclRvcC5sZW5ndGg7IGluZGV4VG9wKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkeENhbGVuZGFyVG9wW2luZGV4VG9wXTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjZWxsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KHRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSA0ICYmIG51bSAhPT0gTmFOKSB7XG4gICAgICAgICAgICAgIGxldCBudW0yID0gbnVtICsgNTQzO1xuICAgICAgICAgICAgICBsZXQgZmlzcnQgPSBjZWxsLmNoaWxkcmVuO1xuICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmlzcnQuaXRlbSgwKS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgdGFyZ2V0Lml0ZW0oMCkudGV4dENvbnRlbnQgPSBudW0yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goeWVhclJlZ2V4KSkge1xuICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0ZXh0LnNwbGl0KCctJyk7XG4gICAgICAgICAgICAgIGNvbnN0IHllYXIxID0gcGFyc2VJbnQoYXJyWzBdKTtcbiAgICAgICAgICAgICAgY29uc3QgeWVhcjIgPSBwYXJzZUludChhcnJbMV0pO1xuICAgICAgICAgICAgICBjb25zdCBzdHIgPSAoeWVhcjEgKyA1NDMpLnRvU3RyaW5nKCkgKyAnLScgKyAoeWVhcjIgKyA1NDMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIGxldCBmaXNydCA9IGNlbGwuY2hpbGRyZW47XG4gICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaXNydC5pdGVtKDApLmNoaWxkcmVuO1xuICAgICAgICAgICAgICB0YXJnZXQuaXRlbSgwKS50ZXh0Q29udGVudCA9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZm5DaGFuZ2VDYWxlbmRhclllYXIgLT4gZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICB9XG4gIGZuQ2hhbmdlQ2FsZW5kYXJZZWFyT25jZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWVhclJlZ2V4ID0gL15bMC05XXs0fS1bMC05XXs0fSQvZztcbiAgICAgIC8qKiDguYDguJvguKXguLXguYjguKLguJnguJvguLXguYPguJnguKrguYjguKfguJnguILguK3guIcgY2VsbCDguJTguYnguLLguJnguYPguJkgKi9cbiAgICAgIGNvbnN0IGR4Q2FsZW5kYXJDZWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmR4LWNhbGVuZGFyLWNlbGwnKTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkeENhbGVuZGFyQ2VsbC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGR4Q2FsZW5kYXJDZWxsW2luZGV4XTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGNlbGwuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG4gICAgICAgIGxldCBudW0gPSBwYXJzZUludCh0ZXh0KTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09PSA0ICYmIG51bSAhPT0gTmFOKSB7XG4gICAgICAgICAgbGV0IG51bTIgPSBudW0gKyA1NDM7XG4gICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IG51bTIudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoqIOC5gOC4m+C4peC4teC5iOC4ouC4meC4m+C4teC5g+C4meC4quC5iOC4p+C4meC4guC4reC4hyBuYXYg4LiU4LmJ4Liy4LiZ4Lia4LiZICovXG4gICAgICBjb25zdCBkeENhbGVuZGFyVG9wID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmR4LWNhbGVuZGFyLWNhcHRpb24tYnV0dG9uJyk7XG4gICAgICBmb3IgKGxldCBpbmRleFRvcCA9IDA7IGluZGV4VG9wIDwgZHhDYWxlbmRhclRvcC5sZW5ndGg7IGluZGV4VG9wKyspIHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGR4Q2FsZW5kYXJUb3BbaW5kZXhUb3BdO1xuICAgICAgICBjb25zdCB0ZXh0ID0gY2VsbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KHRleHQpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDQgJiYgbnVtICE9PSBOYU4pIHtcbiAgICAgICAgICBsZXQgbnVtMiA9IG51bSArIDU0MztcbiAgICAgICAgICBsZXQgZmlzcnQgPSBjZWxsLmNoaWxkcmVuO1xuICAgICAgICAgIGxldCB0YXJnZXQgPSBmaXNydC5pdGVtKDApLmNoaWxkcmVuO1xuICAgICAgICAgIHRhcmdldC5pdGVtKDApLnRleHRDb250ZW50ID0gbnVtMi50b1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goeWVhclJlZ2V4KSkge1xuICAgICAgICAgIGNvbnN0IGFyciA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICAgICAgICBjb25zdCB5ZWFyMSA9IHBhcnNlSW50KGFyclswXSk7XG4gICAgICAgICAgY29uc3QgeWVhcjIgPSBwYXJzZUludChhcnJbMV0pO1xuICAgICAgICAgIGNvbnN0IHN0ciA9ICh5ZWFyMSArIDU0MykudG9TdHJpbmcoKSArICctJyArICh5ZWFyMiArIDU0MykudG9TdHJpbmcoKTtcbiAgICAgICAgICBsZXQgZmlzcnQgPSBjZWxsLmNoaWxkcmVuO1xuICAgICAgICAgIGxldCB0YXJnZXQgPSBmaXNydC5pdGVtKDApLmNoaWxkcmVuO1xuICAgICAgICAgIHRhcmdldC5pdGVtKDApLnRleHRDb250ZW50ID0gc3RyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZm5DaGFuZ2VDYWxlbmRhclllYXIgLT4gZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLy8gZ2VuIHV1aWRcbiAgZm5HZW5VdWlkKCl7XG4gICAgcmV0dXJuIFVVSUQuVVVJRCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZuIOC5geC4m+C4peC4hyBkYXRlIOC4geC5iOC4reC4meC4quC5iOC4h+C5hOC4m+C5g+C4q+C5iSBBUElcbiAgICogQHBhcmFtIGRhdGFMaXN0IGRhdGEg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiI4Lix4LiU4LiB4Liy4Lij4Lir4Lij4Li34LitIG1vZGVsIOC4l+C4teC5iOC4nOC4ueC4gVxuICAgKiBAcGFyYW0gZmllbGRMaXN0IGxpc3Qg4Lij4Liy4Lii4LiK4Li34LmI4LitIGZpZWxkIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4m+C4peC4hyBkYXRlXG4gICAqL1xuICBmbkZvcm1hdERhdGVMaXN0KGRhdGFMaXN0OmFueSwgZmllbGRMaXN0OmFueVtdKSB7XG4gICAgICBjb25zdCBjbG9uZURhdGFMaXN0ID0gXy5jbG9uZURlZXAoZGF0YUxpc3QpO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkTGlzdFtpbmRleF07XG4gICAgICAgICAgaWYgKGNsb25lRGF0YUxpc3RbZmllbGRdKSB7XG4gICAgICAgICAgICAgIGNsb25lRGF0YUxpc3RbZmllbGRdID0gbW9tZW50KGNsb25lRGF0YUxpc3RbZmllbGRdKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lRGF0YUxpc3Q7XG4gIH1cbiAgLyoqXG4gICAgICogZm4uIOC5geC4m+C4peC4hyBzdHJpbmcgZGF0ZSDguIjguLLguIEgZGIg4LmA4Lib4LmH4LiZIOC4p+C4seC4mSDguYDguKfguKXguLIg4Lib4Lij4Liw4LmA4LiX4Lio4LmE4LiX4LiiXG4gICAgICogQHBhcmFtIHZhbHVlIFN0cmluZyBkYXRlIOC4l+C4teC5iOC4leC5ieC4reC4h+C4geC4suC4o+C5geC4m+C4peC4h1xuICAgICAqL1xuICBmbkRpc3BsYXlGb3JtYXREYXRlKHZhbHVlKSB7XG4gICAgICBsZXQgZGF0ZVN0cmluZyA9IGZvcm1hdERhdGUodmFsdWUsIFwic2hvcnREYXRlXCIpO1xuICAgICAgbGV0IHRpbWVTdHJpbmcgPSBmb3JtYXREYXRlKHZhbHVlLCBcIkhIOm1tOnNzXCIpO1xuICAgICAgcmV0dXJuIGRhdGVTdHJpbmcgKyAnICcgKyB0aW1lU3RyaW5nXG4gIH1cblxuICByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gICAgICAvLyBGaWx0ZXJpbmcgb3V0IHByb3BlcnRpZXNcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwia2V5XCIsa2V5KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwidmFsdWVcIix2YWx1ZSk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGVcIix0eXBlb2YgdmFsdWUpO1xuXG4gICAgICAvLyBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgLy8gc3dpdGNoICh0eXBlKSB7XG4gICAgICAvLyAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIC8vICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICAgIC8vICAgICBjYXNlICdEYXRlJzpcbiAgICAgIC8vICAgICAgICAgcmV0dXJuIG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLWRkIEhIOm1tOnNzJyk7XG4gICAgICAvLyAgICAgZGVmYXVsdDpcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYoL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfS5cXGR7M31aJC8udGVzdCh2YWx1ZSkpe1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJyk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJlcGxhY2Vybm90cmltKGtleSwgdmFsdWUpIHtcbiAgICAvLyBGaWx0ZXJpbmcgb3V0IHByb3BlcnRpZXNcbiAgICAvLyBjb25zb2xlLmxvZyhcImtleVwiLGtleSk7XG4gICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLHZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcInR5cGVcIix0eXBlb2YgdmFsdWUpO1xuXG4gICAgLy8gY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAvLyAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAvLyAgICAgICAgIHJldHVybiB2YWx1ZS50cmltKCk7XG4gICAgLy8gICAgIGNhc2UgJ0RhdGUnOlxuICAgIC8vICAgICAgICAgcmV0dXJuIG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLWRkIEhIOm1tOnNzJyk7XG4gICAgLy8gICAgIGRlZmF1bHQ6XG4gICAgLy8gfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0uXFxkezN9WiQvLnRlc3QodmFsdWUpKXtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcbiAgICAgIH1lbHNle1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuICBjb252ZXJ0VEhTaG9ydERhdGUoZGF0ZSkge1xuICAgICAgZGF0ZSA9IG1vbWVudChkYXRlKTtcbiAgICAgIGxldCBpTW9udGggPSBwYXJzZUludChtb21lbnQoZGF0ZSkuZm9ybWF0KCdNTScpKSwgaVllYXIgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZJyk7XG4gICAgICBpWWVhciA9IGlZZWFyLnN1YnN0cigyLCA0KTtcbiAgICAgIGxldCB0aFNob3J0TW9udGggPSBbJycsICfguKEu4LiELicsICfguIEu4LieLicsICfguKHguLUu4LiELicsICfguYDguKEu4LiiLicsICfguJ4u4LiELicsICfguKHguLQu4LiiLicsICfguIEu4LiELicsICfguKou4LiELicsICfguIEu4LiiLicsICfguJUu4LiELicsICfguJ4u4LiiLicsICfguJgu4LiELiddO1xuICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyVG9UaGFpTnVtYmVyKGRhdGUuZm9ybWF0KCdERCcpKSArICcgJyArIHRoU2hvcnRNb250aFtpTW9udGhdICsgJyAnICsgdGhpcy5OdW1iZXJUb1RoYWlOdW1iZXIoaVllYXIpIDtcbiAgfTtcblxuICBOdW1iZXJUb1RoYWlOdW1iZXIoTnVtYmVyKSB7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIudG9TdHJpbmcoKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC8wL2dpLCAn4LmQJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvMS9naSwgJ+C5kScpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzIvZ2ksICfguZInKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC8zL2dpLCAn4LmTJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvNC9naSwgJ+C5lCcpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzUvZ2ksICfguZUnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC82L2dpLCAn4LmWJyk7XG4gICAgICBOdW1iZXIgPSBOdW1iZXIucmVwbGFjZSgvNy9naSwgJ+C5lycpO1xuICAgICAgTnVtYmVyID0gTnVtYmVyLnJlcGxhY2UoLzgvZ2ksICfguZgnKTtcbiAgICAgIE51bWJlciA9IE51bWJlci5yZXBsYWNlKC85L2dpLCAn4LmZJyk7XG4gICAgICByZXR1cm4gTnVtYmVyO1xuICB9XG5cbiAgZm5HZXRNb250aFRIKG1vbnRoLCBzaG9ydCkge1xuICAgICAgbW9udGggPSBtb250aCAtIDE7XG4gICAgICBsZXQgdGhNb250aCA9IFtcIuC4oeC4geC4o+C4suC4hOC4oVwiLCBcIuC4geC4uOC4oeC4oOC4suC4nuC4seC4meC4mOC5jFwiLCBcIuC4oeC4teC4meC4suC4hOC4oVwiLFxuICAgICAgICAgIFwi4LmA4Lih4Lip4Liy4Lii4LiZXCIsIFwi4Lie4Lik4Lip4Lig4Liy4LiE4LihXCIsIFwi4Lih4Li04LiW4Li44LiZ4Liy4Lii4LiZXCIsIFwi4LiB4Lij4LiB4LiO4Liy4LiE4LihXCIsIFwi4Liq4Li04LiH4Lir4Liy4LiE4LihXCIsIFwi4LiB4Lix4LiZ4Lii4Liy4Lii4LiZXCIsXG4gICAgICAgICAgXCLguJXguLjguKXguLLguITguKFcIiwgXCLguJ7guKTguKjguIjguLTguIHguLLguKLguJlcIiwgXCLguJjguLHguJnguKfguLLguITguKFcIl07XG4gICAgICBsZXQgdGhTaG9ydE1vbnRoID0gW1wi4LihLuC4hC5cIiwgXCLguIEu4LieLlwiLCBcIuC4oeC4tS7guIQuXCIsIFwi4LmA4LihLuC4oi5cIiwgXCLguJ4u4LiELlwiLCBcIuC4oeC4tC7guKIuXCIsIFwi4LiBLuC4hC5cIiwgXCLguKou4LiELlwiLCBcIuC4gS7guKIuXCIsIFwi4LiVLuC4hC5cIiwgXCLguJ4u4LiiLlwiLCBcIuC4mC7guIQuXCJdO1xuICAgICAgcmV0dXJuIHNob3J0ID09PSB0cnVlID8gdGhTaG9ydE1vbnRoW21vbnRoXSA6IHRoTW9udGhbbW9udGhdO1xuICB9O1xuXG4gIGNvbnZlcnRUSERhdGUoZGF0ZSwgZm9ybWF0LHR5cGVUSCkge1xuICAgICAgbW9tZW50LmxvY2FsZSgndGgnKTtcbiAgICAgIGNvbnNvbGUubG9nKG1vbWVudChkYXRlKS5hZGQoNTQzLFwieWVhcnNcIikuZm9ybWF0KFwiREQgTU1NTSBZWVlZXCIpKTtcbiAgICAgIGlmKHR5cGVUSCl7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuTnVtYmVyVG9UaGFpTnVtYmVyKG1vbWVudChkYXRlKS5hZGQoNTQzLFwieWVhcnNcIikuZm9ybWF0KGZvcm1hdCkpO1xuICAgICAgfWVsc2V7XG4gICAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5hZGQoNTQzLFwieWVhcnNcIikuZm9ybWF0KGZvcm1hdCk7XG4gICAgICB9XG4gIH07XG59XG4iXX0=