@sapui5/sap.fe.macros 1.140.0 → 1.141.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/package.json +1 -1
- package/src/sap/fe/macros/.library +1 -1
- package/src/sap/fe/macros/Chart.js +53 -2
- package/src/sap/fe/macros/Chart.tsx +55 -0
- package/src/sap/fe/macros/CollaborativeDraftHandler.js +230 -0
- package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +218 -0
- package/src/sap/fe/macros/CommonHelper.js +59 -15
- package/src/sap/fe/macros/CommonHelper.ts +65 -14
- package/src/sap/fe/macros/ConditionalSwitch.js +174 -0
- package/src/sap/fe/macros/ConditionalSwitch.tsx +141 -0
- package/src/sap/fe/macros/ConditionalSwitchProperty.js +78 -0
- package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +62 -0
- package/src/sap/fe/macros/Field.js +14 -10
- package/src/sap/fe/macros/Field.ts +15 -12
- package/src/sap/fe/macros/MacroAPI.js +9 -4
- package/src/sap/fe/macros/MacroAPI.ts +9 -4
- package/src/sap/fe/macros/MultiValueField.js +10 -5
- package/src/sap/fe/macros/MultiValueField.tsx +7 -1
- package/src/sap/fe/macros/Page.js +5 -7
- package/src/sap/fe/macros/Page.tsx +4 -6
- package/src/sap/fe/macros/Paginator.js +9 -4
- package/src/sap/fe/macros/Paginator.tsx +12 -3
- package/src/sap/fe/macros/RichTextEditor.js +3 -2
- package/src/sap/fe/macros/RichTextEditor.tsx +2 -1
- package/src/sap/fe/macros/Status.js +38 -13
- package/src/sap/fe/macros/Status.tsx +26 -6
- package/src/sap/fe/macros/ai/EasyFillDialog.js +11 -17
- package/src/sap/fe/macros/ai/EasyFillDialog.tsx +11 -16
- package/src/sap/fe/macros/ai/EasyFilterBar.js +195 -55
- package/src/sap/fe/macros/ai/EasyFilterBar.tsx +234 -57
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +76 -33
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +89 -40
- package/src/sap/fe/macros/chart/Chart.js +2 -2
- package/src/sap/fe/macros/chart/Chart.tsx +1 -1
- package/src/sap/fe/macros/chart/MdcChartTemplate.js +4 -2
- package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +4 -1
- package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.js +9 -2
- package/src/sap/fe/macros/contentSwitcher/ContentSwitcher.tsx +8 -0
- package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +5 -1
- package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +4 -0
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +2 -2
- package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +1 -1
- package/src/sap/fe/macros/controls/FilterBar.js +14 -5
- package/src/sap/fe/macros/controls/FilterBar.ts +3 -0
- package/src/sap/fe/macros/controls/RadioButtons.js +61 -38
- package/src/sap/fe/macros/controls/RadioButtons.tsx +39 -18
- package/src/sap/fe/macros/controls/Section.js +4 -3
- package/src/sap/fe/macros/controls/Section.ts +3 -2
- package/src/sap/fe/macros/controls/section/SubSection.js +63 -8
- package/src/sap/fe/macros/controls/section/SubSection.ts +67 -1
- package/src/sap/fe/macros/field/Field.js +2 -2
- package/src/sap/fe/macros/field/Field.tsx +1 -1
- package/src/sap/fe/macros/field/FieldFormatOptions.js +25 -2
- package/src/sap/fe/macros/field/FieldFormatOptions.ts +13 -0
- package/src/sap/fe/macros/field/FieldHelper.js +2 -2
- package/src/sap/fe/macros/field/FieldHelper.ts +1 -4
- package/src/sap/fe/macros/field/FieldTemplating.js +3 -3
- package/src/sap/fe/macros/field/FieldTemplating.ts +4 -2
- package/src/sap/fe/macros/filter/FilterUtils.js +232 -2
- package/src/sap/fe/macros/filter/FilterUtils.ts +290 -4
- package/src/sap/fe/macros/filterBar/FilterBar.block.js +5 -3
- package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +4 -2
- package/src/sap/fe/macros/filterBar/FilterBar.js +2 -2
- package/src/sap/fe/macros/filterBar/FilterBar.tsx +1 -1
- package/src/sap/fe/macros/filterBar/FilterBarAPI.js +63 -27
- package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +49 -3
- package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +5 -3
- package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +5 -2
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +7 -2
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +6 -1
- package/src/sap/fe/macros/form/Form.block.js +7 -8
- package/src/sap/fe/macros/form/Form.block.ts +4 -6
- package/src/sap/fe/macros/form/FormContainer.block.js +555 -4
- package/src/sap/fe/macros/form/FormContainer.block.ts +665 -6
- package/src/sap/fe/macros/form/FormContainer.fragment.xml +1 -0
- package/src/sap/fe/macros/form/FormDelegate.js +6 -9
- package/src/sap/fe/macros/form/FormDelegate.ts +5 -8
- package/src/sap/fe/macros/internal/DataPoint.js +3 -2
- package/src/sap/fe/macros/internal/DataPoint.tsx +10 -1
- package/src/sap/fe/macros/internal/FilterField.block.js +16 -8
- package/src/sap/fe/macros/internal/FilterField.block.ts +11 -7
- package/src/sap/fe/macros/internal/field/DisplayStyle.js +7 -1
- package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +8 -0
- package/src/sap/fe/macros/internal/field/EditStyle.js +21 -4
- package/src/sap/fe/macros/internal/field/EditStyle.tsx +18 -4
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +3 -2
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +4 -1
- package/src/sap/fe/macros/internal/filterField/FilterFieldTemplate.fragment.xml +1 -0
- package/src/sap/fe/macros/internal/helpers/ActionHelper.js +36 -5
- package/src/sap/fe/macros/internal/helpers/ActionHelper.ts +34 -4
- package/src/sap/fe/macros/library.js +1 -1
- package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.js +2 -1
- package/src/sap/fe/macros/mdc/adapter/StateFilterToSelectionVariant.ts +1 -0
- package/src/sap/fe/macros/messagebundle.properties +20 -2
- package/src/sap/fe/macros/messagebundle_ar.properties +1 -1
- package/src/sap/fe/macros/messagebundle_bg.properties +1 -1
- package/src/sap/fe/macros/messagebundle_ca.properties +1 -1
- package/src/sap/fe/macros/messagebundle_cnr.properties +1 -1
- package/src/sap/fe/macros/messagebundle_cs.properties +1 -1
- package/src/sap/fe/macros/messagebundle_cy.properties +1 -1
- package/src/sap/fe/macros/messagebundle_da.properties +1 -1
- package/src/sap/fe/macros/messagebundle_de.properties +4 -4
- package/src/sap/fe/macros/messagebundle_el.properties +1 -1
- package/src/sap/fe/macros/messagebundle_en.properties +1 -1
- package/src/sap/fe/macros/messagebundle_en_GB.properties +1 -1
- package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +1 -1
- package/src/sap/fe/macros/messagebundle_es.properties +2 -2
- package/src/sap/fe/macros/messagebundle_es_MX.properties +1 -1
- package/src/sap/fe/macros/messagebundle_et.properties +1 -1
- package/src/sap/fe/macros/messagebundle_fi.properties +1 -1
- package/src/sap/fe/macros/messagebundle_fr.properties +1 -1
- package/src/sap/fe/macros/messagebundle_fr_CA.properties +1 -1
- package/src/sap/fe/macros/messagebundle_hi.properties +1 -1
- package/src/sap/fe/macros/messagebundle_hr.properties +1 -1
- package/src/sap/fe/macros/messagebundle_hu.properties +1 -1
- package/src/sap/fe/macros/messagebundle_id.properties +5 -5
- package/src/sap/fe/macros/messagebundle_it.properties +1 -1
- package/src/sap/fe/macros/messagebundle_iw.properties +1 -1
- package/src/sap/fe/macros/messagebundle_ja.properties +5 -5
- package/src/sap/fe/macros/messagebundle_kk.properties +1 -1
- package/src/sap/fe/macros/messagebundle_ko.properties +2 -2
- package/src/sap/fe/macros/messagebundle_lt.properties +2 -2
- package/src/sap/fe/macros/messagebundle_lv.properties +1 -1
- package/src/sap/fe/macros/messagebundle_mk.properties +2 -2
- package/src/sap/fe/macros/messagebundle_ms.properties +1 -1
- package/src/sap/fe/macros/messagebundle_nl.properties +1 -1
- package/src/sap/fe/macros/messagebundle_no.properties +1 -1
- package/src/sap/fe/macros/messagebundle_pl.properties +1 -1
- package/src/sap/fe/macros/messagebundle_pt.properties +1 -1
- package/src/sap/fe/macros/messagebundle_pt_PT.properties +1 -1
- package/src/sap/fe/macros/messagebundle_ro.properties +1 -1
- package/src/sap/fe/macros/messagebundle_ru.properties +1 -1
- package/src/sap/fe/macros/messagebundle_sh.properties +1 -1
- package/src/sap/fe/macros/messagebundle_sk.properties +1 -1
- package/src/sap/fe/macros/messagebundle_sl.properties +1 -1
- package/src/sap/fe/macros/messagebundle_sr.properties +1 -1
- package/src/sap/fe/macros/messagebundle_sv.properties +1 -1
- package/src/sap/fe/macros/messagebundle_th.properties +1 -1
- package/src/sap/fe/macros/messagebundle_tr.properties +1 -1
- package/src/sap/fe/macros/messagebundle_uk.properties +1 -1
- package/src/sap/fe/macros/messagebundle_vi.properties +2 -2
- package/src/sap/fe/macros/messagebundle_zh_CN.properties +1 -1
- package/src/sap/fe/macros/messagebundle_zh_TW.properties +1 -1
- package/src/sap/fe/macros/messages/MessageButton.js +1 -1
- package/src/sap/fe/macros/messages/MessageButton.ts +2 -2
- package/src/sap/fe/macros/messages/MessagePopover.js +3 -1
- package/src/sap/fe/macros/messages/MessagePopover.ts +2 -0
- package/src/sap/fe/macros/microchart/MicroChart.js +2 -2
- package/src/sap/fe/macros/microchart/MicroChart.tsx +1 -1
- package/src/sap/fe/macros/microchart/MicroChartHelper.js +2 -2
- package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +1 -1
- package/src/sap/fe/macros/table/ActionsTemplating.js +4 -8
- package/src/sap/fe/macros/table/ActionsTemplating.tsx +5 -8
- package/src/sap/fe/macros/table/BasicSearch.js +1 -1
- package/src/sap/fe/macros/table/BasicSearch.ts +2 -1
- package/src/sap/fe/macros/table/Column.js +14 -2
- package/src/sap/fe/macros/table/Column.ts +7 -0
- package/src/sap/fe/macros/table/ColumnExportSettings.js +83 -15
- package/src/sap/fe/macros/table/ColumnExportSettings.ts +44 -0
- package/src/sap/fe/macros/table/ColumnOverride.js +14 -2
- package/src/sap/fe/macros/table/ColumnOverride.ts +7 -0
- package/src/sap/fe/macros/table/MdcTableTemplate.js +5 -5
- package/src/sap/fe/macros/table/MdcTableTemplate.tsx +15 -9
- package/src/sap/fe/macros/table/QuickFilterSelector.js +12 -3
- package/src/sap/fe/macros/table/QuickFilterSelector.tsx +15 -2
- package/src/sap/fe/macros/table/Table.block.js +188 -147
- package/src/sap/fe/macros/table/Table.block.tsx +41 -11
- package/src/sap/fe/macros/table/Table.js +16 -10
- package/src/sap/fe/macros/table/Table.tsx +16 -10
- package/src/sap/fe/macros/table/TableAPI.js +224 -184
- package/src/sap/fe/macros/table/TableAPI.ts +63 -19
- package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -6
- package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +5 -4
- package/src/sap/fe/macros/table/TableHelper.js +2 -2
- package/src/sap/fe/macros/table/TableHelper.ts +1 -1
- package/src/sap/fe/macros/table/TreeTable.js +16 -10
- package/src/sap/fe/macros/table/TreeTable.tsx +16 -10
- package/src/sap/fe/macros/table/Utils.js +3 -2
- package/src/sap/fe/macros/table/Utils.ts +7 -2
- package/src/sap/fe/macros/table/delegates/TableDelegate.js +69 -33
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +75 -32
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +10 -10
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +11 -9
- package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +14 -12
- package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +11 -10
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +34 -4
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +45 -2
- package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +55 -12
- package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +71 -9
- package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +53 -2
- package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +55 -0
- package/src/sap/fe/macros/table/mixin/TableExport.js +22 -3
- package/src/sap/fe/macros/table/mixin/TableExport.ts +25 -4
- package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
- package/src/sap/fe/macros/table/mixin/TableSharing.ts +4 -3
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +27 -10
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +31 -13
- package/src/sap/fe/macros/visualfilters/VisualFilter.js +5 -3
- package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +3 -1
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import type { Property } from "@sap-ux/vocabularies-types";
|
|
1
|
+
import type { ComplexType, EntitySet, EntityType, NavigationProperty, Property, TypeDefinition } from "@sap-ux/vocabularies-types";
|
|
2
2
|
import Log from "sap/base/Log";
|
|
3
|
+
import Localization from "sap/base/i18n/Localization";
|
|
4
|
+
import { isConstant } from "sap/fe/base/BindingToolkit";
|
|
3
5
|
import type { EnhanceWithUI5 } from "sap/fe/base/ClassSupport";
|
|
4
6
|
import { aggregation, association, defineUI5Class, implementInterface, property, type PropertiesOf } from "sap/fe/base/ClassSupport";
|
|
5
7
|
import type {
|
|
8
|
+
CodeListType,
|
|
6
9
|
EasyFilterBarContainer$ShowValueHelpEvent,
|
|
7
10
|
EasyFilterPropertyMetadata,
|
|
8
11
|
TokenDefinition,
|
|
@@ -15,10 +18,11 @@ import BuildingBlock from "sap/fe/core/buildingBlocks/BuildingBlock";
|
|
|
15
18
|
import BusyLocker from "sap/fe/core/controllerextensions/BusyLocker";
|
|
16
19
|
import type { ControlState, NavigationParameter } from "sap/fe/core/controllerextensions/ViewState";
|
|
17
20
|
import type IViewStateContributor from "sap/fe/core/controllerextensions/viewState/IViewStateContributor";
|
|
18
|
-
import type
|
|
21
|
+
import { type FilterField } from "sap/fe/core/definition/FEDefinition";
|
|
19
22
|
import type MetaPath from "sap/fe/core/helpers/MetaPath";
|
|
20
23
|
import ModelHelper from "sap/fe/core/helpers/ModelHelper";
|
|
21
|
-
import { isPathAnnotationExpression } from "sap/fe/core/helpers/TypeGuards";
|
|
24
|
+
import { isComplexType, isEntityType, isNavigationProperty, isPathAnnotationExpression, isProperty } from "sap/fe/core/helpers/TypeGuards";
|
|
25
|
+
import { isPathFilterable } from "sap/fe/core/templating/DataModelPathHelper";
|
|
22
26
|
import { hasValueHelpWithFixedValues } from "sap/fe/core/templating/PropertyHelper";
|
|
23
27
|
import {
|
|
24
28
|
generateSelectParameter,
|
|
@@ -146,11 +150,9 @@ export default class EasyFilterBar extends BuildingBlock implements IViewStateCo
|
|
|
146
150
|
this.content.filterBarMetadata = this.filterBarMetadata;
|
|
147
151
|
}
|
|
148
152
|
|
|
149
|
-
private
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
const unitProperty = isPathAnnotationExpression(unitAnnotation) ? unitAnnotation.$target : undefined;
|
|
153
|
-
return allFilterFields.find((f) => f.getTarget() === unitProperty)?.annotationPath;
|
|
153
|
+
private getUnitForProperty(prop: Property, basePath: string): string | undefined {
|
|
154
|
+
const unitAnnotation = prop.annotations.Measures?.ISOCurrency ?? prop.annotations.Measures?.Unit;
|
|
155
|
+
return isPathAnnotationExpression(unitAnnotation) ? `${basePath}/${unitAnnotation.path}` : undefined;
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
private getDefaultValueForFilterField(
|
|
@@ -196,9 +198,9 @@ export default class EasyFilterBar extends BuildingBlock implements IViewStateCo
|
|
|
196
198
|
};
|
|
197
199
|
}
|
|
198
200
|
|
|
199
|
-
private getTokenType(prop: Property): TokenType {
|
|
201
|
+
private getTokenType(prop: Property, filterRestriction: string): TokenType {
|
|
200
202
|
if (hasValueHelpWithFixedValues(prop)) {
|
|
201
|
-
return "MenuWithCheckBox";
|
|
203
|
+
return filterRestriction === "SingleValue" ? "MenuWithSingleSelect" : "MenuWithCheckBox";
|
|
202
204
|
}
|
|
203
205
|
switch (prop.type) {
|
|
204
206
|
case "Edm.Date":
|
|
@@ -210,7 +212,44 @@ export default class EasyFilterBar extends BuildingBlock implements IViewStateCo
|
|
|
210
212
|
}
|
|
211
213
|
}
|
|
212
214
|
|
|
215
|
+
private getLabel(element: Property | NavigationProperty | EntityType | ComplexType): string | undefined {
|
|
216
|
+
const label = element.annotations.Common?.Label?.toString();
|
|
217
|
+
const headerInfoTypeName = isEntityType(element) ? (element.annotations.UI?.HeaderInfo?.TypeName?.valueOf() as string) : undefined;
|
|
218
|
+
const result = headerInfoTypeName || label;
|
|
219
|
+
|
|
220
|
+
if (this.isComplexProperty(element) || isNavigationProperty(element)) {
|
|
221
|
+
return result || this.getLabel(element.targetType);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private isScalarProperty(element: unknown): element is Property & { targetType?: TypeDefinition } {
|
|
228
|
+
return isProperty(element) && !isComplexType(element.targetType);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
private isComplexProperty(element: unknown): element is Property & { targetType: ComplexType } {
|
|
232
|
+
return isProperty(element) && isComplexType(element.targetType);
|
|
233
|
+
}
|
|
234
|
+
|
|
213
235
|
prepareFilterBarMetadata(): FieldMetadata[] {
|
|
236
|
+
/*
|
|
237
|
+
* 1. INITIALIZATION:
|
|
238
|
+
* - Queue all root entity properties and navigation properties for traversal
|
|
239
|
+
* - Initialize result array and elimination set for Common.Text targets
|
|
240
|
+
*
|
|
241
|
+
* 2. BREADTH-FIRST TRAVERSAL:
|
|
242
|
+
* For each path in queue:
|
|
243
|
+
* - Skip UI.Hidden properties
|
|
244
|
+
* - Scalar properties: Generate metadata, track Common.Text targets for elimination
|
|
245
|
+
* - Complex properties: Add child properties to queue
|
|
246
|
+
* - Navigation properties: Add target EntityType properties to queue
|
|
247
|
+
* (Collections only if explicit filter fields exist, respect depth limits)
|
|
248
|
+
*
|
|
249
|
+
* 3. POST-PROCESSING:
|
|
250
|
+
* - Add $editState filter for draft-enabled entities
|
|
251
|
+
* - Remove properties marked for elimination (except explicit filter fields)
|
|
252
|
+
*/
|
|
214
253
|
const owner = this._getOwner()!;
|
|
215
254
|
const definitionForPage = owner.preprocessorContext?.getDefinitionForPage();
|
|
216
255
|
|
|
@@ -219,42 +258,155 @@ export default class EasyFilterBar extends BuildingBlock implements IViewStateCo
|
|
|
219
258
|
}
|
|
220
259
|
|
|
221
260
|
const filterBarDef = definitionForPage.getFilterBarDefinition({});
|
|
261
|
+
const metaPath = definitionForPage.getMetaPath();
|
|
262
|
+
const entitySet = metaPath.getClosestEntitySet() as EntitySet;
|
|
263
|
+
|
|
264
|
+
let filterExpressionRestrictions = entitySet.annotations.Capabilities?.FilterRestrictions?.FilterExpressionRestrictions ?? [];
|
|
265
|
+
|
|
266
|
+
// TODO: Maybe we can simplify this by using restrictions on the main entity set only
|
|
267
|
+
for (const navigationProperty in entitySet.navigationPropertyBinding) {
|
|
268
|
+
if (entitySet.navigationPropertyBinding[navigationProperty]?._type === "EntitySet") {
|
|
269
|
+
// FIXME: optional chaining should not be needed here -> root cause fix pending
|
|
270
|
+
const navigationPropertyEntitySet = entitySet.navigationPropertyBinding[navigationProperty] as EntitySet;
|
|
271
|
+
const navPropertyFilterExpressionRestrictions =
|
|
272
|
+
navigationPropertyEntitySet.annotations.Capabilities?.FilterRestrictions?.FilterExpressionRestrictions ?? [];
|
|
273
|
+
|
|
274
|
+
const currentFilterRestrictions = [...filterExpressionRestrictions];
|
|
275
|
+
filterExpressionRestrictions = [
|
|
276
|
+
...filterExpressionRestrictions,
|
|
277
|
+
...navPropertyFilterExpressionRestrictions.filter((restriction) => !currentFilterRestrictions.includes(restriction))
|
|
278
|
+
];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
222
282
|
const metaModel = owner.preprocessorContext?.models.metaModel as ODataMetaModel;
|
|
223
283
|
|
|
284
|
+
const getCodeList = (lastPathSegment: Property, propertyPath: string): CodeList | (() => Promise<CodeList>) | undefined =>
|
|
285
|
+
hasValueHelpWithFixedValues(lastPathSegment)
|
|
286
|
+
? async (): Promise<CodeList> => this.getCodeListForProperty(propertyPath)
|
|
287
|
+
: undefined;
|
|
288
|
+
|
|
289
|
+
const filterFields = filterBarDef
|
|
290
|
+
.getFilterFields()
|
|
291
|
+
.filter((field: FilterField) => !field.getTarget()?.annotations?.UI?.HiddenFilter?.valueOf());
|
|
292
|
+
|
|
224
293
|
const startupParameters = owner.getAppComponent().getComponentData()?.startupParameters ?? {};
|
|
225
294
|
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
295
|
+
const maxDepth = 1; // Maximum depth for navigation properties
|
|
296
|
+
|
|
297
|
+
// Initialize traversal queue with all entity properties and navigation properties.
|
|
298
|
+
// Each path to traverse is a list of segments (e.g. [navProp1, complexProp1, complexProp2, scalarProp])
|
|
299
|
+
const pathsToExplore: (Property | NavigationProperty)[][] = [
|
|
300
|
+
...entitySet.entityType.entityProperties,
|
|
301
|
+
...entitySet.entityType.navigationProperties
|
|
302
|
+
].map((element) => [element]);
|
|
230
303
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
304
|
+
// Resulting metadata array
|
|
305
|
+
const result: EasyFilterPropertyMetadata[] = [];
|
|
306
|
+
|
|
307
|
+
// Set of property paths to be eliminated from the filter bar metadata
|
|
308
|
+
const pathsToEliminate = new Set<string>();
|
|
309
|
+
|
|
310
|
+
const getPathLabel = (path: (Property | NavigationProperty)[]): string => {
|
|
311
|
+
const pathLabels = path.map((e) => this.getLabel(e) || `[${e.name}]`);
|
|
312
|
+
return Localization.getRTL() ? pathLabels.slice().reverse().join(" - ") : pathLabels.join(" - ");
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
while (pathsToExplore.length > 0) {
|
|
316
|
+
const currentPath = pathsToExplore.shift()!;
|
|
317
|
+
|
|
318
|
+
const navigationDepth = currentPath.filter(isNavigationProperty).length;
|
|
319
|
+
|
|
320
|
+
const lastPathSegment = currentPath[currentPath.length - 1];
|
|
321
|
+
|
|
322
|
+
if (lastPathSegment.annotations.UI?.Hidden?.valueOf() === true) {
|
|
323
|
+
continue;
|
|
236
324
|
}
|
|
237
325
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
326
|
+
const pathString = [`/${entitySet.name}`, ...currentPath.slice(0, -1).map((e) => e.name)].reduce(
|
|
327
|
+
(acc, curr) => `${acc}/${curr}`
|
|
328
|
+
);
|
|
329
|
+
const propertyPath = `${pathString}/${lastPathSegment.name}`;
|
|
330
|
+
|
|
331
|
+
if (this.isScalarProperty(lastPathSegment)) {
|
|
332
|
+
// Check for Common.Text annotation and record the annotation target path for elimination
|
|
333
|
+
const textAnnotation = lastPathSegment.annotations.Common?.Text;
|
|
334
|
+
if (isPathAnnotationExpression(textAnnotation)) {
|
|
335
|
+
// Construct the full path to the target property
|
|
336
|
+
pathsToEliminate.add(`${pathString}/${textAnnotation.path}`);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Scalar property: create metadata for the property
|
|
340
|
+
const filterField = filterFields.find((field) => field.getTarget() === lastPathSegment);
|
|
341
|
+
const filterRestriction = filterExpressionRestrictions.find(
|
|
342
|
+
(expression) => expression.Property?.$target === lastPathSegment
|
|
343
|
+
);
|
|
344
|
+
const filterable = isPathFilterable(this.getDataModelObjectPath(propertyPath));
|
|
345
|
+
const filterableExpression = isConstant(filterable) ? filterable.value : true;
|
|
346
|
+
const filterRestrictionExpression = filterRestriction?.AllowedExpressions as
|
|
347
|
+
| EasyFilterPropertyMetadata["filterRestriction"]
|
|
348
|
+
| undefined;
|
|
349
|
+
const codeList = getCodeList(lastPathSegment, propertyPath);
|
|
350
|
+
const metadata: EasyFilterPropertyMetadata = {
|
|
351
|
+
name: propertyPath,
|
|
352
|
+
label: getPathLabel(currentPath),
|
|
353
|
+
dataType: lastPathSegment.type,
|
|
354
|
+
required: filterField?.required,
|
|
355
|
+
defaultValue: filterField ? this.getDefaultValueForFilterField(filterField, startupParameters) : undefined,
|
|
356
|
+
filterable: filterField ? filterableExpression : undefined,
|
|
357
|
+
hiddenFilter: !filterField,
|
|
358
|
+
filterRestriction: filterField ? filterRestrictionExpression : undefined,
|
|
359
|
+
codeList,
|
|
360
|
+
type: this.getTokenType(
|
|
361
|
+
lastPathSegment,
|
|
362
|
+
filterRestriction?.AllowedExpressions?.toString() || "MultiRangeOrSearchExpression"
|
|
363
|
+
) as Exclude<TokenType, "ValueHelp">,
|
|
364
|
+
unit: this.getUnitForProperty(lastPathSegment, pathString)
|
|
365
|
+
};
|
|
366
|
+
result.push(metadata);
|
|
367
|
+
} else if (this.isComplexProperty(lastPathSegment)) {
|
|
368
|
+
// Complex property: add all properties and navigation properties of the complex type
|
|
369
|
+
lastPathSegment.targetType.properties.forEach((child) => {
|
|
370
|
+
pathsToExplore.push([...currentPath, child]);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// only traverse navigation properties if we are not at the maximum depth
|
|
374
|
+
if (navigationDepth < maxDepth) {
|
|
375
|
+
lastPathSegment.targetType.navigationProperties.forEach((child) => {
|
|
376
|
+
pathsToExplore.push([...currentPath, child]);
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
} else if (isNavigationProperty(lastPathSegment)) {
|
|
380
|
+
// add 1:n navigation properties only if there are filter fields for at least one of the target properties
|
|
381
|
+
if (lastPathSegment.isCollection && !filterFields.some((field) => field.annotationPath?.startsWith(propertyPath))) {
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
lastPathSegment.targetType.entityProperties.forEach((child) => {
|
|
386
|
+
pathsToExplore.push([...currentPath, child]);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
// only traverse navigation properties if we are not at the maximum depth
|
|
390
|
+
if (navigationDepth < maxDepth) {
|
|
391
|
+
lastPathSegment.targetType.navigationProperties.forEach((child) => {
|
|
392
|
+
pathsToExplore.push([...currentPath, child]);
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
251
397
|
|
|
252
398
|
// [Editing Status]
|
|
253
399
|
if (ModelHelper.isMetaPathDraftSupported(definitionForPage.getMetaPath() as unknown as MetaPath<unknown>)) {
|
|
254
400
|
result.push(this.getEditStateFilterMetadata(metaModel));
|
|
255
401
|
}
|
|
256
402
|
|
|
257
|
-
|
|
403
|
+
// Remove properties marked for elimination (unless they are filter fields)
|
|
404
|
+
return result.filter((metadata) => {
|
|
405
|
+
return (
|
|
406
|
+
!metadata.hiddenFilter || // Keep if explicit filter field
|
|
407
|
+
!pathsToEliminate.has(metadata.name) // Keep if path not marked for elimination
|
|
408
|
+
);
|
|
409
|
+
});
|
|
258
410
|
}
|
|
259
411
|
|
|
260
412
|
async getCodeListForProperty(propertyPath: string): Promise<CodeList> {
|
|
@@ -283,37 +435,62 @@ export default class EasyFilterBar extends BuildingBlock implements IViewStateCo
|
|
|
283
435
|
fieldName: string,
|
|
284
436
|
values: TokenSelectedValuesDefinition[]
|
|
285
437
|
): Promise<ValueHelpSelectedValuesDefinition[]> {
|
|
286
|
-
let filteredValues = values;
|
|
287
438
|
const field = this.filterBarMetadata.find(({ name }) => name === fieldName);
|
|
288
|
-
|
|
289
|
-
const maxLength = field.maxLength;
|
|
290
|
-
|
|
291
|
-
if (maxLength !== undefined) {
|
|
292
|
-
filteredValues = values
|
|
293
|
-
.map((token) => {
|
|
294
|
-
const filtered = token.selectedValues.filter((val) => typeof val !== "string" || val.length <= maxLength);
|
|
295
|
-
return filtered.length > 0 ? { ...token, selectedValues: filtered } : undefined;
|
|
296
|
-
})
|
|
297
|
-
.filter(Boolean) as TokenSelectedValuesDefinition[];
|
|
298
|
-
if (filteredValues.length === 0) {
|
|
299
|
-
return [];
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
const valueList = await this.getValueList(field.name);
|
|
439
|
+
let result: ValueHelpSelectedValuesDefinition[];
|
|
303
440
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
441
|
+
if (!field) {
|
|
442
|
+
// return original values converted to the expected format if no field is defined
|
|
443
|
+
return unresolvedResult(values);
|
|
308
444
|
}
|
|
445
|
+
const valueList = await this.getValueList(field.name);
|
|
309
446
|
|
|
310
|
-
|
|
311
|
-
|
|
447
|
+
if (valueList && ValueListHelper.isValueListSearchable(field.name, valueList)) {
|
|
448
|
+
const resolvedTokenValues = await Promise.all(values.map(async (value) => resolveTokenValue(valueList, value)));
|
|
449
|
+
result = resolvedTokenValues.flat();
|
|
450
|
+
} else {
|
|
451
|
+
result = unresolvedResult(values);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Apply maxLength filtering if defined
|
|
455
|
+
if (field.maxLength !== undefined) {
|
|
456
|
+
const filteredTokens = result
|
|
457
|
+
.map((token) => {
|
|
458
|
+
if (token.operator === FilterOperator.BT || token.operator === FilterOperator.NB) {
|
|
459
|
+
// Handle between operators - selectedValues is ValueHelpBetweenSelectedValues
|
|
460
|
+
const [a, b] = token.selectedValues;
|
|
461
|
+
|
|
462
|
+
// Check if both values exceed maxLength
|
|
463
|
+
if (String(a.value).length <= field.maxLength! && String(b.value).length <= field.maxLength!) {
|
|
464
|
+
return token; // Keep the token if both values are within limit
|
|
465
|
+
} else {
|
|
466
|
+
return null; // Remove the token if either value exceeds limit
|
|
467
|
+
}
|
|
468
|
+
} else {
|
|
469
|
+
// Handle other operators - selectedValues is CodeListType[]
|
|
470
|
+
const filtered: CodeListType[] = token.selectedValues.filter(
|
|
471
|
+
(selectedValue) => String(selectedValue.value).length <= field.maxLength!
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
// Only return the token if there are remaining values after filtering
|
|
475
|
+
if (filtered.length > 0) {
|
|
476
|
+
return { ...token, selectedValues: filtered };
|
|
477
|
+
} else {
|
|
478
|
+
return null; // Remove the token if no values remain
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
})
|
|
482
|
+
.filter((token): token is ValueHelpSelectedValuesDefinition => token !== null);
|
|
483
|
+
|
|
484
|
+
return filteredTokens;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// if no maxLength is defined, return unfiltered result
|
|
488
|
+
return result;
|
|
312
489
|
}
|
|
313
490
|
|
|
314
|
-
async getValueList(
|
|
491
|
+
async getValueList(fieldName: string): Promise<ValueListInfo | undefined> {
|
|
315
492
|
const metaModel = this.getMetaModel()!;
|
|
316
|
-
const valueLists = await ValueListHelper.getValueListInfo(undefined,
|
|
493
|
+
const valueLists = await ValueListHelper.getValueListInfo(undefined, fieldName, undefined, metaModel);
|
|
317
494
|
return valueLists[0];
|
|
318
495
|
}
|
|
319
496
|
|
|
@@ -45,7 +45,13 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
45
45
|
const path = `/${valueList.valueListInfo.CollectionPath}`;
|
|
46
46
|
const $select = generateSelectParameter(valueList);
|
|
47
47
|
let $search = CommonUtils.normalizeSearchTerm(valueToMatch instanceof Date ? valueToMatch.toISOString() : valueToMatch.toString());
|
|
48
|
-
|
|
48
|
+
|
|
49
|
+
// Handle negation operators (NE, NotContains, NotStartsWith, NotEndsWith)
|
|
50
|
+
// Strategy: Query for positive case, then apply negation client-side
|
|
51
|
+
const isNegation = isNegationOperator(operator);
|
|
52
|
+
// "cleaned" operator for possible negation operators
|
|
53
|
+
const cleanedOperator = isNegation ? getPositiveOperator(operator) : operator;
|
|
54
|
+
const keyPropertyFilter = getKeyPropertyFilter(valueList, keyProperty, cleanedOperator, valueToMatch);
|
|
49
55
|
|
|
50
56
|
// Check if the query exceeds the maximum length of the key property
|
|
51
57
|
const characterLimitOverflow = !$search || $search.length > (keyProperty.maxLength ?? $search.length);
|
|
@@ -67,7 +73,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
67
73
|
// There is at least one match in the key column:
|
|
68
74
|
// - If the operator is EQ: This indicates an exact key match, so the returned data will be used.
|
|
69
75
|
// - For other operators: One or more keys match the value based on the operator, so the original condition is preserved.
|
|
70
|
-
return
|
|
76
|
+
return cleanedOperator === FilterOperator.EQ ? {
|
|
71
77
|
operator,
|
|
72
78
|
selectedValues: valueHelpKeyQuery.value.map(mapResult)
|
|
73
79
|
} : {
|
|
@@ -82,7 +88,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
82
88
|
// The key query did not return any matches, but the search query found results. Use the search results instead.
|
|
83
89
|
|
|
84
90
|
let results = valueHelpSearchQuery.value.map(mapResult);
|
|
85
|
-
if (
|
|
91
|
+
if (cleanedOperator === FilterOperator.EQ) {
|
|
86
92
|
const filteredResults = results.filter(result => result.description.toString().toLowerCase() === valueToMatch.toString().toLowerCase());
|
|
87
93
|
// If the search query is found once/multiple times in the result + operator is EQ, we need to return only those results
|
|
88
94
|
if (filteredResults.length > 0) {
|
|
@@ -96,6 +102,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
96
102
|
}
|
|
97
103
|
|
|
98
104
|
// No matches were found in either query; the original value will be used as a fallback.
|
|
105
|
+
|
|
99
106
|
return {
|
|
100
107
|
operator,
|
|
101
108
|
selectedValues: [{
|
|
@@ -135,32 +142,6 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
135
142
|
function generateSelectParameter(valueList) {
|
|
136
143
|
return [valueList.keyPath, valueList.descriptionPath].filter(path => path && !path.includes("/")).join(",");
|
|
137
144
|
}
|
|
138
|
-
_exports.generateSelectParameter = generateSelectParameter;
|
|
139
|
-
function handleIntervals(operator, resolvedValues) {
|
|
140
|
-
const [resolvedLowerBound, resolvedUpperBound] = resolvedValues;
|
|
141
|
-
const result = [];
|
|
142
|
-
for (const {
|
|
143
|
-
value: lowerBound,
|
|
144
|
-
description: lowerBoundText
|
|
145
|
-
} of resolvedLowerBound.selectedValues) {
|
|
146
|
-
for (const {
|
|
147
|
-
value: upperBound,
|
|
148
|
-
description: upperBoundText
|
|
149
|
-
} of resolvedUpperBound.selectedValues) {
|
|
150
|
-
result.push({
|
|
151
|
-
operator,
|
|
152
|
-
selectedValues: [{
|
|
153
|
-
value: lowerBound,
|
|
154
|
-
description: lowerBoundText ?? lowerBound
|
|
155
|
-
}, {
|
|
156
|
-
value: upperBound,
|
|
157
|
-
description: upperBoundText ?? upperBound
|
|
158
|
-
}]
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return result;
|
|
163
|
-
}
|
|
164
145
|
|
|
165
146
|
/**
|
|
166
147
|
* Resolves token-based filter values using a value list.
|
|
@@ -169,6 +150,7 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
169
150
|
* @param looseMatch Whether to perform a loose match on the values.
|
|
170
151
|
* @returns A promise that resolves to an array of resolved filter values.
|
|
171
152
|
*/
|
|
153
|
+
_exports.generateSelectParameter = generateSelectParameter;
|
|
172
154
|
async function resolveTokenValue(valueList, value) {
|
|
173
155
|
let looseMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
174
156
|
const {
|
|
@@ -186,9 +168,31 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
186
168
|
// something went wrong - the key property is not a property of the value list entity
|
|
187
169
|
return unresolvedResult([value]);
|
|
188
170
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
171
|
+
|
|
172
|
+
// For comparison operators (GreaterThan, LessThan, Between, etc.), skip backend calls
|
|
173
|
+
// and return user input directly to EasyFilter
|
|
174
|
+
if (isComparisonOperator(operator)) {
|
|
175
|
+
if (operator === FilterOperator.BT || operator === FilterOperator.NB) {
|
|
176
|
+
// Handle Between/Not Between operators - they expect exactly 2 values
|
|
177
|
+
const [lowerBound, upperBound] = selectedValues;
|
|
178
|
+
return [{
|
|
179
|
+
operator,
|
|
180
|
+
selectedValues: [{
|
|
181
|
+
value: lowerBound,
|
|
182
|
+
description: lowerBound
|
|
183
|
+
}, {
|
|
184
|
+
value: upperBound,
|
|
185
|
+
description: upperBound
|
|
186
|
+
}]
|
|
187
|
+
}];
|
|
188
|
+
} else {
|
|
189
|
+
// Handle other comparison operators (GT, GE, LT, LE)
|
|
190
|
+
return unresolvedResult([value]);
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
const resolvedValues = await Promise.all(selectedValues.map(async selectedValue => resolveValueUsingValueList(valueList, keyProperty, operator, selectedValue, looseMatch)));
|
|
194
|
+
return resolvedValues.flat();
|
|
195
|
+
}
|
|
192
196
|
}
|
|
193
197
|
|
|
194
198
|
/**
|
|
@@ -212,7 +216,46 @@ sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/MetaModelConve
|
|
|
212
216
|
};
|
|
213
217
|
});
|
|
214
218
|
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Checks if the operator is a negation operator (NE, NotContains, NotStartsWith, NotEndsWith).
|
|
222
|
+
* @param operator The filter operator to check.
|
|
223
|
+
* @returns True if the operator is a negation operator.
|
|
224
|
+
*/
|
|
215
225
|
_exports.unresolvedResult = unresolvedResult;
|
|
226
|
+
function isNegationOperator(operator) {
|
|
227
|
+
return [FilterOperator.NE, FilterOperator.NotContains, FilterOperator.NotStartsWith, FilterOperator.NotEndsWith].includes(operator);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Checks if the operator is a comparison operator (GT, GE, LT, LE, BT, NB).
|
|
232
|
+
* @param operator The filter operator to check.
|
|
233
|
+
* @returns True if the operator is a comparison operator.
|
|
234
|
+
*/
|
|
235
|
+
function isComparisonOperator(operator) {
|
|
236
|
+
return [FilterOperator.GT, FilterOperator.GE, FilterOperator.LT, FilterOperator.LE, FilterOperator.BT, FilterOperator.NB].includes(operator);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Converts a negation operator to its positive equivalent (NE -> EQ, NotContains -> Contains, etc.).
|
|
241
|
+
* @param negationOperator The negation operator to convert.
|
|
242
|
+
* @returns The corresponding positive operator.
|
|
243
|
+
*/
|
|
244
|
+
function getPositiveOperator(negationOperator) {
|
|
245
|
+
switch (negationOperator) {
|
|
246
|
+
case FilterOperator.NE:
|
|
247
|
+
return FilterOperator.EQ;
|
|
248
|
+
case FilterOperator.NotContains:
|
|
249
|
+
return FilterOperator.Contains;
|
|
250
|
+
case FilterOperator.NotStartsWith:
|
|
251
|
+
return FilterOperator.StartsWith;
|
|
252
|
+
case FilterOperator.NotEndsWith:
|
|
253
|
+
return FilterOperator.EndsWith;
|
|
254
|
+
default:
|
|
255
|
+
return FilterOperator.EQ;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
_exports.getPositiveOperator = getPositiveOperator;
|
|
216
259
|
return _exports;
|
|
217
260
|
}, false);
|
|
218
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRLZXlQcm9wZXJ0eUZpbHRlciIsInZhbHVlTGlzdCIsImtleVByb3BlcnR5Iiwib3BlcmF0b3IiLCJ2YWx1ZVRvTWF0Y2giLCJmaWx0ZXJWYWx1ZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNVcHBlckNhc2UiLCJ2YWx1ZU9mIiwidG9VcHBlckNhc2UiLCJGaWx0ZXIiLCJwYXRoIiwia2V5UGF0aCIsInZhbHVlMSIsInJlc29sdmVWYWx1ZVVzaW5nVmFsdWVMaXN0IiwibG9vc2VNYXRjaCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm1vZGVsIiwidmFsdWVMaXN0SW5mbyIsIiRtb2RlbCIsIkNvbGxlY3Rpb25QYXRoIiwiJHNlbGVjdCIsImdlbmVyYXRlU2VsZWN0UGFyYW1ldGVyIiwiJHNlYXJjaCIsIkNvbW1vblV0aWxzIiwibm9ybWFsaXplU2VhcmNoVGVybSIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsInRvU3RyaW5nIiwia2V5UHJvcGVydHlGaWx0ZXIiLCJjaGFyYWN0ZXJMaW1pdE92ZXJmbG93IiwibWF4TGVuZ3RoIiwidmFsdWVIZWxwS2V5UXVlcnkiLCJ2YWx1ZUhlbHBTZWFyY2hRdWVyeSIsIlByb21pc2UiLCJhbGxTZXR0bGVkIiwiYmluZExpc3QiLCJyZXF1ZXN0Q29udGV4dHMiLCJtYXBSZXN1bHQiLCJtYXBWYWx1ZUxpc3RUb0NvZGVMaXN0Iiwic3RhdHVzIiwidmFsdWUiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwic2VsZWN0ZWRWYWx1ZXMiLCJtYXAiLCJkZXNjcmlwdGlvbiIsInJlc3VsdHMiLCJmaWx0ZXJlZFJlc3VsdHMiLCJmaWx0ZXIiLCJyZXN1bHQiLCJ0b0xvd2VyQ2FzZSIsIm5vTWF0Y2giLCJlbnN1cmVEZXNjcmlwdGlvbiIsImNvbnRleHQiLCJkYXRhIiwiZ2V0T2JqZWN0IiwiZGVzY3JpcHRpb25QYXRoIiwiX2V4cG9ydHMiLCJpbmNsdWRlcyIsImpvaW4iLCJoYW5kbGVJbnRlcnZhbHMiLCJyZXNvbHZlZFZhbHVlcyIsInJlc29sdmVkTG93ZXJCb3VuZCIsInJlc29sdmVkVXBwZXJCb3VuZCIsImxvd2VyQm91bmQiLCJsb3dlckJvdW5kVGV4dCIsInVwcGVyQm91bmQiLCJ1cHBlckJvdW5kVGV4dCIsInB1c2giLCJyZXNvbHZlVG9rZW5WYWx1ZSIsInNldENvbnRpbnVlT25FcnJvciIsInZhbHVlTGlzdE1ldGFtb2RlbCIsImNvbnZlcnRUeXBlcyIsImdldE1ldGFNb2RlbCIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiaXNQcm9wZXJ0eSIsInVucmVzb2x2ZWRSZXN1bHQiLCJyZXNvbHZlZE9wZXJhdG9yIiwiQlQiLCJOQiIsImFsbCIsInNlbGVjdGVkVmFsdWUiLCJmbGF0IiwidmFsdWVzIiwiX3JlZiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWFzeUZpbHRlckRhdGFGZXRjaGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29kZUxpc3RUeXBlLFxuXHRUb2tlblNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbixcblx0VmFsdWVIZWxwU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29udHJvbHMvZWFzeUZpbHRlci9FYXN5RmlsdGVyQmFyQ29udGFpbmVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyB0eXBlIFZhbHVlTGlzdEluZm8gfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCB0eXBlIHsgQ29kZUxpc3RFbnRyeSB9IGZyb20gXCJ1eC9lbmcvZmlvcmlhaS9yZXVzZS9lYXN5ZmlsdGVyL0Vhc3lGaWx0ZXJcIjtcblxudHlwZSBTY2FsYXJPcGVyYXRvciA9IEV4Y2x1ZGU8RmlsdGVyT3BlcmF0b3IsIEZpbHRlck9wZXJhdG9yLkJUIHwgRmlsdGVyT3BlcmF0b3IuTkI+O1xudHlwZSBTY2FsYXJWYWx1ZSA9IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZpbHRlciBmb3IgdGhlIGtleSBwcm9wZXJ0eSBvZiBhIHZhbHVlIGxpc3QuXG4gKiBAcGFyYW0gdmFsdWVMaXN0IFRoZSB2YWx1ZSBsaXN0IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGtleVByb3BlcnR5IFRoZSBrZXkgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGxpc3QuXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIGZpbHRlciBvcGVyYXRvci5cbiAqIEBwYXJhbSB2YWx1ZVRvTWF0Y2ggVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMgQSBmaWx0ZXIgZm9yIHRoZSBrZXkgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEtleVByb3BlcnR5RmlsdGVyKFxuXHR2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8sXG5cdGtleVByb3BlcnR5OiBQcm9wZXJ0eSxcblx0b3BlcmF0b3I6IFNjYWxhck9wZXJhdG9yLFxuXHR2YWx1ZVRvTWF0Y2g6IFNjYWxhclZhbHVlXG4pOiBGaWx0ZXIge1xuXHRsZXQgZmlsdGVyVmFsdWUgPSB2YWx1ZVRvTWF0Y2g7XG5cblx0Ly8gSWYgdGhlIGtleSBwcm9wZXJ0eSBpcyBrbm93biB0byBjb250YWluIG9ubHkgdXBwZXJjYXNlIHZhbHVlcywgY29udmVydCB0aGUgZmlsdGVyIHZhbHVlIHRvIHVwcGVyY2FzZSBhcyB3ZWxsXG5cdGlmICh0eXBlb2YgZmlsdGVyVmFsdWUgPT09IFwic3RyaW5nXCIgJiYga2V5UHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5Jc1VwcGVyQ2FzZT8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0ZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS50b1VwcGVyQ2FzZSgpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBGaWx0ZXIoeyBwYXRoOiB2YWx1ZUxpc3Qua2V5UGF0aCwgb3BlcmF0b3IsIHZhbHVlMTogZmlsdGVyVmFsdWUgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzaW5nbGUgc2NhbGFyIHZhbHVlIHVzaW5nIGEgdmFsdWUgbGlzdC5cbiAqIEBwYXJhbSB2YWx1ZUxpc3QgVGhlIHZhbHVlIGxpc3QgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ga2V5UHJvcGVydHkgVGhlIGtleSBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgbGlzdC5cbiAqIEBwYXJhbSBvcGVyYXRvciBUaGUgZmlsdGVyIG9wZXJhdG9yLlxuICogQHBhcmFtIHZhbHVlVG9NYXRjaCBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcGFyYW0gbG9vc2VNYXRjaCBXaGV0aGVyIHRvIGFwcGx5IGxvb3NlIG1hdGNoaW5nIG9yIG5vdFxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNlbGVjdGVkIHZhbHVlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZhbHVlVXNpbmdWYWx1ZUxpc3QoXG5cdHZhbHVlTGlzdDogVmFsdWVMaXN0SW5mbyxcblx0a2V5UHJvcGVydHk6IFByb3BlcnR5LFxuXHRvcGVyYXRvcjogU2NhbGFyT3BlcmF0b3IsXG5cdHZhbHVlVG9NYXRjaDogU2NhbGFyVmFsdWUsXG5cdGxvb3NlTWF0Y2ggPSBmYWxzZVxuKTogUHJvbWlzZTxWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb24+IHtcblx0Y29uc3QgbW9kZWwgPSB2YWx1ZUxpc3QudmFsdWVMaXN0SW5mby4kbW9kZWw7XG5cdGNvbnN0IHBhdGggPSBgLyR7dmFsdWVMaXN0LnZhbHVlTGlzdEluZm8uQ29sbGVjdGlvblBhdGh9YDtcblx0Y29uc3QgJHNlbGVjdCA9IGdlbmVyYXRlU2VsZWN0UGFyYW1ldGVyKHZhbHVlTGlzdCk7XG5cdGxldCAkc2VhcmNoID0gQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybSh2YWx1ZVRvTWF0Y2ggaW5zdGFuY2VvZiBEYXRlID8gdmFsdWVUb01hdGNoLnRvSVNPU3RyaW5nKCkgOiB2YWx1ZVRvTWF0Y2gudG9TdHJpbmcoKSk7XG5cdGNvbnN0IGtleVByb3BlcnR5RmlsdGVyID0gZ2V0S2V5UHJvcGVydHlGaWx0ZXIodmFsdWVMaXN0LCBrZXlQcm9wZXJ0eSwgb3BlcmF0b3IsIHZhbHVlVG9NYXRjaCk7XG5cblx0Ly8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBrZXkgcHJvcGVydHlcblx0Y29uc3QgY2hhcmFjdGVyTGltaXRPdmVyZmxvdyA9ICEkc2VhcmNoIHx8ICRzZWFyY2gubGVuZ3RoID4gKGtleVByb3BlcnR5Lm1heExlbmd0aCA/PyAkc2VhcmNoLmxlbmd0aCk7XG5cblx0aWYgKCFsb29zZU1hdGNoKSB7XG5cdFx0JHNlYXJjaCA9IGBcIiR7JHNlYXJjaH1cImA7IC8vIEVuc3VyZSB0aGUgc2VhcmNoIHRlcm0gaXMgdHJlYXRlZCBhcyBhIHBocmFzZVxuXHR9XG5cdC8vIElmIHF1ZXJ5IGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBrZXkgcHJvcGVydHksIHdlIGRvbid0IGZpbHRlciBhdCBhbGwsIGFzIGl0IHdvdWxkIGdpdmUgbm8gcmVzdWx0IGFueXdheVxuXHRjb25zdCBbdmFsdWVIZWxwS2V5UXVlcnksIHZhbHVlSGVscFNlYXJjaFF1ZXJ5XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG5cdFx0IWNoYXJhY3RlckxpbWl0T3ZlcmZsb3cgPyBtb2RlbC5iaW5kTGlzdChwYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwga2V5UHJvcGVydHlGaWx0ZXIsIHsgJHNlbGVjdCB9KS5yZXF1ZXN0Q29udGV4dHMoMCwgMSkgOiBbXSwgLy8gJGZpbHRlciBvbiB0aGUga2V5IHByb3BlcnR5IG9mIHRoZSB2YWx1ZSBsaXN0XG5cdFx0bW9kZWwuYmluZExpc3QocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgeyAkc2VhcmNoOiAkc2VhcmNoLCAkc2VsZWN0IH0pLnJlcXVlc3RDb250ZXh0cygpIC8vICRzZWFyY2ggb24gdGhlIHZhbHVlIGxpc3Rcblx0XSk7XG5cblx0Y29uc3QgbWFwUmVzdWx0ID0gbWFwVmFsdWVMaXN0VG9Db2RlTGlzdCh2YWx1ZUxpc3QsIHRydWUpO1xuXG5cdGlmICh2YWx1ZUhlbHBLZXlRdWVyeS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgdmFsdWVIZWxwS2V5UXVlcnkudmFsdWUubGVuZ3RoID4gMCkge1xuXHRcdC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBtYXRjaCBpbiB0aGUga2V5IGNvbHVtbjpcblx0XHQvLyAtIElmIHRoZSBvcGVyYXRvciBpcyBFUTogVGhpcyBpbmRpY2F0ZXMgYW4gZXhhY3Qga2V5IG1hdGNoLCBzbyB0aGUgcmV0dXJuZWQgZGF0YSB3aWxsIGJlIHVzZWQuXG5cdFx0Ly8gLSBGb3Igb3RoZXIgb3BlcmF0b3JzOiBPbmUgb3IgbW9yZSBrZXlzIG1hdGNoIHRoZSB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmF0b3IsIHNvIHRoZSBvcmlnaW5hbCBjb25kaXRpb24gaXMgcHJlc2VydmVkLlxuXHRcdHJldHVybiBvcGVyYXRvciA9PT0gRmlsdGVyT3BlcmF0b3IuRVFcblx0XHRcdD8geyBvcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZXM6IHZhbHVlSGVscEtleVF1ZXJ5LnZhbHVlLm1hcChtYXBSZXN1bHQpIH1cblx0XHRcdDogeyBvcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZXM6IFt7IHZhbHVlOiB2YWx1ZVRvTWF0Y2gsIGRlc2NyaXB0aW9uOiB2YWx1ZVRvTWF0Y2ggfV0gfTtcblx0fVxuXG5cdGlmICh2YWx1ZUhlbHBTZWFyY2hRdWVyeS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIgJiYgdmFsdWVIZWxwU2VhcmNoUXVlcnkudmFsdWUubGVuZ3RoID4gMCkge1xuXHRcdC8vIFRoZSBrZXkgcXVlcnkgZGlkIG5vdCByZXR1cm4gYW55IG1hdGNoZXMsIGJ1dCB0aGUgc2VhcmNoIHF1ZXJ5IGZvdW5kIHJlc3VsdHMuIFVzZSB0aGUgc2VhcmNoIHJlc3VsdHMgaW5zdGVhZC5cblxuXHRcdGxldCByZXN1bHRzID0gdmFsdWVIZWxwU2VhcmNoUXVlcnkudmFsdWUubWFwKG1hcFJlc3VsdCk7XG5cblx0XHRpZiAob3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLkVRKSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJlZFJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihcblx0XHRcdFx0KHJlc3VsdCkgPT4gcmVzdWx0LmRlc2NyaXB0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWVUb01hdGNoLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKVxuXHRcdFx0KTtcblx0XHRcdC8vIElmIHRoZSBzZWFyY2ggcXVlcnkgaXMgZm91bmQgb25jZS9tdWx0aXBsZSB0aW1lcyBpbiB0aGUgcmVzdWx0ICsgb3BlcmF0b3IgaXMgRVEsIHdlIG5lZWQgdG8gcmV0dXJuIG9ubHkgdGhvc2UgcmVzdWx0c1xuXHRcdFx0aWYgKGZpbHRlcmVkUmVzdWx0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJlc3VsdHMgPSBmaWx0ZXJlZFJlc3VsdHM7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRvcGVyYXRvcixcblx0XHRcdHNlbGVjdGVkVmFsdWVzOiByZXN1bHRzXG5cdFx0fTtcblx0fVxuXG5cdC8vIE5vIG1hdGNoZXMgd2VyZSBmb3VuZCBpbiBlaXRoZXIgcXVlcnk7IHRoZSBvcmlnaW5hbCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgYSBmYWxsYmFjay5cblx0cmV0dXJuIHsgb3BlcmF0b3IsIHNlbGVjdGVkVmFsdWVzOiBbeyB2YWx1ZTogdmFsdWVUb01hdGNoLCBkZXNjcmlwdGlvbjogdmFsdWVUb01hdGNoIH1dLCBub01hdGNoOiB0cnVlIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbWFwcGluZyBmdW5jdGlvbiBmb3IgbWFwcGluZyBhIHZhbHVlIGxpc3QgcXVlcnkgcmVzdWx0IHRvIGEgY29kZSBsaXN0LlxuICogQHBhcmFtIHZhbHVlTGlzdCBUaGUgdmFsdWUgbGlzdCBpbmZvcm1hdGlvbiB1c2VkIHRvIGlkZW50aWZ5IHRoZSBrZXkgYW5kIGRlc2NyaXB0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gZW5zdXJlRGVzY3JpcHRpb24gV2hldGhlciB0byBlbnN1cmUgdGhhdCB0aGUgZGVzY3JpcHRpb24gaXMgYWx3YXlzIHJldHVybmVkLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBzaW5nbGUgdmFsdWUgbGlzdCBxdWVyeSByZXN1bHQgdG8gYSBjb2RlIGxpc3QgZW50cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBWYWx1ZUxpc3RUb0NvZGVMaXN0KHZhbHVlTGlzdDogVmFsdWVMaXN0SW5mbywgZW5zdXJlRGVzY3JpcHRpb246IHRydWUpOiAoY29udGV4dDogQ29udGV4dCkgPT4gQ29kZUxpc3RUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFZhbHVlTGlzdFRvQ29kZUxpc3QodmFsdWVMaXN0OiBWYWx1ZUxpc3RJbmZvLCBlbnN1cmVEZXNjcmlwdGlvbj86IGZhbHNlKTogKGNvbnRleHQ6IENvbnRleHQpID0+IENvZGVMaXN0RW50cnk7XG5leHBvcnQgZnVuY3Rpb24gbWFwVmFsdWVMaXN0VG9Db2RlTGlzdChcblx0dmFsdWVMaXN0OiBWYWx1ZUxpc3RJbmZvLFxuXHRlbnN1cmVEZXNjcmlwdGlvbiA9IGZhbHNlXG4pOiAoY29udGV4dDogQ29udGV4dCkgPT4gQ29kZUxpc3RFbnRyeSB8IENvZGVMaXN0VHlwZSB7XG5cdHJldHVybiAoY29udGV4dDogQ29udGV4dCk6IENvZGVMaXN0RW50cnkgPT4ge1xuXHRcdGNvbnN0IGRhdGEgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IHZhbHVlID0gZGF0YVt2YWx1ZUxpc3Qua2V5UGF0aF07XG5cdFx0Y29uc3QgZGVzY3JpcHRpb24gPSB2YWx1ZUxpc3QuZGVzY3JpcHRpb25QYXRoID8gZGF0YVt2YWx1ZUxpc3QuZGVzY3JpcHRpb25QYXRoXSA6IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4geyB2YWx1ZSwgZGVzY3JpcHRpb246IGVuc3VyZURlc2NyaXB0aW9uID8gZGVzY3JpcHRpb24gPz8gdmFsdWUgOiBkZXNjcmlwdGlvbiB9O1xuXHR9O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgJHNlbGVjdCBwYXJhbWV0ZXIgZm9yIGEgdmFsdWUgbGlzdCBxdWVyeS5cbiAqIEBwYXJhbSB2YWx1ZUxpc3QgVGhlIHZhbHVlIGxpc3QgaW5mb3JtYXRpb24uXG4gKiBAcmV0dXJucyBUaGUgJHNlbGVjdCBwYXJhbWV0ZXIgYXMgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNlbGVjdFBhcmFtZXRlcih2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8pOiBzdHJpbmcge1xuXHRyZXR1cm4gW3ZhbHVlTGlzdC5rZXlQYXRoLCB2YWx1ZUxpc3QuZGVzY3JpcHRpb25QYXRoXS5maWx0ZXIoKHBhdGgpID0+IHBhdGggJiYgIXBhdGguaW5jbHVkZXMoXCIvXCIpKS5qb2luKFwiLFwiKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlSW50ZXJ2YWxzKFxuXHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuQlQgfCBGaWx0ZXJPcGVyYXRvci5OQixcblx0cmVzb2x2ZWRWYWx1ZXM6IFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdXG4pOiBWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb25bXSB7XG5cdGNvbnN0IFtyZXNvbHZlZExvd2VyQm91bmQsIHJlc29sdmVkVXBwZXJCb3VuZF0gPSByZXNvbHZlZFZhbHVlcztcblxuXHRjb25zdCByZXN1bHQ6IFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdID0gW107XG5cdGZvciAoY29uc3QgeyB2YWx1ZTogbG93ZXJCb3VuZCwgZGVzY3JpcHRpb246IGxvd2VyQm91bmRUZXh0IH0gb2YgcmVzb2x2ZWRMb3dlckJvdW5kLnNlbGVjdGVkVmFsdWVzKSB7XG5cdFx0Zm9yIChjb25zdCB7IHZhbHVlOiB1cHBlckJvdW5kLCBkZXNjcmlwdGlvbjogdXBwZXJCb3VuZFRleHQgfSBvZiByZXNvbHZlZFVwcGVyQm91bmQuc2VsZWN0ZWRWYWx1ZXMpIHtcblx0XHRcdHJlc3VsdC5wdXNoKHtcblx0XHRcdFx0b3BlcmF0b3IsXG5cdFx0XHRcdHNlbGVjdGVkVmFsdWVzOiBbXG5cdFx0XHRcdFx0eyB2YWx1ZTogbG93ZXJCb3VuZCwgZGVzY3JpcHRpb246IGxvd2VyQm91bmRUZXh0ID8/IGxvd2VyQm91bmQgfSxcblx0XHRcdFx0XHR7IHZhbHVlOiB1cHBlckJvdW5kLCBkZXNjcmlwdGlvbjogdXBwZXJCb3VuZFRleHQgPz8gdXBwZXJCb3VuZCB9XG5cdFx0XHRcdF1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRva2VuLWJhc2VkIGZpbHRlciB2YWx1ZXMgdXNpbmcgYSB2YWx1ZSBsaXN0LlxuICogQHBhcmFtIHZhbHVlTGlzdCBUaGUgdmFsdWUgbGlzdCB1c2VkIGZvciByZXNvbHZpbmcgdmFsdWVzLlxuICogQHBhcmFtIHZhbHVlIFRoZSB0b2tlbi1iYXNlZCBmaWx0ZXIgdmFsdWVzIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0gbG9vc2VNYXRjaCBXaGV0aGVyIHRvIHBlcmZvcm0gYSBsb29zZSBtYXRjaCBvbiB0aGUgdmFsdWVzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlblZhbHVlKFxuXHR2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8sXG5cdHZhbHVlOiBUb2tlblNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbixcblx0bG9vc2VNYXRjaCA9IGZhbHNlXG4pOiBQcm9taXNlPFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdPiB7XG5cdGNvbnN0IHsgb3BlcmF0b3IsIHNlbGVjdGVkVmFsdWVzIH0gPSB2YWx1ZTtcblx0Y29uc3QgbW9kZWwgPSB2YWx1ZUxpc3QudmFsdWVMaXN0SW5mby4kbW9kZWw7XG5cblx0Ly8gTWFrZSBzdXJlIGFsbCB2YWx1ZXMgYXJlIHJlc29sdmVkLCBldmVuIGlmIHNvbWUgcmVxdWVzdHMgZmFpbC4gSXQgY2FuIGhhcHBlbiB0aGF0IHRoZSBiYWNrZW5kIGNhbm5vdCBwcm9jZXNzIHRoZSAkZmlsdGVyIHF1ZXJpZXMgd2Vcblx0Ly8gcnVuIG9uIHRoZSB2YWx1ZSBsaXN0LCBidXQgd2Ugc3RpbGwgd2FudCB0byBnZXQgdGhlIGZhbGxiYWNrICRzZWFyY2ggcmVzdWx0cy5cblx0bW9kZWwuc2V0Q29udGludWVPbkVycm9yKFwiJGF1dG9cIik7XG5cblx0Y29uc3QgdmFsdWVMaXN0TWV0YW1vZGVsID0gY29udmVydFR5cGVzKG1vZGVsLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3Qga2V5UHJvcGVydHkgPSB2YWx1ZUxpc3RNZXRhbW9kZWwucmVzb2x2ZVBhdGgoYC8ke3ZhbHVlTGlzdC52YWx1ZUxpc3RJbmZvLkNvbGxlY3Rpb25QYXRofS8ke3ZhbHVlTGlzdC5rZXlQYXRofWApPy50YXJnZXQ7XG5cblx0aWYgKCFpc1Byb3BlcnR5KGtleVByb3BlcnR5KSkge1xuXHRcdC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIC0gdGhlIGtleSBwcm9wZXJ0eSBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgbGlzdCBlbnRpdHlcblx0XHRyZXR1cm4gdW5yZXNvbHZlZFJlc3VsdChbdmFsdWVdKTtcblx0fVxuXG5cdGNvbnN0IHJlc29sdmVkT3BlcmF0b3IgPSBvcGVyYXRvciA9PT0gRmlsdGVyT3BlcmF0b3IuQlQgfHwgb3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLk5CID8gRmlsdGVyT3BlcmF0b3IuRVEgOiBvcGVyYXRvcjsgLy8gQlQvTkI6IFVzZSBFUSBmb3IgcmVzb2x2aW5nIHRoZSBsb3dlci91cHBlciBib3VuZHNcblx0Y29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRzZWxlY3RlZFZhbHVlcy5tYXAoYXN5bmMgKHNlbGVjdGVkVmFsdWUpID0+XG5cdFx0XHRyZXNvbHZlVmFsdWVVc2luZ1ZhbHVlTGlzdCh2YWx1ZUxpc3QsIGtleVByb3BlcnR5LCByZXNvbHZlZE9wZXJhdG9yLCBzZWxlY3RlZFZhbHVlLCBsb29zZU1hdGNoKVxuXHRcdClcblx0KTtcblxuXHRyZXR1cm4gb3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLkJUIHx8IG9wZXJhdG9yID09PSBGaWx0ZXJPcGVyYXRvci5OQlxuXHRcdD8gaGFuZGxlSW50ZXJ2YWxzKG9wZXJhdG9yLCByZXNvbHZlZFZhbHVlcylcblx0XHQ6IHJlc29sdmVkVmFsdWVzLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBFYXN5IEZpbHRlciBCYXIuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYmUgcmVzb2x2ZWQuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bnJlc29sdmVkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVzb2x2ZWRSZXN1bHQodmFsdWVzOiBUb2tlblNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdKTogVmFsdWVIZWxwU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uW10ge1xuXHRyZXR1cm4gdmFsdWVzLm1hcCgoeyBvcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZXMgfSkgPT4gKHtcblx0XHRvcGVyYXRvcixcblx0XHRzZWxlY3RlZFZhbHVlczogc2VsZWN0ZWRWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gKHsgdmFsdWUsIGRlc2NyaXB0aW9uOiB2YWx1ZSB9KSlcblx0fSkpIGFzIFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQSxvQkFBb0JBLENBQzVCQyxTQUF3QixFQUN4QkMsV0FBcUIsRUFDckJDLFFBQXdCLEVBQ3hCQyxZQUF5QixFQUNoQjtJQUNULElBQUlDLFdBQVcsR0FBR0QsWUFBWTs7SUFFOUI7SUFDQSxJQUFJLE9BQU9DLFdBQVcsS0FBSyxRQUFRLElBQUlILFdBQVcsQ0FBQ0ksV0FBVyxDQUFDQyxNQUFNLEVBQUVDLFdBQVcsRUFBRUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7TUFDdkdKLFdBQVcsR0FBR0EsV0FBVyxDQUFDSyxXQUFXLENBQUMsQ0FBQztJQUN4QztJQUVBLE9BQU8sSUFBSUMsTUFBTSxDQUFDO01BQUVDLElBQUksRUFBRVgsU0FBUyxDQUFDWSxPQUFPO01BQUVWLFFBQVE7TUFBRVcsTUFBTSxFQUFFVDtJQUFZLENBQUMsQ0FBQztFQUM5RTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlVSwwQkFBMEJBLENBQ3hDZCxTQUF3QixFQUN4QkMsV0FBcUIsRUFDckJD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
|
|
261
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRLZXlQcm9wZXJ0eUZpbHRlciIsInZhbHVlTGlzdCIsImtleVByb3BlcnR5Iiwib3BlcmF0b3IiLCJ2YWx1ZVRvTWF0Y2giLCJmaWx0ZXJWYWx1ZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNVcHBlckNhc2UiLCJ2YWx1ZU9mIiwidG9VcHBlckNhc2UiLCJGaWx0ZXIiLCJwYXRoIiwia2V5UGF0aCIsInZhbHVlMSIsInJlc29sdmVWYWx1ZVVzaW5nVmFsdWVMaXN0IiwibG9vc2VNYXRjaCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm1vZGVsIiwidmFsdWVMaXN0SW5mbyIsIiRtb2RlbCIsIkNvbGxlY3Rpb25QYXRoIiwiJHNlbGVjdCIsImdlbmVyYXRlU2VsZWN0UGFyYW1ldGVyIiwiJHNlYXJjaCIsIkNvbW1vblV0aWxzIiwibm9ybWFsaXplU2VhcmNoVGVybSIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsInRvU3RyaW5nIiwiaXNOZWdhdGlvbiIsImlzTmVnYXRpb25PcGVyYXRvciIsImNsZWFuZWRPcGVyYXRvciIsImdldFBvc2l0aXZlT3BlcmF0b3IiLCJrZXlQcm9wZXJ0eUZpbHRlciIsImNoYXJhY3RlckxpbWl0T3ZlcmZsb3ciLCJtYXhMZW5ndGgiLCJ2YWx1ZUhlbHBLZXlRdWVyeSIsInZhbHVlSGVscFNlYXJjaFF1ZXJ5IiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJiaW5kTGlzdCIsInJlcXVlc3RDb250ZXh0cyIsIm1hcFJlc3VsdCIsIm1hcFZhbHVlTGlzdFRvQ29kZUxpc3QiLCJzdGF0dXMiLCJ2YWx1ZSIsIkZpbHRlck9wZXJhdG9yIiwiRVEiLCJzZWxlY3RlZFZhbHVlcyIsIm1hcCIsImRlc2NyaXB0aW9uIiwicmVzdWx0cyIsImZpbHRlcmVkUmVzdWx0cyIsImZpbHRlciIsInJlc3VsdCIsInRvTG93ZXJDYXNlIiwibm9NYXRjaCIsImVuc3VyZURlc2NyaXB0aW9uIiwiY29udGV4dCIsImRhdGEiLCJnZXRPYmplY3QiLCJkZXNjcmlwdGlvblBhdGgiLCJfZXhwb3J0cyIsImluY2x1ZGVzIiwiam9pbiIsInJlc29sdmVUb2tlblZhbHVlIiwic2V0Q29udGludWVPbkVycm9yIiwidmFsdWVMaXN0TWV0YW1vZGVsIiwiY29udmVydFR5cGVzIiwiZ2V0TWV0YU1vZGVsIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJpc1Byb3BlcnR5IiwidW5yZXNvbHZlZFJlc3VsdCIsImlzQ29tcGFyaXNvbk9wZXJhdG9yIiwiQlQiLCJOQiIsImxvd2VyQm91bmQiLCJ1cHBlckJvdW5kIiwicmVzb2x2ZWRWYWx1ZXMiLCJhbGwiLCJzZWxlY3RlZFZhbHVlIiwiZmxhdCIsInZhbHVlcyIsIl9yZWYiLCJORSIsIk5vdENvbnRhaW5zIiwiTm90U3RhcnRzV2l0aCIsIk5vdEVuZHNXaXRoIiwiR1QiLCJHRSIsIkxUIiwiTEUiLCJuZWdhdGlvbk9wZXJhdG9yIiwiQ29udGFpbnMiLCJTdGFydHNXaXRoIiwiRW5kc1dpdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVhc3lGaWx0ZXJEYXRhRmV0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENvZGVMaXN0VHlwZSxcblx0VG9rZW5TZWxlY3RlZFZhbHVlc0RlZmluaXRpb24sXG5cdFZhbHVlSGVscEJldHdlZW5TZWxlY3RlZFZhbHVlcyxcblx0VmFsdWVIZWxwU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29udHJvbHMvZWFzeUZpbHRlci9FYXN5RmlsdGVyQmFyQ29udGFpbmVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyB0eXBlIFZhbHVlTGlzdEluZm8gfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCB0eXBlIHsgQ29kZUxpc3RFbnRyeSB9IGZyb20gXCJ1eC9lbmcvZmlvcmlhaS9yZXVzZS9lYXN5ZmlsdGVyL0Vhc3lGaWx0ZXJcIjtcblxudHlwZSBTY2FsYXJPcGVyYXRvciA9IEV4Y2x1ZGU8RmlsdGVyT3BlcmF0b3IsIEZpbHRlck9wZXJhdG9yLkJUIHwgRmlsdGVyT3BlcmF0b3IuTkI+O1xudHlwZSBTY2FsYXJWYWx1ZSA9IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZpbHRlciBmb3IgdGhlIGtleSBwcm9wZXJ0eSBvZiBhIHZhbHVlIGxpc3QuXG4gKiBAcGFyYW0gdmFsdWVMaXN0IFRoZSB2YWx1ZSBsaXN0IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGtleVByb3BlcnR5IFRoZSBrZXkgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGxpc3QuXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIGZpbHRlciBvcGVyYXRvci5cbiAqIEBwYXJhbSB2YWx1ZVRvTWF0Y2ggVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMgQSBmaWx0ZXIgZm9yIHRoZSBrZXkgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEtleVByb3BlcnR5RmlsdGVyKFxuXHR2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8sXG5cdGtleVByb3BlcnR5OiBQcm9wZXJ0eSxcblx0b3BlcmF0b3I6IFNjYWxhck9wZXJhdG9yLFxuXHR2YWx1ZVRvTWF0Y2g6IFNjYWxhclZhbHVlXG4pOiBGaWx0ZXIge1xuXHRsZXQgZmlsdGVyVmFsdWUgPSB2YWx1ZVRvTWF0Y2g7XG5cblx0Ly8gSWYgdGhlIGtleSBwcm9wZXJ0eSBpcyBrbm93biB0byBjb250YWluIG9ubHkgdXBwZXJjYXNlIHZhbHVlcywgY29udmVydCB0aGUgZmlsdGVyIHZhbHVlIHRvIHVwcGVyY2FzZSBhcyB3ZWxsXG5cdGlmICh0eXBlb2YgZmlsdGVyVmFsdWUgPT09IFwic3RyaW5nXCIgJiYga2V5UHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5Jc1VwcGVyQ2FzZT8udmFsdWVPZigpID09PSB0cnVlKSB7XG5cdFx0ZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS50b1VwcGVyQ2FzZSgpO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBGaWx0ZXIoeyBwYXRoOiB2YWx1ZUxpc3Qua2V5UGF0aCwgb3BlcmF0b3IsIHZhbHVlMTogZmlsdGVyVmFsdWUgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzaW5nbGUgc2NhbGFyIHZhbHVlIHVzaW5nIGEgdmFsdWUgbGlzdC5cbiAqIEBwYXJhbSB2YWx1ZUxpc3QgVGhlIHZhbHVlIGxpc3QgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ga2V5UHJvcGVydHkgVGhlIGtleSBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgbGlzdC5cbiAqIEBwYXJhbSBvcGVyYXRvciBUaGUgZmlsdGVyIG9wZXJhdG9yLlxuICogQHBhcmFtIHZhbHVlVG9NYXRjaCBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcGFyYW0gbG9vc2VNYXRjaCBXaGV0aGVyIHRvIGFwcGx5IGxvb3NlIG1hdGNoaW5nIG9yIG5vdFxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNlbGVjdGVkIHZhbHVlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZhbHVlVXNpbmdWYWx1ZUxpc3QoXG5cdHZhbHVlTGlzdDogVmFsdWVMaXN0SW5mbyxcblx0a2V5UHJvcGVydHk6IFByb3BlcnR5LFxuXHRvcGVyYXRvcjogU2NhbGFyT3BlcmF0b3IsXG5cdHZhbHVlVG9NYXRjaDogU2NhbGFyVmFsdWUsXG5cdGxvb3NlTWF0Y2ggPSBmYWxzZVxuKTogUHJvbWlzZTxWYWx1ZUhlbHBTZWxlY3RlZFZhbHVlc0RlZmluaXRpb24+IHtcblx0Y29uc3QgbW9kZWwgPSB2YWx1ZUxpc3QudmFsdWVMaXN0SW5mby4kbW9kZWw7XG5cdGNvbnN0IHBhdGggPSBgLyR7dmFsdWVMaXN0LnZhbHVlTGlzdEluZm8uQ29sbGVjdGlvblBhdGh9YDtcblx0Y29uc3QgJHNlbGVjdCA9IGdlbmVyYXRlU2VsZWN0UGFyYW1ldGVyKHZhbHVlTGlzdCk7XG5cdGxldCAkc2VhcmNoID0gQ29tbW9uVXRpbHMubm9ybWFsaXplU2VhcmNoVGVybSh2YWx1ZVRvTWF0Y2ggaW5zdGFuY2VvZiBEYXRlID8gdmFsdWVUb01hdGNoLnRvSVNPU3RyaW5nKCkgOiB2YWx1ZVRvTWF0Y2gudG9TdHJpbmcoKSk7XG5cblx0Ly8gSGFuZGxlIG5lZ2F0aW9uIG9wZXJhdG9ycyAoTkUsIE5vdENvbnRhaW5zLCBOb3RTdGFydHNXaXRoLCBOb3RFbmRzV2l0aClcblx0Ly8gU3RyYXRlZ3k6IFF1ZXJ5IGZvciBwb3NpdGl2ZSBjYXNlLCB0aGVuIGFwcGx5IG5lZ2F0aW9uIGNsaWVudC1zaWRlXG5cdGNvbnN0IGlzTmVnYXRpb24gPSBpc05lZ2F0aW9uT3BlcmF0b3Iob3BlcmF0b3IpO1xuXHQvLyBcImNsZWFuZWRcIiBvcGVyYXRvciBmb3IgcG9zc2libGUgbmVnYXRpb24gb3BlcmF0b3JzXG5cdGNvbnN0IGNsZWFuZWRPcGVyYXRvciA9IGlzTmVnYXRpb24gPyBnZXRQb3NpdGl2ZU9wZXJhdG9yKG9wZXJhdG9yKSA6IG9wZXJhdG9yO1xuXHRjb25zdCBrZXlQcm9wZXJ0eUZpbHRlciA9IGdldEtleVByb3BlcnR5RmlsdGVyKHZhbHVlTGlzdCwga2V5UHJvcGVydHksIGNsZWFuZWRPcGVyYXRvciwgdmFsdWVUb01hdGNoKTtcblxuXHQvLyBDaGVjayBpZiB0aGUgcXVlcnkgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGtleSBwcm9wZXJ0eVxuXHRjb25zdCBjaGFyYWN0ZXJMaW1pdE92ZXJmbG93ID0gISRzZWFyY2ggfHwgJHNlYXJjaC5sZW5ndGggPiAoa2V5UHJvcGVydHkubWF4TGVuZ3RoID8/ICRzZWFyY2gubGVuZ3RoKTtcblxuXHRpZiAoIWxvb3NlTWF0Y2gpIHtcblx0XHQkc2VhcmNoID0gYFwiJHskc2VhcmNofVwiYDsgLy8gRW5zdXJlIHRoZSBzZWFyY2ggdGVybSBpcyB0cmVhdGVkIGFzIGEgcGhyYXNlXG5cdH1cblx0Ly8gSWYgcXVlcnkgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGtleSBwcm9wZXJ0eSwgd2UgZG9uJ3QgZmlsdGVyIGF0IGFsbCwgYXMgaXQgd291bGQgZ2l2ZSBubyByZXN1bHQgYW55d2F5XG5cdGNvbnN0IFt2YWx1ZUhlbHBLZXlRdWVyeSwgdmFsdWVIZWxwU2VhcmNoUXVlcnldID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcblx0XHQhY2hhcmFjdGVyTGltaXRPdmVyZmxvdyA/IG1vZGVsLmJpbmRMaXN0KHBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBrZXlQcm9wZXJ0eUZpbHRlciwgeyAkc2VsZWN0IH0pLnJlcXVlc3RDb250ZXh0cygwLCAxKSA6IFtdLCAvLyAkZmlsdGVyIG9uIHRoZSBrZXkgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGxpc3Rcblx0XHRtb2RlbC5iaW5kTGlzdChwYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7ICRzZWFyY2g6ICRzZWFyY2gsICRzZWxlY3QgfSkucmVxdWVzdENvbnRleHRzKCkgLy8gJHNlYXJjaCBvbiB0aGUgdmFsdWUgbGlzdFxuXHRdKTtcblxuXHRjb25zdCBtYXBSZXN1bHQgPSBtYXBWYWx1ZUxpc3RUb0NvZGVMaXN0KHZhbHVlTGlzdCwgdHJ1ZSk7XG5cblx0aWYgKHZhbHVlSGVscEtleVF1ZXJ5LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAmJiB2YWx1ZUhlbHBLZXlRdWVyeS52YWx1ZS5sZW5ndGggPiAwKSB7XG5cdFx0Ly8gVGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1hdGNoIGluIHRoZSBrZXkgY29sdW1uOlxuXHRcdC8vIC0gSWYgdGhlIG9wZXJhdG9yIGlzIEVROiBUaGlzIGluZGljYXRlcyBhbiBleGFjdCBrZXkgbWF0Y2gsIHNvIHRoZSByZXR1cm5lZCBkYXRhIHdpbGwgYmUgdXNlZC5cblx0XHQvLyAtIEZvciBvdGhlciBvcGVyYXRvcnM6IE9uZSBvciBtb3JlIGtleXMgbWF0Y2ggdGhlIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYXRvciwgc28gdGhlIG9yaWdpbmFsIGNvbmRpdGlvbiBpcyBwcmVzZXJ2ZWQuXG5cdFx0cmV0dXJuIGNsZWFuZWRPcGVyYXRvciA9PT0gRmlsdGVyT3BlcmF0b3IuRVFcblx0XHRcdD8geyBvcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZXM6IHZhbHVlSGVscEtleVF1ZXJ5LnZhbHVlLm1hcChtYXBSZXN1bHQpIH1cblx0XHRcdDoge1xuXHRcdFx0XHRcdG9wZXJhdG9yLFxuXHRcdFx0XHRcdHNlbGVjdGVkVmFsdWVzOiBbeyB2YWx1ZTogdmFsdWVUb01hdGNoLCBkZXNjcmlwdGlvbjogdmFsdWVUb01hdGNoIH1dXG5cdFx0XHQgIH07XG5cdH1cblxuXHRpZiAodmFsdWVIZWxwU2VhcmNoUXVlcnkuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHZhbHVlSGVscFNlYXJjaFF1ZXJ5LnZhbHVlLmxlbmd0aCA+IDApIHtcblx0XHQvLyBUaGUga2V5IHF1ZXJ5IGRpZCBub3QgcmV0dXJuIGFueSBtYXRjaGVzLCBidXQgdGhlIHNlYXJjaCBxdWVyeSBmb3VuZCByZXN1bHRzLiBVc2UgdGhlIHNlYXJjaCByZXN1bHRzIGluc3RlYWQuXG5cblx0XHRsZXQgcmVzdWx0cyA9IHZhbHVlSGVscFNlYXJjaFF1ZXJ5LnZhbHVlLm1hcChtYXBSZXN1bHQpO1xuXG5cdFx0aWYgKGNsZWFuZWRPcGVyYXRvciA9PT0gRmlsdGVyT3BlcmF0b3IuRVEpIHtcblx0XHRcdGNvbnN0IGZpbHRlcmVkUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKFxuXHRcdFx0XHQocmVzdWx0KSA9PiByZXN1bHQuZGVzY3JpcHRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZVRvTWF0Y2gudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG5cdFx0XHQpO1xuXHRcdFx0Ly8gSWYgdGhlIHNlYXJjaCBxdWVyeSBpcyBmb3VuZCBvbmNlL211bHRpcGxlIHRpbWVzIGluIHRoZSByZXN1bHQgKyBvcGVyYXRvciBpcyBFUSwgd2UgbmVlZCB0byByZXR1cm4gb25seSB0aG9zZSByZXN1bHRzXG5cdFx0XHRpZiAoZmlsdGVyZWRSZXN1bHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmVzdWx0cyA9IGZpbHRlcmVkUmVzdWx0cztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4geyBvcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZXM6IHJlc3VsdHMgfTtcblx0fVxuXG5cdC8vIE5vIG1hdGNoZXMgd2VyZSBmb3VuZCBpbiBlaXRoZXIgcXVlcnk7IHRoZSBvcmlnaW5hbCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgYSBmYWxsYmFjay5cblxuXHRyZXR1cm4ge1xuXHRcdG9wZXJhdG9yLFxuXHRcdHNlbGVjdGVkVmFsdWVzOiBbeyB2YWx1ZTogdmFsdWVUb01hdGNoLCBkZXNjcmlwdGlvbjogdmFsdWVUb01hdGNoIH1dLFxuXHRcdG5vTWF0Y2g6IHRydWVcblx0fTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtYXBwaW5nIGZ1bmN0aW9uIGZvciBtYXBwaW5nIGEgdmFsdWUgbGlzdCBxdWVyeSByZXN1bHQgdG8gYSBjb2RlIGxpc3QuXG4gKiBAcGFyYW0gdmFsdWVMaXN0IFRoZSB2YWx1ZSBsaXN0IGluZm9ybWF0aW9uIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBhbmQgZGVzY3JpcHRpb24gcHJvcGVydGllcy5cbiAqIEBwYXJhbSBlbnN1cmVEZXNjcmlwdGlvbiBXaGV0aGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBkZXNjcmlwdGlvbiBpcyBhbHdheXMgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIHNpbmdsZSB2YWx1ZSBsaXN0IHF1ZXJ5IHJlc3VsdCB0byBhIGNvZGUgbGlzdCBlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFZhbHVlTGlzdFRvQ29kZUxpc3QodmFsdWVMaXN0OiBWYWx1ZUxpc3RJbmZvLCBlbnN1cmVEZXNjcmlwdGlvbjogdHJ1ZSk6IChjb250ZXh0OiBDb250ZXh0KSA9PiBDb2RlTGlzdFR5cGU7XG5leHBvcnQgZnVuY3Rpb24gbWFwVmFsdWVMaXN0VG9Db2RlTGlzdCh2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8sIGVuc3VyZURlc2NyaXB0aW9uPzogZmFsc2UpOiAoY29udGV4dDogQ29udGV4dCkgPT4gQ29kZUxpc3RFbnRyeTtcbmV4cG9ydCBmdW5jdGlvbiBtYXBWYWx1ZUxpc3RUb0NvZGVMaXN0KFxuXHR2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8sXG5cdGVuc3VyZURlc2NyaXB0aW9uID0gZmFsc2Vcbik6IChjb250ZXh0OiBDb250ZXh0KSA9PiBDb2RlTGlzdEVudHJ5IHwgQ29kZUxpc3RUeXBlIHtcblx0cmV0dXJuIChjb250ZXh0OiBDb250ZXh0KTogQ29kZUxpc3RFbnRyeSA9PiB7XG5cdFx0Y29uc3QgZGF0YSA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0Y29uc3QgdmFsdWUgPSBkYXRhW3ZhbHVlTGlzdC5rZXlQYXRoXTtcblx0XHRjb25zdCBkZXNjcmlwdGlvbiA9IHZhbHVlTGlzdC5kZXNjcmlwdGlvblBhdGggPyBkYXRhW3ZhbHVlTGlzdC5kZXNjcmlwdGlvblBhdGhdIDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiB7IHZhbHVlLCBkZXNjcmlwdGlvbjogZW5zdXJlRGVzY3JpcHRpb24gPyBkZXNjcmlwdGlvbiA/PyB2YWx1ZSA6IGRlc2NyaXB0aW9uIH07XG5cdH07XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSAkc2VsZWN0IHBhcmFtZXRlciBmb3IgYSB2YWx1ZSBsaXN0IHF1ZXJ5LlxuICogQHBhcmFtIHZhbHVlTGlzdCBUaGUgdmFsdWUgbGlzdCBpbmZvcm1hdGlvbi5cbiAqIEByZXR1cm5zIFRoZSAkc2VsZWN0IHBhcmFtZXRlciBhcyBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2VsZWN0UGFyYW1ldGVyKHZhbHVlTGlzdDogVmFsdWVMaXN0SW5mbyk6IHN0cmluZyB7XG5cdHJldHVybiBbdmFsdWVMaXN0LmtleVBhdGgsIHZhbHVlTGlzdC5kZXNjcmlwdGlvblBhdGhdLmZpbHRlcigocGF0aCkgPT4gcGF0aCAmJiAhcGF0aC5pbmNsdWRlcyhcIi9cIikpLmpvaW4oXCIsXCIpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRva2VuLWJhc2VkIGZpbHRlciB2YWx1ZXMgdXNpbmcgYSB2YWx1ZSBsaXN0LlxuICogQHBhcmFtIHZhbHVlTGlzdCBUaGUgdmFsdWUgbGlzdCB1c2VkIGZvciByZXNvbHZpbmcgdmFsdWVzLlxuICogQHBhcmFtIHZhbHVlIFRoZSB0b2tlbi1iYXNlZCBmaWx0ZXIgdmFsdWVzIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0gbG9vc2VNYXRjaCBXaGV0aGVyIHRvIHBlcmZvcm0gYSBsb29zZSBtYXRjaCBvbiB0aGUgdmFsdWVzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlblZhbHVlKFxuXHR2YWx1ZUxpc3Q6IFZhbHVlTGlzdEluZm8sXG5cdHZhbHVlOiBUb2tlblNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbixcblx0bG9vc2VNYXRjaCA9IGZhbHNlXG4pOiBQcm9taXNlPFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdPiB7XG5cdGNvbnN0IHsgb3BlcmF0b3IsIHNlbGVjdGVkVmFsdWVzIH0gPSB2YWx1ZTtcblx0Y29uc3QgbW9kZWwgPSB2YWx1ZUxpc3QudmFsdWVMaXN0SW5mby4kbW9kZWw7XG5cblx0Ly8gTWFrZSBzdXJlIGFsbCB2YWx1ZXMgYXJlIHJlc29sdmVkLCBldmVuIGlmIHNvbWUgcmVxdWVzdHMgZmFpbC4gSXQgY2FuIGhhcHBlbiB0aGF0IHRoZSBiYWNrZW5kIGNhbm5vdCBwcm9jZXNzIHRoZSAkZmlsdGVyIHF1ZXJpZXMgd2Vcblx0Ly8gcnVuIG9uIHRoZSB2YWx1ZSBsaXN0LCBidXQgd2Ugc3RpbGwgd2FudCB0byBnZXQgdGhlIGZhbGxiYWNrICRzZWFyY2ggcmVzdWx0cy5cblx0bW9kZWwuc2V0Q29udGludWVPbkVycm9yKFwiJGF1dG9cIik7XG5cblx0Y29uc3QgdmFsdWVMaXN0TWV0YW1vZGVsID0gY29udmVydFR5cGVzKG1vZGVsLmdldE1ldGFNb2RlbCgpKTtcblx0Y29uc3Qga2V5UHJvcGVydHkgPSB2YWx1ZUxpc3RNZXRhbW9kZWwucmVzb2x2ZVBhdGgoYC8ke3ZhbHVlTGlzdC52YWx1ZUxpc3RJbmZvLkNvbGxlY3Rpb25QYXRofS8ke3ZhbHVlTGlzdC5rZXlQYXRofWApPy50YXJnZXQ7XG5cblx0aWYgKCFpc1Byb3BlcnR5KGtleVByb3BlcnR5KSkge1xuXHRcdC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIC0gdGhlIGtleSBwcm9wZXJ0eSBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgbGlzdCBlbnRpdHlcblx0XHRyZXR1cm4gdW5yZXNvbHZlZFJlc3VsdChbdmFsdWVdKTtcblx0fVxuXG5cdC8vIEZvciBjb21wYXJpc29uIG9wZXJhdG9ycyAoR3JlYXRlclRoYW4sIExlc3NUaGFuLCBCZXR3ZWVuLCBldGMuKSwgc2tpcCBiYWNrZW5kIGNhbGxzXG5cdC8vIGFuZCByZXR1cm4gdXNlciBpbnB1dCBkaXJlY3RseSB0byBFYXN5RmlsdGVyXG5cdGlmIChpc0NvbXBhcmlzb25PcGVyYXRvcihvcGVyYXRvcikpIHtcblx0XHRpZiAob3BlcmF0b3IgPT09IEZpbHRlck9wZXJhdG9yLkJUIHx8IG9wZXJhdG9yID09PSBGaWx0ZXJPcGVyYXRvci5OQikge1xuXHRcdFx0Ly8gSGFuZGxlIEJldHdlZW4vTm90IEJldHdlZW4gb3BlcmF0b3JzIC0gdGhleSBleHBlY3QgZXhhY3RseSAyIHZhbHVlc1xuXHRcdFx0Y29uc3QgW2xvd2VyQm91bmQsIHVwcGVyQm91bmRdID0gc2VsZWN0ZWRWYWx1ZXM7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b3BlcmF0b3IsXG5cdFx0XHRcdFx0c2VsZWN0ZWRWYWx1ZXM6IFtcblx0XHRcdFx0XHRcdHsgdmFsdWU6IGxvd2VyQm91bmQsIGRlc2NyaXB0aW9uOiBsb3dlckJvdW5kIH0sXG5cdFx0XHRcdFx0XHR7IHZhbHVlOiB1cHBlckJvdW5kLCBkZXNjcmlwdGlvbjogdXBwZXJCb3VuZCB9XG5cdFx0XHRcdFx0XSBhcyBWYWx1ZUhlbHBCZXR3ZWVuU2VsZWN0ZWRWYWx1ZXNcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSGFuZGxlIG90aGVyIGNvbXBhcmlzb24gb3BlcmF0b3JzIChHVCwgR0UsIExULCBMRSlcblx0XHRcdHJldHVybiB1bnJlc29sdmVkUmVzdWx0KFt2YWx1ZV0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCByZXNvbHZlZFZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0c2VsZWN0ZWRWYWx1ZXMubWFwKGFzeW5jIChzZWxlY3RlZFZhbHVlKSA9PlxuXHRcdFx0XHRyZXNvbHZlVmFsdWVVc2luZ1ZhbHVlTGlzdCh2YWx1ZUxpc3QsIGtleVByb3BlcnR5LCBvcGVyYXRvciBhcyBTY2FsYXJPcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZSwgbG9vc2VNYXRjaClcblx0XHRcdClcblx0XHQpO1xuXHRcdHJldHVybiByZXNvbHZlZFZhbHVlcy5mbGF0KCk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBpbiB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBFYXN5IEZpbHRlciBCYXIuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYmUgcmVzb2x2ZWQuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bnJlc29sdmVkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVzb2x2ZWRSZXN1bHQodmFsdWVzOiBUb2tlblNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdKTogVmFsdWVIZWxwU2VsZWN0ZWRWYWx1ZXNEZWZpbml0aW9uW10ge1xuXHRyZXR1cm4gdmFsdWVzLm1hcCgoeyBvcGVyYXRvciwgc2VsZWN0ZWRWYWx1ZXMgfSkgPT4gKHtcblx0XHRvcGVyYXRvcixcblx0XHRzZWxlY3RlZFZhbHVlczogc2VsZWN0ZWRWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gKHsgdmFsdWUsIGRlc2NyaXB0aW9uOiB2YWx1ZSB9KSlcblx0fSkpIGFzIFZhbHVlSGVscFNlbGVjdGVkVmFsdWVzRGVmaW5pdGlvbltdO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgb3BlcmF0b3IgaXMgYSBuZWdhdGlvbiBvcGVyYXRvciAoTkUsIE5vdENvbnRhaW5zLCBOb3RTdGFydHNXaXRoLCBOb3RFbmRzV2l0aCkuXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIGZpbHRlciBvcGVyYXRvciB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9wZXJhdG9yIGlzIGEgbmVnYXRpb24gb3BlcmF0b3IuXG4gKi9cbmZ1bmN0aW9uIGlzTmVnYXRpb25PcGVyYXRvcihvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IpOiBib29sZWFuIHtcblx0cmV0dXJuIFtGaWx0ZXJPcGVyYXRvci5ORSwgRmlsdGVyT3BlcmF0b3IuTm90Q29udGFpbnMsIEZpbHRlck9wZXJhdG9yLk5vdFN0YXJ0c1dpdGgsIEZpbHRlck9wZXJhdG9yLk5vdEVuZHNXaXRoXS5pbmNsdWRlcyhvcGVyYXRvcik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBvcGVyYXRvciBpcyBhIGNvbXBhcmlzb24gb3BlcmF0b3IgKEdULCBHRSwgTFQsIExFLCBCVCwgTkIpLlxuICogQHBhcmFtIG9wZXJhdG9yIFRoZSBmaWx0ZXIgb3BlcmF0b3IgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvcGVyYXRvciBpcyBhIGNvbXBhcmlzb24gb3BlcmF0b3IuXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGFyaXNvbk9wZXJhdG9yKG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gW0ZpbHRlck9wZXJhdG9yLkdULCBGaWx0ZXJPcGVyYXRvci5HRSwgRmlsdGVyT3BlcmF0b3IuTFQsIEZpbHRlck9wZXJhdG9yLkxFLCBGaWx0ZXJPcGVyYXRvci5CVCwgRmlsdGVyT3BlcmF0b3IuTkJdLmluY2x1ZGVzKFxuXHRcdG9wZXJhdG9yXG5cdCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBuZWdhdGlvbiBvcGVyYXRvciB0byBpdHMgcG9zaXRpdmUgZXF1aXZhbGVudCAoTkUgLT4gRVEsIE5vdENvbnRhaW5zIC0+IENvbnRhaW5zLCBldGMuKS5cbiAqIEBwYXJhbSBuZWdhdGlvbk9wZXJhdG9yIFRoZSBuZWdhdGlvbiBvcGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpdmUgb3BlcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NpdGl2ZU9wZXJhdG9yKG5lZ2F0aW9uT3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yKTogU2NhbGFyT3BlcmF0b3Ige1xuXHRzd2l0Y2ggKG5lZ2F0aW9uT3BlcmF0b3IpIHtcblx0XHRjYXNlIEZpbHRlck9wZXJhdG9yLk5FOlxuXHRcdFx0cmV0dXJuIEZpbHRlck9wZXJhdG9yLkVRO1xuXHRcdGNhc2UgRmlsdGVyT3BlcmF0b3IuTm90Q29udGFpbnM6XG5cdFx0XHRyZXR1cm4gRmlsdGVyT3BlcmF0b3IuQ29udGFpbnM7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5Ob3RTdGFydHNXaXRoOlxuXHRcdFx0cmV0dXJuIEZpbHRlck9wZXJhdG9yLlN0YXJ0c1dpdGg7XG5cdFx0Y2FzZSBGaWx0ZXJPcGVyYXRvci5Ob3RFbmRzV2l0aDpcblx0XHRcdHJldHVybiBGaWx0ZXJPcGVyYXRvci5FbmRzV2l0aDtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIEZpbHRlck9wZXJhdG9yLkVRO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7RUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNBLG9CQUFvQkEsQ0FDNUJDLFNBQXdCLEVBQ3hCQyxXQUFxQixFQUNyQkMsUUFBd0IsRUFDeEJDLFlBQXlCLEVBQ2hCO0lBQ1QsSUFBSUMsV0FBVyxHQUFHRCxZQUFZOztJQUU5QjtJQUNBLElBQUksT0FBT0MsV0FBVyxLQUFLLFFBQVEsSUFBSUgsV0FBVyxDQUFDSSxXQUFXLENBQUNDLE1BQU0sRUFBRUMsV0FBVyxFQUFFQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtNQUN2R0osV0FBVyxHQUFHQSxXQUFXLENBQUNLLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDO0lBRUEsT0FBTyxJQUFJQyxNQUFNLENBQUM7TUFBRUMsSUFBSSxFQUFFWCxTQUFTLENBQUNZLE9BQU87TUFBRVYsUUFBUTtNQUFFVyxNQUFNLEVBQUVUO0lBQVksQ0FBQyxDQUFDO0VBQzlFOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVVLDBCQUEwQkEsQ0FDeENkLFNBQXdCLEVBQ3hCQyxXQUFx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QUFPQSxNQUFNLENBQUNsQyxHQUFHLENBQUNtQyxJQUFBO01BQUEsSUFBQztRQUFFcEYsUUFBUTtRQUFFZ0Q7TUFBZSxDQUFDLEdBQUFvQyxJQUFBO01BQUEsT0FBTTtRQUNwRHBGLFFBQVE7UUFDUmdELGNBQWMsRUFBRUEsY0FBYyxDQUFDQyxHQUFHLENBQUVKLEtBQUssS0FBTTtVQUFFQSxLQUFLO1VBQUVLLFdBQVcsRUFBRUw7UUFBTSxDQUFDLENBQUM7TUFDOUUsQ0FBQztJQUFBLENBQUMsQ0FBQztFQUNKOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFKQWlCLFFBQUEsQ0FBQVcsZ0JBQUEsR0FBQUEsZ0JBQUE7RUFLQSxTQUFTM0Msa0JBQWtCQSxDQUFDOUIsUUFBd0IsRUFBVztJQUM5RCxPQUFPLENBQUM4QyxjQUFjLENBQUN1QyxFQUFFLEVBQUV2QyxjQUFjLENBQUN3QyxXQUFXLEVBQUV4QyxjQUFjLENBQUN5QyxhQUFhLEVBQUV6QyxjQUFjLENBQUMwQyxXQUFXLENBQUMsQ0FBQ3pCLFFBQVEsQ0FBQy9ELFFBQVEsQ0FBQztFQUNwSTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUzBFLG9CQUFvQkEsQ0FBQzFFLFFBQXdCLEVBQVc7SUFDaEUsT0FBTyxDQUFDOEMsY0FBYyxDQUFDMkMsRUFBRSxFQUFFM0MsY0FBYyxDQUFDNEMsRUFBRSxFQUFFNUMsY0FBYyxDQUFDNkMsRUFBRSxFQUFFN0MsY0FBYyxDQUFDOEMsRUFBRSxFQUFFOUMsY0FBYyxDQUFDNkIsRUFBRSxFQUFFN0IsY0FBYyxDQUFDOEIsRUFBRSxDQUFDLENBQUNiLFFBQVEsQ0FDakkvRCxRQUNELENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU2dDLG1CQUFtQkEsQ0FBQzZELGdCQUFnQyxFQUFrQjtJQUNyRixRQUFRQSxnQkFBZ0I7TUFDdkIsS0FBSy9DLGNBQWMsQ0FBQ3VDLEVBQUU7UUFDckIsT0FBT3ZDLGNBQWMsQ0FBQ0MsRUFBRTtNQUN6QixLQUFLRCxjQUFjLENBQUN3QyxXQUFXO1FBQzlCLE9BQU94QyxjQUFjLENBQUNnRCxRQUFRO01BQy9CLEtBQUtoRCxjQUFjLENBQUN5QyxhQUFhO1FBQ2hDLE9BQU96QyxjQUFjLENBQUNpRCxVQUFVO01BQ2pDLEtBQUtqRCxjQUFjLENBQUMwQyxXQUFXO1FBQzlCLE9BQU8xQyxjQUFjLENBQUNrRCxRQUFRO01BQy9CO1FBQ0MsT0FBT2xELGNBQWMsQ0FBQ0MsRUFBRTtJQUMxQjtFQUNEO0VBQUNlLFFBQUEsQ0FBQTlCLG1CQUFBLEdBQUFBLG1CQUFBO0VBQUEsT0FBQThCLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|