verben-ng-ui 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/data-export/data-export.component.mjs +1 -1
- package/esm2022/lib/components/data-filter/data-filter.component.mjs +1 -1
- package/esm2022/lib/components/data-table/data-table.component.mjs +3 -3
- package/esm2022/lib/components/data-xport/data-xport.component.mjs +1 -1
- package/esm2022/lib/components/date-picker/date-picker.component.mjs +1 -1
- package/esm2022/lib/components/drop-down/drop-down-item/drop-down-item.component.mjs +12 -4
- package/esm2022/lib/components/drop-down/drop-down.component.mjs +13 -4
- package/esm2022/lib/components/table-filter/table-filter.component.mjs +1 -1
- package/fesm2022/verben-ng-ui.mjs +30 -13
- package/fesm2022/verben-ng-ui.mjs.map +1 -1
- package/lib/components/data-table/data-table.component.d.ts +4 -2
- package/lib/components/drop-down/drop-down-item/drop-down-item.component.d.ts +2 -1
- package/lib/components/drop-down/drop-down.component.d.ts +2 -1
- package/package.json +1 -1
|
@@ -192,7 +192,7 @@ export class DataExportComponent {
|
|
|
192
192
|
this.showAllGroups = !this.showAllGroups;
|
|
193
193
|
}
|
|
194
194
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataExportComponent, deps: [{ token: i1.DataExportService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
195
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataExportComponent, selector: "lib-data-export", inputs: { columns: "columns", data: "data" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n <div class=\"operation-grid\">\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select field\"\n [options]=\"numericProperties.concat(stringProperties)\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n [(ngModel)]=\"newOperation.operator\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
195
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataExportComponent, selector: "lib-data-export", inputs: { columns: "columns", data: "data" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n <div class=\"operation-grid\">\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select field\"\n [options]=\"numericProperties.concat(stringProperties)\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n [(ngModel)]=\"newOperation.operator\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
196
196
|
}
|
|
197
197
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataExportComponent, decorators: [{
|
|
198
198
|
type: Component,
|
|
@@ -134,7 +134,7 @@ export class DataFilterComponent {
|
|
|
134
134
|
return this.savedFilters.filter((filter) => filter.selected).length;
|
|
135
135
|
}
|
|
136
136
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
137
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data" }, outputs: { filterApplied: "filterApplied" }, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div *ngFor=\"let filter of visibleFilters\" class=\"item\">\n <div class=\"item-label\">\n <input type=\"checkbox\" [(ngModel)]=\"filter.selected\" />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeholder=\"Select date\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeholder=\"Enter number\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchCase=\"'string'\"\n type=\"text\"\n placeholder=\"Enter text\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <button class=\"add-button ml-auto\" (click)=\"addFilter()\">+ Add</button>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}sup{color:#3479e9}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
|
|
137
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data" }, outputs: { filterApplied: "filterApplied" }, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div *ngFor=\"let filter of visibleFilters\" class=\"item\">\n <div class=\"item-label\">\n <input type=\"checkbox\" [(ngModel)]=\"filter.selected\" />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeholder=\"Select date\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeholder=\"Enter number\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchCase=\"'string'\"\n type=\"text\"\n placeholder=\"Enter text\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <button class=\"add-button ml-auto\" (click)=\"addFilter()\">+ Add</button>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}sup{color:#3479e9}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
|
|
138
138
|
}
|
|
139
139
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataFilterComponent, decorators: [{
|
|
140
140
|
type: Component,
|
|
@@ -6,7 +6,7 @@ export class DataTableComponent {
|
|
|
6
6
|
// Modify data input to use grouped data
|
|
7
7
|
data = input.required();
|
|
8
8
|
columns = input.required();
|
|
9
|
-
dataKey = input
|
|
9
|
+
dataKey = input('Id'); // New required input for unique identifier
|
|
10
10
|
// @Input({ required: true })
|
|
11
11
|
// set data(value: T[]) {
|
|
12
12
|
// this._data = value;
|
|
@@ -367,7 +367,7 @@ export class DataTableComponent {
|
|
|
367
367
|
return cellStyle;
|
|
368
368
|
}
|
|
369
369
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
370
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired:
|
|
370
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track dataKey(); let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
371
371
|
}
|
|
372
372
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataTableComponent, decorators: [{
|
|
373
373
|
type: Component,
|
|
@@ -428,4 +428,4 @@ const defaultTableStyles = {
|
|
|
428
428
|
borderTop: '2px solid #e0e0e0',
|
|
429
429
|
},
|
|
430
430
|
};
|
|
431
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFHTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFTckQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3Qix3Q0FBd0M7SUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQztJQUM3QixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBeUIsQ0FBQztJQUNsRCxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDLENBQUMsMkNBQTJDO0lBQ2hGLDZCQUE2QjtJQUM3Qix5QkFBeUI7SUFDekIsd0JBQXdCO0lBQ3hCLElBQUk7SUFDSixvQkFBb0I7SUFDcEIsK0JBQStCO0lBQy9CLElBQUk7SUFDSiwyQkFBMkI7SUFDM0IsdUNBQXVDO0lBQ3ZDLDZCQUE2QjtJQUM3Qiw4Q0FBOEM7SUFDOUMsbUNBQW1DO0lBQ25DLElBQUk7SUFDSiwwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssRUFBK0IsQ0FBQztJQUV0QyxXQUFXLEdBQWdCLGtCQUFrQixDQUFDO0lBR3ZELGVBQWUsQ0FBOEI7SUFFbkMsT0FBTyxHQUFHLElB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TUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07O0FBbWFULGlCQUFpQjtBQUNqQixNQUFNLGtCQUFrQixHQUFnQjtJQUN0QyxNQUFNLEVBQUUsbUJBQW1CO0lBQzNCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFNBQVMsRUFBRSwyQkFBMkI7SUFDdEMsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUU7UUFDTixlQUFlLEVBQUUsU0FBUztRQUMxQixVQUFVLEVBQUUsTUFBTTtRQUNsQixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLFlBQVksRUFBRSxtQkFBbUI7S0FDbEM7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixlQUFlLEVBQUUsU0FBUztTQUMzQjtRQUNELEdBQUcsRUFBRTtZQUNILGVBQWUsRUFBRSxTQUFTO1NBQzNCO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUU7Z0JBQ0wsZUFBZSxFQUFFLFNBQVM7YUFDM0I7U0FDRjtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLFdBQVc7UUFDcEIsWUFBWSxFQUFFLG1CQUFtQjtLQUNsQztJQUNELE1BQU0sRUFBRTtRQUNOLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLE1BQU07UUFDakIsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGlucHV0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24sIEdyb3VwZWREYXRhUm93IH0gZnJvbSAnLi9kYXRhLXRhYmxlLnR5cGVzJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCYXNlU3R5bGVzLCBUYWJsZVN0eWxlcyB9IGZyb20gJy4vc3R5bGUudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuICAvLyBNb2RpZnkgZGF0YSBpbnB1dCB0byB1c2UgZ3JvdXBlZCBkYXRhXG4gIGRhdGEgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG4gIGNvbHVtbnMgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+KCk7XG4gIGRhdGFLZXkgPSBpbnB1dC5yZXF1aXJlZDxrZXlvZiBUPigpOyAvLyBOZXcgcmVxdWlyZWQgaW5wdXQgZm9yIHVuaXF1ZSBpZGVudGlmaWVyXG4gIC8vIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIC8vIHNldCBkYXRhKHZhbHVlOiBUW10pIHtcbiAgLy8gICB0aGlzLl9kYXRhID0gdmFsdWU7XG4gIC8vIH1cbiAgLy8gZ2V0IGRhdGEoKTogVFtdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5ncm91cGVkRGF0YSgpO1xuICAvLyB9XG4gIC8vIHByaXZhdGUgX2RhdGE6IFRbXSA9IFtdO1xuICAvLyBNb2RpZnkgY29sdW1ucyBpbnB1dCB0byB1c2UgYSBzaWduYWxcbiAgLy8gQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgLy8gc2V0IGNvbHVtbnModmFsdWU6IENvbHVtbkRlZmluaXRpb248VD5bXSkge1xuICAvLyAgIHRoaXMuY29sdW1uc1NpZ25hbC5zZXQodmFsdWUpO1xuICAvLyB9XG4gIC8vIE5ldyBpbnB1dHMgZm9yIGdyb3VwaW5nXG4gIGdyb3VwQnkgPSBpbnB1dDxrZXlvZiBUIHwgKChyb3c6IFQpID0+IGFueSk+KCk7XG5cbiAgQElucHV0KCkgc3R5bGVDb25maWc6IFRhYmxlU3R5bGVzID0gZGVmYXVsdFRhYmxlU3R5bGVzO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQ29sdW1uRGlyZWN0aXZlKVxuICBjb2x1bW5UZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8Q29sdW1uRGlyZWN0aXZlPjtcblxuICBAT3V0cHV0KCkgcm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJvd1NhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICBwcml2YXRlIGVkaXRpbmdSb3dzU2lnbmFsID0gc2lnbmFsPFNldDxzdHJpbmcgfCBudW1iZXI+PihuZXcgU2V0KCkpO1xuICBwcml2YXRlIHNlbGVjdGVkUm93c1NpZ25hbCA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcbiAgcHJpdmF0ZSBlZGl0ZWREYXRhU2lnbmFsID0gc2lnbmFsPE1hcDxzdHJpbmcgfCBudW1iZXIsIEVkaXRlZERhdGE8VD4+PihcbiAgICBuZXcgTWFwKClcbiAgKTtcblxuICBjb2x1bW5zU2lnbmFsOiBXcml0YWJsZVNpZ25hbDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+ID0gc2lnbmFsKFtdKTtcblxuICBoYXNGb290ZXIgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuY29sdW1uc1NpZ25hbCgpLnNvbWUoKGNvbCkgPT4gY29sLmZvb3RlclRlbXBsYXRlICE9PSB1bmRlZmluZWQpXG4gICk7XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcm93XG4gIGdldFJvd0lkKHJvdzogVCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5kYXRhS2V5KCk7XG4gICAgY29uc3QgdmFsdWUgPSByb3dba2V5XTtcblxuICAgIC8vIENvbnZlcnQgdG8gc3RyaW5nIG9yIG51bWJlciBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHN0cmluZ2lmeVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuXG4gIC8vIFR5cGUgZ3VhcmQgbWV0aG9kIHRvIGNoZWNrIGZvciBncm91cCByb3dzXG4gIGlzR3JvdXBSb3cocm93OiBUKTogcm93IGlzIFQgJiB7IGlzR3JvdXBSb3c6IHRydWU7IGdyb3VwVGl0bGU6IGFueSB9IHtcbiAgICByZXR1cm4gISEocm93IGFzIGFueSkuaXNHcm91cFJvdztcbiAgfVxuXG4gIC8vIENvbXB1dGVkIHByb3BlcnR5IGZvciBncm91cGVkIGRhdGFcblxuICBncm91cGVkRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZ3JvdXBCeSgpKSByZXR1cm4gdGhpcy5kYXRhKCkgYXMgR3JvdXBlZERhdGFSb3c8VD5bXTtcblxuICAgIGNvbnN0IGdldEdyb3VwVmFsdWUgPVxuICAgICAgdHlwZW9mIHRoaXMuZ3JvdXBCeSgpID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHRoaXMuZ3JvdXBCeSgpIGFzIChyb3c6IFQpID0+IGFueSlcbiAgICAgICAgOiAocm93OiBUKSA9PiByb3dbdGhpcy5ncm91cEJ5KCkgYXMga2V5b2YgVF07XG5cbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPGFueSwgVFtdPigpO1xuXG4gICAgdGhpcy5kYXRhKCkuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBpZiAoZ2V0R3JvdXBWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwVmFsdWUgPSBnZXRHcm91cFZhbHVlKHJvdyk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nR3JvdXAgPSBncm91cHMuZ2V0KGdyb3VwVmFsdWUpIHx8IFtdO1xuICAgICAgICBncm91cHMuc2V0KGdyb3VwVmFsdWUsIFsuLi5leGlzdGluZ0dyb3VwLCByb3ddKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGdyb3VwZWREYXRhQXJyYXk6IEdyb3VwZWREYXRhUm93PFQ+W10gPSBbXTtcblxuICAgIGdyb3Vwcy5mb3JFYWNoKChncm91cFJvd3MsIGdyb3VwVmFsdWUpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBncm91cCBoZWFkZXIgcm93XG4gICAgICBjb25zdCBncm91cFJvdzogR3JvdXBlZERhdGFSb3c8VD4gPSB7XG4gICAgICAgIC4uLih7fSBhcyBUKSwgLy8gQ3JlYXRlIGVtcHR5IG9iamVjdCBvZiB0eXBlIFQgYXMgYmFzZVxuICAgICAgICBbdGhpcy5kYXRhS2V5KCldOiBgZ3JvdXAtJHtncm91cFZhbHVlfWAsXG4gICAgICAgIGlzR3JvdXBSb3c6IHRydWUsXG4gICAgICAgIGdyb3VwVmFsdWUsXG4gICAgICAgIGdyb3VwVGl0bGU6IGdyb3VwVmFsdWUsXG4gICAgICB9O1xuXG4gICAgICBncm91cGVkRGF0YUFycmF5LnB1c2goZ3JvdXBSb3cpO1xuICAgICAgLy8gQWRkIHJlZ3VsYXIgcm93cyB3aXRoIHRoZSBvcHRpb25hbCBpc0dyb3VwUm93IHByb3BlcnR5ICh1bmRlZmluZWQgYnkgZGVmYXVsdClcbiAgICAgIGdyb3VwZWREYXRhQXJyYXkucHVzaCguLi4oZ3JvdXBSb3dzIGFzIEdyb3VwZWREYXRhUm93PFQ+W10pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cGVkRGF0YUFycmF5O1xuICB9KTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBTZXQgaW5pdGlhbCBjb2x1bW5zIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgIGlmICh0aGlzLmNvbHVtbnNTaWduYWwoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY29sdW1uc1NpZ25hbC5zZXQodGhpcy5jb2x1bW5zKCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmNvbHVtblRlbXBsYXRlcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLm1lcmdlQ29sdW1uVGVtcGxhdGVzKCkpO1xuICAgIHRoaXMubWVyZ2VDb2x1bW5UZW1wbGF0ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDb2x1bW5UZW1wbGF0ZXMoKSB7XG4gICAgLy8gT25seSBtZXJnZSBpZiB3ZSBoYXZlIGJvdGggY29sdW1ucyBhbmQgdGVtcGxhdGVzXG4gICAgaWYgKHRoaXMuY29sdW1uc1NpZ25hbCgpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zU2lnbmFsKCkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IHRoaXMuY29sdW1uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgICAgKHQpID0+IHQuY29sdW1uSWQgPT09IGNvbHVtbi5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuY2VsbFRlbXBsYXRlLFxuICAgICAgICAgICAgY2VsbEVkaXRUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsRWRpdFRlbXBsYXRlLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5mb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29sdW1uc1NpZ25hbC5zZXQodXBkYXRlZENvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIGdldENlbGxWYWx1ZSA9IChyb3c6IFQsIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPik6IGFueSA9PiB7XG4gICAgLy8gRm9yIGdyb3VwIHJvd3MsIHJldHVybiB0aGUgZ3JvdXAgdGl0bGUgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuaXNHcm91cFJvdyhyb3cpKSB7XG4gICAgICByZXR1cm4gKHJvdyBhcyBhbnkpLmdyb3VwVGl0bGU7XG4gICAgfVxuXG4gICAgLy8gRXhpc3RpbmcgbG9naWMgZm9yIG5vcm1hbCByb3dzXG4gICAgaWYgKGNvbHVtbi5hY2Nlc3NvcktleSkge1xuICAgICAgcmV0dXJuIChyb3cgYXMgYW55KVtjb2x1bW4uYWNjZXNzb3JLZXldO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uLmFjY2Vzc29yRm4gPyBjb2x1bW4uYWNjZXNzb3JGbihyb3cpIDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIGlzUm93RWRpdGluZyA9IChyb3c6IFQpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nUm93c1NpZ25hbCgpLmhhcyh0aGlzLmdldFJvd0lkKHJvdykpO1xuICB9O1xuXG4gIHRvZ2dsZVJvd0VkaXQgPSAocm93OiBUKSA9PiB7XG4gICAgdGhpcy5lZGl0aW5nUm93c1NpZ25hbC51cGRhdGUoKHNldCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChzZXQpO1xuICAgICAgaWYgKG5ld1NldC5oYXModGhpcy5nZXRSb3dJZChyb3cpKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHRoaXMuZ2V0Um93SWQocm93KSk7XG4gICAgICAgIC8vIHRoaXMuc2F2ZVJvdyh0aGlzLmdldFJvd0lkKHJvdykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U2V0LmFkZCh0aGlzLmdldFJvd0lkKHJvdykpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVFZGl0ZWREYXRhKHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUVkaXRlZERhdGEocm93OiBUKSB7XG4gICAgY29uc3Qgcm93SWQgPSB0aGlzLmdldFJvd0lkKHJvdyk7XG4gICAgdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICBuZXdNYXAuc2V0KHJvd0lkLCB7IC4uLnJvdyB9KTtcbiAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgfSk7XG4gIH1cblxuICAvLyBwcml2YXRlIHNhdmVSb3cocm93SWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAvLyAgIGNvbnN0IGVkaXRlZERhdGEgPSB0aGlzLmVkaXRlZERhdGFTaWduYWwoKS5nZXQocm93SWQpO1xuICAvLyAgIGlmIChlZGl0ZWREYXRhKSB7XG4gIC8vICAgICBjb25zdCBvcmlnaW5hbFJvd0luZGV4ID0gdGhpcy5kYXRhKCkuZmluZEluZGV4KChyKSA9PiByLmlkID09PSByb3dJZCk7XG4gIC8vICAgICBpZiAob3JpZ2luYWxSb3dJbmRleCAhPT0gLTEpIHtcbiAgLy8gICAgICAgY29uc3QgdXBkYXRlZFJvdyA9IHsgLi4udGhpcy5kYXRhKClbb3JpZ2luYWxSb3dJbmRleF0sIC4uLmVkaXRlZERhdGEgfTtcbiAgLy8gICAgICAgdGhpcy5kYXRhKClbb3JpZ2luYWxSb3dJbmRleF0gPSB1cGRhdGVkUm93O1xuICAvLyAgICAgICB0aGlzLnJvd1NhdmUuZW1pdCh1cGRhdGVkUm93KTtcbiAgLy8gICAgICAgdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gIC8vICAgICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAvLyAgICAgICAgIG5ld01hcC5kZWxldGUocm93SWQpO1xuICAvLyAgICAgICAgIHJldHVybiBuZXdNYXA7XG4gIC8vICAgICAgIH0pO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGlzUm93U2VsZWN0ZWQgPSAocm93SWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbCgpLmhhcyhyb3dJZCk7XG4gIH07XG5cbiAgdG9nZ2xlUm93U2VsZWN0aW9uID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbC51cGRhdGUoKHNldCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChzZXQpO1xuICAgICAgaWYgKG5ld1NldC5oYXMocm93SWQpKSB7XG4gICAgICAgIG5ld1NldC5kZWxldGUocm93SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U2V0LmFkZChyb3dJZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIHJldHVybiBuZXdTZXQ7XG4gICAgfSk7XG4gIH07XG5cbiAgYWxsUm93c1NlbGVjdGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG5vbkdyb3VwUm93cyA9IHRoaXMuZGF0YSgpLmZpbHRlcigocm93KSA9PiAhdGhpcy5pc0dyb3VwUm93KHJvdykpO1xuICAgIHJldHVybiAoXG4gICAgICBub25Hcm91cFJvd3MubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplID09PSBub25Hcm91cFJvd3MubGVuZ3RoXG4gICAgKTtcbiAgfTtcblxuICBzb21lUm93c1NlbGVjdGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG5vbkdyb3VwUm93cyA9IHRoaXMuZGF0YSgpLmZpbHRlcigocm93KSA9PiAhdGhpcy5pc0dyb3VwUm93KHJvdykpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbCgpLnNpemUgPiAwICYmXG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbCgpLnNpemUgPCBub25Hcm91cFJvd3MubGVuZ3RoXG4gICAgKTtcbiAgfTtcblxuICB0b2dnbGVBbGxSb3dzID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmFsbFJvd3NTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbC5zZXQobmV3IFNldCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9uR3JvdXBSb3dzID0gdGhpcy5kYXRhKCkuZmlsdGVyKChyb3cpID0+ICF0aGlzLmlzR3JvdXBSb3cocm93KSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbC5zZXQoXG4gICAgICAgIG5ldyBTZXQobm9uR3JvdXBSb3dzLm1hcCgocm93KSA9PiB0aGlzLmdldFJvd0lkKHJvdykpKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZGF0YSgpLmZpbHRlcigocm93KSA9PlxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5oYXModGhpcy5nZXRSb3dJZChyb3cpKVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ29udGV4dChjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXG4gICAgICBjb2x1bW4sXG4gICAgICBhbGxSb3dzU2VsZWN0ZWQ6IHRoaXMuYWxsUm93c1NlbGVjdGVkLFxuICAgICAgc29tZVJvd3NTZWxlY3RlZDogdGhpcy5zb21lUm93c1NlbGVjdGVkLFxuICAgICAgdG9nZ2xlQWxsUm93czogdGhpcy50b2dnbGVBbGxSb3dzLFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVFZGl0ZWRWYWx1ZShyb3dJZDogc3RyaW5nIHwgbnVtYmVyLCBjb2x1bW5JZDoga2V5b2YgVCwgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93RGF0YSwgW2NvbHVtbklkXTogdmFsdWUgfSk7XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkVmFsdWVGbihcbiAgICByb3dJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHZhbHVlRm46ICh2YWx1ZTogYW55KSA9PiBULFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICBjb25zdCByb3dEYXRhID0gbmV3TWFwLmdldChyb3dJZCkgfHwgKHt9IGFzIEVkaXRlZERhdGE8VD4pO1xuICAgICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3dEYXRhLCAuLi52YWx1ZUZuKHZhbHVlKSB9KTtcbiAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVFZGl0ZWREYXRhKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIsIGRhdGE6IFBhcnRpYWw8VD4pIHtcbiAgICB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgICBuZXdNYXAuc2V0KHJvd0lkLCB7IC4uLnJvd0RhdGEsIC4uLmRhdGEgfSk7XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTmVzdGVkRWRpdGVkVmFsdWUoXG4gICAgcm93SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBjb2x1bW5JZDoga2V5b2YgVCxcbiAgICBuZXN0ZWRGaWVsZDogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICBjb25zdCByb3dEYXRhID0gbmV3TWFwLmdldChyb3dJZCkgfHwgKHt9IGFzIEVkaXRlZERhdGE8VD4pO1xuICAgICAgY29uc3QgY29sdW1uRGF0YSA9IChyb3dEYXRhW2NvbHVtbklkXSBhcyBhbnkpIHx8IHt9O1xuICAgICAgbmV3TWFwLnNldChyb3dJZCwge1xuICAgICAgICAuLi5yb3dEYXRhLFxuICAgICAgICBbY29sdW1uSWRdOiB7XG4gICAgICAgICAgLi4uY29sdW1uRGF0YSxcbiAgICAgICAgICBbbmVzdGVkRmllbGRdOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENlbGxDb250ZXh0KHJvdzogVCwgY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+LCByb3dJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93SWQgPSB0aGlzLmdldFJvd0lkKHJvdyk7XG4gICAgY29uc3QgaXNFZGl0aW5nID0gdGhpcy5pc1Jvd0VkaXRpbmcocm93KTtcbiAgICBjb25zdCBlZGl0ZWREYXRhID0gdGhpcy5lZGl0ZWREYXRhU2lnbmFsKCkuZ2V0KHJvd0lkKTtcblxuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIGlmIChpc0VkaXRpbmcgJiYgZWRpdGVkRGF0YSAmJiBjb2x1bW4uaWQgaW4gZWRpdGVkRGF0YSkge1xuICAgICAgdmFsdWUgPSBlZGl0ZWREYXRhW2NvbHVtbi5pZCBhcyBrZXlvZiBUXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0aGlzLmdldENlbGxWYWx1ZShyb3csIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdmFsdWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHJvdyxcbiAgICAgIGNvbHVtbixcbiAgICAgIHJvd0luZGV4LFxuICAgICAgaXNFZGl0aW5nLFxuICAgICAgaXNTZWxlY3RlZDogdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lkKSxcbiAgICAgIHRvZ2dsZVJvd1NlbGVjdGlvbjogKCkgPT4gdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQpLFxuICAgICAgdG9nZ2xlUm93RWRpdDogKCkgPT4gdGhpcy50b2dnbGVSb3dFZGl0KHJvdyksXG4gICAgICBkZWxldGVSb3c6ICgpID0+IHRoaXMuZGVsZXRlUm93KHJvd0lkKSxcbiAgICAgIHVwZGF0ZVZhbHVlOiAobmV3VmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRWYWx1ZShyb3dJZCwgY29sdW1uLmlkIGFzIGtleW9mIFQsIG5ld1ZhbHVlKSxcbiAgICAgIHVwZGF0ZU5lc3RlZFZhbHVlOiAobmVzdGVkRmllbGQ6IHN0cmluZywgbmV3VmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVOZXN0ZWRFZGl0ZWRWYWx1ZShcbiAgICAgICAgICByb3dJZCxcbiAgICAgICAgICBjb2x1bW4uaWQgYXMga2V5b2YgVCxcbiAgICAgICAgICBuZXN0ZWRGaWVsZCxcbiAgICAgICAgICBuZXdWYWx1ZVxuICAgICAgICApLFxuXG4gICAgICB1cGRhdGVWYWx1ZUZuOiAodmFsdWVGbjogKHZhbHVlOiBhbnkpID0+IFQsIG5ld1ZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkVmFsdWVGbihyb3dJZCwgdmFsdWVGbiwgbmV3VmFsdWUpLFxuICAgICAgdXBkYXRlRGF0YTogKG5ld0RhdGE6IFBhcnRpYWw8VD4pID0+XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkRGF0YShyb3dJZCwgbmV3RGF0YSksXG4gICAgfTtcbiAgfVxuXG4gIGRlbGV0ZVJvdyA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm93VG9EZWxldGUgPSB0aGlzLmRhdGEoKS5maW5kKChyb3cpID0+IHRoaXMuZ2V0Um93SWQocm93KSA9PT0gcm93SWQpO1xuICAgIGlmIChyb3dUb0RlbGV0ZSkge1xuICAgICAgdGhpcy5yb3dEZWxldGUuZW1pdChyb3dUb0RlbGV0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGdldEZvb3RlckNvbnRleHQoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogY29sdW1uLFxuICAgICAgY29sdW1uLFxuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgIH07XG4gIH1cblxuICBnZXRUYWJsZVN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0eWxlQ29uZmlnLmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdGhpcy5zdHlsZUNvbmZpZy5mb250U2l6ZSxcbiAgICAgIHdoaXRlU3BhY2U6IHRoaXMuc3R5bGVDb25maWcud2hpdGVTcGFjZSxcbiAgICAgIG1hcmdpbjogdGhpcy5zdHlsZUNvbmZpZy5tYXJnaW4sXG4gICAgICBib3JkZXI6IHRoaXMuc3R5bGVDb25maWcuYm9yZGVyLFxuICAgICAgYm9yZGVyQ29sbGFwc2U6IHRoaXMuc3R5bGVDb25maWcuYm9yZGVyQ29sbGFwc2UsXG4gICAgICBib3JkZXJTcGFjaW5nOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlclNwYWNpbmcsXG4gICAgICB0YWJsZUxheW91dDogdGhpcy5zdHlsZUNvbmZpZy50YWJsZUxheW91dCxcbiAgICAgIHdpZHRoOiB0aGlzLnN0eWxlQ29uZmlnLndpZHRoLFxuICAgIH07XG4gIH1cblxuICBnZXRIZWFkZXJTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmhlYWRlcixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnN0eWxlQ29uZmlnLmhlYWRlcj8uc3RpY2t5VG9wID8gJ3N0aWNreScgOiAnc3RhdGljJyxcbiAgICAgIHRvcDogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnN0aWNreVRvcCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIGdldEZvb3RlclN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcuZm9vdGVyLFxuICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuZm9vdGVyPy5zdGlja3lCb3R0b20gPyAnc3RpY2t5JyA6ICdzdGF0aWMnLFxuICAgICAgYm90dG9tOiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uc3RpY2t5Qm90dG9tID8gJzAnIDogJ2F1dG8nLFxuICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uekluZGV4IHx8ICdhdXRvJyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0Um93U3R5bGUocm93SW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3Qgcm93U3R5bGVzID0gdGhpcy5zdHlsZUNvbmZpZy5yb3dzO1xuICAgIGlmIChyb3dTdHlsZXMgJiYgJ2V2ZW4nIGluIHJvd1N0eWxlcyAmJiAnb2RkJyBpbiByb3dTdHlsZXMpIHtcbiAgICAgIHJldHVybiByb3dJbmRleCAlIDIgPT09IDAgPyByb3dTdHlsZXMuZXZlbiA6IHJvd1N0eWxlcy5vZGQ7XG4gICAgfSBlbHNlIGlmIChyb3dTdHlsZXMgJiYgJ250aCcgaW4gcm93U3R5bGVzICYmIHJvd1N0eWxlcy5udGgpIHtcbiAgICAgIGNvbnN0IHsgaW50ZXJ2YWwsIHN0eWxlIH0gPSByb3dTdHlsZXMubnRoO1xuICAgICAgcmV0dXJuIChyb3dJbmRleCArIDEpICUgKGludGVydmFsIHx8IDEpID09PSAwID8gc3R5bGUgOiB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJvd1N0eWxlcyB8fCB7fTtcbiAgICB9XG4gIH1cblxuICBnZXRDZWxsU3R5bGUocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgaXNGaXJzdENvbHVtbiA9IGNvbEluZGV4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdENvbHVtbiA9IGNvbEluZGV4ID09PSB0aGlzLmNvbHVtbnNTaWduYWwoKS5sZW5ndGggLSAxO1xuXG4gICAgbGV0IGNlbGxTdHlsZSA9IHsgLi4udGhpcy5zdHlsZUNvbmZpZy5jZWxscyB9O1xuXG4gICAgaWYgKGlzRmlyc3RDb2x1bW4pIHtcbiAgICAgIGNlbGxTdHlsZSA9IHtcbiAgICAgICAgLi4uY2VsbFN0eWxlLFxuICAgICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uLFxuICAgICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbj8uc3RpY2t5TGVmdFxuICAgICAgICAgID8gJ3N0aWNreSdcbiAgICAgICAgICA6ICdzdGF0aWMnLFxuICAgICAgICBsZWZ0OiB0aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uPy5zdGlja3lMZWZ0ID8gJzAnIDogJ2F1dG8nLFxuICAgICAgICB6SW5kZXg6IHRoaXMuc3R5bGVDb25maWcuZmlyc3RDb2x1bW4/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNMYXN0Q29sdW1uKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7XG4gICAgICAgIC4uLmNlbGxTdHlsZSxcbiAgICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uLFxuICAgICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy5zdGlja3lSaWdodFxuICAgICAgICAgID8gJ3N0aWNreSdcbiAgICAgICAgICA6ICdzdGF0aWMnLFxuICAgICAgICByaWdodDogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy5zdGlja3lSaWdodCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmxhc3RDb2x1bW4/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChyb3dJbmRleCA+PSAwKSB7XG4gICAgICAvLyBBcHBseSBib2R5IHN0eWxlcyB0byBhbGwgY2VsbHNcbiAgICAgIGNlbGxTdHlsZSA9IHsgLi4uY2VsbFN0eWxlLCAuLi50aGlzLnN0eWxlQ29uZmlnLmJvZHkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2VsbFN0eWxlID0geyAuLi50aGlzLnN0eWxlQ29uZmlnLmhlYWRlciB9O1xuICAgIH1cblxuICAgIHJldHVybiBjZWxsU3R5bGU7XG4gIH1cbn1cblxudHlwZSBFZGl0ZWREYXRhPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXT86IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBQYXJ0aWFsPFRbS10+IDogVFtLXTtcbn07XG5cbi8vIERlZmF1bHQgc3R5bGVzXG5jb25zdCBkZWZhdWx0VGFibGVTdHlsZXM6IFRhYmxlU3R5bGVzID0ge1xuICBib3JkZXI6ICcxcHggc29saWQgI2UwZTBlMCcsXG4gIGJvcmRlclJhZGl1czogJzRweCcsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgYm94U2hhZG93OiAnMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xKScsXG4gIHdpZHRoOiAnMTAwJScsXG4gIGhlYWRlcjoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJyNmNWY1ZjUnLFxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBjb2xvcjogJyMzMzMnLFxuICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgIHBhZGRpbmc6ICcxMnB4IDE2cHgnLFxuICAgIGJvcmRlckJvdHRvbTogJzJweCBzb2xpZCAjZTBlMGUwJyxcbiAgfSxcbiAgcm93czoge1xuICAgIGV2ZW46IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxuICAgIH0sXG4gICAgb2RkOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjlmOWY5JyxcbiAgICB9LFxuICAgIG50aDoge1xuICAgICAgaW50ZXJ2YWw6IDUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY2VsbHM6IHtcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJCb3R0b206ICcxcHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG4gIGZvb3Rlcjoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJyNmNWY1ZjUnLFxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBjb2xvcjogJyMzMzMnLFxuICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgIHBhZGRpbmc6ICcxMnB4IDE2cHgnLFxuICAgIGJvcmRlclRvcDogJzJweCBzb2xpZCAjZTBlMGUwJyxcbiAgfSxcbn07XG4iLCI8dGFibGUgW25nU3R5bGVdPVwiZ2V0VGFibGVTdHlsZSgpXCI+XG4gIDx0aGVhZD5cbiAgICA8dHIgW25nU3R5bGVdPVwiZ2V0SGVhZGVyU3R5bGUoKVwiPlxuICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnNTaWduYWwoKTsgdHJhY2sgY29sdW1uLmlkKSB7XG4gICAgICA8dGggW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKC0xLCAkaW5kZXgpXCI+XG4gICAgICAgIEBpZiAoY29sdW1uLmhlYWRlclRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRIZWFkZXJDb250ZXh0KGNvbHVtbilcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICB7eyBjb2x1bW4uaGVhZGVyIH19XG4gICAgICAgIH1cbiAgICAgIDwvdGg+XG4gICAgICB9XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIEBmb3IgKHJvdyBvZiBkYXRhKCk7IHRyYWNrIGRhdGFLZXkoKTsgbGV0IHJvd0luZGV4ID0gJGluZGV4KSB7IEBpZlxuICAgIChpc0dyb3VwUm93KHJvdykpIHtcbiAgICA8dHIgY2xhc3M9XCJncm91cC1yb3dcIiBbbmdTdHlsZV09XCJnZXRSb3dTdHlsZShyb3dJbmRleClcIj5cbiAgICAgIDx0ZFxuICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnNTaWduYWwoKS5sZW5ndGhcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRDZWxsU3R5bGUocm93SW5kZXgsIDApXCJcbiAgICAgID5cbiAgICAgICAge3sgZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uc1NpZ25hbCgpWzBdKSB9fVxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIH0gQGVsc2Uge1xuICAgIDx0ciBbbmdTdHlsZV09XCJnZXRSb3dTdHlsZShyb3dJbmRleClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zU2lnbmFsKCk7IHRyYWNrIGNvbHVtbi5pZDsgbGV0IGNvbEluZGV4ID0gJGluZGV4KSB7XG4gICAgICA8dGQgW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKHJvd0luZGV4LCBjb2xJbmRleClcIj5cbiAgICAgICAgQGlmIChpc1Jvd0VkaXRpbmcocm93KSAmJiBjb2x1bW4uY2VsbEVkaXRUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmNlbGxFZGl0VGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDZWxsQ29udGV4dChyb3csIGNvbHVtbiwgcm93SW5kZXgpXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIGlmIChjb2x1bW4uY2VsbFRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q2VsbENvbnRleHQocm93LCBjb2x1bW4sIHJvd0luZGV4KVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIHt7IGdldENlbGxWYWx1ZShyb3csIGNvbHVtbikgfX1cbiAgICAgICAgfVxuICAgICAgPC90ZD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICAgIH0gfVxuICA8L3Rib2R5PlxuICBAaWYgKGhhc0Zvb3RlcigpKSB7XG4gIDx0Zm9vdD5cbiAgICA8dHIgW25nU3R5bGVdPVwiZ2V0Rm9vdGVyU3R5bGUoKVwiPlxuICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnNTaWduYWwoKTsgdHJhY2sgY29sdW1uLmlkKSB7XG4gICAgICA8dGQgW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKC0xLCAkaW5kZXgpXCI+XG4gICAgICAgIEBpZiAoY29sdW1uLmZvb3RlclRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uZm9vdGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRGb290ZXJDb250ZXh0KGNvbHVtbilcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvdGQ+XG4gICAgICB9XG4gICAgPC90cj5cbiAgPC90Zm9vdD5cbiAgfVxuPC90YWJsZT5cbiJdfQ==
|
|
431
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFHTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFTckQsTUFBTSxPQUFPLGtCQUFrQjtJQUc3Qix3Q0FBd0M7SUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQztJQUM3QixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBeUIsQ0FBQztJQUNsRCxPQUFPLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsMkNBQTJDO0lBQzNFLDZCQUE2QjtJQUM3Qix5QkFBeUI7SUFDekIsd0JBQXdCO0lBQ3hCLElBQUk7SUFDSixvQkFBb0I7SUFDcEIsK0JBQStCO0lBQy9CLElBQUk7SUFDSiwyQkFBMkI7SUFDM0IsdUNBQXVDO0lBQ3ZDLDZCQUE2QjtJQUM3Qiw4Q0FBOEM7SUFDOUMsbUNBQW1DO0lBQ25DLElBQUk7SUFDSiwwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssRUFBK0IsQ0FBQztJQUV0QyxXQUFXLEdBQWdCLGtCQUFrQixDQUFDO0lBR3ZELGVBQWUsQ0FBOEI7SUFFbkMsT0FBTyxHQUFHLElB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TUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07O0FBbWFULGlCQUFpQjtBQUNqQixNQUFNLGtCQUFrQixHQUFnQjtJQUN0QyxNQUFNLEVBQUUsbUJBQW1CO0lBQzNCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFNBQVMsRUFBRSwyQkFBMkI7SUFDdEMsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUU7UUFDTixlQUFlLEVBQUUsU0FBUztRQUMxQixVQUFVLEVBQUUsTUFBTTtRQUNsQixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLFlBQVksRUFBRSxtQkFBbUI7S0FDbEM7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixlQUFlLEVBQUUsU0FBUztTQUMzQjtRQUNELEdBQUcsRUFBRTtZQUNILGVBQWUsRUFBRSxTQUFTO1NBQzNCO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUU7Z0JBQ0wsZUFBZSxFQUFFLFNBQVM7YUFDM0I7U0FDRjtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLFdBQVc7UUFDcEIsWUFBWSxFQUFFLG1CQUFtQjtLQUNsQztJQUNELE1BQU0sRUFBRTtRQUNOLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLE1BQU07UUFDakIsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGlucHV0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24sIEdyb3VwZWREYXRhUm93IH0gZnJvbSAnLi9kYXRhLXRhYmxlLnR5cGVzJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCYXNlU3R5bGVzLCBUYWJsZVN0eWxlcyB9IGZyb20gJy4vc3R5bGUudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIHsgSWQ6IHN0cmluZyB8IG51bWJlciB9PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdFxue1xuICAvLyBNb2RpZnkgZGF0YSBpbnB1dCB0byB1c2UgZ3JvdXBlZCBkYXRhXG4gIGRhdGEgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG4gIGNvbHVtbnMgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+KCk7XG4gIGRhdGFLZXkgPSBpbnB1dDxrZXlvZiBUPignSWQnKTsgLy8gTmV3IHJlcXVpcmVkIGlucHV0IGZvciB1bmlxdWUgaWRlbnRpZmllclxuICAvLyBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAvLyBzZXQgZGF0YSh2YWx1ZTogVFtdKSB7XG4gIC8vICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAvLyB9XG4gIC8vIGdldCBkYXRhKCk6IFRbXSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuZ3JvdXBlZERhdGEoKTtcbiAgLy8gfVxuICAvLyBwcml2YXRlIF9kYXRhOiBUW10gPSBbXTtcbiAgLy8gTW9kaWZ5IGNvbHVtbnMgaW5wdXQgdG8gdXNlIGEgc2lnbmFsXG4gIC8vIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIC8vIHNldCBjb2x1bW5zKHZhbHVlOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10pIHtcbiAgLy8gICB0aGlzLmNvbHVtbnNTaWduYWwuc2V0KHZhbHVlKTtcbiAgLy8gfVxuICAvLyBOZXcgaW5wdXRzIGZvciBncm91cGluZ1xuICBncm91cEJ5ID0gaW5wdXQ8a2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpPigpO1xuXG4gIEBJbnB1dCgpIHN0eWxlQ29uZmlnOiBUYWJsZVN0eWxlcyA9IGRlZmF1bHRUYWJsZVN0eWxlcztcblxuICBAQ29udGVudENoaWxkcmVuKENvbHVtbkRpcmVjdGl2ZSlcbiAgY29sdW1uVGVtcGxhdGVzITogUXVlcnlMaXN0PENvbHVtbkRpcmVjdGl2ZT47XG5cbiAgQE91dHB1dCgpIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSByb3dTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgcm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgcHJpdmF0ZSBlZGl0aW5nUm93c1NpZ25hbCA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJvd3NTaWduYWwgPSBzaWduYWw8U2V0PHN0cmluZyB8IG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgZWRpdGVkRGF0YVNpZ25hbCA9IHNpZ25hbDxNYXA8c3RyaW5nIHwgbnVtYmVyLCBFZGl0ZWREYXRhPFQ+Pj4oXG4gICAgbmV3IE1hcCgpXG4gICk7XG5cbiAgY29sdW1uc1NpZ25hbDogV3JpdGFibGVTaWduYWw8Q29sdW1uRGVmaW5pdGlvbjxUPltdPiA9IHNpZ25hbChbXSk7XG5cbiAgaGFzRm9vdGVyID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNvbHVtbnNTaWduYWwoKS5zb21lKChjb2wpID0+IGNvbC5mb290ZXJUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkKVxuICApO1xuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJvd1xuICBnZXRSb3dJZChyb3c6IFQpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZGF0YUtleSgpO1xuICAgIGNvbnN0IHZhbHVlID0gcm93W2tleV07XG5cbiAgICAvLyBDb252ZXJ0IHRvIHN0cmluZyBvciBudW1iZXIgaWYgcG9zc2libGUsIG90aGVyd2lzZSBzdHJpbmdpZnlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cblxuICAvLyBUeXBlIGd1YXJkIG1ldGhvZCB0byBjaGVjayBmb3IgZ3JvdXAgcm93c1xuICBpc0dyb3VwUm93KHJvdzogVCk6IHJvdyBpcyBUICYgeyBpc0dyb3VwUm93OiB0cnVlOyBncm91cFRpdGxlOiBhbnkgfSB7XG4gICAgcmV0dXJuICEhKHJvdyBhcyBhbnkpLmlzR3JvdXBSb3c7XG4gIH1cblxuICAvLyBDb21wdXRlZCBwcm9wZXJ0eSBmb3IgZ3JvdXBlZCBkYXRhXG5cbiAgZ3JvdXBlZERhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmdyb3VwQnkoKSkgcmV0dXJuIHRoaXMuZGF0YSgpIGFzIEdyb3VwZWREYXRhUm93PFQ+W107XG5cbiAgICBjb25zdCBnZXRHcm91cFZhbHVlID1cbiAgICAgIHR5cGVvZiB0aGlzLmdyb3VwQnkoKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICh0aGlzLmdyb3VwQnkoKSBhcyAocm93OiBUKSA9PiBhbnkpXG4gICAgICAgIDogKHJvdzogVCkgPT4gcm93W3RoaXMuZ3JvdXBCeSgpIGFzIGtleW9mIFRdO1xuXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxhbnksIFRbXT4oKTtcblxuICAgIHRoaXMuZGF0YSgpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgaWYgKGdldEdyb3VwVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBncm91cFZhbHVlID0gZ2V0R3JvdXBWYWx1ZShyb3cpO1xuICAgICAgICBjb25zdCBleGlzdGluZ0dyb3VwID0gZ3JvdXBzLmdldChncm91cFZhbHVlKSB8fCBbXTtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cFZhbHVlLCBbLi4uZXhpc3RpbmdHcm91cCwgcm93XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRGF0YUFycmF5OiBHcm91cGVkRGF0YVJvdzxUPltdID0gW107XG5cbiAgICBncm91cHMuZm9yRWFjaCgoZ3JvdXBSb3dzLCBncm91cFZhbHVlKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgZ3JvdXAgaGVhZGVyIHJvd1xuICAgICAgY29uc3QgZ3JvdXBSb3c6IEdyb3VwZWREYXRhUm93PFQ+ID0ge1xuICAgICAgICAuLi4oe30gYXMgVCksIC8vIENyZWF0ZSBlbXB0eSBvYmplY3Qgb2YgdHlwZSBUIGFzIGJhc2VcbiAgICAgICAgW3RoaXMuZGF0YUtleSgpXTogYGdyb3VwLSR7Z3JvdXBWYWx1ZX1gLFxuICAgICAgICBpc0dyb3VwUm93OiB0cnVlLFxuICAgICAgICBncm91cFZhbHVlLFxuICAgICAgICBncm91cFRpdGxlOiBncm91cFZhbHVlLFxuICAgICAgfTtcblxuICAgICAgZ3JvdXBlZERhdGFBcnJheS5wdXNoKGdyb3VwUm93KTtcbiAgICAgIC8vIEFkZCByZWd1bGFyIHJvd3Mgd2l0aCB0aGUgb3B0aW9uYWwgaXNHcm91cFJvdyBwcm9wZXJ0eSAodW5kZWZpbmVkIGJ5IGRlZmF1bHQpXG4gICAgICBncm91cGVkRGF0YUFycmF5LnB1c2goLi4uKGdyb3VwUm93cyBhcyBHcm91cGVkRGF0YVJvdzxUPltdKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBlZERhdGFBcnJheTtcbiAgfSk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gU2V0IGluaXRpYWwgY29sdW1ucyBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICBpZiAodGhpcy5jb2x1bW5zU2lnbmFsKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnNTaWduYWwuc2V0KHRoaXMuY29sdW1ucygpKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5jb2x1bW5UZW1wbGF0ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5tZXJnZUNvbHVtblRlbXBsYXRlcygpKTtcbiAgICB0aGlzLm1lcmdlQ29sdW1uVGVtcGxhdGVzKCk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29sdW1uVGVtcGxhdGVzKCkge1xuICAgIC8vIE9ubHkgbWVyZ2UgaWYgd2UgaGF2ZSBib3RoIGNvbHVtbnMgYW5kIHRlbXBsYXRlc1xuICAgIGlmICh0aGlzLmNvbHVtbnNTaWduYWwoKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc1NpZ25hbCgpLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVGVtcGxhdGUgPSB0aGlzLmNvbHVtblRlbXBsYXRlcy5maW5kKFxuICAgICAgICAgICh0KSA9PiB0LmNvbHVtbklkID09PSBjb2x1bW4uaWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmNlbGxUZW1wbGF0ZSxcbiAgICAgICAgICAgIGNlbGxFZGl0VGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuY2VsbEVkaXRUZW1wbGF0ZSxcbiAgICAgICAgICAgIGhlYWRlclRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmhlYWRlclRlbXBsYXRlLFxuICAgICAgICAgICAgZm9vdGVyVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuZm9vdGVyVGVtcGxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbHVtbnNTaWduYWwuc2V0KHVwZGF0ZWRDb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBnZXRDZWxsVmFsdWUgPSAocm93OiBULCBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pOiBhbnkgPT4ge1xuICAgIC8vIEZvciBncm91cCByb3dzLCByZXR1cm4gdGhlIGdyb3VwIHRpdGxlIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmlzR3JvdXBSb3cocm93KSkge1xuICAgICAgcmV0dXJuIChyb3cgYXMgYW55KS5ncm91cFRpdGxlO1xuICAgIH1cblxuICAgIC8vIEV4aXN0aW5nIGxvZ2ljIGZvciBub3JtYWwgcm93c1xuICAgIGlmIChjb2x1bW4uYWNjZXNzb3JLZXkpIHtcbiAgICAgIHJldHVybiAocm93IGFzIGFueSlbY29sdW1uLmFjY2Vzc29yS2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbi5hY2Nlc3NvckZuID8gY29sdW1uLmFjY2Vzc29yRm4ocm93KSA6IHVuZGVmaW5lZDtcbiAgfTtcblxuICBpc1Jvd0VkaXRpbmcgPSAocm93OiBUKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ1Jvd3NTaWduYWwoKS5oYXModGhpcy5nZXRSb3dJZChyb3cpKTtcbiAgfTtcblxuICB0b2dnbGVSb3dFZGl0ID0gKHJvdzogVCkgPT4ge1xuICAgIHRoaXMuZWRpdGluZ1Jvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHRoaXMuZ2V0Um93SWQocm93KSkpIHtcbiAgICAgICAgbmV3U2V0LmRlbGV0ZSh0aGlzLmdldFJvd0lkKHJvdykpO1xuICAgICAgICAvLyB0aGlzLnNhdmVSb3codGhpcy5nZXRSb3dJZChyb3cpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQodGhpcy5nZXRSb3dJZChyb3cpKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRWRpdGVkRGF0YShyb3cpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1NldDtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGluaXRpYWxpemVFZGl0ZWREYXRhKHJvdzogVCkge1xuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5nZXRSb3dJZChyb3cpO1xuICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3cgfSk7XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBzYXZlUm93KHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgLy8gICBjb25zdCBlZGl0ZWREYXRhID0gdGhpcy5lZGl0ZWREYXRhU2lnbmFsKCkuZ2V0KHJvd0lkKTtcbiAgLy8gICBpZiAoZWRpdGVkRGF0YSkge1xuICAvLyAgICAgY29uc3Qgb3JpZ2luYWxSb3dJbmRleCA9IHRoaXMuZGF0YSgpLmZpbmRJbmRleCgocikgPT4gci5pZCA9PT0gcm93SWQpO1xuICAvLyAgICAgaWYgKG9yaWdpbmFsUm93SW5kZXggIT09IC0xKSB7XG4gIC8vICAgICAgIGNvbnN0IHVwZGF0ZWRSb3cgPSB7IC4uLnRoaXMuZGF0YSgpW29yaWdpbmFsUm93SW5kZXhdLCAuLi5lZGl0ZWREYXRhIH07XG4gIC8vICAgICAgIHRoaXMuZGF0YSgpW29yaWdpbmFsUm93SW5kZXhdID0gdXBkYXRlZFJvdztcbiAgLy8gICAgICAgdGhpcy5yb3dTYXZlLmVtaXQodXBkYXRlZFJvdyk7XG4gIC8vICAgICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAvLyAgICAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgLy8gICAgICAgICBuZXdNYXAuZGVsZXRlKHJvd0lkKTtcbiAgLy8gICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAvLyAgICAgICB9KTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBpc1Jvd1NlbGVjdGVkID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5oYXMocm93SWQpO1xuICB9O1xuXG4gIHRvZ2dsZVJvd1NlbGVjdGlvbiA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHJvd0lkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIGFsbFJvd3NTZWxlY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBub25Hcm91cFJvd3MgPSB0aGlzLmRhdGEoKS5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNHcm91cFJvdyhyb3cpKTtcbiAgICByZXR1cm4gKFxuICAgICAgbm9uR3JvdXBSb3dzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA9PT0gbm9uR3JvdXBSb3dzLmxlbmd0aFxuICAgICk7XG4gIH07XG5cbiAgc29tZVJvd3NTZWxlY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBub25Hcm91cFJvd3MgPSB0aGlzLmRhdGEoKS5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNHcm91cFJvdyhyb3cpKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplID4gMCAmJlxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplIDwgbm9uR3JvdXBSb3dzLmxlbmd0aFxuICAgICk7XG4gIH07XG5cbiAgdG9nZ2xlQWxsUm93cyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5hbGxSb3dzU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwuc2V0KG5ldyBTZXQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vbkdyb3VwUm93cyA9IHRoaXMuZGF0YSgpLmZpbHRlcigocm93KSA9PiAhdGhpcy5pc0dyb3VwUm93KHJvdykpO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwuc2V0KFxuICAgICAgICBuZXcgU2V0KG5vbkdyb3VwUm93cy5tYXAoKHJvdykgPT4gdGhpcy5nZXRSb3dJZChyb3cpKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9O1xuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbkNoYW5nZSgpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmRhdGEoKS5maWx0ZXIoKHJvdykgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuaGFzKHRoaXMuZ2V0Um93SWQocm93KSlcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIGdldEhlYWRlckNvbnRleHQoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogY29sdW1uLFxuICAgICAgY29sdW1uLFxuICAgICAgYWxsUm93c1NlbGVjdGVkOiB0aGlzLmFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIHNvbWVSb3dzU2VsZWN0ZWQ6IHRoaXMuc29tZVJvd3NTZWxlY3RlZCxcbiAgICAgIHRvZ2dsZUFsbFJvd3M6IHRoaXMudG9nZ2xlQWxsUm93cyxcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkVmFsdWUocm93SWQ6IHN0cmluZyB8IG51bWJlciwgY29sdW1uSWQ6IGtleW9mIFQsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgICBuZXdNYXAuc2V0KHJvd0lkLCB7IC4uLnJvd0RhdGEsIFtjb2x1bW5JZF06IHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUVkaXRlZFZhbHVlRm4oXG4gICAgcm93SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB2YWx1ZUZuOiAodmFsdWU6IGFueSkgPT4gVCxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93RGF0YSwgLi4udmFsdWVGbih2YWx1ZSkgfSk7XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkRGF0YShyb3dJZDogc3RyaW5nIHwgbnVtYmVyLCBkYXRhOiBQYXJ0aWFsPFQ+KSB7XG4gICAgdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICBjb25zdCByb3dEYXRhID0gbmV3TWFwLmdldChyb3dJZCkgfHwgKHt9IGFzIEVkaXRlZERhdGE8VD4pO1xuICAgICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3dEYXRhLCAuLi5kYXRhIH0pO1xuICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZU5lc3RlZEVkaXRlZFZhbHVlKFxuICAgIHJvd0lkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgY29sdW1uSWQ6IGtleW9mIFQsXG4gICAgbmVzdGVkRmllbGQ6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSAocm93RGF0YVtjb2x1bW5JZF0gYXMgYW55KSB8fCB7fTtcbiAgICAgIG5ld01hcC5zZXQocm93SWQsIHtcbiAgICAgICAgLi4ucm93RGF0YSxcbiAgICAgICAgW2NvbHVtbklkXToge1xuICAgICAgICAgIC4uLmNvbHVtbkRhdGEsXG4gICAgICAgICAgW25lc3RlZEZpZWxkXTogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDZWxsQ29udGV4dChyb3c6IFQsIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPiwgcm93SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5nZXRSb3dJZChyb3cpO1xuICAgIGNvbnN0IGlzRWRpdGluZyA9IHRoaXMuaXNSb3dFZGl0aW5nKHJvdyk7XG4gICAgY29uc3QgZWRpdGVkRGF0YSA9IHRoaXMuZWRpdGVkRGF0YVNpZ25hbCgpLmdldChyb3dJZCk7XG5cbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICBpZiAoaXNFZGl0aW5nICYmIGVkaXRlZERhdGEgJiYgY29sdW1uLmlkIGluIGVkaXRlZERhdGEpIHtcbiAgICAgIHZhbHVlID0gZWRpdGVkRGF0YVtjb2x1bW4uaWQgYXMga2V5b2YgVF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5nZXRDZWxsVmFsdWUocm93LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHZhbHVlLFxuICAgICAgdmFsdWUsXG4gICAgICByb3csXG4gICAgICBjb2x1bW4sXG4gICAgICByb3dJbmRleCxcbiAgICAgIGlzRWRpdGluZyxcbiAgICAgIGlzU2VsZWN0ZWQ6IHRoaXMuaXNSb3dTZWxlY3RlZChyb3dJZCksXG4gICAgICB0b2dnbGVSb3dTZWxlY3Rpb246ICgpID0+IHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKHJvd0lkKSxcbiAgICAgIHRvZ2dsZVJvd0VkaXQ6ICgpID0+IHRoaXMudG9nZ2xlUm93RWRpdChyb3cpLFxuICAgICAgZGVsZXRlUm93OiAoKSA9PiB0aGlzLmRlbGV0ZVJvdyhyb3dJZCksXG4gICAgICB1cGRhdGVWYWx1ZTogKG5ld1ZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkVmFsdWUocm93SWQsIGNvbHVtbi5pZCBhcyBrZXlvZiBULCBuZXdWYWx1ZSksXG4gICAgICB1cGRhdGVOZXN0ZWRWYWx1ZTogKG5lc3RlZEZpZWxkOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMudXBkYXRlTmVzdGVkRWRpdGVkVmFsdWUoXG4gICAgICAgICAgcm93SWQsXG4gICAgICAgICAgY29sdW1uLmlkIGFzIGtleW9mIFQsXG4gICAgICAgICAgbmVzdGVkRmllbGQsXG4gICAgICAgICAgbmV3VmFsdWVcbiAgICAgICAgKSxcblxuICAgICAgdXBkYXRlVmFsdWVGbjogKHZhbHVlRm46ICh2YWx1ZTogYW55KSA9PiBULCBuZXdWYWx1ZTogYW55KSA9PlxuICAgICAgICB0aGlzLnVwZGF0ZUVkaXRlZFZhbHVlRm4ocm93SWQsIHZhbHVlRm4sIG5ld1ZhbHVlKSxcbiAgICAgIHVwZGF0ZURhdGE6IChuZXdEYXRhOiBQYXJ0aWFsPFQ+KSA9PlxuICAgICAgICB0aGlzLnVwZGF0ZUVkaXRlZERhdGEocm93SWQsIG5ld0RhdGEpLFxuICAgIH07XG4gIH1cblxuICBkZWxldGVSb3cgPSAocm93SWQ6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHJvd1RvRGVsZXRlID0gdGhpcy5kYXRhKCkuZmluZCgocm93KSA9PiB0aGlzLmdldFJvd0lkKHJvdykgPT09IHJvd0lkKTtcbiAgICBpZiAocm93VG9EZWxldGUpIHtcbiAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQocm93VG9EZWxldGUpO1xuICAgIH1cbiAgfTtcblxuICBnZXRGb290ZXJDb250ZXh0KGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPikge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGNvbHVtbixcbiAgICAgIGNvbHVtbixcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGFibGVTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5zdHlsZUNvbmZpZy5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3R5bGVDb25maWcuZm9udFNpemUsXG4gICAgICB3aGl0ZVNwYWNlOiB0aGlzLnN0eWxlQ29uZmlnLndoaXRlU3BhY2UsXG4gICAgICBtYXJnaW46IHRoaXMuc3R5bGVDb25maWcubWFyZ2luLFxuICAgICAgYm9yZGVyOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlcixcbiAgICAgIGJvcmRlckNvbGxhcHNlOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlckNvbGxhcHNlLFxuICAgICAgYm9yZGVyU3BhY2luZzogdGhpcy5zdHlsZUNvbmZpZy5ib3JkZXJTcGFjaW5nLFxuICAgICAgdGFibGVMYXlvdXQ6IHRoaXMuc3R5bGVDb25maWcudGFibGVMYXlvdXQsXG4gICAgICB3aWR0aDogdGhpcy5zdHlsZUNvbmZpZy53aWR0aCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0SGVhZGVyU3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIsXG4gICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnN0aWNreVRvcCA/ICdzdGlja3knIDogJ3N0YXRpYycsXG4gICAgICB0b3A6IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy5zdGlja3lUb3AgPyAnMCcgOiAnYXV0bycsXG4gICAgICB6SW5kZXg6IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICBnZXRGb290ZXJTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmZvb3RlcixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uc3RpY2t5Qm90dG9tID8gJ3N0aWNreScgOiAnc3RhdGljJyxcbiAgICAgIGJvdHRvbTogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnN0aWNreUJvdHRvbSA/ICcwJyA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIGdldFJvd1N0eWxlKHJvd0luZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHJvd1N0eWxlcyA9IHRoaXMuc3R5bGVDb25maWcucm93cztcbiAgICBpZiAocm93U3R5bGVzICYmICdldmVuJyBpbiByb3dTdHlsZXMgJiYgJ29kZCcgaW4gcm93U3R5bGVzKSB7XG4gICAgICByZXR1cm4gcm93SW5kZXggJSAyID09PSAwID8gcm93U3R5bGVzLmV2ZW4gOiByb3dTdHlsZXMub2RkO1xuICAgIH0gZWxzZSBpZiAocm93U3R5bGVzICYmICdudGgnIGluIHJvd1N0eWxlcyAmJiByb3dTdHlsZXMubnRoKSB7XG4gICAgICBjb25zdCB7IGludGVydmFsLCBzdHlsZSB9ID0gcm93U3R5bGVzLm50aDtcbiAgICAgIHJldHVybiAocm93SW5kZXggKyAxKSAlIChpbnRlcnZhbCB8fCAxKSA9PT0gMCA/IHN0eWxlIDoge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByb3dTdHlsZXMgfHwge307XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2VsbFN0eWxlKHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGlzRmlyc3RDb2x1bW4gPSBjb2xJbmRleCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBjb2xJbmRleCA9PT0gdGhpcy5jb2x1bW5zU2lnbmFsKCkubGVuZ3RoIC0gMTtcblxuICAgIGxldCBjZWxsU3R5bGUgPSB7IC4uLnRoaXMuc3R5bGVDb25maWcuY2VsbHMgfTtcblxuICAgIGlmIChpc0ZpcnN0Q29sdW1uKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7XG4gICAgICAgIC4uLmNlbGxTdHlsZSxcbiAgICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuZmlyc3RDb2x1bW4/LnN0aWNreUxlZnRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgbGVmdDogdGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbj8uc3RpY2t5TGVmdCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzTGFzdENvbHVtbikge1xuICAgICAgY2VsbFN0eWxlID0ge1xuICAgICAgICAuLi5jZWxsU3R5bGUsXG4gICAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgcmlnaHQ6IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHQgPyAnMCcgOiAnYXV0bycsXG4gICAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocm93SW5kZXggPj0gMCkge1xuICAgICAgLy8gQXBwbHkgYm9keSBzdHlsZXMgdG8gYWxsIGNlbGxzXG4gICAgICBjZWxsU3R5bGUgPSB7IC4uLmNlbGxTdHlsZSwgLi4udGhpcy5zdHlsZUNvbmZpZy5ib2R5IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbGxTdHlsZSA9IHsgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbFN0eWxlO1xuICB9XG59XG5cbnR5cGUgRWRpdGVkRGF0YTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0/OiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gUGFydGlhbDxUW0tdPiA6IFRbS107XG59O1xuXG4vLyBEZWZhdWx0IHN0eWxlc1xuY29uc3QgZGVmYXVsdFRhYmxlU3R5bGVzOiBUYWJsZVN0eWxlcyA9IHtcbiAgYm9yZGVyOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIGJveFNoYWRvdzogJzAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMSknLFxuICB3aWR0aDogJzEwMCUnLFxuICBoZWFkZXI6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJCb3R0b206ICcycHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG4gIHJvd3M6IHtcbiAgICBldmVuOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9LFxuICAgIG9kZDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2Y5ZjlmOScsXG4gICAgfSxcbiAgICBudGg6IHtcbiAgICAgIGludGVydmFsOiA1LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2YwZjBmMCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNlbGxzOiB7XG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxuICBmb290ZXI6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJUb3A6ICcycHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG59O1xuIiwiPHRhYmxlIFtuZ1N0eWxlXT1cImdldFRhYmxlU3R5bGUoKVwiPlxuICA8dGhlYWQ+XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldEhlYWRlclN0eWxlKClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zU2lnbmFsKCk7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgPHRoIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZSgtMSwgJGluZGV4KVwiPlxuICAgICAgICBAaWYgKGNvbHVtbi5oZWFkZXJUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SGVhZGVyQ29udGV4dChjb2x1bW4pXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgY29sdW1uLmhlYWRlciB9fVxuICAgICAgICB9XG4gICAgICA8L3RoPlxuICAgICAgfVxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICBAZm9yIChyb3cgb2YgZGF0YSgpOyB0cmFjayBkYXRhS2V5KCk7IGxldCByb3dJbmRleCA9ICRpbmRleCkgeyBAaWZcbiAgICAoaXNHcm91cFJvdyhyb3cpKSB7XG4gICAgPHRyIGNsYXNzPVwiZ3JvdXAtcm93XCIgW25nU3R5bGVdPVwiZ2V0Um93U3R5bGUocm93SW5kZXgpXCI+XG4gICAgICA8dGRcbiAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zU2lnbmFsKCkubGVuZ3RoXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKHJvd0luZGV4LCAwKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGdldENlbGxWYWx1ZShyb3csIGNvbHVtbnNTaWduYWwoKVswXSkgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICB9IEBlbHNlIHtcbiAgICA8dHIgW25nU3R5bGVdPVwiZ2V0Um93U3R5bGUocm93SW5kZXgpXCI+XG4gICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uc1NpZ25hbCgpOyB0cmFjayBjb2x1bW4uaWQ7IGxldCBjb2xJbmRleCA9ICRpbmRleCkge1xuICAgICAgPHRkIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZShyb3dJbmRleCwgY29sSW5kZXgpXCI+XG4gICAgICAgIEBpZiAoaXNSb3dFZGl0aW5nKHJvdykgJiYgY29sdW1uLmNlbGxFZGl0VGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5jZWxsRWRpdFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q2VsbENvbnRleHQocm93LCBjb2x1bW4sIHJvd0luZGV4KVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSBpZiAoY29sdW1uLmNlbGxUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENlbGxDb250ZXh0KHJvdywgY29sdW1uLCByb3dJbmRleClcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICB7eyBnZXRDZWxsVmFsdWUocm93LCBjb2x1bW4pIH19XG4gICAgICAgIH1cbiAgICAgIDwvdGQ+XG4gICAgICB9XG4gICAgPC90cj5cbiAgICB9IH1cbiAgPC90Ym9keT5cbiAgQGlmIChoYXNGb290ZXIoKSkge1xuICA8dGZvb3Q+XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldEZvb3RlclN0eWxlKClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zU2lnbmFsKCk7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgPHRkIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZSgtMSwgJGluZGV4KVwiPlxuICAgICAgICBAaWYgKGNvbHVtbi5mb290ZXJUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmZvb3RlclRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Rm9vdGVyQ29udGV4dChjb2x1bW4pXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICA8L3RkPlxuICAgICAgfVxuICAgIDwvdHI+XG4gIDwvdGZvb3Q+XG4gIH1cbjwvdGFibGU+XG4iXX0=
|
|
@@ -236,7 +236,7 @@ export class DataXportComponent {
|
|
|
236
236
|
: column.header;
|
|
237
237
|
}
|
|
238
238
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataXportComponent, deps: [{ token: i1.DataXportService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
239
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataXportComponent, selector: "lib-data-xport", inputs: { data: "data", columns: "columns" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
|
|
239
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataXportComponent, selector: "lib-data-xport", inputs: { data: "data", columns: "columns" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
|
|
240
240
|
}
|
|
241
241
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataXportComponent, decorators: [{
|
|
242
242
|
type: Component,
|
|
@@ -115,7 +115,7 @@ export class DatePickerComponent {
|
|
|
115
115
|
this.showCalendar = false;
|
|
116
116
|
}
|
|
117
117
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
118
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DatePickerComponent, selector: "app-date-picker", inputs: { placeholder: "placeholder", format: "format", minDate: "minDate", maxDate: "maxDate", useDropdowns: "useDropdowns", yearPlaceholder: "yearPlaceholder", monthPlaceholder: "monthPlaceholder" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div class=\"date-picker\">\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n [value]=\"displayDate\"\n (focus)=\"toggleCalendar()\"\n readonly\n />\n <div *ngIf=\"showCalendar\" class=\"calendar\">\n <div class=\"calendar-header\">\n <ng-container *ngIf=\"!useDropdowns; else dropdowns\">\n <button (click)=\"previousMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-left'\"></verben-svg>\n </button>\n \n <!-- Display the current month and year -->\n <span>{{ months[selectedMonth] }} {{ selectedYear }}</span>\n \n <button (click)=\"nextMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-right'\"></verben-svg>\n </button>\n </ng-container>\n \n <ng-template #dropdowns>\n <verben-drop-down\n [placeholder]=\"yearPlaceholder\"\n (onChange)=\"onDropdownYearChange($event)\"\n [options]=\"yearRange\"\n [(ngModel)]=\"selectedYear\"\n ></verben-drop-down>\n <verben-drop-down\n placeholder=\"Select a month\"\n (onChange)=\"onDropdownMonthChange($event)\"\n [options]=\"months\"\n [(ngModel)]=\"selectedMonth\"\n ></verben-drop-down>\n </ng-template>\n </div>\n \n <div class=\"calendar-body\">\n <div class=\"weekdays\">\n <span *ngFor=\"let day of weekDays\">{{ day }}</span>\n </div>\n <div class=\"dates\">\n <button\n *ngFor=\"let day of getDaysInMonth()\"\n [class.selected]=\"isSelected(day)\"\n (click)=\"selectTemporaryDate(day)\"\n >\n {{ day.getDate() }}\n </button>\n </div>\n </div>\n <div class=\"calendar-footer\">\n <button (click)=\"cancel()\">Cancel</button>\n <button (click)=\"confirm()\">OK</button>\n </div>\n </div>\n </div>\n ", styles: [".date-picker{position:relative;width:250px}input{width:100%;padding:10px;border:1px solid #ccc;border-radius:4px;cursor:pointer}.calendar{position:absolute;top:100%;left:0;width:fit-content;border:1px solid #ccc;background-color:#fff;z-index:10;border-radius:4px}.calendar-header{display:flex;justify-content:space-between;gap:10px;padding:10px;background-color:#f0f0f0}.weekdays,.dates{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:6px;padding:10px}button{border:none;background:none;cursor:pointer;padding:5px;width:40px;height:40px}button.selected{background-color:#ffe681;color:#000;border-radius:30px}.calendar-footer{display:flex;justify-content:end;gap:20px;padding:4px 10px;color:purple;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
|
|
118
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DatePickerComponent, selector: "app-date-picker", inputs: { placeholder: "placeholder", format: "format", minDate: "minDate", maxDate: "maxDate", useDropdowns: "useDropdowns", yearPlaceholder: "yearPlaceholder", monthPlaceholder: "monthPlaceholder" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div class=\"date-picker\">\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n [value]=\"displayDate\"\n (focus)=\"toggleCalendar()\"\n readonly\n />\n <div *ngIf=\"showCalendar\" class=\"calendar\">\n <div class=\"calendar-header\">\n <ng-container *ngIf=\"!useDropdowns; else dropdowns\">\n <button (click)=\"previousMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-left'\"></verben-svg>\n </button>\n \n <!-- Display the current month and year -->\n <span>{{ months[selectedMonth] }} {{ selectedYear }}</span>\n \n <button (click)=\"nextMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-right'\"></verben-svg>\n </button>\n </ng-container>\n \n <ng-template #dropdowns>\n <verben-drop-down\n [placeholder]=\"yearPlaceholder\"\n (onChange)=\"onDropdownYearChange($event)\"\n [options]=\"yearRange\"\n [(ngModel)]=\"selectedYear\"\n ></verben-drop-down>\n <verben-drop-down\n placeholder=\"Select a month\"\n (onChange)=\"onDropdownMonthChange($event)\"\n [options]=\"months\"\n [(ngModel)]=\"selectedMonth\"\n ></verben-drop-down>\n </ng-template>\n </div>\n \n <div class=\"calendar-body\">\n <div class=\"weekdays\">\n <span *ngFor=\"let day of weekDays\">{{ day }}</span>\n </div>\n <div class=\"dates\">\n <button\n *ngFor=\"let day of getDaysInMonth()\"\n [class.selected]=\"isSelected(day)\"\n (click)=\"selectTemporaryDate(day)\"\n >\n {{ day.getDate() }}\n </button>\n </div>\n </div>\n <div class=\"calendar-footer\">\n <button (click)=\"cancel()\">Cancel</button>\n <button (click)=\"confirm()\">OK</button>\n </div>\n </div>\n </div>\n ", styles: [".date-picker{position:relative;width:250px}input{width:100%;padding:10px;border:1px solid #ccc;border-radius:4px;cursor:pointer}.calendar{position:absolute;top:100%;left:0;width:fit-content;border:1px solid #ccc;background-color:#fff;z-index:10;border-radius:4px}.calendar-header{display:flex;justify-content:space-between;gap:10px;padding:10px;background-color:#f0f0f0}.weekdays,.dates{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:6px;padding:10px}button{border:none;background:none;cursor:pointer;padding:5px;width:40px;height:40px}button.selected{background-color:#ffe681;color:#000;border-radius:30px}.calendar-footer{display:flex;justify-content:end;gap:20px;padding:4px 10px;color:purple;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
|
|
119
119
|
}
|
|
120
120
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DatePickerComponent, decorators: [{
|
|
121
121
|
type: Component,
|