@firestitch/report 18.8.1 → 18.10.0
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/app/reports/anchor-at-point.d.ts +14 -0
- package/app/reports/canvas-landing-page.d.ts +2 -0
- package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
- package/app/reports/components/component-text/component-text.component.d.ts +47 -2
- package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +37 -9
- package/app/reports/components/report-component/report-component.component.d.ts +45 -2
- package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
- package/app/reports/data/report.data.d.ts +18 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +25 -2
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +15 -6
- package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
- package/app/reports/drill-crumbs.d.ts +12 -0
- package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
- package/app/reports/export/report-export-collector.service.d.ts +35 -4
- package/app/reports/export/report-export.service.d.ts +3 -1
- package/app/reports/export/report-filter-lines.d.ts +18 -0
- package/app/reports/export/report-pdf.service.d.ts +18 -2
- package/app/reports/export/report-pptx.service.d.ts +15 -2
- package/app/reports/export/report-text-layout.service.d.ts +35 -0
- package/app/reports/filter-settings-rules.d.ts +33 -0
- package/app/reports/format.d.ts +2 -1
- package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
- package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
- package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
- package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
- package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
- package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
- package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
- package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
- package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
- package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
- package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
- package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
- package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
- package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
- package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
- package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
- package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
- package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
- package/app/reports/interfaces/report-url-link.interface.d.ts +4 -0
- package/app/reports/interfaces/report-url-value-name.type.d.ts +1 -0
- package/app/reports/interfaces/report-url-write.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
- package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
- package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view.interface.d.ts +7 -0
- package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
- package/app/reports/interfaces/report-views.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +48 -5
- package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
- package/app/reports/layout.d.ts +2 -0
- package/app/reports/mark-click.d.ts +20 -0
- package/app/reports/option-builder.d.ts +12 -1
- package/app/reports/report-chat-viewer-state.d.ts +8 -0
- package/app/reports/report-date-presets.d.ts +2 -0
- package/app/reports/report-filter-items.d.ts +27 -22
- package/app/reports/report-tile.d.ts +2 -0
- package/app/reports/report-url-state.d.ts +27 -10
- package/app/reports/report-view-config.d.ts +36 -0
- package/app/reports/report-view-menu.d.ts +15 -0
- package/app/reports/report-viewer-features.d.ts +5 -0
- package/app/reports/services/report-filter-options.service.d.ts +26 -0
- package/app/reports/services/report-filter-state.service.d.ts +65 -2
- package/app/reports/services/report-view.service.d.ts +51 -0
- package/app/reports/text.d.ts +50 -0
- package/app/reports/tile-data-state.d.ts +7 -0
- package/app/reports/tile-loads.d.ts +4 -0
- package/app/reports/values.d.ts +17 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +9 -1
- package/app/reports/views/report/report.component.d.ts +6 -0
- package/esm2022/app/reports/anchor-at-point.mjs +49 -0
- package/esm2022/app/reports/canvas-landing-page.mjs +25 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +7 -1
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
- package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +296 -55
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +318 -76
- package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
- package/esm2022/app/reports/data/report.data.mjs +103 -8
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +210 -44
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +86 -90
- package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
- package/esm2022/app/reports/drill-crumbs.mjs +73 -0
- package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +299 -125
- package/esm2022/app/reports/export/report-export.service.mjs +57 -19
- package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +315 -71
- package/esm2022/app/reports/export/report-pptx.service.mjs +293 -71
- package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
- package/esm2022/app/reports/filter-settings-rules.mjs +283 -0
- package/esm2022/app/reports/format.mjs +13 -30
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
- package/esm2022/app/reports/layout.mjs +11 -1
- package/esm2022/app/reports/mark-click.mjs +193 -0
- package/esm2022/app/reports/option-builder.mjs +159 -15
- package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
- package/esm2022/app/reports/report-date-presets.mjs +18 -0
- package/esm2022/app/reports/report-filter-items.mjs +343 -72
- package/esm2022/app/reports/report-tile.mjs +12 -0
- package/esm2022/app/reports/report-url-state.mjs +596 -108
- package/esm2022/app/reports/report-view-config.mjs +697 -0
- package/esm2022/app/reports/report-view-menu.mjs +119 -0
- package/esm2022/app/reports/report-viewer-features.mjs +42 -0
- package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +715 -71
- package/esm2022/app/reports/services/report-view.service.mjs +358 -0
- package/esm2022/app/reports/text.mjs +293 -85
- package/esm2022/app/reports/tile-data-state.mjs +127 -0
- package/esm2022/app/reports/tile-loads.mjs +38 -0
- package/esm2022/app/reports/values.mjs +183 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +180 -46
- package/esm2022/app/reports/views/report/report.component.mjs +106 -23
- package/esm2022/public_api.mjs +24 -1
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs → firestitch-report-echarts-UBg8Wlhd.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs.map → firestitch-report-echarts-UBg8Wlhd.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CSylkyko.mjs → firestitch-report-firestitch-report-B1keNrcK.mjs} +11315 -4201
- package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +23 -0
- package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
|
|
2
|
+
import { FormsModule } from '@angular/forms';
|
|
3
|
+
import { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
|
|
4
|
+
import { MatFormField, MatHint, MatLabel } from '@angular/material/form-field';
|
|
5
|
+
import { MatInput } from '@angular/material/input';
|
|
6
|
+
import { FsDialogModule } from '@firestitch/dialog';
|
|
7
|
+
import { FsFormModule } from '@firestitch/form';
|
|
8
|
+
import { tap } from 'rxjs/operators';
|
|
9
|
+
import { VIEW_NAME_MAX_LENGTH, viewNameError } from '../../report-view-menu';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/forms";
|
|
12
|
+
import * as i2 from "@firestitch/dialog";
|
|
13
|
+
import * as i3 from "@firestitch/form";
|
|
14
|
+
// Names a saved view: Save as new view and Rename. One name field; the
|
|
15
|
+
// caller's save call does the work, and the dialog closes once it answers.
|
|
16
|
+
// A refusal from the server (a name taken, too many views) shows as the
|
|
17
|
+
// API's own error and leaves the dialog open.
|
|
18
|
+
export class ReportViewDialogComponent {
|
|
19
|
+
data = inject(MAT_DIALOG_DATA);
|
|
20
|
+
name = signal(this.data.name);
|
|
21
|
+
nameMaxLength = VIEW_NAME_MAX_LENGTH;
|
|
22
|
+
_dialogRef = inject(MatDialogRef);
|
|
23
|
+
// A name of spaces only is refused here, where fsFormRequired lets it by.
|
|
24
|
+
// It reads the control: the name signal catches up only after validation.
|
|
25
|
+
validateName = (control) => {
|
|
26
|
+
const error = viewNameError(control.value);
|
|
27
|
+
if (error) {
|
|
28
|
+
throw new Error(error);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
save = () => {
|
|
32
|
+
return this.data.save(this.name().trim())
|
|
33
|
+
.pipe(tap(() => this._dialogRef.close(true)));
|
|
34
|
+
};
|
|
35
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
36
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportViewDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <fs-dialog-title>\n {{ data.title }}\n </fs-dialog-title>\n <mat-dialog-content>\n <div class=\"fs-column\">\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n cdkFocusInitial\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"validateName\">\n @if (data.note) {\n <mat-hint>\n {{ data.note }}\n </mat-hint>\n }\n </mat-form-field>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions></fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "component", type: i2.FsDialogTitleComponent, selector: "fs-dialog-title", inputs: ["close", "dockToggle", "back"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i3.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i3.FsFormMaxLengthDirective, selector: "[fsFormMaxLength]", inputs: ["fsFormMaxLength", "fsFormMaxLengthMessage"] }, { kind: "directive", type: i3.FsFormValidateDirective, selector: "[validate]", inputs: ["validate", "validateData", "validateOnSubmit"] }, { kind: "component", type: i3.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewDialogComponent, decorators: [{
|
|
39
|
+
type: Component,
|
|
40
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
41
|
+
FormsModule,
|
|
42
|
+
MatDialogContent,
|
|
43
|
+
MatDialogActions,
|
|
44
|
+
MatFormField,
|
|
45
|
+
MatHint,
|
|
46
|
+
MatLabel,
|
|
47
|
+
MatInput,
|
|
48
|
+
FsDialogModule,
|
|
49
|
+
FsFormModule,
|
|
50
|
+
], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <fs-dialog-title>\n {{ data.title }}\n </fs-dialog-title>\n <mat-dialog-content>\n <div class=\"fs-column\">\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n cdkFocusInitial\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"validateName\">\n @if (data.note) {\n <mat-hint>\n {{ data.note }}\n </mat-hint>\n }\n </mat-form-field>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions></fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n" }]
|
|
51
|
+
}] });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXctZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC12aWV3L3JlcG9ydC12aWV3LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9yZXBvcnQtdmlldy9yZXBvcnQtdmlldy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7OztBQUc3RSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLHdFQUF3RTtBQUN4RSw4Q0FBOEM7QUFpQjlDLE1BQU0sT0FBTyx5QkFBeUI7SUFFcEIsSUFBSSxHQUFHLE1BQU0sQ0FBdUIsZUFBZSxDQUFDLENBQUM7SUFDckQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQztJQUU3QyxVQUFVLEdBQUcsTUFBTSxDQUFtRCxZQUFZLENBQUMsQ0FBQztJQUU1RiwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQ25FLFlBQVksR0FBRyxDQUFDLE9BQXdCLEVBQVEsRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFSyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3RDLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDdkMsQ0FBQztJQUNOLENBQUMsQ0FBQzt3R0F0QlMseUJBQXlCOzRGQUF6Qix5QkFBeUIsd0VDcEN0QyxxNEJBa0NBLDJDRFRJLFdBQVcsd2lDQUNYLGdCQUFnQix5R0FDaEIsZ0JBQWdCLDRIQUNoQixZQUFZLDRMQUNaLE9BQU8sOEVBQ1AsUUFBUSxzREFDUixRQUFRLGdVQUNSLGNBQWMsOFRBQ2QsWUFBWTs7NEZBR0gseUJBQXlCO2tCQWhCckMsU0FBUztzQ0FFUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixRQUFRO3dCQUNSLGNBQWM7d0JBQ2QsWUFBWTtxQkFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdEhpbnQsIE1hdExhYmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcblxuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5cbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0Vmlld0RpYWxvZ0RhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LWRpYWxvZy1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWSUVXX05BTUVfTUFYX0xFTkdUSCwgdmlld05hbWVFcnJvciB9IGZyb20gJy4uLy4uL3JlcG9ydC12aWV3LW1lbnUnO1xuXG5cbi8vIE5hbWVzIGEgc2F2ZWQgdmlldzogU2F2ZSBhcyBuZXcgdmlldyBhbmQgUmVuYW1lLiBPbmUgbmFtZSBmaWVsZDsgdGhlXG4vLyBjYWxsZXIncyBzYXZlIGNhbGwgZG9lcyB0aGUgd29yaywgYW5kIHRoZSBkaWFsb2cgY2xvc2VzIG9uY2UgaXQgYW5zd2Vycy5cbi8vIEEgcmVmdXNhbCBmcm9tIHRoZSBzZXJ2ZXIgKGEgbmFtZSB0YWtlbiwgdG9vIG1hbnkgdmlld3MpIHNob3dzIGFzIHRoZVxuLy8gQVBJJ3Mgb3duIGVycm9yIGFuZCBsZWF2ZXMgdGhlIGRpYWxvZyBvcGVuLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtdmlldy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0SGludCxcbiAgICBNYXRMYWJlbCxcbiAgICBNYXRJbnB1dCxcbiAgICBGc0RpYWxvZ01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFZpZXdEaWFsb2dDb21wb25lbnQge1xuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhID0gaW5qZWN0PFJlcG9ydFZpZXdEaWFsb2dEYXRhPihNQVRfRElBTE9HX0RBVEEpO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZSA9IHNpZ25hbCh0aGlzLmRhdGEubmFtZSk7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lTWF4TGVuZ3RoID0gVklFV19OQU1FX01BWF9MRU5HVEg7XG5cbiAgcHJpdmF0ZSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxSZXBvcnRWaWV3RGlhbG9nQ29tcG9uZW50LCBib29sZWFuPj4oTWF0RGlhbG9nUmVmKTtcblxuICAvLyBBIG5hbWUgb2Ygc3BhY2VzIG9ubHkgaXMgcmVmdXNlZCBoZXJlLCB3aGVyZSBmc0Zvcm1SZXF1aXJlZCBsZXRzIGl0IGJ5LlxuICAvLyBJdCByZWFkcyB0aGUgY29udHJvbDogdGhlIG5hbWUgc2lnbmFsIGNhdGNoZXMgdXAgb25seSBhZnRlciB2YWxpZGF0aW9uLlxuICBwdWJsaWMgdmFsaWRhdGVOYW1lID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gdmlld05hbWVFcnJvcihjb250cm9sLnZhbHVlKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBzYXZlID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2F2ZSh0aGlzLm5hbWUoKS50cmltKCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2RpYWxvZ1JlZi5jbG9zZSh0cnVlKSksXG4gICAgICApO1xuICB9O1xufVxuIiwiPGZvcm1cbiAgICBmc0Zvcm1cbiAgICBbc3VibWl0XT1cInNhdmVcIj5cbiAgPGZzLWRpYWxvZz5cbiAgICA8ZnMtZGlhbG9nLXRpdGxlPlxuICAgICAge3sgZGF0YS50aXRsZSB9fVxuICAgIDwvZnMtZGlhbG9nLXRpdGxlPlxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgTmFtZVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5hbWVcIlxuICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtmc0Zvcm1NYXhMZW5ndGhdPVwibmFtZU1heExlbmd0aFwiXG4gICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJ2YWxpZGF0ZU5hbWVcIj5cbiAgICAgICAgICBAaWYgKGRhdGEubm90ZSkge1xuICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICB7eyBkYXRhLm5vdGUgfX1cbiAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgIDxmcy1mb3JtLWRpYWxvZy1hY3Rpb25zPjwvZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+XG4iXX0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ReportChartDateLabel } from './enums/report-chart-date-label.enum';
|
|
2
|
+
import { GRANULARITY_OPTIONS, } from './interfaces/report.interface';
|
|
3
|
+
import { formatPeriodLabel } from './option-builder';
|
|
4
|
+
// The words a time drill is shown in. The tile header's breadcrumb, the PDF
|
|
5
|
+
// and PowerPoint titles and the chat all name a path's steps here, so they
|
|
6
|
+
// never word the same step two ways. A step is the period clicked and the
|
|
7
|
+
// level it was clicked at: {level: 'year', value: '2026-01-01'} then
|
|
8
|
+
// {level: 'quarter', value: '2026-07-01'} reads '2026 › Q3', the months of
|
|
9
|
+
// Q3 2026. Pure, so the node harness checks it.
|
|
10
|
+
// Between the title and each crumb.
|
|
11
|
+
export const DRILL_CRUMB_SEPARATOR = ' › ';
|
|
12
|
+
// Shown once when the server could not apply a chart's whole drill path and
|
|
13
|
+
// the viewer kept the part it applied.
|
|
14
|
+
export const DRILL_RESET_MESSAGE = 'The drill was reset: this chart changed.';
|
|
15
|
+
// The breadcrumb's labels for a path, top first, in the report's locale. The
|
|
16
|
+
// first step carries its year ('2026', 'Q3 2026', 'July 2026', 'Jul 1,
|
|
17
|
+
// 2026'), and each later step is read inside the one before it, so it leaves
|
|
18
|
+
// the year out ('Q3', 'July', 'Jul 1'). A crumb the server labeled keeps its
|
|
19
|
+
// label. `drill` is a path as the server echoes it (ComponentDataDrill.path)
|
|
20
|
+
// or as the viewer holds it (a tile's drill steps).
|
|
21
|
+
export function drillCrumbLabels(drill, formatContext) {
|
|
22
|
+
return drill.map((step, index) => crumbLabel(step, formatContext.locale, index === 0));
|
|
23
|
+
}
|
|
24
|
+
// A title followed by its breadcrumb ('Revenue by Period › 2026 › Q3'): what
|
|
25
|
+
// an exported tile's title and a file's drill line read. With no crumbs it is
|
|
26
|
+
// the title, and with no title the crumbs alone.
|
|
27
|
+
export function crumbedTitle(title, crumbs = []) {
|
|
28
|
+
return [title ?? '', ...crumbs]
|
|
29
|
+
.filter((part) => !!part)
|
|
30
|
+
.join(DRILL_CRUMB_SEPARATOR);
|
|
31
|
+
}
|
|
32
|
+
// One step on its own, with its year ('Q3 2026'), in the report's locale. A
|
|
33
|
+
// step that holds no period names its level.
|
|
34
|
+
export function drillStepLabel(step, locale) {
|
|
35
|
+
return crumbLabel(step, locale, true);
|
|
36
|
+
}
|
|
37
|
+
// The empty chart's note when the drilled period holds none of the days the
|
|
38
|
+
// tile reads ('July 2026 is outside the dates this tile reads.'), or null.
|
|
39
|
+
export function drillOutsideMessage(drill, formatContext) {
|
|
40
|
+
const last = drill?.outsideWindow ? drill.path[drill.path.length - 1] : null;
|
|
41
|
+
return last ? `${drillStepLabel(last, formatContext.locale)} is outside the dates this tile reads.` : null;
|
|
42
|
+
}
|
|
43
|
+
// The path a chart adopts from its answer: the steps the server applied,
|
|
44
|
+
// which are the truth. A server that drills sends no drill state for a chart
|
|
45
|
+
// that cannot drill, so its path is empty.
|
|
46
|
+
export function adoptedDrillPath(drill) {
|
|
47
|
+
return (drill?.path ?? []).map(({ level, value }) => ({ level, value }));
|
|
48
|
+
}
|
|
49
|
+
// Whether a chart whose adopted path is shorter than the one it sent tells
|
|
50
|
+
// the viewer: yes when the server dropped steps, or answered with no drill
|
|
51
|
+
// state at all, because the chart changed under the path. Not when the
|
|
52
|
+
// viewer's own group-by change is why the path no longer starts at the
|
|
53
|
+
// chart's top (`grainMoved`, refusal topChanged): the chart simply opens at
|
|
54
|
+
// its new top.
|
|
55
|
+
export function drillResetNoted(drill, grainMoved) {
|
|
56
|
+
if (!drill) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return drill.dropped > 0 && !(grainMoved && drill.refusal === 'topChanged');
|
|
60
|
+
}
|
|
61
|
+
// A step's label: the server's own, else the period at its level, written in
|
|
62
|
+
// full (with its year) or short (inside the step before it). A step with no
|
|
63
|
+
// period names its level.
|
|
64
|
+
function crumbLabel(step, locale, full) {
|
|
65
|
+
if ('label' in step && step.label) {
|
|
66
|
+
return step.label;
|
|
67
|
+
}
|
|
68
|
+
if (step.value === null || step.value === '') {
|
|
69
|
+
return GRANULARITY_OPTIONS.find((option) => option.value === step.level)?.name ?? step.level;
|
|
70
|
+
}
|
|
71
|
+
return formatPeriodLabel(String(step.value), step.level, false, locale, full ? ReportChartDateLabel.Long : ReportChartDateLabel.Short);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpbGwtY3J1bWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RyaWxsLWNydW1icy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUk1RSxPQUFPLEVBQ0wsbUJBQW1CLEdBR3BCLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHckQsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLDJFQUEyRTtBQUMzRSxnREFBZ0Q7QUFHaEQsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUUzQyw0RUFBNEU7QUFDNUUsdUNBQXVDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLDBDQUEwQyxDQUFDO0FBRzlFLDZFQUE2RTtBQUM3RSx1RUFBdUU7QUFDdkUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0Usb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsS0FBc0QsRUFDdEQsYUFBa0Q7SUFFbEQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLGlEQUFpRDtBQUNqRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWdDLEVBQUUsU0FBNEIsRUFBRTtJQUMzRixPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztTQUM1QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDeEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUF3QyxFQUFFLE1BQXVCO0lBQzlGLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxLQUE0QyxFQUM1QyxhQUFrRDtJQUVsRCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFFN0UsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0csQ0FBQztBQUVELHlFQUF5RTtBQUN6RSw2RUFBNkU7QUFDN0UsMkNBQTJDO0FBQzNDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUE0QztJQUMzRSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSw0RUFBNEU7QUFDNUUsZUFBZTtBQUNmLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBNEMsRUFBRSxVQUFtQjtJQUMvRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwwQkFBMEI7QUFDMUIsU0FBUyxVQUFVLENBQUMsSUFBd0MsRUFBRSxNQUF1QixFQUFFLElBQWE7SUFDbEcsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDL0YsQ0FBQztJQUVELE9BQU8saUJBQWlCLENBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUM5RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydENoYXJ0RGF0ZUxhYmVsIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmltcG9ydCB7IENvbXBvbmVudERhdGFEcmlsbCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb21wb25lbnQtZGF0YS1kcmlsbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RHJpbGxDcnVtYiB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtY3J1bWIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydERyaWxsU3RlcCB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtc3RlcC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBmb3JtYXRQZXJpb2RMYWJlbCB9IGZyb20gJy4vb3B0aW9uLWJ1aWxkZXInO1xuXG5cbi8vIFRoZSB3b3JkcyBhIHRpbWUgZHJpbGwgaXMgc2hvd24gaW4uIFRoZSB0aWxlIGhlYWRlcidzIGJyZWFkY3J1bWIsIHRoZSBQREZcbi8vIGFuZCBQb3dlclBvaW50IHRpdGxlcyBhbmQgdGhlIGNoYXQgYWxsIG5hbWUgYSBwYXRoJ3Mgc3RlcHMgaGVyZSwgc28gdGhleVxuLy8gbmV2ZXIgd29yZCB0aGUgc2FtZSBzdGVwIHR3byB3YXlzLiBBIHN0ZXAgaXMgdGhlIHBlcmlvZCBjbGlja2VkIGFuZCB0aGVcbi8vIGxldmVsIGl0IHdhcyBjbGlja2VkIGF0OiB7bGV2ZWw6ICd5ZWFyJywgdmFsdWU6ICcyMDI2LTAxLTAxJ30gdGhlblxuLy8ge2xldmVsOiAncXVhcnRlcicsIHZhbHVlOiAnMjAyNi0wNy0wMSd9IHJlYWRzICcyMDI2IOKAuiBRMycsIHRoZSBtb250aHMgb2Zcbi8vIFEzIDIwMjYuIFB1cmUsIHNvIHRoZSBub2RlIGhhcm5lc3MgY2hlY2tzIGl0LlxuXG5cbi8vIEJldHdlZW4gdGhlIHRpdGxlIGFuZCBlYWNoIGNydW1iLlxuZXhwb3J0IGNvbnN0IERSSUxMX0NSVU1CX1NFUEFSQVRPUiA9ICcg4oC6ICc7XG5cbi8vIFNob3duIG9uY2Ugd2hlbiB0aGUgc2VydmVyIGNvdWxkIG5vdCBhcHBseSBhIGNoYXJ0J3Mgd2hvbGUgZHJpbGwgcGF0aCBhbmRcbi8vIHRoZSB2aWV3ZXIga2VwdCB0aGUgcGFydCBpdCBhcHBsaWVkLlxuZXhwb3J0IGNvbnN0IERSSUxMX1JFU0VUX01FU1NBR0UgPSAnVGhlIGRyaWxsIHdhcyByZXNldDogdGhpcyBjaGFydCBjaGFuZ2VkLic7XG5cblxuLy8gVGhlIGJyZWFkY3J1bWIncyBsYWJlbHMgZm9yIGEgcGF0aCwgdG9wIGZpcnN0LCBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLiBUaGVcbi8vIGZpcnN0IHN0ZXAgY2FycmllcyBpdHMgeWVhciAoJzIwMjYnLCAnUTMgMjAyNicsICdKdWx5IDIwMjYnLCAnSnVsIDEsXG4vLyAyMDI2JyksIGFuZCBlYWNoIGxhdGVyIHN0ZXAgaXMgcmVhZCBpbnNpZGUgdGhlIG9uZSBiZWZvcmUgaXQsIHNvIGl0IGxlYXZlc1xuLy8gdGhlIHllYXIgb3V0ICgnUTMnLCAnSnVseScsICdKdWwgMScpLiBBIGNydW1iIHRoZSBzZXJ2ZXIgbGFiZWxlZCBrZWVwcyBpdHNcbi8vIGxhYmVsLiBgZHJpbGxgIGlzIGEgcGF0aCBhcyB0aGUgc2VydmVyIGVjaG9lcyBpdCAoQ29tcG9uZW50RGF0YURyaWxsLnBhdGgpXG4vLyBvciBhcyB0aGUgdmlld2VyIGhvbGRzIGl0IChhIHRpbGUncyBkcmlsbCBzdGVwcykuXG5leHBvcnQgZnVuY3Rpb24gZHJpbGxDcnVtYkxhYmVscyhcbiAgZHJpbGw6IHJlYWRvbmx5IChSZXBvcnREcmlsbFN0ZXAgfCBSZXBvcnREcmlsbENydW1iKVtdLFxuICBmb3JtYXRDb250ZXh0OiBQaWNrPFJlcG9ydEZvcm1hdENvbnRleHQsICdsb2NhbGUnPixcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGRyaWxsLm1hcCgoc3RlcCwgaW5kZXgpID0+IGNydW1iTGFiZWwoc3RlcCwgZm9ybWF0Q29udGV4dC5sb2NhbGUsIGluZGV4ID09PSAwKSk7XG59XG5cbi8vIEEgdGl0bGUgZm9sbG93ZWQgYnkgaXRzIGJyZWFkY3J1bWIgKCdSZXZlbnVlIGJ5IFBlcmlvZCDigLogMjAyNiDigLogUTMnKTogd2hhdFxuLy8gYW4gZXhwb3J0ZWQgdGlsZSdzIHRpdGxlIGFuZCBhIGZpbGUncyBkcmlsbCBsaW5lIHJlYWQuIFdpdGggbm8gY3J1bWJzIGl0IGlzXG4vLyB0aGUgdGl0bGUsIGFuZCB3aXRoIG5vIHRpdGxlIHRoZSBjcnVtYnMgYWxvbmUuXG5leHBvcnQgZnVuY3Rpb24gY3J1bWJlZFRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBjcnVtYnM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICByZXR1cm4gW3RpdGxlID8/ICcnLCAuLi5jcnVtYnNdXG4gICAgLmZpbHRlcigocGFydCkgPT4gISFwYXJ0KVxuICAgIC5qb2luKERSSUxMX0NSVU1CX1NFUEFSQVRPUik7XG59XG5cbi8vIE9uZSBzdGVwIG9uIGl0cyBvd24sIHdpdGggaXRzIHllYXIgKCdRMyAyMDI2JyksIGluIHRoZSByZXBvcnQncyBsb2NhbGUuIEFcbi8vIHN0ZXAgdGhhdCBob2xkcyBubyBwZXJpb2QgbmFtZXMgaXRzIGxldmVsLlxuZXhwb3J0IGZ1bmN0aW9uIGRyaWxsU3RlcExhYmVsKHN0ZXA6IFJlcG9ydERyaWxsU3RlcCB8IFJlcG9ydERyaWxsQ3J1bWIsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNydW1iTGFiZWwoc3RlcCwgbG9jYWxlLCB0cnVlKTtcbn1cblxuLy8gVGhlIGVtcHR5IGNoYXJ0J3Mgbm90ZSB3aGVuIHRoZSBkcmlsbGVkIHBlcmlvZCBob2xkcyBub25lIG9mIHRoZSBkYXlzIHRoZVxuLy8gdGlsZSByZWFkcyAoJ0p1bHkgMjAyNiBpcyBvdXRzaWRlIHRoZSBkYXRlcyB0aGlzIHRpbGUgcmVhZHMuJyksIG9yIG51bGwuXG5leHBvcnQgZnVuY3Rpb24gZHJpbGxPdXRzaWRlTWVzc2FnZShcbiAgZHJpbGw6IENvbXBvbmVudERhdGFEcmlsbCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGZvcm1hdENvbnRleHQ6IFBpY2s8UmVwb3J0Rm9ybWF0Q29udGV4dCwgJ2xvY2FsZSc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxhc3QgPSBkcmlsbD8ub3V0c2lkZVdpbmRvdyA/IGRyaWxsLnBhdGhbZHJpbGwucGF0aC5sZW5ndGggLSAxXSA6IG51bGw7XG5cbiAgcmV0dXJuIGxhc3QgPyBgJHtkcmlsbFN0ZXBMYWJlbChsYXN0LCBmb3JtYXRDb250ZXh0LmxvY2FsZSl9IGlzIG91dHNpZGUgdGhlIGRhdGVzIHRoaXMgdGlsZSByZWFkcy5gIDogbnVsbDtcbn1cblxuLy8gVGhlIHBhdGggYSBjaGFydCBhZG9wdHMgZnJvbSBpdHMgYW5zd2VyOiB0aGUgc3RlcHMgdGhlIHNlcnZlciBhcHBsaWVkLFxuLy8gd2hpY2ggYXJlIHRoZSB0cnV0aC4gQSBzZXJ2ZXIgdGhhdCBkcmlsbHMgc2VuZHMgbm8gZHJpbGwgc3RhdGUgZm9yIGEgY2hhcnRcbi8vIHRoYXQgY2Fubm90IGRyaWxsLCBzbyBpdHMgcGF0aCBpcyBlbXB0eS5cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdGVkRHJpbGxQYXRoKGRyaWxsOiBDb21wb25lbnREYXRhRHJpbGwgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0RHJpbGxTdGVwW10ge1xuICByZXR1cm4gKGRyaWxsPy5wYXRoID8/IFtdKS5tYXAoKHsgbGV2ZWwsIHZhbHVlIH0pID0+ICh7IGxldmVsLCB2YWx1ZSB9KSk7XG59XG5cbi8vIFdoZXRoZXIgYSBjaGFydCB3aG9zZSBhZG9wdGVkIHBhdGggaXMgc2hvcnRlciB0aGFuIHRoZSBvbmUgaXQgc2VudCB0ZWxsc1xuLy8gdGhlIHZpZXdlcjogeWVzIHdoZW4gdGhlIHNlcnZlciBkcm9wcGVkIHN0ZXBzLCBvciBhbnN3ZXJlZCB3aXRoIG5vIGRyaWxsXG4vLyBzdGF0ZSBhdCBhbGwsIGJlY2F1c2UgdGhlIGNoYXJ0IGNoYW5nZWQgdW5kZXIgdGhlIHBhdGguIE5vdCB3aGVuIHRoZVxuLy8gdmlld2VyJ3Mgb3duIGdyb3VwLWJ5IGNoYW5nZSBpcyB3aHkgdGhlIHBhdGggbm8gbG9uZ2VyIHN0YXJ0cyBhdCB0aGVcbi8vIGNoYXJ0J3MgdG9wIChgZ3JhaW5Nb3ZlZGAsIHJlZnVzYWwgdG9wQ2hhbmdlZCk6IHRoZSBjaGFydCBzaW1wbHkgb3BlbnMgYXRcbi8vIGl0cyBuZXcgdG9wLlxuZXhwb3J0IGZ1bmN0aW9uIGRyaWxsUmVzZXROb3RlZChkcmlsbDogQ29tcG9uZW50RGF0YURyaWxsIHwgbnVsbCB8IHVuZGVmaW5lZCwgZ3JhaW5Nb3ZlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoIWRyaWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZHJpbGwuZHJvcHBlZCA+IDAgJiYgIShncmFpbk1vdmVkICYmIGRyaWxsLnJlZnVzYWwgPT09ICd0b3BDaGFuZ2VkJyk7XG59XG5cbi8vIEEgc3RlcCdzIGxhYmVsOiB0aGUgc2VydmVyJ3Mgb3duLCBlbHNlIHRoZSBwZXJpb2QgYXQgaXRzIGxldmVsLCB3cml0dGVuIGluXG4vLyBmdWxsICh3aXRoIGl0cyB5ZWFyKSBvciBzaG9ydCAoaW5zaWRlIHRoZSBzdGVwIGJlZm9yZSBpdCkuIEEgc3RlcCB3aXRoIG5vXG4vLyBwZXJpb2QgbmFtZXMgaXRzIGxldmVsLlxuZnVuY3Rpb24gY3J1bWJMYWJlbChzdGVwOiBSZXBvcnREcmlsbFN0ZXAgfCBSZXBvcnREcmlsbENydW1iLCBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZywgZnVsbDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICgnbGFiZWwnIGluIHN0ZXAgJiYgc3RlcC5sYWJlbCkge1xuICAgIHJldHVybiBzdGVwLmxhYmVsO1xuICB9XG5cbiAgaWYgKHN0ZXAudmFsdWUgPT09IG51bGwgfHwgc3RlcC52YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gR1JBTlVMQVJJVFlfT1BUSU9OUy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gc3RlcC5sZXZlbCk/Lm5hbWUgPz8gc3RlcC5sZXZlbDtcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRQZXJpb2RMYWJlbChcbiAgICBTdHJpbmcoc3RlcC52YWx1ZSksXG4gICAgc3RlcC5sZXZlbCxcbiAgICBmYWxzZSxcbiAgICBsb2NhbGUsXG4gICAgZnVsbCA/IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLkxvbmcgOiBSZXBvcnRDaGFydERhdGVMYWJlbC5TaG9ydCxcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// What a formula value works out of the query values it reads on its page
|
|
2
|
+
// (config.formula.of): change is a - b, percent_change (a - b) / |b| as a 0-1
|
|
3
|
+
// fraction, ratio a / b, and sum adds 2 to 10 values. The server evaluates
|
|
4
|
+
// it; the viewer only formats the number.
|
|
5
|
+
//
|
|
6
|
+
// Mirrors the server's ValueFormulaEnum value for value.
|
|
7
|
+
export var ReportValueFormula;
|
|
8
|
+
(function (ReportValueFormula) {
|
|
9
|
+
ReportValueFormula["Change"] = "change";
|
|
10
|
+
ReportValueFormula["PercentChange"] = "percent_change";
|
|
11
|
+
ReportValueFormula["Ratio"] = "ratio";
|
|
12
|
+
ReportValueFormula["Sum"] = "sum";
|
|
13
|
+
})(ReportValueFormula || (ReportValueFormula = {}));
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZhbHVlLWZvcm11bGEuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtdmFsdWUtZm9ybXVsYS5lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsMkVBQTJFO0FBQzNFLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YseURBQXlEO0FBQ3pELE1BQU0sQ0FBTixJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDNUIsdUNBQWlCLENBQUE7SUFDakIsc0RBQWdDLENBQUE7SUFDaEMscUNBQWUsQ0FBQTtJQUNmLGlDQUFXLENBQUE7QUFDYixDQUFDLEVBTFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUs3QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFdoYXQgYSBmb3JtdWxhIHZhbHVlIHdvcmtzIG91dCBvZiB0aGUgcXVlcnkgdmFsdWVzIGl0IHJlYWRzIG9uIGl0cyBwYWdlXG4vLyAoY29uZmlnLmZvcm11bGEub2YpOiBjaGFuZ2UgaXMgYSAtIGIsIHBlcmNlbnRfY2hhbmdlIChhIC0gYikgLyB8YnwgYXMgYSAwLTFcbi8vIGZyYWN0aW9uLCByYXRpbyBhIC8gYiwgYW5kIHN1bSBhZGRzIDIgdG8gMTAgdmFsdWVzLiBUaGUgc2VydmVyIGV2YWx1YXRlc1xuLy8gaXQ7IHRoZSB2aWV3ZXIgb25seSBmb3JtYXRzIHRoZSBudW1iZXIuXG4vL1xuLy8gTWlycm9ycyB0aGUgc2VydmVyJ3MgVmFsdWVGb3JtdWxhRW51bSB2YWx1ZSBmb3IgdmFsdWUuXG5leHBvcnQgZW51bSBSZXBvcnRWYWx1ZUZvcm11bGEge1xuICBDaGFuZ2UgPSAnY2hhbmdlJyxcbiAgUGVyY2VudENoYW5nZSA9ICdwZXJjZW50X2NoYW5nZScsXG4gIFJhdGlvID0gJ3JhdGlvJyxcbiAgU3VtID0gJ3N1bScsXG59XG4iXX0=
|