nuxeo-development-framework 6.1.5 → 6.1.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/bundles/nuxeo-development-framework.umd.js +688 -1009
- package/bundles/nuxeo-development-framework.umd.js.map +1 -1
- package/esm2015/lib/components/ndf-filters/components/__parts/filter-autocomplete-input/filter-autocomplete.service.js +7 -5
- package/esm2015/lib/components/ndf-filters/containers/filters-panel/filters-panel.component.js +9 -9
- package/esm2015/lib/components/ndf-filters/models/base-field-config.js +1 -1
- package/esm2015/lib/components/ndf-filters/pipes/check-condition.pipe.js +9 -4
- package/esm2015/lib/components/ndf-filters/pipes/evaluate-label.pipe.js +3 -3
- package/esm2015/lib/components/pdf-tron/pdftron/pdftron.component.js +2 -1
- package/esm2015/lib/components/pdf-tron/pdftron/silent-pdftron.service.js +2 -1
- package/esm2015/lib/components/reports/ndf-reports/models/details.js +1 -1
- package/esm2015/lib/components/reports/ndf-reports/models/graph-definition.js +1 -1
- package/esm2015/lib/components/reports/ndf-reports/pipes/check-condition.pipe.js +3 -3
- package/esm2015/lib/components/reports/ndf-reports/services/report-config-mapper.service.js +28 -15
- package/esm2015/lib/components/reports/ndf-reports/services/reports-hooks.service.js +3 -3
- package/esm2015/lib/components/tables/dynamic-table/dynamic-table/dynamic-table.component.js +1 -1
- package/esm2015/lib/components/tables/dynamic-table/services/table-hooks.service.js +4 -4
- package/esm2015/lib/components/tables/ndf-table/models/table-config.js +1 -1
- package/esm2015/lib/shared/index.js +5 -6
- package/esm2015/lib/shared-services/global-pdftron.service.js +2 -1
- package/esm2015/public-api.js +12 -13
- package/fesm2015/nuxeo-development-framework.js +644 -938
- package/fesm2015/nuxeo-development-framework.js.map +1 -1
- package/lib/components/ndf-filters/components/__parts/filter-autocomplete-input/filter-autocomplete.service.d.ts +1 -2
- package/lib/components/ndf-filters/containers/filters-panel/filters-panel.component.d.ts +3 -3
- package/lib/components/ndf-filters/models/base-field-config.d.ts +1 -1
- package/lib/components/ndf-filters/pipes/check-condition.pipe.d.ts +1 -2
- package/lib/components/reports/ndf-reports/models/details.d.ts +1 -1
- package/lib/components/reports/ndf-reports/models/graph-definition.d.ts +2 -2
- package/lib/components/reports/ndf-reports/services/report-config-mapper.service.d.ts +2 -2
- package/lib/components/tables/ndf-table/models/table-config.d.ts +1 -1
- package/lib/shared/index.d.ts +7 -5
- package/package.json +1 -1
- package/public-api.d.ts +11 -12
- package/esm2015/lib/shared/evaluator/evaluator.js +0 -318
- package/esm2015/lib/shared/evaluator/index.js +0 -3
- package/esm2015/lib/shared/evaluator/types.js +0 -2
- package/lib/shared/evaluator/evaluator.d.ts +0 -79
- package/lib/shared/evaluator/index.d.ts +0 -2
- package/lib/shared/evaluator/types.d.ts +0 -18
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Injector } from '@angular/core';
|
|
2
2
|
import { BaseService } from '../../../../../shared/services/base';
|
|
3
|
-
import { InterpolateString } from '../../../../../shared/evaluator';
|
|
4
3
|
import { AggregationFieldConfig, SearchConfig } from '../../../models';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
5
|
export declare class FilterAutocompleteService extends BaseService {
|
|
@@ -8,7 +7,7 @@ export declare class FilterAutocompleteService extends BaseService {
|
|
|
8
7
|
private readonly _aggregationService;
|
|
9
8
|
constructor(injector: Injector);
|
|
10
9
|
customSearch(searchText: string, query: SearchConfig['search']['query'], fieldConfig: AggregationFieldConfig): import("rxjs").Observable<import("../../../models").FilterOption[]>;
|
|
11
|
-
replacePlaceholder(template:
|
|
10
|
+
replacePlaceholder(template: string, searchText: string): string;
|
|
12
11
|
static ɵfac: i0.ɵɵFactoryDeclaration<FilterAutocompleteService, never>;
|
|
13
12
|
static ɵprov: i0.ɵɵInjectableDeclaration<FilterAutocompleteService>;
|
|
14
13
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { Direction } from '@angular/cdk/bidi';
|
|
1
2
|
import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
|
2
3
|
import { FormGroup } from '@angular/forms';
|
|
4
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
3
5
|
import { Observable } from 'rxjs';
|
|
6
|
+
import { NuxeoService } from '../../../../core/services';
|
|
4
7
|
import { AggregationResponse, FieldConfigModel, FormQueryModel } from '../../models';
|
|
5
8
|
import { BaseFiltersPanel } from './base-filters-panel';
|
|
6
|
-
import { Direction } from '@angular/cdk/bidi';
|
|
7
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
8
|
-
import { NuxeoService } from '../../../../core/services';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
export declare class FiltersPanelComponent extends BaseFiltersPanel implements OnInit, OnChanges {
|
|
11
11
|
private _translateService;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EvaluatedString, InterpolateString } from '../../../shared
|
|
1
|
+
import { EvaluatedString, InterpolateString } from '../../../shared';
|
|
2
2
|
import { TranslateKey } from '../../../shared/models';
|
|
3
3
|
import { ComparisonOperator } from './types-helper';
|
|
4
4
|
export declare type BaseFieldConfig = {
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { PipeTransform } from '@angular/core';
|
|
2
|
-
import { Evaluator } from '../../../shared/evaluator';
|
|
3
2
|
import { NuxeoService } from '../../../core/services';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
4
|
export declare class CheckConditionPipe implements PipeTransform {
|
|
6
5
|
nuxeoService: NuxeoService;
|
|
7
6
|
user: Record<string, any>;
|
|
8
7
|
constructor(nuxeoService: NuxeoService);
|
|
9
|
-
transform(condition: string, aggregations: Record<string, any>, language: string, filterValues: Record<string, any>):
|
|
8
|
+
transform(condition: string, aggregations: Record<string, any>, language: string, filterValues: Record<string, any>): any;
|
|
10
9
|
static ɵfac: i0.ɵɵFactoryDeclaration<CheckConditionPipe, never>;
|
|
11
10
|
static ɵpipe: i0.ɵɵPipeDeclaration<CheckConditionPipe, "checkCondition">;
|
|
12
11
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FilterMode, TableColumnConfig, TableExportConfig, TableSortConfig, TableSortOptions } from '../../../tables/ndf-table';
|
|
2
|
-
import { NdfReportsRequest } from './request';
|
|
3
2
|
import { EvaluatedString } from '../../../../shared';
|
|
4
3
|
import { NdfReportsFilters } from './ndf-reports.config';
|
|
4
|
+
import { NdfReportsRequest } from './request';
|
|
5
5
|
export declare type ReportDetailsConfig = {
|
|
6
6
|
enabled: boolean;
|
|
7
7
|
source: ReportDetailsKey | ReportConfigOptions;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DialogPosition } from '@angular/material/dialog';
|
|
2
2
|
import { ChartDataset, ChartType, Plugin } from 'chart.js';
|
|
3
3
|
import { CustomChartOptions } from '../../charts';
|
|
4
|
+
import { EvaluatedString } from '../../../../shared';
|
|
5
|
+
import { CHARTS_TYPES } from '../constants';
|
|
4
6
|
import { BaseReportConfig } from './base';
|
|
5
7
|
import { ChartOptionsByType } from './common';
|
|
6
8
|
import { ReportDataSource } from './report-data-source';
|
|
7
|
-
import { CHARTS_TYPES } from '../constants';
|
|
8
|
-
import { EvaluatedString } from '../../../../shared';
|
|
9
9
|
declare type chartTypes = Omit<typeof CHARTS_TYPES, 'line'>;
|
|
10
10
|
export declare type AllowedChartType = chartTypes[keyof chartTypes];
|
|
11
11
|
export interface ChartTypeConfig {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
1
2
|
import { CustomChart, CustomChartDefinition, DigitChart, DigitChartDefinition, DynamicLineChart, DynamicLineChartDefinition, GraphChart, GraphChartDefinition } from '../models';
|
|
2
|
-
import { ChartPluginsRegistry } from './chart-plugins-registry.service';
|
|
3
3
|
import { ChartCallbacksRegisterService } from './chart-callbacks-register.services';
|
|
4
|
-
import {
|
|
4
|
+
import { ChartPluginsRegistry } from './chart-plugins-registry.service';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class ReportConfigMapperService {
|
|
7
7
|
private readonly _chartPluginsRegistry;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { EvaluatedString } from '../../../../shared';
|
|
1
2
|
import { TableColumnAction, TableColumnConfig } from './table-column';
|
|
2
3
|
import { NdfTableOptions } from './table-options';
|
|
3
4
|
import { TableDefaultSortModel, TablePaginationOptions, TableSortOptions } from './types';
|
|
4
|
-
import { EvaluatedString } from '../../../../shared';
|
|
5
5
|
/**
|
|
6
6
|
* Configuration type for the NDF Table component.
|
|
7
7
|
* Extends `TablePaginationOptions` and provides additional properties
|
package/lib/shared/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export * from './directives';
|
|
2
|
-
export * from './services';
|
|
3
1
|
export * from './components';
|
|
4
|
-
export * from './models';
|
|
5
|
-
export * from './libraryShared.module';
|
|
6
|
-
export * from './evaluator';
|
|
7
2
|
export * from './constants';
|
|
3
|
+
export * from './directives';
|
|
4
|
+
export * from './libraryShared.module';
|
|
5
|
+
export * from './models';
|
|
6
|
+
export * from './services';
|
|
7
|
+
export declare type InterpolateString = string;
|
|
8
|
+
export declare type Whitespace = '' | ' ' | `${any}`;
|
|
9
|
+
export declare type EvaluatedString<VAR extends string = 'show'> = `${string}${VAR}${Whitespace}=${Whitespace}${string}`;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -117,11 +117,11 @@ export * from './lib/components/latest-activity/components/single-activity/singl
|
|
|
117
117
|
export * from './lib/components/latest-activity/latest-activity.module';
|
|
118
118
|
export * from './lib/components/pagination/pagination.module';
|
|
119
119
|
export * from './lib/components/pagination/pagination/pagination.component';
|
|
120
|
+
export * from './lib/components/pdf-tron/directives/ndf-tron-extract-text.directive';
|
|
120
121
|
export * from './lib/components/pdf-tron/pdf-tron.module';
|
|
121
122
|
export * from './lib/components/pdf-tron/pdftron/pdftron.component';
|
|
122
123
|
export * from './lib/components/pdf-tron/pdftron/pdftron.service';
|
|
123
124
|
export * from './lib/components/pdf-tron/pdftron/silent-pdftron.service';
|
|
124
|
-
export * from './lib/components/pdf-tron/directives/ndf-tron-extract-text.directive';
|
|
125
125
|
export * from './lib/components/select/select.module';
|
|
126
126
|
export * from './lib/components/select/select/select.component';
|
|
127
127
|
export * from './lib/components/users-card/users-card.component';
|
|
@@ -178,18 +178,18 @@ export * from './lib/components/toasts';
|
|
|
178
178
|
export * from './lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module';
|
|
179
179
|
export * from './lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component';
|
|
180
180
|
export * from './lib/shared/components/button/button.component';
|
|
181
|
+
export * from './lib/shared/components/general-notification-popup/general-notification-popup.component';
|
|
181
182
|
export * from './lib/shared/components/item-list/item-list.component';
|
|
182
183
|
export * from './lib/shared/components/no-data/no-data.component';
|
|
183
184
|
export * from './lib/shared/components/read-more/read-more.component';
|
|
184
185
|
export * from './lib/shared/components/search-autocomplete/search-autocomplete.component';
|
|
185
186
|
export * from './lib/shared/components/spinner/spinner.component';
|
|
186
187
|
export * from './lib/shared/components/user-card/user-card.component';
|
|
187
|
-
export * from './lib/shared/components/general-notification-popup/general-notification-popup.component';
|
|
188
188
|
export * from './lib/shared/libraryShared.module';
|
|
189
|
+
export * from './lib/shared-services/apis-errors-messages.service';
|
|
189
190
|
export * from './lib/shared-services/global-admin.service';
|
|
190
191
|
export * from './lib/shared-services/shared-services.module';
|
|
191
192
|
export * from './lib/shared-services/user.service';
|
|
192
|
-
export * from './lib/shared-services/apis-errors-messages.service';
|
|
193
193
|
export * from './lib/core/adapters/adapter.service';
|
|
194
194
|
export * from './lib/core/enums/language.enum';
|
|
195
195
|
export * from './lib/core/env/index';
|
|
@@ -230,21 +230,20 @@ export * from './lib/configuration/app-config.service';
|
|
|
230
230
|
export * from './lib/configuration/helpers/app-initializer';
|
|
231
231
|
export * from './lib/directive/permissions/evaluators.service';
|
|
232
232
|
export * from './lib/components/comments/services/comment-api.service';
|
|
233
|
-
export * from './lib/
|
|
234
|
-
export * from './lib/core/tokens';
|
|
233
|
+
export * from './lib/components/ndf-config-editor';
|
|
235
234
|
export * from './lib/components/ndf-datepicker';
|
|
235
|
+
export * from './lib/components/ndf-filters';
|
|
236
236
|
export * from './lib/components/ndf-panel';
|
|
237
|
+
export * from './lib/components/ndf-scanner';
|
|
238
|
+
export * from './lib/components/ndf-signatures';
|
|
237
239
|
export * from './lib/components/ndf-tabs';
|
|
240
|
+
export * from './lib/components/ndf-uploader';
|
|
238
241
|
export * from './lib/components/no-data-found';
|
|
242
|
+
export * from './lib/components/reports/chart-panel';
|
|
239
243
|
export * from './lib/components/reports/charts';
|
|
240
244
|
export * from './lib/components/reports/ndf-reports';
|
|
241
|
-
export * from './lib/components/reports/chart-panel';
|
|
242
245
|
export * from './lib/components/skeleton';
|
|
243
246
|
export * from './lib/components/tables';
|
|
244
|
-
export * from './lib/
|
|
245
|
-
export * from './lib/components/ndf-filters';
|
|
246
|
-
export * from './lib/components/ndf-uploader';
|
|
247
|
-
export * from './lib/components/ndf-scanner';
|
|
248
|
-
export * from './lib/components/ndf-signatures';
|
|
249
|
-
export * from './lib/shared/evaluator';
|
|
247
|
+
export * from './lib/core/tokens';
|
|
250
248
|
export * from './lib/shared/constants';
|
|
249
|
+
export * from './lib/shared/directives';
|
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
import _, { get, keys, set, trim, values } from 'lodash';
|
|
2
|
-
import stringHash from 'string-hash';
|
|
3
|
-
/**
|
|
4
|
-
* Creates a secure context for function evaluation that prevents access to the window object.
|
|
5
|
-
* @returns {Record<string, any>} A secure context object with safe properties.
|
|
6
|
-
*/
|
|
7
|
-
function createSecureContext() {
|
|
8
|
-
// Create a secure context with only safe properties
|
|
9
|
-
return {
|
|
10
|
-
// Add any safe globals here that should be accessible
|
|
11
|
-
console: {
|
|
12
|
-
log: console.log,
|
|
13
|
-
warn: console.warn,
|
|
14
|
-
error: console.error
|
|
15
|
-
},
|
|
16
|
-
// Add other safe objects/functions as needed
|
|
17
|
-
Math,
|
|
18
|
-
Date,
|
|
19
|
-
Number,
|
|
20
|
-
String,
|
|
21
|
-
Boolean,
|
|
22
|
-
Array,
|
|
23
|
-
Object,
|
|
24
|
-
JSON,
|
|
25
|
-
// Prevent access to window
|
|
26
|
-
window: undefined,
|
|
27
|
-
self: undefined,
|
|
28
|
-
globalThis: undefined,
|
|
29
|
-
_: _ // Include lodash if needed, but ensure it's used safely
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* A utility class for evaluating expressions, interpolating strings, and working with templates.
|
|
34
|
-
* This class provides static methods for dynamic evaluation of code, string interpolation,
|
|
35
|
-
* and template processing with caching capabilities.
|
|
36
|
-
*/
|
|
37
|
-
export class Evaluator {
|
|
38
|
-
/**
|
|
39
|
-
* Creates a function from a string or returns the function if already provided.
|
|
40
|
-
* Uses a secure context to prevent access to the window object by default.
|
|
41
|
-
* @param {string|Function} func - The function or string to convert to a function.
|
|
42
|
-
* @param {...any} params - The parameters to pass to the function.
|
|
43
|
-
* @param {EvaluatorOptions} [options={}] - Optional configuration for the evaluation.
|
|
44
|
-
* @returns {Function} - The resulting function.
|
|
45
|
-
*/
|
|
46
|
-
static evaluator(func, ...params) {
|
|
47
|
-
// Extract options if the last parameter is an options object
|
|
48
|
-
let options = {};
|
|
49
|
-
if (params.length > 0 &&
|
|
50
|
-
params[params.length - 1] &&
|
|
51
|
-
typeof params[params.length - 1] === 'object' &&
|
|
52
|
-
'securityMode' in params[params.length - 1]) {
|
|
53
|
-
options = params.pop();
|
|
54
|
-
}
|
|
55
|
-
if (typeof func === 'function') {
|
|
56
|
-
return func;
|
|
57
|
-
}
|
|
58
|
-
if (typeof params[0] === 'object') {
|
|
59
|
-
params = keys(params[0]);
|
|
60
|
-
}
|
|
61
|
-
// Check if we should use secure mode (default) or unsafe mode
|
|
62
|
-
const securityMode = options.securityMode || 'secure';
|
|
63
|
-
if (securityMode === 'unsafe') {
|
|
64
|
-
// In unsafe mode, create a function with access to all globals
|
|
65
|
-
return new Function(...params, func);
|
|
66
|
-
}
|
|
67
|
-
const sandbox = createSecureContext();
|
|
68
|
-
const sandboxKeys = Object.keys(sandbox);
|
|
69
|
-
const sandboxAssignments = sandboxKeys.map((key) => `const ${key} = sandbox.${key};`).join('');
|
|
70
|
-
const wrapper = new Function(...params, 'sandbox', `${sandboxAssignments}${func}`);
|
|
71
|
-
return (...args) => wrapper(...args, sandbox);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Replaces template expressions in a string with values from data.
|
|
75
|
-
* Supports function calls within templates and fallback values using || syntax.
|
|
76
|
-
* By default, ensures evaluation happens in a secure context to prevent access to window object.
|
|
77
|
-
* @param {string} rawTemplate - The template string containing expressions to interpolate.
|
|
78
|
-
* @param {Record<string, any>} data - The data object containing values to use for interpolation.
|
|
79
|
-
* @param {EvaluatorOptions} [options={}] - Optional configuration for the interpolation process.
|
|
80
|
-
* @returns {string} - The interpolated string with all expressions replaced with actual values.
|
|
81
|
-
*/
|
|
82
|
-
static interpolateString(rawTemplate, data, options = {}) {
|
|
83
|
-
if (!rawTemplate) {
|
|
84
|
-
return '';
|
|
85
|
-
}
|
|
86
|
-
if (typeof rawTemplate !== 'string') {
|
|
87
|
-
return rawTemplate.toString();
|
|
88
|
-
}
|
|
89
|
-
// Check if we should use secure mode (default) or unsafe mode
|
|
90
|
-
const securityMode = options.securityMode || 'secure';
|
|
91
|
-
// Create a secure data object if needed
|
|
92
|
-
const secureData = securityMode === 'unsafe'
|
|
93
|
-
? data
|
|
94
|
-
: Object.assign(Object.assign(Object.assign({}, createSecureContext()), data), {
|
|
95
|
-
// Ensure these remain undefined
|
|
96
|
-
window: undefined, self: undefined, globalThis: undefined });
|
|
97
|
-
return rawTemplate.replace(/({{\s*(.*?)\s*}})/g, (match, $1, expression) => {
|
|
98
|
-
if (expression.indexOf('(') !== -1) {
|
|
99
|
-
return expression.replace(/([^(]+)\(([^)]+)\s*\);?/, (_, fnName, argsStr) => {
|
|
100
|
-
fnName = trim(fnName);
|
|
101
|
-
const func = get(secureData, fnName);
|
|
102
|
-
if (func) {
|
|
103
|
-
if (argsStr) {
|
|
104
|
-
const args = argsStr.split(',').map((arg) => {
|
|
105
|
-
const trimmed = trim(arg);
|
|
106
|
-
if (/^['"]/.test(trimmed))
|
|
107
|
-
return trimmed.slice(1, -1);
|
|
108
|
-
return get(secureData, trimmed);
|
|
109
|
-
});
|
|
110
|
-
return Evaluator.evaluate(func, args, '', false, secureData, options);
|
|
111
|
-
}
|
|
112
|
-
return Evaluator.evaluate(func, [], '', false, secureData, options);
|
|
113
|
-
}
|
|
114
|
-
return '';
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
let dataPath = expression;
|
|
119
|
-
if (expression.indexOf('?') !== -1) {
|
|
120
|
-
dataPath = expression.replace(/\?\./g, '.');
|
|
121
|
-
}
|
|
122
|
-
const parts = dataPath.split('||').map((item) => item.trim());
|
|
123
|
-
let value = '';
|
|
124
|
-
let path = '';
|
|
125
|
-
for (let i = 0; i < parts.length; i++) {
|
|
126
|
-
path = parts[i];
|
|
127
|
-
if (_.has(secureData, path)) {
|
|
128
|
-
value = _.get(secureData, path);
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if (options.data) {
|
|
133
|
-
set(options.data, path, value);
|
|
134
|
-
}
|
|
135
|
-
return value;
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Performs an evaluation using the evaluation context of this component.
|
|
141
|
-
* By default, ensures evaluation happens in a secure context to prevent access to window object.
|
|
142
|
-
* @param {string|Function|object} func - The function or string to evaluate.
|
|
143
|
-
* @param {object} args - The arguments to pass to the evaluation.
|
|
144
|
-
* @param {string} ret - The name of the variable within the evaluation context to return.
|
|
145
|
-
* @param {boolean} interpolate - Determines if it should replace all {{ }} token references with actual data.
|
|
146
|
-
* @param {object} context - - The evaluation context.
|
|
147
|
-
* @param {EvaluatorOptions } options - The options to pass to the evaluation.
|
|
148
|
-
* @returns {*} - The result of the evaluation.
|
|
149
|
-
*/
|
|
150
|
-
static evaluate(func, args = {}, ret = 'show', interpolate = false, context = {}, options = {}) {
|
|
151
|
-
let returnVal = null;
|
|
152
|
-
const field = args.field ? args.field : { key: 'unknown' };
|
|
153
|
-
const fieldKey = field.key;
|
|
154
|
-
if (typeof func === 'string') {
|
|
155
|
-
if (ret) {
|
|
156
|
-
func = `var ${ret};${func};return ${ret}`;
|
|
157
|
-
}
|
|
158
|
-
if (interpolate) {
|
|
159
|
-
func = Evaluator.interpolate(func, args, options);
|
|
160
|
-
}
|
|
161
|
-
try {
|
|
162
|
-
// Pass the security mode option to the evaluator
|
|
163
|
-
const evaluatorOptions = { securityMode: options.securityMode || 'secure' };
|
|
164
|
-
func = Evaluator.evaluator(func, args, context, evaluatorOptions);
|
|
165
|
-
args = Array.isArray(args) ? args : values(args);
|
|
166
|
-
}
|
|
167
|
-
catch (err) {
|
|
168
|
-
console.warn(`An error occured within the custom function for ${fieldKey}`, err);
|
|
169
|
-
returnVal = null;
|
|
170
|
-
func = false;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (typeof func === 'function') {
|
|
174
|
-
try {
|
|
175
|
-
returnVal = Evaluator.execute(func, args, context, options);
|
|
176
|
-
}
|
|
177
|
-
catch (err) {
|
|
178
|
-
returnVal = null;
|
|
179
|
-
console.warn(`An error occured within custom function for ${fieldKey}`, err);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else if (func) {
|
|
183
|
-
console.warn(`Unknown function type for ${fieldKey}`);
|
|
184
|
-
}
|
|
185
|
-
return returnVal;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Executes a function with provided arguments and context.
|
|
189
|
-
* By default, ensures execution happens in a secure context to prevent access to window object.
|
|
190
|
-
* @param {Function} func - The function to execute.
|
|
191
|
-
* @param {any[]|Record<string, any>} args - The arguments to pass to the function, either as an array or object.
|
|
192
|
-
* @param {Record<string, any>} [context={}] - The context (this) to use when executing the function.
|
|
193
|
-
* @param {EvaluatorOptions} [options={}] - Optional configuration for the execution.
|
|
194
|
-
* @returns {any} - The result of the function execution.
|
|
195
|
-
*/
|
|
196
|
-
static execute(func, args, context = {}, options = {}) {
|
|
197
|
-
// Check if we should use secure mode (default) or unsafe mode
|
|
198
|
-
const securityMode = options.securityMode || 'secure';
|
|
199
|
-
if (securityMode === 'unsafe') {
|
|
200
|
-
// In unsafe mode, execute with the original context
|
|
201
|
-
return Array.isArray(args) ? func.apply(context, args) : func.call(context, args);
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
// In secure mode, create a secure context by merging the provided context with our secure context
|
|
205
|
-
const secureContext = Object.assign(Object.assign(Object.assign({}, createSecureContext()), context), {
|
|
206
|
-
// Ensure these remain undefined even if they were in the provided context
|
|
207
|
-
window: undefined, self: undefined, globalThis: undefined });
|
|
208
|
-
// Execute the function with the secure context
|
|
209
|
-
return Array.isArray(args) ? func.apply(secureContext, args) : func.call(secureContext, args);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Creates a template function from a string with caching for performance.
|
|
214
|
-
* By default, ensures the template function executes in a secure context.
|
|
215
|
-
* @param {string} template - The template string to compile into a function.
|
|
216
|
-
* @param {string} [hash] - Optional hash to use as cache key. If not provided, a hash will be generated from the template.
|
|
217
|
-
* @param {EvaluatorOptions} [options={}] - Optional configuration for the template.
|
|
218
|
-
* @returns {Function|undefined} - The compiled template function, or undefined if compilation fails.
|
|
219
|
-
*/
|
|
220
|
-
static template(template, hash, options = {}) {
|
|
221
|
-
hash = hash || stringHash(template).toString();
|
|
222
|
-
// If hash contains options object, extract it
|
|
223
|
-
if (typeof hash === 'object' && 'securityMode' in hash) {
|
|
224
|
-
options = hash;
|
|
225
|
-
hash = stringHash(template).toString();
|
|
226
|
-
}
|
|
227
|
-
// Check if we have a cached version
|
|
228
|
-
const cacheKey = hash + (options.securityMode || 'secure');
|
|
229
|
-
if (Evaluator.cache[cacheKey]) {
|
|
230
|
-
return Evaluator.cache[cacheKey];
|
|
231
|
-
}
|
|
232
|
-
try {
|
|
233
|
-
template = template.replace(/ctx\./g, '');
|
|
234
|
-
// Create the template function using lodash
|
|
235
|
-
const templateFunc = _.template(template, Evaluator.templateSettings);
|
|
236
|
-
// Check if we should use secure mode (default) or unsafe mode
|
|
237
|
-
const securityMode = options.securityMode || 'secure';
|
|
238
|
-
if (securityMode === 'unsafe') {
|
|
239
|
-
// In unsafe mode, return the original template function
|
|
240
|
-
return (Evaluator.cache[cacheKey] = templateFunc);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
// In secure mode, wrap the template function to ensure it runs in a secure context
|
|
244
|
-
const secureTemplateFunc = (data) => {
|
|
245
|
-
// Create a secure context for the template
|
|
246
|
-
const secureData = Object.assign(Object.assign(Object.assign({}, createSecureContext()), data), {
|
|
247
|
-
// Ensure these remain undefined
|
|
248
|
-
window: undefined, self: undefined, globalThis: undefined });
|
|
249
|
-
return templateFunc(secureData);
|
|
250
|
-
};
|
|
251
|
-
// Cache and return the secure template function
|
|
252
|
-
return (Evaluator.cache[cacheKey] = secureTemplateFunc);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
catch (err) {
|
|
256
|
-
console.warn('Error while processing template', err, template);
|
|
257
|
-
return undefined;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Interpolates a template with data, handling both function templates and string templates.
|
|
262
|
-
* By default, ensures interpolation happens in a secure context to prevent access to window object.
|
|
263
|
-
* @param {string|Function} rawTemplate - The template to interpolate, either as a string or a function.
|
|
264
|
-
* @param {Record<string, any>} data - The data object to use for interpolation.
|
|
265
|
-
* @param {EvaluatorOptions} options - Options for the interpolation process.
|
|
266
|
-
* @returns {string|any} - The result of the interpolation, typically a string but could be any type depending on the template.
|
|
267
|
-
*/
|
|
268
|
-
static interpolate(rawTemplate, data, options = {}) {
|
|
269
|
-
if (typeof rawTemplate === 'function') {
|
|
270
|
-
try {
|
|
271
|
-
// If the template is a function, execute it with the data
|
|
272
|
-
// We can't directly secure a provided function, but we can use execute
|
|
273
|
-
// to run it in a secure context if needed
|
|
274
|
-
if (options.securityMode !== 'unsafe') {
|
|
275
|
-
const secureData = Object.assign(Object.assign(Object.assign({}, createSecureContext()), data), { window: undefined, self: undefined, globalThis: undefined });
|
|
276
|
-
return rawTemplate(secureData);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
return rawTemplate(data);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
catch (err) {
|
|
283
|
-
console.warn('Error interpolating template', err, data);
|
|
284
|
-
return err.message;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
rawTemplate = String(rawTemplate);
|
|
288
|
-
// Pass the security mode option to the template method
|
|
289
|
-
const template = Evaluator.template(rawTemplate, undefined, options);
|
|
290
|
-
if (typeof template === 'function') {
|
|
291
|
-
try {
|
|
292
|
-
return template(data);
|
|
293
|
-
}
|
|
294
|
-
catch (err) {
|
|
295
|
-
console.warn('Error interpolating template', err, rawTemplate, data);
|
|
296
|
-
return err.message;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return template;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Cache for storing compiled template functions to improve performance.
|
|
304
|
-
* Keys are string hashes of the template, values are the compiled functions.
|
|
305
|
-
*/
|
|
306
|
-
Evaluator.cache = {};
|
|
307
|
-
/**
|
|
308
|
-
* Settings for template processing, defining regex patterns for different template operations.
|
|
309
|
-
* - interpolate: Pattern for variable interpolation ({{ variable }})
|
|
310
|
-
* - evaluate: Pattern for code evaluation ({% code %})
|
|
311
|
-
* - escape: Pattern for HTML escaping ({{{ variable }}})
|
|
312
|
-
*/
|
|
313
|
-
Evaluator.templateSettings = {
|
|
314
|
-
interpolate: /{{([\s\S]+?)}}/g,
|
|
315
|
-
evaluate: /\{%([\s\S]+?)%\}/g,
|
|
316
|
-
escape: /\{\{\{([\s\S]+?)\}\}\}/g
|
|
317
|
-
};
|
|
318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvc2hhcmVkL2V2YWx1YXRvci9ldmFsdWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3pELE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUlyQzs7O0dBR0c7QUFDSCxTQUFTLG1CQUFtQjtJQUMzQixvREFBb0Q7SUFDcEQsT0FBTztRQUNOLHNEQUFzRDtRQUN0RCxPQUFPLEVBQUU7WUFDUixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNwQjtRQUNELDZDQUE2QztRQUM3QyxJQUFJO1FBQ0osSUFBSTtRQUNKLE1BQU07UUFDTixNQUFNO1FBQ04sT0FBTztRQUNQLEtBQUs7UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLDJCQUEyQjtRQUMzQixNQUFNLEVBQUUsU0FBUztRQUNqQixJQUFJLEVBQUUsU0FBUztRQUNmLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLENBQUMsRUFBRSxDQUFDLENBQUMsd0RBQXdEO0tBQzdELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxTQUFTO0lBbUJyQjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUF1QixFQUFFLEdBQUcsTUFBYTtRQUN6RCw2REFBNkQ7UUFDN0QsSUFBSSxPQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUNuQyxJQUNDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNqQixNQUFNLENBQUMsTUFB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LENBQUM7YUFDdEI7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE9BQVEsR0FBYSxDQUFDLE9BQU8sQ0FBQzthQUM5QjtTQUNEO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDakIsQ0FBQzs7QUF0VkQ7OztHQUdHO0FBQ0ksZUFBSyxHQUE2QixFQUFFLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFDSSwwQkFBZ0IsR0FBcUI7SUFDM0MsV0FBVyxFQUFFLGlCQUFpQjtJQUM5QixRQUFRLEVBQUUsbUJBQW1CO0lBQzdCLE1BQU0sRUFBRSx5QkFBeUI7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfLCB7IGdldCwga2V5cywgc2V0LCB0cmltLCB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgc3RyaW5nSGFzaCBmcm9tICdzdHJpbmctaGFzaCc7XHJcblxyXG5pbXBvcnQgeyBFdmFsdWF0b3JPcHRpb25zLCBUZW1wbGF0ZVNldHRpbmdzIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHNlY3VyZSBjb250ZXh0IGZvciBmdW5jdGlvbiBldmFsdWF0aW9uIHRoYXQgcHJldmVudHMgYWNjZXNzIHRvIHRoZSB3aW5kb3cgb2JqZWN0LlxyXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gQSBzZWN1cmUgY29udGV4dCBvYmplY3Qgd2l0aCBzYWZlIHByb3BlcnRpZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVTZWN1cmVDb250ZXh0KCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG5cdC8vIENyZWF0ZSBhIHNlY3VyZSBjb250ZXh0IHdpdGggb25seSBzYWZlIHByb3BlcnRpZXNcclxuXHRyZXR1cm4ge1xyXG5cdFx0Ly8gQWRkIGFueSBzYWZlIGdsb2JhbHMgaGVyZSB0aGF0IHNob3VsZCBiZSBhY2Nlc3NpYmxlXHJcblx0XHRjb25zb2xlOiB7XHJcblx0XHRcdGxvZzogY29uc29sZS5sb2csXHJcblx0XHRcdHdhcm46IGNvbnNvbGUud2FybixcclxuXHRcdFx0ZXJyb3I6IGNvbnNvbGUuZXJyb3JcclxuXHRcdH0sXHJcblx0XHQvLyBBZGQgb3RoZXIgc2FmZSBvYmplY3RzL2Z1bmN0aW9ucyBhcyBuZWVkZWRcclxuXHRcdE1hdGgsXHJcblx0XHREYXRlLFxyXG5cdFx0TnVtYmVyLFxyXG5cdFx0U3RyaW5nLFxyXG5cdFx0Qm9vbGVhbixcclxuXHRcdEFycmF5LFxyXG5cdFx0T2JqZWN0LFxyXG5cdFx0SlNPTixcclxuXHRcdC8vIFByZXZlbnQgYWNjZXNzIHRvIHdpbmRvd1xyXG5cdFx0d2luZG93OiB1bmRlZmluZWQsXHJcblx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRnbG9iYWxUaGlzOiB1bmRlZmluZWQsXHJcblx0XHRfOiBfIC8vIEluY2x1ZGUgbG9kYXNoIGlmIG5lZWRlZCwgYnV0IGVuc3VyZSBpdCdzIHVzZWQgc2FmZWx5XHJcblx0fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgZXZhbHVhdGluZyBleHByZXNzaW9ucywgaW50ZXJwb2xhdGluZyBzdHJpbmdzLCBhbmQgd29ya2luZyB3aXRoIHRlbXBsYXRlcy5cclxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgZHluYW1pYyBldmFsdWF0aW9uIG9mIGNvZGUsIHN0cmluZyBpbnRlcnBvbGF0aW9uLFxyXG4gKiBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGNhY2hpbmcgY2FwYWJpbGl0aWVzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2YWx1YXRvciB7XHJcblx0LyoqXHJcblx0ICogQ2FjaGUgZm9yIHN0b3JpbmcgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb25zIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXHJcblx0ICogS2V5cyBhcmUgc3RyaW5nIGhhc2hlcyBvZiB0aGUgdGVtcGxhdGUsIHZhbHVlcyBhcmUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9ucy5cclxuXHQgKi9cclxuXHRzdGF0aWMgY2FjaGU6IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPiA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXR0aW5ncyBmb3IgdGVtcGxhdGUgcHJvY2Vzc2luZywgZGVmaW5pbmcgcmVnZXggcGF0dGVybnMgZm9yIGRpZmZlcmVudCB0ZW1wbGF0ZSBvcGVyYXRpb25zLlxyXG5cdCAqIC0gaW50ZXJwb2xhdGU6IFBhdHRlcm4gZm9yIHZhcmlhYmxlIGludGVycG9sYXRpb24gKHt7IHZhcmlhYmxlIH19KVxyXG5cdCAqIC0gZXZhbHVhdGU6IFBhdHRlcm4gZm9yIGNvZGUgZXZhbHVhdGlvbiAoeyUgY29kZSAlfSlcclxuXHQgKiAtIGVzY2FwZTogUGF0dGVybiBmb3IgSFRNTCBlc2NhcGluZyAoe3t7IHZhcmlhYmxlIH19fSlcclxuXHQgKi9cclxuXHRzdGF0aWMgdGVtcGxhdGVTZXR0aW5nczogVGVtcGxhdGVTZXR0aW5ncyA9IHtcclxuXHRcdGludGVycG9sYXRlOiAve3soW1xcc1xcU10rPyl9fS9nLFxyXG5cdFx0ZXZhbHVhdGU6IC9cXHslKFtcXHNcXFNdKz8pJVxcfS9nLFxyXG5cdFx0ZXNjYXBlOiAvXFx7XFx7XFx7KFtcXHNcXFNdKz8pXFx9XFx9XFx9L2dcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZyBvciByZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBhbHJlYWR5IHByb3ZpZGVkLlxyXG5cdCAqIFVzZXMgYSBzZWN1cmUgY29udGV4dCB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgd2luZG93IG9iamVjdCBieSBkZWZhdWx0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBmdW5jIC0gVGhlIGZ1bmN0aW9uIG9yIHN0cmluZyB0byBjb252ZXJ0IHRvIGEgZnVuY3Rpb24uXHJcblx0ICogQHBhcmFtIHsuLi5hbnl9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7RXZhbHVhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGV2YWx1YXRpb24uXHJcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSAtIFRoZSByZXN1bHRpbmcgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0c3RhdGljIGV2YWx1YXRvcihmdW5jOiBzdHJpbmcgfCBGdW5jdGlvbiwgLi4ucGFyYW1zOiBhbnlbXSk6IEZ1bmN0aW9uIHtcclxuXHRcdC8vIEV4dHJhY3Qgb3B0aW9ucyBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9ucyBvYmplY3RcclxuXHRcdGxldCBvcHRpb25zOiBFdmFsdWF0b3JPcHRpb25zID0ge307XHJcblx0XHRpZiAoXHJcblx0XHRcdHBhcmFtcy5sZW5ndGggPiAwICYmXHJcblx0XHRcdHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV0gJiZcclxuXHRcdFx0dHlwZW9mIHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV0gPT09ICdvYmplY3QnICYmXHJcblx0XHRcdCdzZWN1cml0eU1vZGUnIGluIHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV1cclxuXHRcdCkge1xyXG5cdFx0XHRvcHRpb25zID0gcGFyYW1zLnBvcCgpIGFzIEV2YWx1YXRvck9wdGlvbnM7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBmdW5jO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgcGFyYW1zWzBdID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRwYXJhbXMgPSBrZXlzKHBhcmFtc1swXSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSBzZWN1cmUgbW9kZSAoZGVmYXVsdCkgb3IgdW5zYWZlIG1vZGVcclxuXHRcdGNvbnN0IHNlY3VyaXR5TW9kZSA9IG9wdGlvbnMuc2VjdXJpdHlNb2RlIHx8ICdzZWN1cmUnO1xyXG5cclxuXHRcdGlmIChzZWN1cml0eU1vZGUgPT09ICd1bnNhZmUnKSB7XHJcblx0XHRcdC8vIEluIHVuc2FmZSBtb2RlLCBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGFjY2VzcyB0byBhbGwgZ2xvYmFsc1xyXG5cdFx0XHRyZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLnBhcmFtcywgZnVuYyBhcyBzdHJpbmcpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgc2FuZGJveCA9IGNyZWF0ZVNlY3VyZUNvbnRleHQoKTtcclxuXHRcdGNvbnN0IHNhbmRib3hLZXlzID0gT2JqZWN0LmtleXMoc2FuZGJveCk7XHJcblx0XHRjb25zdCBzYW5kYm94QXNzaWdubWVudHMgPSBzYW5kYm94S2V5cy5tYXAoKGtleSkgPT4gYGNvbnN0ICR7a2V5fSA9IHNhbmRib3guJHtrZXl9O2ApLmpvaW4oJycpO1xyXG5cclxuXHRcdGNvbnN0IHdyYXBwZXIgPSBuZXcgRnVuY3Rpb24oLi4ucGFyYW1zLCAnc2FuZGJveCcsIGAke3NhbmRib3hBc3NpZ25tZW50c30ke2Z1bmMgYXMgc3RyaW5nfWApO1xyXG5cclxuXHRcdHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHdyYXBwZXIoLi4uYXJncywgc2FuZGJveCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXBsYWNlcyB0ZW1wbGF0ZSBleHByZXNzaW9ucyBpbiBhIHN0cmluZyB3aXRoIHZhbHVlcyBmcm9tIGRhdGEuXHJcblx0ICogU3VwcG9ydHMgZnVuY3Rpb24gY2FsbHMgd2l0aGluIHRlbXBsYXRlcyBhbmQgZmFsbGJhY2sgdmFsdWVzIHVzaW5nIHx8IHN5bnRheC5cclxuXHQgKiBCeSBkZWZhdWx0LCBlbnN1cmVzIGV2YWx1YXRpb24gaGFwcGVucyBpbiBhIHNlY3VyZSBjb250ZXh0IHRvIHByZXZlbnQgYWNjZXNzIHRvIHdpbmRvdyBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJhd1RlbXBsYXRlIC0gVGhlIHRlbXBsYXRlIHN0cmluZyBjb250YWluaW5nIGV4cHJlc3Npb25zIHRvIGludGVycG9sYXRlLlxyXG5cdCAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBjb250YWluaW5nIHZhbHVlcyB0byB1c2UgZm9yIGludGVycG9sYXRpb24uXHJcblx0ICogQHBhcmFtIHtFdmFsdWF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBwcm9jZXNzLlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGludGVycG9sYXRlZCBzdHJpbmcgd2l0aCBhbGwgZXhwcmVzc2lvbnMgcmVwbGFjZWQgd2l0aCBhY3R1YWwgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBpbnRlcnBvbGF0ZVN0cmluZyhyYXdUZW1wbGF0ZTogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcHRpb25zOiBFdmFsdWF0b3JPcHRpb25zID0ge30pOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFyYXdUZW1wbGF0ZSkge1xyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0XHRpZiAodHlwZW9mIHJhd1RlbXBsYXRlICE9PSAnc3RyaW5nJykge1xyXG5cdFx0XHRyZXR1cm4gKHJhd1RlbXBsYXRlIGFzIGFueSkudG9TdHJpbmcoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBpZiB3ZSBzaG91bGQgdXNlIHNlY3VyZSBtb2RlIChkZWZhdWx0KSBvciB1bnNhZmUgbW9kZVxyXG5cdFx0Y29uc3Qgc2VjdXJpdHlNb2RlID0gb3B0aW9ucy5zZWN1cml0eU1vZGUgfHwgJ3NlY3VyZSc7XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIGEgc2VjdXJlIGRhdGEgb2JqZWN0IGlmIG5lZWRlZFxyXG5cdFx0Y29uc3Qgc2VjdXJlRGF0YSA9XHJcblx0XHRcdHNlY3VyaXR5TW9kZSA9PT0gJ3Vuc2FmZSdcclxuXHRcdFx0XHQ/IGRhdGFcclxuXHRcdFx0XHQ6IHtcclxuXHRcdFx0XHRcdFx0Li4uY3JlYXRlU2VjdXJlQ29udGV4dCgpLFxyXG5cdFx0XHRcdFx0XHQuLi5kYXRhLFxyXG5cdFx0XHRcdFx0XHQvLyBFbnN1cmUgdGhlc2UgcmVtYWluIHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHR3aW5kb3c6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdFx0c2VsZjogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHRnbG9iYWxUaGlzOiB1bmRlZmluZWRcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0cmV0dXJuIHJhd1RlbXBsYXRlLnJlcGxhY2UoLyh7e1xccyooLio/KVxccyp9fSkvZywgKG1hdGNoOiBzdHJpbmcsICQxOiBzdHJpbmcsIGV4cHJlc3Npb246IHN0cmluZykgPT4ge1xyXG5cdFx0XHRpZiAoZXhwcmVzc2lvbi5pbmRleE9mKCcoJykgIT09IC0xKSB7XHJcblx0XHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ucmVwbGFjZSgvKFteKF0rKVxcKChbXildKylcXHMqXFwpOz8vLCAoXzogc3RyaW5nLCBmbk5hbWU6IHN0cmluZywgYXJnc1N0cjogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRmbk5hbWUgPSB0cmltKGZuTmFtZSk7XHJcblx0XHRcdFx0XHRjb25zdCBmdW5jID0gZ2V0KHNlY3VyZURhdGEsIGZuTmFtZSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGZ1bmMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGFyZ3NTdHIpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBhcmdzID0gYXJnc1N0ci5zcGxpdCgnLCcpLm1hcCgoYXJnOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRyaW1tZWQgPSB0cmltKGFyZyk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoL15bJ1wiXS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQuc2xpY2UoMSwgLTEpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldChzZWN1cmVEYXRhLCB0cmltbWVkKTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gRXZhbHVhdG9yLmV2YWx1YXRlKGZ1bmMsIGFyZ3MsICcnLCBmYWxzZSwgc2VjdXJlRGF0YSwgb3B0aW9ucyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuIEV2YWx1YXRvci5ldmFsdWF0ZShmdW5jLCBbXSwgJycsIGZhbHNlLCBzZWN1cmVEYXRhLCBvcHRpb25zKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiAnJztcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgZGF0YVBhdGggPSBleHByZXNzaW9uO1xyXG5cdFx0XHRcdGlmIChleHByZXNzaW9uLmluZGV4T2YoJz8nKSAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdGRhdGFQYXRoID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9cXD9cXC4vZywgJy4nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgcGFydHMgPSBkYXRhUGF0aC5zcGxpdCgnfHwnKS5tYXAoKGl0ZW06IHN0cmluZykgPT4gaXRlbS50cmltKCkpO1xyXG5cdFx0XHRcdGxldCB2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdGxldCBwYXRoID0gJyc7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0cGF0aCA9IHBhcnRzW2ldO1xyXG5cdFx0XHRcdFx0aWYgKF8uaGFzKHNlY3VyZURhdGEsIHBhdGgpKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlID0gXy5nZXQoc2VjdXJlRGF0YSwgcGF0aCk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAob3B0aW9ucy5kYXRhKSB7XHJcblx0XHRcdFx0XHRzZXQob3B0aW9ucy5kYXRhLCBwYXRoLCB2YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhbiBldmFsdWF0aW9uIHVzaW5nIHRoZSBldmFsdWF0aW9uIGNvbnRleHQgb2YgdGhpcyBjb21wb25lbnQuXHJcblx0ICogQnkgZGVmYXVsdCwgZW5zdXJlcyBldmFsdWF0aW9uIGhhcHBlbnMgaW4gYSBzZWN1cmUgY29udGV4dCB0byBwcmV2ZW50IGFjY2VzcyB0byB3aW5kb3cgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufG9iamVjdH0gZnVuYyAtIFRoZSBmdW5jdGlvbiBvciBzdHJpbmcgdG8gZXZhbHVhdGUuXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2YWx1YXRpb24uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJldCAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB3aXRoaW4gdGhlIGV2YWx1YXRpb24gY29udGV4dCB0byByZXR1cm4uXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBpbnRlcnBvbGF0ZSAtIERldGVybWluZXMgaWYgaXQgc2hvdWxkIHJlcGxhY2UgYWxsIHt7IH19IHRva2VuIHJlZmVyZW5jZXMgd2l0aCBhY3R1YWwgZGF0YS5cclxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCAtICAgLSBUaGUgZXZhbHVhdGlvbiBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7RXZhbHVhdG9yT3B0aW9ucyB9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBldmFsdWF0aW9uLlxyXG5cdCAqIEByZXR1cm5zIHsqfSAtIFRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24uXHJcblx0ICovXHJcblx0c3RhdGljIGV2YWx1YXRlKFxyXG5cdFx0ZnVuYzogYW55LFxyXG5cdFx0YXJnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxyXG5cdFx0cmV0OiBzdHJpbmcgPSAnc2hvdycsXHJcblx0XHRpbnRlcnBvbGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxyXG5cdFx0Y29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxyXG5cdFx0b3B0aW9uczogRXZhbHVhdG9yT3B0aW9ucyA9IHt9XHJcblx0KTogYW55IHtcclxuXHRcdGxldCByZXR1cm5WYWwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGZpZWxkID0gYXJncy5maWVsZCA/IGFyZ3MuZmllbGQgOiB7IGtleTogJ3Vua25vd24nIH07XHJcblx0XHRjb25zdCBmaWVsZEtleSA9IGZpZWxkLmtleTtcclxuXHJcblx0XHRpZiAodHlwZW9mIGZ1bmMgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdGlmIChyZXQpIHtcclxuXHRcdFx0XHRmdW5jID0gYHZhciAke3JldH07JHtmdW5jfTtyZXR1cm4gJHtyZXR9YDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGludGVycG9sYXRlKSB7XHJcblx0XHRcdFx0ZnVuYyA9IEV2YWx1YXRvci5pbnRlcnBvbGF0ZShmdW5jLCBhcmdzLCBvcHRpb25zKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXNzIHRoZSBzZWN1cml0eSBtb2RlIG9wdGlvbiB0byB0aGUgZXZhbHVhdG9yXHJcblx0XHRcdFx0Y29uc3QgZXZhbHVhdG9yT3B0aW9ucyA9IHsgc2VjdXJpdHlNb2RlOiBvcHRpb25zLnNlY3VyaXR5TW9kZSB8fCAnc2VjdXJlJyB9O1xyXG5cdFx0XHRcdGZ1bmMgPSBFdmFsdWF0b3IuZXZhbHVhdG9yKGZ1bmMsIGFyZ3MsIGNvbnRleHQsIGV2YWx1YXRvck9wdGlvbnMpO1xyXG5cdFx0XHRcdGFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IHZhbHVlcyhhcmdzKTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKGBBbiBlcnJvciBvY2N1cmVkIHdpdGhpbiB0aGUgY3VzdG9tIGZ1bmN0aW9uIGZvciAke2ZpZWxkS2V5fWAsIGVycik7XHJcblx0XHRcdFx0cmV0dXJuVmFsID0gbnVsbDtcclxuXHRcdFx0XHRmdW5jID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm5WYWwgPSBFdmFsdWF0b3IuZXhlY3V0ZShmdW5jLCBhcmdzLCBjb250ZXh0LCBvcHRpb25zKTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdFx0cmV0dXJuVmFsID0gbnVsbDtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oYEFuIGVycm9yIG9jY3VyZWQgd2l0aGluIGN1c3RvbSBmdW5jdGlvbiBmb3IgJHtmaWVsZEtleX1gLCBlcnIpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGZ1bmMpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKGBVbmtub3duIGZ1bmN0aW9uIHR5cGUgZm9yICR7ZmllbGRLZXl9YCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmV0dXJuVmFsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50cyBhbmQgY29udGV4dC5cclxuXHQgKiBCeSBkZWZhdWx0LCBlbnN1cmVzIGV4ZWN1dGlvbiBoYXBwZW5zIGluIGEgc2VjdXJlIGNvbnRleHQgdG8gcHJldmVudCBhY2Nlc3MgdG8gd2luZG93IG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXHJcblx0ICogQHBhcmFtIHthbnlbXXxSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiwgZWl0aGVyIGFzIGFuIGFycmF5IG9yIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtjb250ZXh0PXt9XSAtIFRoZSBjb250ZXh0ICh0aGlzKSB0byB1c2Ugd2hlbiBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7RXZhbHVhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGV4ZWN1dGlvbi5cclxuXHQgKiBAcmV0dXJucyB7YW55fSAtIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cclxuXHQgKi9cclxuXHRzdGF0aWMgZXhlY3V0ZShcclxuXHRcdGZ1bmM6IEZ1bmN0aW9uLFxyXG5cdFx0YXJnczogYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG5cdFx0Y29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxyXG5cdFx0b3B0aW9uczogRXZhbHVhdG9yT3B0aW9ucyA9IHt9XHJcblx0KTogYW55IHtcclxuXHRcdC8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2Ugc2VjdXJlIG1vZGUgKGRlZmF1bHQpIG9yIHVuc2FmZSBtb2RlXHJcblx0XHRjb25zdCBzZWN1cml0eU1vZGUgPSBvcHRpb25zLnNlY3VyaXR5TW9kZSB8fCAnc2VjdXJlJztcclxuXHJcblx0XHRpZiAoc2VjdXJpdHlNb2RlID09PSAndW5zYWZlJykge1xyXG5cdFx0XHQvLyBJbiB1bnNhZmUgbW9kZSwgZXhlY3V0ZSB3aXRoIHRoZSBvcmlnaW5hbCBjb250ZXh0XHJcblx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KGFyZ3MpID8gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKSA6IGZ1bmMuY2FsbChjb250ZXh0LCBhcmdzKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIEluIHNlY3VyZSBtb2RlLCBjcmVhdGUgYSBzZWN1cmUgY29udGV4dCBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpdGggb3VyIHNlY3VyZSBjb250ZXh0XHJcblx0XHRcdGNvbnN0IHNlY3VyZUNvbnRleHQgPSB7XHJcblx0XHRcdFx0Li4uY3JlYXRlU2VjdXJlQ29udGV4dCgpLFxyXG5cdFx0XHRcdC4uLmNvbnRleHQsXHJcblx0XHRcdFx0Ly8gRW5zdXJlIHRoZXNlIHJlbWFpbiB1bmRlZmluZWQgZXZlbiBpZiB0aGV5IHdlcmUgaW4gdGhlIHByb3ZpZGVkIGNvbnRleHRcclxuXHRcdFx0XHR3aW5kb3c6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0Z2xvYmFsVGhpczogdW5kZWZpbmVkXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzZWN1cmUgY29udGV4dFxyXG5cdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcmdzKSA/IGZ1bmMuYXBwbHkoc2VjdXJlQ29udGV4dCwgYXJncykgOiBmdW5jLmNhbGwoc2VjdXJlQ29udGV4dCwgYXJncyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgdGVtcGxhdGUgZnVuY3Rpb24gZnJvbSBhIHN0cmluZyB3aXRoIGNhY2hpbmcgZm9yIHBlcmZvcm1hbmNlLlxyXG5cdCAqIEJ5IGRlZmF1bHQsIGVuc3VyZXMgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIGEgc2VjdXJlIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlIC0gVGhlIHRlbXBsYXRlIHN0cmluZyB0byBjb21waWxlIGludG8gYSBmdW5jdGlvbi5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2hhc2hdIC0gT3B0aW9uYWwgaGFzaCB0byB1c2UgYXMgY2FjaGUga2V5LiBJZiBub3QgcHJvdmlkZWQsIGEgaGFzaCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZS5cclxuXHQgKiBAcGFyYW0ge0V2YWx1YXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZW1wbGF0ZS5cclxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb258dW5kZWZpbmVkfSAtIFRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGNvbXBpbGF0aW9uIGZhaWxzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0ZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBoYXNoPzogc3RyaW5nLCBvcHRpb25zOiBFdmFsdWF0b3JPcHRpb25zID0ge30pOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XHJcblx0XHRoYXNoID0gaGFzaCB8fCBzdHJpbmdIYXNoKHRlbXBsYXRlKS50b1N0cmluZygpO1xyXG5cclxuXHRcdC8vIElmIGhhc2ggY29udGFpbnMgb3B0aW9ucyBvYmplY3QsIGV4dHJhY3QgaXRcclxuXHRcdGlmICh0eXBlb2YgaGFzaCA9PT0gJ29iamVjdCcgJiYgJ3NlY3VyaXR5TW9kZScgaW4gaGFzaCkge1xyXG5cdFx0XHRvcHRpb25zID0gaGFzaCBhcyB1bmtub3duIGFzIEV2YWx1YXRvck9wdGlvbnM7XHJcblx0XHRcdGhhc2ggPSBzdHJpbmdIYXNoKHRlbXBsYXRlKS50b1N0cmluZygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgdmVyc2lvblxyXG5cdFx0Y29uc3QgY2FjaGVLZXkgPSBoYXNoICsgKG9wdGlvbnMuc2VjdXJpdHlNb2RlIHx8ICdzZWN1cmUnKTtcclxuXHRcdGlmIChFdmFsdWF0b3IuY2FjaGVbY2FjaGVLZXldKSB7XHJcblx0XHRcdHJldHVybiBFdmFsdWF0b3IuY2FjaGVbY2FjaGVLZXldO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvY3R4XFwuL2csICcnKTtcclxuXHJcblx0XHRcdC8vIENyZWF0ZSB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gdXNpbmcgbG9kYXNoXHJcblx0XHRcdGNvbnN0IHRlbXBsYXRlRnVuYyA9IF8udGVtcGxhdGUodGVtcGxhdGUsIEV2YWx1YXRvci50ZW1wbGF0ZVNldHRpbmdzKTtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2Ugc2VjdXJlIG1vZGUgKGRlZmF1bHQpIG9yIHVuc2FmZSBtb2RlXHJcblx0XHRcdGNvbnN0IHNlY3VyaXR5TW9kZSA9IG9wdGlvbnMuc2VjdXJpdHlNb2RlIHx8ICdzZWN1cmUnO1xyXG5cclxuXHRcdFx0aWYgKHNlY3VyaXR5TW9kZSA9PT0gJ3Vuc2FmZScpIHtcclxuXHRcdFx0XHQvLyBJbiB1bnNhZmUgbW9kZSwgcmV0dXJuIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBmdW5jdGlvblxyXG5cdFx0XHRcdHJldHVybiAoRXZhbHVhdG9yLmNhY2hlW2NhY2hlS2V5XSA9IHRlbXBsYXRlRnVuYyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gSW4gc2VjdXJlIG1vZGUsIHdyYXAgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSBpdCBydW5zIGluIGEgc2VjdXJlIGNvbnRleHRcclxuXHRcdFx0XHRjb25zdCBzZWN1cmVUZW1wbGF0ZUZ1bmMgPSAoZGF0YTogYW55KSA9PiB7XHJcblx0XHRcdFx0XHQvLyBDcmVhdGUgYSBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRlbXBsYXRlXHJcblx0XHRcdFx0XHRjb25zdCBzZWN1cmVEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHQuLi5jcmVhdGVTZWN1cmVDb250ZXh0KCksXHJcblx0XHRcdFx0XHRcdC4uLmRhdGEsXHJcblx0XHRcdFx0XHRcdC8vIEVuc3VyZSB0aGVzZSByZW1haW4gdW5kZWZpbmVkXHJcblx0XHRcdFx0XHRcdHdpbmRvdzogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGdsb2JhbFRoaXM6IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdGVtcGxhdGVGdW5jKHNlY3VyZURhdGEpO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdC8vIENhY2hlIGFuZCByZXR1cm4gdGhlIHNlY3VyZSB0ZW1wbGF0ZSBmdW5jdGlvblxyXG5cdFx0XHRcdHJldHVybiAoRXZhbHVhdG9yLmNhY2hlW2NhY2hlS2V5XSA9IHNlY3VyZVRlbXBsYXRlRnVuYyk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ0Vycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGVtcGxhdGUnLCBlcnIsIHRlbXBsYXRlKTtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVycG9sYXRlcyBhIHRlbXBsYXRlIHdpdGggZGF0YSwgaGFuZGxpbmcgYm90aCBmdW5jdGlvbiB0ZW1wbGF0ZXMgYW5kIHN0cmluZyB0ZW1wbGF0ZXMuXHJcblx0ICogQnkgZGVmYXVsdCwgZW5zdXJlcyBpbnRlcnBvbGF0aW9uIGhhcHBlbnMgaW4gYSBzZWN1cmUgY29udGV4dCB0byBwcmV2ZW50IGFjY2VzcyB0byB3aW5kb3cgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSByYXdUZW1wbGF0ZSAtIFRoZSB0ZW1wbGF0ZSB0byBpbnRlcnBvbGF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uXHJcblx0ICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IHRvIHVzZSBmb3IgaW50ZXJwb2xhdGlvbi5cclxuXHQgKiBAcGFyYW0ge0V2YWx1YXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBwcm9jZXNzLlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd8YW55fSAtIFRoZSByZXN1bHQgb2YgdGhlIGludGVycG9sYXRpb24sIHR5cGljYWxseSBhIHN0cmluZyBidXQgY291bGQgYmUgYW55IHR5cGUgZGVwZW5kaW5nIG9uIHRoZSB0ZW1wbGF0ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgaW50ZXJwb2xhdGUoXHJcblx0XHRyYXdUZW1wbGF0ZTogc3RyaW5nIHwgRnVuY3Rpb24sXHJcblx0XHRkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG5cdFx0b3B0aW9uczogRXZhbHVhdG9yT3B0aW9ucyA9IHt9XHJcblx0KTogc3RyaW5nIHwgYW55IHtcclxuXHRcdGlmICh0eXBlb2YgcmF3VGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBJZiB0aGUgdGVtcGxhdGUgaXMgYSBmdW5jdGlvbiwgZXhlY3V0ZSBpdCB3aXRoIHRoZSBkYXRhXHJcblx0XHRcdFx0Ly8gV2UgY2FuJ3QgZGlyZWN0bHkgc2VjdXJlIGEgcHJvdmlkZWQgZnVuY3Rpb24sIGJ1dCB3ZSBjYW4gdXNlIGV4ZWN1dGVcclxuXHRcdFx0XHQvLyB0byBydW4gaXQgaW4gYSBzZWN1cmUgY29udGV4dCBpZiBuZWVkZWRcclxuXHRcdFx0XHRpZiAob3B0aW9ucy5zZWN1cml0eU1vZGUgIT09ICd1bnNhZmUnKSB7XHJcblx0XHRcdFx0XHRjb25zdCBzZWN1cmVEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHQuLi5jcmVhdGVTZWN1cmVDb250ZXh0KCksXHJcblx0XHRcdFx0XHRcdC4uLmRhdGEsXHJcblx0XHRcdFx0XHRcdHdpbmRvdzogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGdsb2JhbFRoaXM6IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdHJldHVybiByYXdUZW1wbGF0ZShzZWN1cmVEYXRhKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJhd1RlbXBsYXRlKGRhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdFcnJvciBpbnRlcnBvbGF0aW5nIHRlbXBsYXRlJywgZXJyLCBkYXRhKTtcclxuXHRcdFx0XHRyZXR1cm4gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJhd1RlbXBsYXRlID0gU3RyaW5nKHJhd1RlbXBsYXRlKTtcclxuXHRcdC8vIFBhc3MgdGhlIHNlY3VyaXR5IG1vZGUgb3B0aW9uIHRvIHRoZSB0ZW1wbGF0ZSBtZXRob2RcclxuXHRcdGNvbnN0IHRlbXBsYXRlID0gRXZhbHVhdG9yLnRlbXBsYXRlKHJhd1RlbXBsYXRlLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm4gdGVtcGxhdGUoZGF0YSk7XHJcblx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybignRXJyb3IgaW50ZXJwb2xhdGluZyB0ZW1wbGF0ZScsIGVyciwgcmF3VGVtcGxhdGUsIGRhdGEpO1xyXG5cdFx0XHRcdHJldHVybiAoZXJyIGFzIEVycm9yKS5tZXNzYWdlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRlbXBsYXRlO1xyXG5cdH1cclxufVxyXG4iXX0=
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from './evaluator';
|
|
2
|
-
export * from './types';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9zaGFyZWQvZXZhbHVhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ldmFsdWF0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJ1xyXG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9zaGFyZWQvZXZhbHVhdG9yL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBFdmFsdWF0b3JPcHRpb25zID0ge1xyXG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG5cdC8qKlxyXG5cdCAqIENvbnRyb2xzIHRoZSBzZWN1cml0eSBsZXZlbCBvZiBldmFsdWF0aW9uLlxyXG5cdCAqIC0gJ3NlY3VyZScgKGRlZmF1bHQpOiBQcmV2ZW50cyBhY2Nlc3MgdG8gd2luZG93IG9iamVjdCBhbmQgb3RoZXIgZ2xvYmFsIG9iamVjdHNcclxuXHQgKiAtICd1bnNhZmUnOiBBbGxvd3MgYWNjZXNzIHRvIGFsbCBnbG9iYWwgb2JqZWN0cyAodXNlIHdpdGggY2F1dGlvbilcclxuXHQgKi9cclxuXHRzZWN1cml0eU1vZGU/OiAnc2VjdXJlJyB8ICd1bnNhZmUnO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgVGVtcGxhdGVTZXR0aW5ncyA9IHtcclxuXHRpbnRlcnBvbGF0ZTogUmVnRXhwO1xyXG5cdGV2YWx1YXRlOiBSZWdFeHA7XHJcblx0ZXNjYXBlOiBSZWdFeHA7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBJbnRlcnBvbGF0ZVN0cmluZyA9IHN0cmluZztcclxuXHJcbmV4cG9ydCB0eXBlIEV2YWx1YXRlZFN0cmluZzxWQVIgZXh0ZW5kcyBzdHJpbmcgPSAnc2hvdyc+ID0gYCR7c3RyaW5nfSR7VkFSfSR7V2hpdGVzcGFjZX09JHtXaGl0ZXNwYWNlfSR7c3RyaW5nfWA7XHJcblxyXG50eXBlIFdoaXRlc3BhY2UgPSAnJyB8ICcgJyB8IGAke2FueX1gO1xyXG4iXX0=
|