UNPKG

ngx-mat-cdk

Version:

Extra Components for Angular Material including Filters,Drag Drop File, MatSelect Mobile Version

294 lines 44.4 kB
import { Injectable } from '@angular/core'; import * as moment from 'jalali-moment'; import { ConditionOperator, FilterTypes, PageFilter } from './filter-components/filters-base'; import { SeparateThreeCommaPipe } from "../../shared/pipes/separate-three-comma.pipe"; import * as i0 from "@angular/core"; import * as i1 from "../../shared/pipes/separate-three-comma.pipe"; export class FiltersService { constructor(moneyPipe) { this.moneyPipe = moneyPipe; this.conditionSource = []; this.useJalaliDate = false; } checkHasFilter(filter) { return ((this.noValueConditions.includes(filter.conditionOperator)) || (filter.type == FilterTypes.MultiSelect ? filter.values && filter.values.length > 0 : !!filter.value)); } getConditionSource() { const conditions = []; for (let enumMember in ConditionOperator) { const condition = ConditionOperator[enumMember]; const gcplat = this.getCondition(condition, null); if (gcplat) { conditions.push({ key: ConditionOperator[enumMember], label: gcplat.label, types: gcplat.types }); } } return conditions; } getDefaultCondition(filterType) { switch (filterType) { case FilterTypes.MultiSelect: case FilterTypes.ListCheck: { return ConditionOperator.InRange; } case FilterTypes.TrueFalse: case FilterTypes.SingleSelect: case FilterTypes.Number: { return ConditionOperator.Equal; } case FilterTypes.TextBox: { return ConditionOperator.Contains; } case FilterTypes.DateTime: { return ConditionOperator.Between; } } } getConditionLabel(condition, filter) { var _a, _b; if (condition) { const conditionKey = condition[0].toLowerCase() + condition.substring(1); if ((_a = filter === null || filter === void 0 ? void 0 : filter.options) === null || _a === void 0 ? void 0 : _a.conditionOptions) { return (_b = filter === null || filter === void 0 ? void 0 : filter.options) === null || _b === void 0 ? void 0 : _b.conditionOptions[conditionKey]; } else { return condition; } } return ""; } getCondition(condition, filter) { condition = condition || filter.conditionOperator; const label = this.getConditionLabel(condition, filter); switch (condition) { case ConditionOperator.Between: return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true }; case ConditionOperator.Contains: return { label, types: [FilterTypes.TextBox], hasValue: true }; case ConditionOperator.EndWith: return { label, types: [FilterTypes.TextBox], hasValue: true }; case ConditionOperator.Equal: return { label, types: [FilterTypes.Number], hasValue: true }; case ConditionOperator.Exact: return { label, types: [FilterTypes.DateTime, FilterTypes.TextBox], hasValue: true }; case ConditionOperator.GreaterThan: return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true }; case ConditionOperator.GreaterThanOrEqual: return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true }; case ConditionOperator.LessThan: return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true }; case ConditionOperator.LessThanOrEqual: return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true }; case ConditionOperator.NotEqual: return { label, types: [FilterTypes.Number, FilterTypes.TextBox], hasValue: true }; case ConditionOperator.StartWith: return { label, types: [FilterTypes.TextBox], hasValue: true }; case ConditionOperator.InRange: return { label, types: [FilterTypes.ListCheck], hasValue: true }; case ConditionOperator.LastMonth: return { label, types: [FilterTypes.DateTime], hasValue: false }; case ConditionOperator.LastWeek: return { label, types: [FilterTypes.DateTime], hasValue: false }; case ConditionOperator.CurrentMonth: return { label, types: [FilterTypes.DateTime], hasValue: false }; case ConditionOperator.CurrentWeek: return { label, types: [FilterTypes.DateTime], hasValue: false }; case ConditionOperator.CurrentYear: return { label, types: [FilterTypes.DateTime], hasValue: false }; } } get noValueConditions() { return [ ConditionOperator.LastWeek, ConditionOperator.LastMonth, ConditionOperator.CurrentYear, ConditionOperator.CurrentWeek, ConditionOperator.CurrentMonth ]; } clearFilter(filter) { filter.hasFilter = false; if (filter.type === FilterTypes.DateTime) { filter.conditionOperator = this.getDefaultCondition(filter.type); } switch (filter.type) { case FilterTypes.DateTime: case FilterTypes.Number: case FilterTypes.TextBox: case FilterTypes.SingleSelect: case FilterTypes.TrueFalse: { filter.value = null; filter.valueTo = null; } break; case FilterTypes.MultiSelect: case FilterTypes.ListCheck: { filter.values = null; } } } getDisplayLabel(filter, hasConditionName = true) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; const condition = this.getCondition(null, filter); if (!condition) { return ' '; } filter.conditionName = condition.label; if (this.noValueConditions.includes(filter.conditionOperator)) { return filter.conditionName; } let conditionName = hasConditionName ? filter.conditionName : ''; if (!condition.hasValue) { return conditionName; } if (filter.type == FilterTypes.MultiSelect) { if (!filter.values) { return ''; } return filter.values.map(z => { var _a, _b; return z[(_b = (_a = filter.options) === null || _a === void 0 ? void 0 : _a.selectBoxOptions) === null || _b === void 0 ? void 0 : _b.displayMember]; }).join(' ,'); } else if (filter.type == FilterTypes.SingleSelect) { if (!filter.value) { return ''; } return filter.value[(_b = (_a = filter.options) === null || _a === void 0 ? void 0 : _a.selectBoxOptions) === null || _b === void 0 ? void 0 : _b.displayMember]; } else { if (!filter.value) { return ''; } if (filter.type == FilterTypes.TrueFalse) { if (filter.value == true) { filter.valueName = ((_d = (_c = filter === null || filter === void 0 ? void 0 : filter.options) === null || _c === void 0 ? void 0 : _c.trueFalseOptions) === null || _d === void 0 ? void 0 : _d.trueLabel) ? filter.options.trueFalseOptions.trueLabel : 'Yes'; } else { filter.valueName = ((_f = (_e = filter === null || filter === void 0 ? void 0 : filter.options) === null || _e === void 0 ? void 0 : _e.trueFalseOptions) === null || _f === void 0 ? void 0 : _f.falseLabel) ? filter.options.trueFalseOptions.falseLabel : 'No'; } return `${filter.valueName}`; } if (filter.type == FilterTypes.DateTime) { if (!this.useJalaliDate) { filter.valueName = moment(filter.value).format('YYYY/MM/DD'); } else { filter.valueName = moment(filter.value).format('jYYYY/jMM/jDD'); } if (filter.conditionOperator == ConditionOperator.Between) { const fromLabel = ((_h = (_g = filter === null || filter === void 0 ? void 0 : filter.options) === null || _g === void 0 ? void 0 : _g.dateTimeOptions) === null || _h === void 0 ? void 0 : _h.fromLabel) ? filter.options.dateTimeOptions.fromLabel : 'from'; const toLabel = ((_k = (_j = filter === null || filter === void 0 ? void 0 : filter.options) === null || _j === void 0 ? void 0 : _j.dateTimeOptions) === null || _k === void 0 ? void 0 : _k.toLabel) ? filter.options.dateTimeOptions.toLabel : 'to'; if (filter.valueTo) { if (!this.useJalaliDate) { filter.valueToName = moment(filter.valueTo).format('YYYY/MM/DD'); } else { filter.valueToName = moment(filter.valueTo).format('jYYYY/jMM/jDD'); } } else { filter.valueToName = '...'; } // filter.valueName = moment(filter.value).format('jYYYY/jMM/jDD'); return `${conditionName} ${fromLabel} ${filter.valueName} ${toLabel} ${filter.valueToName}`; } return `${conditionName} ${filter.valueName}`; } else { if (((_m = (_l = filter.options) === null || _l === void 0 ? void 0 : _l.numberBoxOptions) === null || _m === void 0 ? void 0 : _m.isMoney) && filter.type == FilterTypes.Number) { filter.valueName = this.moneyPipe.transform(filter.value); filter.valueTo ? filter.valueToName = this.moneyPipe.transform(filter.valueTo) : '...'; } else { filter.valueName = filter.value; filter.valueToName = filter.valueTo; } if (filter.conditionOperator == ConditionOperator.Between) { const fromLabel = ((_p = (_o = filter === null || filter === void 0 ? void 0 : filter.options) === null || _o === void 0 ? void 0 : _o.numberBoxOptions) === null || _p === void 0 ? void 0 : _p.fromLabel) ? filter.options.numberBoxOptions.fromLabel : 'from'; const toLabel = ((_r = (_q = filter === null || filter === void 0 ? void 0 : filter.options) === null || _q === void 0 ? void 0 : _q.numberBoxOptions) === null || _r === void 0 ? void 0 : _r.toLabel) ? filter.options.numberBoxOptions.toLabel : 'to'; return `${conditionName} ${fromLabel} ${filter.valueName} ${toLabel} ${filter.valueToName ? filter.valueToName : '...'}`; } else { return `${conditionName} ${filter.valueName}`; } } } } toQueryString(queryObject) { const parts = []; Object.keys(queryObject).forEach((property) => { const value = queryObject[property]; if (value !== undefined && value !== undefined) { parts.push(encodeURIComponent(property) + '=' + encodeURIComponent(value)); } }); return parts.join('&'); } getFiltersInQueryString(filterBy) { let obj = ''; filterBy.forEach((f, i) => { Object.keys(f).forEach((prop) => { const value = filterBy[i][prop]; if (Array.isArray(value)) { const values = value; let bb = 0; values.forEach((b) => { if (b !== undefined && b !== null) { obj = obj + '&' + encodeURIComponent('filters') + `[${i}]` + '.' + `${encodeURIComponent(prop)}[${bb}]` + '=' + encodeURIComponent(b); bb++; } }); } else if (value !== undefined && value !== null) { obj = obj + '&' + encodeURIComponent('filters') + `[${i}]` + '.' + encodeURIComponent(prop) + '=' + encodeURIComponent(value); } }); }); return obj; } getPageFilterInQueryString(queryObject) { let obj; if (queryObject && queryObject.filters) { const filterBy = queryObject.filters.slice(); const query = new PageFilter(); Object.keys(queryObject).forEach((o) => { // copy(slice) from queryObject query[o] = queryObject[o]; }); delete query.filters; obj = this.toQueryString(query); obj += this.getFiltersInQueryString(filterBy); } return obj; } } FiltersService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FiltersService_Factory() { return new FiltersService(i0.ɵɵinject(i1.SeparateThreeCommaPipe)); }, token: FiltersService, providedIn: "root" }); FiltersService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; FiltersService.ctorParameters = () => [ { type: SeparateThreeCommaPipe } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL0FsaXJlemEgTW9oYW1tYWRpL3NvdXJjZS9yZXBvcy9NeUxpYnJhcnkvQW5ndWxhci5MaWJyYXJ5L2xpYnMvcHJvamVjdHMvbmd4LW1hdC1jZGsvc3JjLyIsInNvdXJjZXMiOlsibGliL25neC1tYXQtZmlsdGVycy9maWx0ZXJzL2ZpbHRlcnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxpQkFBaUIsRUFBVSxXQUFXLEVBQUUsVUFBVSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEcsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOENBQThDLENBQUM7OztBQUtwRixNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixTQUFpQztRQUFqQyxjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUZyRCxvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUtyQixrQkFBYSxHQUFHLEtBQUssQ0FBQztJQUY3QixDQUFDO0lBSUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7Z0JBRWpFLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTNHLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBQzdCLEtBQUssSUFBSSxV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QVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBSk8sc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ2phbGFsaS1tb21lbnQnO1xyXG5pbXBvcnQge0NvbmRpdGlvbk9wZXJhdG9yLCBGaWx0ZXIsIEZpbHRlclR5cGVzLCBQYWdlRmlsdGVyfSBmcm9tICcuL2ZpbHRlci1jb21wb25lbnRzL2ZpbHRlcnMtYmFzZSc7XHJcbmltcG9ydCB7U2VwYXJhdGVUaHJlZUNvbW1hUGlwZX0gZnJvbSBcIi4uLy4uL3NoYXJlZC9waXBlcy9zZXBhcmF0ZS10aHJlZS1jb21tYS5waXBlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJzU2VydmljZSB7XHJcbiAgY29uZGl0aW9uU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vbmV5UGlwZTogU2VwYXJhdGVUaHJlZUNvbW1hUGlwZSkge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVzZUphbGFsaURhdGUgPSBmYWxzZTtcclxuXHJcbiAgY2hlY2tIYXNGaWx0ZXIoZmlsdGVyOiBGaWx0ZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMubm9WYWx1ZUNvbmRpdGlvbnMuaW5jbHVkZXMoZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9yKSlcclxuICAgICAgfHxcclxuICAgICAgKGZpbHRlci50eXBlID09IEZpbHRlclR5cGVzLk11bHRpU2VsZWN0ID8gZmlsdGVyLnZhbHVlcyAmJiBmaWx0ZXIudmFsdWVzLmxlbmd0aCA+IDAgOiAhIWZpbHRlci52YWx1ZSkpO1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb25kaXRpb25Tb3VyY2UoKSB7XHJcbiAgICBjb25zdCBjb25kaXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgZW51bU1lbWJlciBpbiBDb25kaXRpb25PcGVyYXRvcikge1xyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBDb25kaXRpb25PcGVyYXRvcltlbnVtTWVtYmVyXTtcclxuICAgICAgY29uc3QgZ2NwbGF0ID0gdGhpcy5nZXRDb25kaXRpb24oY29uZGl0aW9uLCBudWxsKTtcclxuICAgICAgaWYgKGdjcGxhdCkge1xyXG4gICAgICAgIGNvbmRpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICBrZXk6IENvbmRpdGlvbk9wZXJhdG9yW2VudW1NZW1iZXJdLFxyXG4gICAgICAgICAgbGFiZWw6IGdjcGxhdC5sYWJlbCxcclxuICAgICAgICAgIHR5cGVzOiBnY3BsYXQudHlwZXNcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0Q29uZGl0aW9uKGZpbHRlclR5cGU6IEZpbHRlclR5cGVzKTogQ29uZGl0aW9uT3BlcmF0b3Ige1xyXG4gICAgc3dpdGNoIChmaWx0ZXJUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuTXVsdGlTZWxlY3Q6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuTGlzdENoZWNrOiB7XHJcbiAgICAgICAgcmV0dXJuIENvbmRpdGlvbk9wZXJhdG9yLkluUmFuZ2U7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5UcnVlRmFsc2U6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuU2luZ2xlU2VsZWN0OlxyXG4gICAgICBjYXNlIEZpbHRlclR5cGVzLk51bWJlcjoge1xyXG4gICAgICAgIHJldHVybiBDb25kaXRpb25PcGVyYXRvci5FcXVhbDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIEZpbHRlclR5cGVzLlRleHRCb3g6IHtcclxuICAgICAgICByZXR1cm4gQ29uZGl0aW9uT3BlcmF0b3IuQ29udGFpbnM7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5EYXRlVGltZToge1xyXG4gICAgICAgIHJldHVybiBDb25kaXRpb25PcGVyYXRvci5CZXR3ZWVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbmRpdGlvbkxhYmVsKGNvbmRpdGlvbjogQ29uZGl0aW9uT3BlcmF0b3IsIGZpbHRlcjogRmlsdGVyKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25kaXRpb24pIHtcclxuICAgICAgY29uc3QgY29uZGl0aW9uS2V5ID0gY29uZGl0aW9uWzBdLnRvTG93ZXJDYXNlKCkgKyBjb25kaXRpb24uc3Vic3RyaW5nKDEpO1xyXG4gICAgICBpZiAoZmlsdGVyPy5vcHRpb25zPy5jb25kaXRpb25PcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcj8ub3B0aW9ucz8uY29uZGl0aW9uT3B0aW9uc1tjb25kaXRpb25LZXldXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCI7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb25PcGVyYXRvciwgZmlsdGVyOiBGaWx0ZXIpOiB7IGxhYmVsOiBzdHJpbmcsIHR5cGVzOiBGaWx0ZXJUeXBlc1tdLCBoYXNWYWx1ZTogYm9vbGVhbiB9IHtcclxuICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiB8fCBmaWx0ZXIuY29uZGl0aW9uT3BlcmF0b3I7XHJcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0Q29uZGl0aW9uTGFiZWwoY29uZGl0aW9uLCBmaWx0ZXIpO1xyXG4gICAgc3dpdGNoIChjb25kaXRpb24pIHtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5CZXR3ZWVuOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuTnVtYmVyLCBGaWx0ZXJUeXBlcy5EYXRlVGltZV0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5Db250YWluczpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLlRleHRCb3hdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuRW5kV2l0aDpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLlRleHRCb3hdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuRXF1YWw6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5OdW1iZXJdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuRXhhY3Q6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5EYXRlVGltZSwgRmlsdGVyVHlwZXMuVGV4dEJveF0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5HcmVhdGVyVGhhbjpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLk51bWJlciwgRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuR3JlYXRlclRoYW5PckVxdWFsOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuTnVtYmVyLCBGaWx0ZXJUeXBlcy5EYXRlVGltZV0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5MZXNzVGhhbjpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLk51bWJlciwgRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuTGVzc1RoYW5PckVxdWFsOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuTnVtYmVyLCBGaWx0ZXJUeXBlcy5EYXRlVGltZV0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5Ob3RFcXVhbDpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLk51bWJlciwgRmlsdGVyVHlwZXMuVGV4dEJveF0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5TdGFydFdpdGg6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5UZXh0Qm94XSwgaGFzVmFsdWU6IHRydWV9O1xyXG4gICAgICBjYXNlIENvbmRpdGlvbk9wZXJhdG9yLkluUmFuZ2U6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5MaXN0Q2hlY2tdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuTGFzdE1vbnRoOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogZmFsc2V9O1xyXG4gICAgICBjYXNlIENvbmRpdGlvbk9wZXJhdG9yLkxhc3RXZWVrOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogZmFsc2V9O1xyXG4gICAgICBjYXNlIENvbmRpdGlvbk9wZXJhdG9yLkN1cnJlbnRNb250aDpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLkRhdGVUaW1lXSwgaGFzVmFsdWU6IGZhbHNlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5DdXJyZW50V2VlazpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLkRhdGVUaW1lXSwgaGFzVmFsdWU6IGZhbHNlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5DdXJyZW50WWVhcjpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLkRhdGVUaW1lXSwgaGFzVmFsdWU6IGZhbHNlfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBub1ZhbHVlQ29uZGl0aW9ucygpOiBDb25kaXRpb25PcGVyYXRvcltdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIENvbmRpdGlvbk9wZXJhdG9yLkxhc3RXZWVrLFxyXG4gICAgICBDb25kaXRpb25PcGVyYXRvci5MYXN0TW9udGgsXHJcbiAgICAgIENvbmRpdGlvbk9wZXJhdG9yLkN1cnJlbnRZZWFyLFxyXG4gICAgICBDb25kaXRpb25PcGVyYXRvci5DdXJyZW50V2VlayxcclxuICAgICAgQ29uZGl0aW9uT3BlcmF0b3IuQ3VycmVudE1vbnRoXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJGaWx0ZXIoZmlsdGVyOiBGaWx0ZXIpOiB2b2lkIHtcclxuICAgIGZpbHRlci5oYXNGaWx0ZXIgPSBmYWxzZTtcclxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gRmlsdGVyVHlwZXMuRGF0ZVRpbWUpIHtcclxuICAgICAgZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9yID0gdGhpcy5nZXREZWZhdWx0Q29uZGl0aW9uKGZpbHRlci50eXBlKTtcclxuICAgIH1cclxuICAgIHN3aXRjaCAoZmlsdGVyLnR5cGUpIHtcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5EYXRlVGltZTpcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5OdW1iZXI6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuVGV4dEJveDpcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5TaW5nbGVTZWxlY3Q6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuVHJ1ZUZhbHNlOiB7XHJcbiAgICAgICAgZmlsdGVyLnZhbHVlID0gbnVsbDtcclxuICAgICAgICBmaWx0ZXIudmFsdWVUbyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5NdWx0aVNlbGVjdDpcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5MaXN0Q2hlY2s6IHtcclxuICAgICAgICBmaWx0ZXIudmFsdWVzID0gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERpc3BsYXlMYWJlbChmaWx0ZXI6IEZpbHRlciwgaGFzQ29uZGl0aW9uTmFtZTogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5nZXRDb25kaXRpb24obnVsbCwgZmlsdGVyKTtcclxuICAgIGlmICghY29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiAnICc7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyLmNvbmRpdGlvbk5hbWUgPSBjb25kaXRpb24ubGFiZWw7XHJcbiAgICBpZiAodGhpcy5ub1ZhbHVlQ29uZGl0aW9ucy5pbmNsdWRlcyhmaWx0ZXIuY29uZGl0aW9uT3BlcmF0b3IpKSB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXIuY29uZGl0aW9uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29uZGl0aW9uTmFtZSA9IGhhc0NvbmRpdGlvbk5hbWUgPyBmaWx0ZXIuY29uZGl0aW9uTmFtZSA6ICcnO1xyXG5cclxuICAgIGlmICghY29uZGl0aW9uLmhhc1ZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBjb25kaXRpb25OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5NdWx0aVNlbGVjdCkge1xyXG4gICAgICBpZiAoIWZpbHRlci52YWx1ZXMpIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZpbHRlci52YWx1ZXMubWFwKHogPT4geltmaWx0ZXIub3B0aW9ucz8uc2VsZWN0Qm94T3B0aW9ucz8uZGlzcGxheU1lbWJlcl0pLmpvaW4oJyAsJyk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEZpbHRlclR5cGVzLlNpbmdsZVNlbGVjdCkge1xyXG4gICAgICBpZiAoIWZpbHRlci52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlsdGVyLnZhbHVlW2ZpbHRlci5vcHRpb25zPy5zZWxlY3RCb3hPcHRpb25zPy5kaXNwbGF5TWVtYmVyXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghZmlsdGVyLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5UcnVlRmFsc2UpIHtcclxuICAgICAgICBpZiAoZmlsdGVyLnZhbHVlID09IHRydWUpIHtcclxuICAgICAgICAgIGZpbHRlci52YWx1ZU5hbWUgPSBmaWx0ZXI/Lm9wdGlvbnM/LnRydWVGYWxzZU9wdGlvbnM/LnRydWVMYWJlbCA/IGZpbHRlci5vcHRpb25zLnRydWVGYWxzZU9wdGlvbnMudHJ1ZUxhYmVsIDogJ1llcyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpbHRlci52YWx1ZU5hbWUgPSBmaWx0ZXI/Lm9wdGlvbnM/LnRydWVGYWxzZU9wdGlvbnM/LmZhbHNlTGFiZWwgPyBmaWx0ZXIub3B0aW9ucy50cnVlRmFsc2VPcHRpb25zLmZhbHNlTGFiZWwgOiAnTm8nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7ZmlsdGVyLnZhbHVlTmFtZX1gO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuRGF0ZVRpbWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlSmFsYWxpRGF0ZSkge1xyXG4gICAgICAgICAgZmlsdGVyLnZhbHVlTmFtZSA9IG1vbWVudChmaWx0ZXIudmFsdWUpLmZvcm1hdCgnWVlZWS9NTS9ERCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVOYW1lID0gbW9tZW50KGZpbHRlci52YWx1ZSkuZm9ybWF0KCdqWVlZWS9qTU0vakREJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXIuY29uZGl0aW9uT3BlcmF0b3IgPT0gQ29uZGl0aW9uT3BlcmF0b3IuQmV0d2Vlbikge1xyXG4gICAgICAgICAgY29uc3QgZnJvbUxhYmVsID0gKGZpbHRlcj8ub3B0aW9ucz8uZGF0ZVRpbWVPcHRpb25zPy5mcm9tTGFiZWwpID8gZmlsdGVyLm9wdGlvbnMuZGF0ZVRpbWVPcHRpb25zLmZyb21MYWJlbCA6ICdmcm9tJztcclxuICAgICAgICAgIGNvbnN0IHRvTGFiZWwgPSAoZmlsdGVyPy5vcHRpb25zPy5kYXRlVGltZU9wdGlvbnM/LnRvTGFiZWwpID8gZmlsdGVyLm9wdGlvbnMuZGF0ZVRpbWVPcHRpb25zLnRvTGFiZWwgOiAndG8nO1xyXG4gICAgICAgICAgaWYgKGZpbHRlci52YWx1ZVRvKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy51c2VKYWxhbGlEYXRlKSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlVG9OYW1lID0gbW9tZW50KGZpbHRlci52YWx1ZVRvKS5mb3JtYXQoJ1lZWVkvTU0vREQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmaWx0ZXIudmFsdWVUb05hbWUgPSBtb21lbnQoZmlsdGVyLnZhbHVlVG8pLmZvcm1hdCgnallZWVkvak1NL2pERCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaWx0ZXIudmFsdWVUb05hbWUgPSAnLi4uJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGZpbHRlci52YWx1ZU5hbWUgPSBtb21lbnQoZmlsdGVyLnZhbHVlKS5mb3JtYXQoJ2pZWVlZL2pNTS9qREQnKTtcclxuICAgICAgICAgIHJldHVybiBgJHtjb25kaXRpb25OYW1lfSAke2Zyb21MYWJlbH0gJHtmaWx0ZXIudmFsdWVOYW1lfSAke3RvTGFiZWx9ICR7ZmlsdGVyLnZhbHVlVG9OYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHtjb25kaXRpb25OYW1lfSAke2ZpbHRlci52YWx1ZU5hbWV9YDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoZmlsdGVyLm9wdGlvbnM/Lm51bWJlckJveE9wdGlvbnM/LmlzTW9uZXkgJiYgZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuTnVtYmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVOYW1lID0gdGhpcy5tb25leVBpcGUudHJhbnNmb3JtKGZpbHRlci52YWx1ZSk7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVUbyA/IGZpbHRlci52YWx1ZVRvTmFtZSA9IHRoaXMubW9uZXlQaXBlLnRyYW5zZm9ybShmaWx0ZXIudmFsdWVUbykgOiAnLi4uJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmlsdGVyLnZhbHVlTmFtZSA9IGZpbHRlci52YWx1ZTtcclxuICAgICAgICAgIGZpbHRlci52YWx1ZVRvTmFtZSA9IGZpbHRlci52YWx1ZVRvO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9yID09IENvbmRpdGlvbk9wZXJhdG9yLkJldHdlZW4pIHtcclxuICAgICAgICAgIGNvbnN0IGZyb21MYWJlbCA9IChmaWx0ZXI/Lm9wdGlvbnM/Lm51bWJlckJveE9wdGlvbnM/LmZyb21MYWJlbCkgPyBmaWx0ZXIub3B0aW9ucy5udW1iZXJCb3hPcHRpb25zLmZyb21MYWJlbCA6ICdmcm9tJztcclxuICAgICAgICAgIGNvbnN0IHRvTGFiZWwgPSAoZmlsdGVyPy5vcHRpb25zPy5udW1iZXJCb3hPcHRpb25zPy50b0xhYmVsKSA/IGZpbHRlci5vcHRpb25zLm51bWJlckJveE9wdGlvbnMudG9MYWJlbCA6ICd0byc7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGAke2NvbmRpdGlvbk5hbWV9ICR7ZnJvbUxhYmVsfSAke2ZpbHRlci52YWx1ZU5hbWV9ICR7dG9MYWJlbH0gJHtmaWx0ZXIudmFsdWVUb05hbWUgPyBmaWx0ZXIudmFsdWVUb05hbWUgOiAnLi4uJ31gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gYCR7Y29uZGl0aW9uTmFtZX0gJHtmaWx0ZXIudmFsdWVOYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvUXVlcnlTdHJpbmcocXVlcnlPYmplY3Q6IFBhZ2VGaWx0ZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKHF1ZXJ5T2JqZWN0KS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHF1ZXJ5T2JqZWN0W3Byb3BlcnR5XTtcclxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goXHJcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQocHJvcGVydHkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyYnKTtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcnNJblF1ZXJ5U3RyaW5nKGZpbHRlckJ5OiBGaWx0ZXJbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgb2JqID0gJyc7XHJcbiAgICBmaWx0ZXJCeS5mb3JFYWNoKChmLCBpKSA9PiB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGYpLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckJ5W2ldW3Byb3BdO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWUgYXMgc3RyaW5nW107XHJcbiAgICAgICAgICBsZXQgYmIgPSAwO1xyXG4gICAgICAgICAgdmFsdWVzLmZvckVhY2goKGIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGIgIT09IHVuZGVmaW5lZCAmJiBiICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgb2JqID1cclxuICAgICAgICAgICAgICAgIG9iaiArXHJcbiAgICAgICAgICAgICAgICAnJicgK1xyXG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KCdmaWx0ZXJzJykgK1xyXG4gICAgICAgICAgICAgICAgYFske2l9XWAgK1xyXG4gICAgICAgICAgICAgICAgJy4nICtcclxuICAgICAgICAgICAgICAgIGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wKX1bJHtiYn1dYCArXHJcbiAgICAgICAgICAgICAgICAnPScgK1xyXG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGIpO1xyXG4gICAgICAgICAgICAgIGJiKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgb2JqID1cclxuICAgICAgICAgICAgb2JqICtcclxuICAgICAgICAgICAgJyYnICtcclxuICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KCdmaWx0ZXJzJykgK1xyXG4gICAgICAgICAgICBgWyR7aX1dYCArXHJcbiAgICAgICAgICAgICcuJyArXHJcbiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChwcm9wKSArXHJcbiAgICAgICAgICAgICc9JyArXHJcbiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VGaWx0ZXJJblF1ZXJ5U3RyaW5nKHF1ZXJ5T2JqZWN0OiBQYWdlRmlsdGVyKTogc3RyaW5nIHtcclxuICAgIGxldCBvYmo6IHN0cmluZztcclxuICAgIGlmIChxdWVyeU9iamVjdCAmJiBxdWVyeU9iamVjdC5maWx0ZXJzKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlckJ5ID0gcXVlcnlPYmplY3QuZmlsdGVycy5zbGljZSgpO1xyXG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBQYWdlRmlsdGVyKCk7XHJcbiAgICAgIE9iamVjdC5rZXlzKHF1ZXJ5T2JqZWN0KS5mb3JFYWNoKChvKSA9PiB7XHJcbiAgICAgICAgLy8gY29weShzbGljZSkgZnJvbSBxdWVyeU9iamVjdFxyXG4gICAgICAgIHF1ZXJ5W29dID0gcXVlcnlPYmplY3Rbb107XHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWxldGUgcXVlcnkuZmlsdGVycztcclxuICAgICAgb2JqID0gdGhpcy50b1F1ZXJ5U3RyaW5nKHF1ZXJ5KTtcclxuICAgICAgb2JqICs9IHRoaXMuZ2V0RmlsdGVyc0luUXVlcnlTdHJpbmcoZmlsdGVyQnkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbn1cclxuIl19