@firestitch/filter
Version:
801 lines • 61 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { toUTC } from '@firestitch/date';
import { Alias, Model } from 'tsmodels';
import { take, takeUntil } from 'rxjs/operators';
import { isObservable } from 'rxjs/internal/util/isObservable';
import { isFunction, isObject, toString, clone, filter } from 'lodash-es';
import { isDate, isValid, parse } from 'date-fns';
/** @enum {string} */
const ItemType = {
Text: 'text',
Select: 'select',
Range: 'range',
Date: 'date',
DateTime: 'datetime',
DateRange: 'daterange',
DateTimeRange: 'datetimerange',
AutoComplete: 'autocomplete',
AutoCompleteChips: 'autocompletechips',
Checkbox: 'checkbox',
Chips: 'chips',
Keyword: 'keyword',
};
export { ItemType };
export class FsFilterConfigItem extends Model {
/**
* @param {?=} _configItem
* @param {?=} _config
* @param {?=} _route
* @param {?=} _persists
*/
constructor(_configItem = {}, _config, _route, _persists) {
super();
this._configItem = _configItem;
this._config = _config;
this._route = _route;
this._persists = _persists;
this.initialLoading = false;
this.valueChanged = false;
this._pendingValues = false;
this._fromJSON(_configItem);
}
/**
* @return {?}
*/
get hasPendingValues() {
return this._pendingValues;
}
/**
* @return {?}
*/
get model() {
return this._model;
}
/**
* @param {?} val
* @return {?}
*/
set model(val) {
this._model = val;
this.checkIfValueChanged();
}
/**
* @param {?} values
* @return {?}
*/
set values(values) {
this._values = values;
this.sanitize();
}
/**
* @return {?}
*/
get values() {
return this._values;
}
/**
* @param {?} data
* @return {?}
*/
_fromJSON(data) {
super._fromJSON(data);
if (this.name && isObject(this.name)) {
this.names = this.name;
this.name = Object.keys(this.names).join('-');
}
if (this._config.persist) {
/** @type {?} */
const persisted = this._persists[this._config.persist.name].data;
if (persisted[this.name]) {
this.parseAndSetValue(persisted[this.name]);
}
}
this.sanitize();
}
/**
* @return {?}
*/
initValues() {
if (isFunction(this._configItem.values) &&
!this.isTypeAutocomplete() &&
!this.isTypeAutocompleteChips()) {
/** @type {?} */
const obj = this._configItem.values();
this.values = obj;
if (isObservable(obj)) {
this._pendingValues = true;
}
}
else {
this.values = this._configItem.values;
}
}
/**
* @param {?} value
* @return {?}
*/
updateValue(value) {
switch (this.type) {
case ItemType.Select:
{
if (value === '__all' || value === null) {
this.model = value;
return;
}
/** @type {?} */
let valueExists = null;
/** @type {?} */
let isolated = null;
if (this.multiple) {
isolated = this.isolate && Array.isArray(value) && value[0] === this.isolate.value;
valueExists = Array.isArray(this.values)
? value.every((/**
* @param {?} val
* @return {?}
*/
(val) => {
return this.values.find((/**
* @param {?} valueItem
* @return {?}
*/
(valueItem) => valueItem.value === val));
}))
|| isolated
: false;
}
else {
valueExists = Array.isArray(this.values)
? this.values.some((/**
* @param {?} valueItem
* @return {?}
*/
(valueItem) => valueItem.value === value))
: false;
}
if (valueExists) {
this.model = value;
if (this.isolate) {
this.isolate.enabled = isolated;
}
return;
}
}
break;
case ItemType.Range:
{
this.model = isObject(value) ? Object.assign({}, this.model, value) : {};
}
break;
case ItemType.Chips:
{
this.model = [];
}
break;
case ItemType.Date:
case ItemType.DateTime:
{
this.model = value;
}
break;
case ItemType.AutoCompleteChips:
{
if (Array.isArray(value)) {
this.model.push(...value);
}
else if (isObject(value)) {
this.model.push(value);
}
else {
this.model = [];
}
}
break;
default: {
this.model = value;
}
}
}
/**
* @param {?=} reload
* @return {?}
*/
loadValues(reload = true) {
if (reload || (!this.initialLoading && this.hasPendingValues)) {
this.initialLoading = true;
if (isFunction(this._configItem.values) &&
!this.isTypeAutocomplete() &&
!this.isTypeAutocompleteChips()) {
/** @type {?} */
const obj = this._configItem.values();
if (isObservable(obj)) {
// Clear out values so the interfaces go into a loading state
this.values = [];
obj
.pipe(take(1), takeUntil(this._config.destroy$))
.subscribe((/**
* @param {?} values
* @return {?}
*/
(values) => {
this.values = values;
this._pendingValues = false;
this.initialLoading = false;
this.validateModel();
}));
}
else {
this.values = obj;
}
}
}
}
/**
* @return {?}
*/
clear() {
this.valueChanged = false;
this.model = undefined;
this.selectedValue = '';
switch (this.type) {
case ItemType.AutoComplete:
{
this.model = null;
this.search = '';
}
break;
case ItemType.AutoCompleteChips:
case ItemType.Chips:
{
this.model = [];
this.search = '';
}
break;
case ItemType.Checkbox:
{
this.model = false;
}
break;
case ItemType.Select:
{
if (this.multiple) {
this.model = [];
}
else {
this.model = Array.isArray(this.values) && this.values.some((/**
* @param {?} val
* @return {?}
*/
(val) => val.value === '__all'))
? '__all'
: null;
}
if (this.isolate) {
this.isolate.enabled = false;
}
}
break;
case ItemType.Range:
{
this.model = {};
}
break;
case ItemType.Text:
case ItemType.Keyword:
{
this.model = '';
}
break;
case ItemType.Date:
case ItemType.DateTime:
{
this.model = null;
}
break;
}
}
/**
* @return {?}
*/
checkIfValueChanged() {
switch (this.type) {
case ItemType.AutoCompleteChips:
{
this.valueChanged = this.model && this.model.length;
}
break;
case ItemType.Checkbox:
{
this.valueChanged = this.model && this.model !== false;
}
break;
case ItemType.Select:
{
if (this.multiple) {
this.valueChanged = this.model && this.model.length;
}
else {
/** @type {?} */
const hasAllOption = Array.isArray(this.values) && this.values.some((/**
* @param {?} val
* @return {?}
*/
(val) => val.value === '__all'));
if (hasAllOption && this.model && this.model !== '__all') {
this.valueChanged = true;
}
else {
this.valueChanged = !!this.model;
}
}
}
break;
case ItemType.Range:
{
if (this.model && Object.keys(this.model).length > 0) {
this.valueChanged = true;
}
}
break;
case ItemType.Text:
case ItemType.Keyword:
{
this.valueChanged = this.model && this.model !== '';
}
break;
case ItemType.AutoComplete:
case ItemType.Date:
case ItemType.DateTime:
{
this.valueChanged = !!this.model;
}
break;
default: {
this.valueChanged = false;
}
}
}
/**
* @param {?} value
* @return {?}
*/
parseAndSetValue(value) {
if (value) {
if (this.isTypeDateRange() || this.isTypeDateTimeRange()) {
value.from = value.from ? toUTC(value.from) : null;
value.to = value.to ? toUTC(value.to) : null;
}
else if (this.isTypeDate() || this.isTypeDateTime()) {
if (!isDate(value) || !isValid(value)) {
value = parse(value, 'yyyy-MM-dd\'T\'HH:mm:ssxxxxx', new Date());
}
}
else if (this.isTypeCheckbox() && this.checked !== undefined) {
value = value == this.checked;
}
else if (this.isTypeSelect() && this.multiple) {
value = clone(value);
}
else if (this.isTypeSelect() || this.isTypeAutocomplete()) {
value = +value;
}
}
this.model = value;
}
/**
* @return {?}
*/
isTypeAutocomplete() {
return this.type === ItemType.AutoComplete;
}
/**
* @return {?}
*/
isTypeAutocompleteChips() {
return this.type === ItemType.AutoCompleteChips;
}
/**
* @return {?}
*/
isTypeChips() {
return this.type === ItemType.Chips;
}
/**
* @return {?}
*/
isTypeCheckbox() {
return this.type === ItemType.Checkbox;
}
/**
* @return {?}
*/
isTypeSelect() {
return this.type === ItemType.Select;
}
/**
* @return {?}
*/
isTypeDate() {
return this.type === ItemType.Date;
}
/**
* @return {?}
*/
isTypeDateRange() {
return this.type === ItemType.DateRange;
}
/**
* @return {?}
*/
isTypeDateTimeRange() {
return this.type === ItemType.DateTimeRange;
}
/**
* @return {?}
*/
isTypeDateTime() {
return this.type === ItemType.DateTime;
}
/**
* @return {?}
*/
sanitize() {
switch (this.type) {
case ItemType.Text:
case ItemType.Keyword:
{
//?????
}
break;
case ItemType.Select:
{
this.sanitizeSelect();
}
break;
case ItemType.Chips:
{
this.sanitizeChips();
}
break;
case ItemType.Range:
{
this.sanitizeRange();
}
break;
case ItemType.Checkbox:
{
this.sanitizeCheckbox();
}
break;
}
if (this.model === undefined) {
if (this.isTypeCheckbox()) {
this.model = this.checked == this.defaultValue;
}
else {
this.model = this.defaultValue;
}
}
if (this.model === undefined) {
if (this.isTypeCheckbox()) {
this.model = false;
}
else if (this.isTypeSelect()) {
if (this.multiple) {
if (!Array.isArray(this.defaultValue)) {
this.model = [];
}
}
else {
if (this.defaultValue === undefined) {
this.model = '__all';
}
}
}
else if (this.isTypeAutocompleteChips() || this.isTypeChips()) {
this.model = [];
}
}
}
/**
* @return {?}
*/
validateModel() {
if (this.isTypeSelect()) {
if (this.multiple) {
this.model = filter(this.model || [], (/**
* @param {?} item
* @return {?}
*/
(item) => {
return this.values.find((/**
* @param {?} value
* @return {?}
*/
value => {
return value.value === item;
}));
}));
}
else {
/** @type {?} */
const exists = this.modelValueExists(this.values);
if (!exists) {
this.model = '__all';
}
}
}
}
/**
* @private
* @param {?} values
* @return {?}
*/
modelValueExists(values) {
for (let i = 0; i < values.length; i++) {
if (values[i].value === this.model) {
return true;
}
if (values[i][this.children]) {
/** @type {?} */
const model = this.modelValueExists(values[i][this.children]);
if (model) {
return true;
}
}
}
return false;
}
/**
* @private
* @return {?}
*/
sanitizeSelect() {
if (!Array.isArray(this.values)) {
this.values = [];
}
if (this.isolate) {
for (const index in this.values) {
if (this.values.hasOwnProperty(index)) {
if (!this.values[index]) {
continue;
}
if (this.values[index].value == this.isolate.value) {
this.values.splice(index, 1);
}
}
}
if (Array.isArray(this.model)) {
if (this.model.length == this.values.length) {
this.model = null;
this.isolate.enabled = false;
}
else if (this.model[0] == this.isolate.value) {
this.isolate.enabled = true;
}
}
}
}
/**
* @private
* @return {?}
*/
sanitizeChips() {
if (!Array.isArray(this.values)) {
this.values = [];
}
if (this.model && Array.isArray(this.model) && this.values.length) {
if (Number.isInteger(this.model[0])) {
this.model = this.model.map((/**
* @param {?} id
* @return {?}
*/
(id) => {
return this.values.find((/**
* @param {?} value
* @return {?}
*/
(value) => value.value === id));
}));
}
}
}
/**
* @private
* @return {?}
*/
sanitizeCheckbox() {
this.checked = this.checked ? toString(this.checked) : true;
this.unchecked = this.unchecked ? toString(this.unchecked) : false;
this.defaultValue = this.defaultValue === undefined ? this.unchecked : toString(this.defaultValue);
}
/**
* @private
* @return {?}
*/
sanitizeRange() {
if (!this.placeholder) {
this.placeholder = ['Min', 'Max'];
}
if (!this.model) {
this.model = {};
}
}
}
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "name", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "type", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "label", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "chipLabel", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "children", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Boolean)
], FsFilterConfigItem.prototype, "multiple", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "groups", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Boolean)
], FsFilterConfigItem.prototype, "wait", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "query", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "values$", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "selectedValue", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "isolate", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "names", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Boolean)
], FsFilterConfigItem.prototype, "primary", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "search", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "unchecked", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "checked", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "alias", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "placeholder", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Function)
], FsFilterConfigItem.prototype, "change", void 0);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", String)
], FsFilterConfigItem.prototype, "prefix", void 0);
tslib_1.__decorate([
Alias('default'),
tslib_1.__metadata("design:type", Object)
], FsFilterConfigItem.prototype, "defaultValue", void 0);
if (false) {
/** @type {?} */
FsFilterConfigItem.prototype.name;
/** @type {?} */
FsFilterConfigItem.prototype.type;
/** @type {?} */
FsFilterConfigItem.prototype.label;
/** @type {?} */
FsFilterConfigItem.prototype.chipLabel;
/** @type {?} */
FsFilterConfigItem.prototype.children;
/** @type {?} */
FsFilterConfigItem.prototype.multiple;
/** @type {?} */
FsFilterConfigItem.prototype.groups;
/** @type {?} */
FsFilterConfigItem.prototype.wait;
/** @type {?} */
FsFilterConfigItem.prototype.query;
/** @type {?} */
FsFilterConfigItem.prototype.values$;
/** @type {?} */
FsFilterConfigItem.prototype.selectedValue;
/** @type {?} */
FsFilterConfigItem.prototype.isolate;
/** @type {?} */
FsFilterConfigItem.prototype.names;
/** @type {?} */
FsFilterConfigItem.prototype.primary;
/** @type {?} */
FsFilterConfigItem.prototype.search;
/** @type {?} */
FsFilterConfigItem.prototype.unchecked;
/** @type {?} */
FsFilterConfigItem.prototype.checked;
/** @type {?} */
FsFilterConfigItem.prototype.alias;
/** @type {?} */
FsFilterConfigItem.prototype.placeholder;
/** @type {?} */
FsFilterConfigItem.prototype.change;
/** @type {?} */
FsFilterConfigItem.prototype.prefix;
/** @type {?} */
FsFilterConfigItem.prototype.defaultValue;
/** @type {?} */
FsFilterConfigItem.prototype.initialLoading;
/** @type {?} */
FsFilterConfigItem.prototype.valueChanged;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._model;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._pendingValues;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._values;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._configItem;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._config;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._route;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._persists;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9maWx0ZXIvIiwic291cmNlcyI6WyJhcHAvbW9kZWxzL2ZpbHRlci1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0lBT2hELE1BQW9CLE1BQU07SUFDMUIsUUFBb0IsUUFBUTtJQUM1QixPQUFvQixPQUFPO0lBQzNCLE1BQW9CLE1BQU07SUFDMUIsVUFBb0IsVUFBVTtJQUM5QixXQUFvQixXQUFXO0lBQy9CLGVBQW9CLGVBQWU7SUFDbkMsY0FBb0IsY0FBYztJQUNsQyxtQkFBb0IsbUJBQW1CO0lBQ3ZDLFVBQW9CLFVBQVU7SUFDOUIsT0FBb0IsT0FBTztJQUMzQixTQUFvQixTQUFTOzs7QUFHL0IsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7Ozs7Ozs7SUFnQzNDLFlBQW9CLGNBQXVDLEVBQUUsRUFDekMsT0FBdUIsRUFDdkIsTUFBc0IsRUFDdEIsU0FBYztRQUNoQyxLQUFLLEVBQUUsQ0FBQztRQUpVLGdCQUFXLEdBQVgsV0FBVyxDQUE4QjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixjQUFTLEdB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QUFxQjs7Ozs7SUFFVCx5Q0FBaUQ7Ozs7O0lBQ2pELHFDQUErQjs7Ozs7SUFDL0Isb0NBQThCOzs7OztJQUM5Qix1Q0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0b1VUQyB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuXG5pbXBvcnQgeyBBbGlhcywgTW9kZWwgfSBmcm9tICd0c21vZGVscyc7XG5cbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvdXRpbC9pc09ic2VydmFibGUnO1xuXG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCwgdG9TdHJpbmcsIGNsb25lLCBmaWx0ZXIgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgaXNEYXRlLCBpc1ZhbGlkLCBwYXJzZSB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWcgfSBmcm9tICcuL2ZpbHRlci1jb25maWcnO1xuaW1wb3J0IHsgSUZpbHRlckNvbmZpZ0l0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2l0ZW0tY29uZmlnLmludGVyZmFjZSc7XG5cblxuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICBUZXh0ICAgICAgICAgICAgICA9ICd0ZXh0JyxcbiAgU2VsZWN0ICAgICAgICAgICAgPSAnc2VsZWN0JyxcbiAgUmFuZ2UgICAgICAgICAgICAgPSAncmFuZ2UnLFxuICBEYXRlICAgICAgICAgICAgICA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgICAgICAgICAgPSAnZGF0ZXRpbWUnLFxuICBEYXRlUmFuZ2UgICAgICAgICA9ICdkYXRlcmFuZ2UnLFxuICBEYXRlVGltZVJhbmdlICAgICA9ICdkYXRldGltZXJhbmdlJyxcbiAgQXV0b0NvbXBsZXRlICAgICAgPSAnYXV0b2NvbXBsZXRlJyxcbiAgQXV0b0NvbXBsZXRlQ2hpcHMgPSAnYXV0b2NvbXBsZXRlY2hpcHMnLFxuICBDaGVja2JveCAgICAgICAgICA9ICdjaGVja2JveCcsXG4gIENoaXBzICAgICAgICAgICAgID0gJ2NoaXBzJyxcbiAgS2V5d29yZCAgICAgICAgICAgPSAna2V5d29yZCcsXG59XG5cbmV4cG9ydCBjbGFzcyBGc0ZpbHRlckNvbmZpZ0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG5cbiAgQEFsaWFzKCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIHR5cGU6IEl0ZW1UeXBlO1xuICBAQWxpYXMoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIGNoaXBMYWJlbDogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hpbGRyZW46IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIG11bHRpcGxlOiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgZ3JvdXBzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyB3YWl0OiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgcXVlcnk6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIHZhbHVlcyQ6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIHNlbGVjdGVkVmFsdWU6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIGlzb2xhdGU6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIG5hbWVzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBwcmltYXJ5OiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgc2VhcmNoOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyB1bmNoZWNrZWQ6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIGNoZWNrZWQ6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIGFsaWFzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBwbGFjZWhvbGRlcjogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgY2hhbmdlOiBGdW5jdGlvbjtcbiAgQEFsaWFzKCkgcHVibGljIHByZWZpeDogc3RyaW5nO1xuICBAQWxpYXMoJ2RlZmF1bHQnKSBwdWJsaWMgZGVmYXVsdFZhbHVlOiBhbnk7XG5cbiAgcHVibGljIGluaXRpYWxMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyB2YWx1ZUNoYW5nZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9tb2RlbDogYW55O1xuICBwcml2YXRlIF9wZW5kaW5nVmFsdWVzID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZhbHVlczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbmZpZ0l0ZW06IElGaWx0ZXJDb25maWdJdGVtIHwgYW55ID0ge30sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcGVyc2lzdHM6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZnJvbUpTT04oX2NvbmZpZ0l0ZW0pO1xuICB9XG5cbiAgZ2V0IGhhc1BlbmRpbmdWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdWYWx1ZXM7XG4gIH1cblxuICBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgc2V0IG1vZGVsKHZhbCkge1xuICAgIHRoaXMuX21vZGVsID0gdmFsO1xuICAgIHRoaXMuY2hlY2tJZlZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgc2V0IHZhbHVlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgdGhpcy5zYW5pdGl6ZSgpO1xuICB9XG5cbiAgZ2V0IHZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIF9mcm9tSlNPTihkYXRhKSB7XG4gICAgc3VwZXIuX2Zyb21KU09OKGRhdGEpO1xuXG4gICAgaWYgKHRoaXMubmFtZSAmJiBpc09iamVjdCh0aGlzLm5hbWUpKSB7XG4gICAgICB0aGlzLm5hbWVzID0gdGhpcy5uYW1lO1xuICAgICAgdGhpcy5uYW1lID0gT2JqZWN0LmtleXModGhpcy5uYW1lcykuam9pbignLScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcucGVyc2lzdCkge1xuICAgICAgY29uc3QgcGVyc2lzdGVkID0gdGhpcy5fcGVyc2lzdHNbdGhpcy5fY29uZmlnLnBlcnNpc3QubmFtZV0uZGF0YTtcblxuICAgICAgaWYgKHBlcnNpc3RlZFt0aGlzLm5hbWVdKSB7XG4gICAgICAgIHRoaXMucGFyc2VBbmRTZXRWYWx1ZShwZXJzaXN0ZWRbdGhpcy5uYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zYW5pdGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXRWYWx1ZXMoKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odGhpcy5fY29uZmlnSXRlbS52YWx1ZXMpICYmXG4gICAgICAgICF0aGlzLmlzVHlwZUF1dG9jb21wbGV0ZSgpICYmXG4gICAgICAgICF0aGlzLmlzVHlwZUF1dG9jb21wbGV0ZUNoaXBzKCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NvbmZpZ0l0ZW0udmFsdWVzKCk7XG5cbiAgICAgIHRoaXMudmFsdWVzID0gb2JqO1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShvYmopKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHRoaXMuX2NvbmZpZ0l0ZW0udmFsdWVzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIEl0ZW1UeXBlLlNlbGVjdDoge1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ19fYWxsJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWVFeGlzdHMgPSBudWxsO1xuICAgICAgICBsZXQgaXNvbGF0ZWQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgaXNvbGF0ZWQgPSB0aGlzLmlzb2xhdGUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbMF0gPT09IHRoaXMuaXNvbGF0ZS52YWx1ZTtcblxuICAgICAgICAgIHZhbHVlRXhpc3RzID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlcylcbiAgICAgICAgICAgID8gdmFsdWUuZXZlcnkoKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5maW5kKCh2YWx1ZUl0ZW0pID0+IHZhbHVlSXRlbS52YWx1ZSA9PT0gdmFsKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB8fCBpc29sYXRlZFxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZUV4aXN0cyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZXMpXG4gICAgICAgICAgICA/IHRoaXMudmFsdWVzLnNvbWUoKHZhbHVlSXRlbSkgPT4gdmFsdWVJdGVtLnZhbHVlID09PSB2YWx1ZSlcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWVFeGlzdHMpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsID0gdmFsdWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5pc29sYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmlzb2xhdGUuZW5hYmxlZCA9IGlzb2xhdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgSXRlbVR5cGUuUmFuZ2U6IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IGlzT2JqZWN0KHZhbHVlKSA/IHsgLi4udGhpcy5tb2RlbCwgLi4udmFsdWUgfSA6IHt9O1xuICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBJdGVtVHlwZS5DaGlwczoge1xuICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIEl0ZW1UeXBlLkRhdGU6IGNhc2UgSXRlbVR5cGUuRGF0ZVRpbWU6IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHZhbHVlO1xuICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwczoge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsLnB1c2goLi4udmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMubW9kZWwucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbG9hZFZhbHVlcyhyZWxvYWQgPSB0cnVlKSB7XG4gICAgaWYgKHJlbG9hZCB8fCAoIXRoaXMuaW5pdGlhbExvYWRpbmcgJiYgdGhpcy5oYXNQZW5kaW5nVmFsdWVzKSkge1xuICAgICAgdGhpcy5pbml0aWFsTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2NvbmZpZ0l0ZW0udmFs