@eo-sdk/client 10.0.0-beta.2 → 10.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/eo-client/stored-queries-state/stored-queries-state.component.d.ts.map +1 -1
- package/app/eo-framework/app-shell/app-bar/app-search/app-search.component.d.ts +7 -3
- package/app/eo-framework/app-shell/app-bar/app-search/app-search.component.d.ts.map +1 -1
- package/app/eo-framework/app-shell/app-shell.module.d.ts +2 -1
- package/app/eo-framework/app-shell/app-shell.module.d.ts.map +1 -1
- package/app/eo-framework/eo-framework.module.d.ts +26 -29
- package/app/eo-framework/eo-framework.module.d.ts.map +1 -1
- package/app/eo-framework/form-elements/checkbox/checkbox.component.d.ts.map +1 -1
- package/app/eo-framework/form-elements/codesystem/codesystem.component.d.ts +3 -1
- package/app/eo-framework/form-elements/codesystem/codesystem.component.d.ts.map +1 -1
- package/app/eo-framework/form-elements/date/date.component.d.ts +2 -0
- package/app/eo-framework/form-elements/date/date.component.d.ts.map +1 -1
- package/app/eo-framework/form-elements/date/year-range/year-range.directive.d.ts.map +1 -0
- package/app/eo-framework/form-elements/dynamic-list/dynamic-list.component.d.ts +3 -1
- package/app/eo-framework/form-elements/dynamic-list/dynamic-list.component.d.ts.map +1 -1
- package/app/eo-framework/form-elements/form-elements.module.d.ts +37 -39
- package/app/eo-framework/form-elements/form-elements.module.d.ts.map +1 -1
- package/app/eo-framework/form-elements/id-reference/id-reference.component.d.ts.map +1 -1
- package/app/eo-framework/form-elements/index.d.ts +1 -3
- package/app/eo-framework/form-elements/index.d.ts.map +1 -1
- package/app/eo-framework/form-elements/reference/reference.component.d.ts.map +1 -1
- package/app/eo-framework/grid/extensions/filter/setFilters/set-filter.component.d.ts +3 -2
- package/app/eo-framework/grid/extensions/filter/setFilters/set-filter.component.d.ts.map +1 -1
- package/app/eo-framework/grid/extensions/filter/text/text-filter.component.d.ts +1 -5
- package/app/eo-framework/grid/extensions/filter/text/text-filter.component.d.ts.map +1 -1
- package/app/eo-framework/grid/filters/datetime-filter.component.d.ts +4 -7
- package/app/eo-framework/grid/filters/datetime-filter.component.d.ts.map +1 -1
- package/app/eo-framework/grid/grid.module.d.ts +4 -3
- package/app/eo-framework/grid/grid.module.d.ts.map +1 -1
- package/app/eo-framework/inbox-details/inbox-details.component.d.ts +2 -7
- package/app/eo-framework/inbox-details/inbox-details.component.d.ts.map +1 -1
- package/app/eo-framework/index.d.ts +0 -1
- package/app/eo-framework/index.d.ts.map +1 -1
- package/app/eo-framework/media/media.component.d.ts.map +1 -1
- package/app/eo-framework/object-details/object-details.component.d.ts +2 -7
- package/app/eo-framework/object-details/object-details.component.d.ts.map +1 -1
- package/app/eo-framework/object-details/object-history/object-history.component.d.ts.map +1 -1
- package/app/eo-framework/object-form/object-form/object-form.component.d.ts +6 -59
- package/app/eo-framework/object-form/object-form/object-form.component.d.ts.map +1 -1
- package/app/eo-framework/object-form/object-form-helper.service.d.ts +86 -2
- package/app/eo-framework/object-form/object-form-helper.service.d.ts.map +1 -1
- package/app/eo-framework/object-state-details/object-state-details.component.d.ts +3 -11
- package/app/eo-framework/object-state-details/object-state-details.component.d.ts.map +1 -1
- package/app/eo-framework/plugins/plugin.component.d.ts +0 -2
- package/app/eo-framework/plugins/plugin.component.d.ts.map +1 -1
- package/app/eo-framework/prepare-details/prepare-details.component.d.ts.map +1 -1
- package/app/eo-framework/process/details/process-details.component.d.ts +2 -7
- package/app/eo-framework/process/details/process-details.component.d.ts.map +1 -1
- package/app/eo-framework/recyclebin-details/recyclebin-details.component.d.ts +2 -7
- package/app/eo-framework/recyclebin-details/recyclebin-details.component.d.ts.map +1 -1
- package/app/eo-framework/ui/eo-dialog/eo-dialog.component.d.ts +2 -1
- package/app/eo-framework/ui/eo-dialog/eo-dialog.component.d.ts.map +1 -1
- package/assets/_default/i18n/de.json +2 -0
- package/assets/_default/i18n/en.json +4 -2
- package/esm2020/app/eo-client/about-state/about-state.component.mjs +5 -5
- package/esm2020/app/eo-client/dashboard/dashboard.component.mjs +3 -3
- package/esm2020/app/eo-client/favorite-state/favorite-state.component.mjs +1 -1
- package/esm2020/app/eo-client/inbox-state/inbox-state/inbox-state.component.mjs +3 -3
- package/esm2020/app/eo-client/login/login.component.mjs +5 -6
- package/esm2020/app/eo-client/notifications-state/notifications-state.component.mjs +1 -1
- package/esm2020/app/eo-client/object-state/object-state/object-state.component.mjs +4 -4
- package/esm2020/app/eo-client/prepare-state/prepare-state/prepare-state.component.mjs +1 -1
- package/esm2020/app/eo-client/recyclebin-state/recyclebin-state.component.mjs +6 -8
- package/esm2020/app/eo-client/settings/settings.component.mjs +3 -3
- package/esm2020/app/eo-client/stored-queries-state/stored-queries-state.component.mjs +4 -4
- package/esm2020/app/eo-client/version-state/version-state.component.mjs +1 -1
- package/esm2020/app/eo-framework/actions/actions/add-resubmission-action/add-resubmission/add-resubmission.component.mjs +3 -3
- package/esm2020/app/eo-framework/actions/actions/delete-action/delete/delete.component.mjs +1 -1
- package/esm2020/app/eo-framework/actions/actions/signature-action/signature/signature.component.mjs +1 -1
- package/esm2020/app/eo-framework/actions/actions/workflow-action/workflow/workflow.component.mjs +1 -1
- package/esm2020/app/eo-framework/app-shell/app-bar/app-add/app-add-dialog/app-add-dialog.component.mjs +2 -2
- package/esm2020/app/eo-framework/app-shell/app-bar/app-add/app-add.component.mjs +1 -1
- package/esm2020/app/eo-framework/app-shell/app-bar/app-process/app-process.component.mjs +1 -1
- package/esm2020/app/eo-framework/app-shell/app-bar/app-search/app-search.component.mjs +32 -20
- package/esm2020/app/eo-framework/app-shell/app-shell.module.mjs +8 -4
- package/esm2020/app/eo-framework/eo-framework.module.mjs +3 -36
- package/esm2020/app/eo-framework/form-elements/checkbox/checkbox.component.mjs +1 -4
- package/esm2020/app/eo-framework/form-elements/codesystem/codesystem.component.mjs +9 -3
- package/esm2020/app/eo-framework/form-elements/date/date.component.mjs +9 -24
- package/esm2020/app/eo-framework/form-elements/date/year-range/year-range.directive.mjs +44 -0
- package/esm2020/app/eo-framework/form-elements/datetime-range/datetime-range.component.mjs +2 -2
- package/esm2020/app/eo-framework/form-elements/dynamic-list/dynamic-list.component.mjs +9 -3
- package/esm2020/app/eo-framework/form-elements/form-elements.module.mjs +3 -13
- package/esm2020/app/eo-framework/form-elements/id-reference/id-reference.component.mjs +11 -12
- package/esm2020/app/eo-framework/form-elements/id-reference/reference-finder-entry/reference-finder-entry.component.mjs +2 -2
- package/esm2020/app/eo-framework/form-elements/index.mjs +2 -4
- package/esm2020/app/eo-framework/form-elements/number-range/number-range.component.mjs +2 -2
- package/esm2020/app/eo-framework/form-elements/organization/organization.component.mjs +2 -2
- package/esm2020/app/eo-framework/form-elements/reference/reference.component.mjs +5 -5
- package/esm2020/app/eo-framework/form-elements/string/string.component.mjs +3 -3
- package/esm2020/app/eo-framework/grid/extensions/filter/setFilters/set-filter.component.mjs +8 -3
- package/esm2020/app/eo-framework/grid/extensions/filter/text/text-filter.component.mjs +9 -17
- package/esm2020/app/eo-framework/grid/extensions/reset-filter/reset-filter.component.mjs +3 -3
- package/esm2020/app/eo-framework/grid/filters/codesystem-filter.component.mjs +2 -2
- package/esm2020/app/eo-framework/grid/filters/datetime-filter.component.mjs +9 -27
- package/esm2020/app/eo-framework/grid/filters/dynamic-list-filter.component.mjs +2 -2
- package/esm2020/app/eo-framework/grid/filters/list-filter.component.mjs +3 -3
- package/esm2020/app/eo-framework/grid/filters/organization-filter.component.mjs +2 -2
- package/esm2020/app/eo-framework/grid/grid.component.mjs +2 -2
- package/esm2020/app/eo-framework/grid/grid.module.mjs +5 -8
- package/esm2020/app/eo-framework/inbox-details/inbox-details.component.mjs +8 -15
- package/esm2020/app/eo-framework/index.mjs +1 -2
- package/esm2020/app/eo-framework/media/media.component.mjs +5 -4
- package/esm2020/app/eo-framework/object-details/edit-icon/edit-icon.component.mjs +1 -1
- package/esm2020/app/eo-framework/object-details/favorite-icon/favorite-icon.component.mjs +1 -1
- package/esm2020/app/eo-framework/object-details/object-details.component.mjs +10 -15
- package/esm2020/app/eo-framework/object-details/object-history/object-history.component.mjs +1 -2
- package/esm2020/app/eo-framework/object-form/object-form/form-element-table/form-element-table.component.mjs +4 -4
- package/esm2020/app/eo-framework/object-form/object-form/form-element-table/row-edit/row-edit.component.mjs +1 -1
- package/esm2020/app/eo-framework/object-form/object-form/object-form.component.mjs +18 -494
- package/esm2020/app/eo-framework/object-form/object-form-edit/object-form-edit.component.mjs +1 -1
- package/esm2020/app/eo-framework/object-form/object-form-helper.service.mjs +506 -7
- package/esm2020/app/eo-framework/object-state-details/object-state-details.component.mjs +19 -27
- package/esm2020/app/eo-framework/plugins/plugin.component.mjs +5 -7
- package/esm2020/app/eo-framework/prepare-details/prepare-details.component.mjs +3 -4
- package/esm2020/app/eo-framework/process/details/process-details.component.mjs +10 -16
- package/esm2020/app/eo-framework/recyclebin-details/recyclebin-details.component.mjs +7 -16
- package/esm2020/app/eo-framework/result-list/result-list.component.mjs +1 -1
- package/esm2020/app/eo-framework/ui/eo-dialog/eo-dialog.component.mjs +6 -3
- package/esm2020/app/eo-framework/ui/indexdata-summary/indexdata-summary.component.mjs +3 -3
- package/esm2020/projects/eo-sdk/core/lib/util/utils.mjs +6 -1
- package/fesm2015/eo-sdk-client-projects-eo-sdk-core.mjs +5 -0
- package/fesm2015/eo-sdk-client-projects-eo-sdk-core.mjs.map +1 -1
- package/fesm2015/eo-sdk-client.mjs +3744 -4567
- package/fesm2015/eo-sdk-client.mjs.map +1 -1
- package/fesm2020/eo-sdk-client-projects-eo-sdk-core.mjs +5 -0
- package/fesm2020/eo-sdk-client-projects-eo-sdk-core.mjs.map +1 -1
- package/fesm2020/eo-sdk-client.mjs +3746 -4568
- package/fesm2020/eo-sdk-client.mjs.map +1 -1
- package/package.json +4 -4
- package/projects/eo-sdk/core/lib/util/utils.d.ts +1 -0
- package/projects/eo-sdk/core/lib/util/utils.d.ts.map +1 -1
- package/scss/_eo-variables.scss +70 -40
- package/scss/_form.scss +6 -0
- package/scss/_main.scss +1 -1
- package/scss/_theme-dark.scss +22 -0
- package/scss/_yuuvis-components.scss +13 -2
- package/styles.css +51 -24
- package/styles.scss +5 -10
- package/app/eo-framework/form-elements/datetime/datepicker/datepicker.component.d.ts +0 -67
- package/app/eo-framework/form-elements/datetime/datepicker/datepicker.component.d.ts.map +0 -1
- package/app/eo-framework/form-elements/datetime/datepicker/datepicker.interface.d.ts +0 -21
- package/app/eo-framework/form-elements/datetime/datepicker/datepicker.interface.d.ts.map +0 -1
- package/app/eo-framework/form-elements/datetime/datepicker/service/datepicker.service.d.ts +0 -33
- package/app/eo-framework/form-elements/datetime/datepicker/service/datepicker.service.d.ts.map +0 -1
- package/app/eo-framework/form-elements/datetime/datetime.component.d.ts +0 -51
- package/app/eo-framework/form-elements/datetime/datetime.component.d.ts.map +0 -1
- package/app/eo-framework/form-elements/datetime/year-range/year-range.directive.d.ts.map +0 -1
- package/app/eo-framework/tab-container/index.d.ts +0 -6
- package/app/eo-framework/tab-container/index.d.ts.map +0 -1
- package/app/eo-framework/tab-container/tab-container.component.d.ts +0 -62
- package/app/eo-framework/tab-container/tab-container.component.d.ts.map +0 -1
- package/app/eo-framework/tab-container/tab-container.module.d.ts +0 -18
- package/app/eo-framework/tab-container/tab-container.module.d.ts.map +0 -1
- package/app/eo-framework/tab-container/tab-panel/tab-panel.component.d.ts +0 -13
- package/app/eo-framework/tab-container/tab-panel/tab-panel.component.d.ts.map +0 -1
- package/app/eo-framework/tab-container/tab-view/tab-view.component.d.ts +0 -19
- package/app/eo-framework/tab-container/tab-view/tab-view.component.d.ts.map +0 -1
- package/app/eo-framework/tab-container/tab-view-nav/tab-view-nav.component.d.ts +0 -11
- package/app/eo-framework/tab-container/tab-view-nav/tab-view-nav.component.d.ts.map +0 -1
- package/esm2020/app/eo-framework/form-elements/datetime/datepicker/datepicker.component.mjs +0 -239
- package/esm2020/app/eo-framework/form-elements/datetime/datepicker/datepicker.interface.mjs +0 -2
- package/esm2020/app/eo-framework/form-elements/datetime/datepicker/service/datepicker.service.mjs +0 -109
- package/esm2020/app/eo-framework/form-elements/datetime/datetime.component.mjs +0 -142
- package/esm2020/app/eo-framework/form-elements/datetime/year-range/year-range.directive.mjs +0 -44
- package/esm2020/app/eo-framework/tab-container/index.mjs +0 -6
- package/esm2020/app/eo-framework/tab-container/tab-container.component.mjs +0 -184
- package/esm2020/app/eo-framework/tab-container/tab-container.module.mjs +0 -47
- package/esm2020/app/eo-framework/tab-container/tab-panel/tab-panel.component.mjs +0 -26
- package/esm2020/app/eo-framework/tab-container/tab-view/tab-view.component.mjs +0 -61
- package/esm2020/app/eo-framework/tab-container/tab-view-nav/tab-view-nav.component.mjs +0 -25
- package/scss/_eo-inverted.scss +0 -73
- package/scss/_eo-pink-theme.scss +0 -73
- package/scss/_eo-theme.scss +0 -81
- package/scss/_eo-vars.scss +0 -3
- /package/app/eo-framework/form-elements/{datetime → date}/year-range/year-range.directive.d.ts +0 -0
|
@@ -1,17 +1,75 @@
|
|
|
1
|
+
import { DatePipe } from '@angular/common';
|
|
1
2
|
import { Injectable } from '@angular/core';
|
|
3
|
+
import { Validators } from '@angular/forms';
|
|
4
|
+
import { RangeValue, SearchService, Utils } from '@eo-sdk/core';
|
|
5
|
+
import { forkJoin, of } from 'rxjs';
|
|
6
|
+
import { debounceTime, tap } from 'rxjs/operators';
|
|
2
7
|
import { FormValidation } from './object-form/form-validation/form-validation';
|
|
3
|
-
import { ObjectFormControlWrapper } from './object-form/object-form-control-wrapper';
|
|
4
8
|
import { ObjectFormControl } from './object-form/object-form-control';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
9
|
+
import { ObjectFormControlWrapper } from './object-form/object-form-control-wrapper';
|
|
10
|
+
import { ObjectFormGroup } from './object-form/object-form-group.model';
|
|
11
|
+
import { ObjectFormScriptingScope } from './object-form/object-form-script/object-form-scripting-scope';
|
|
7
12
|
import * as i0 from "@angular/core";
|
|
8
13
|
import * as i1 from "@eo-sdk/core";
|
|
14
|
+
import * as i2 from "../../eo-framework-core/references/reference.service";
|
|
15
|
+
import * as i3 from "../../eo-framework-core/api/plugins.service";
|
|
9
16
|
export class ObjectFormHelperService {
|
|
10
|
-
constructor(logger, systemService) {
|
|
17
|
+
constructor(logger, referenceService, searchService, pluginService, systemService) {
|
|
11
18
|
this.logger = logger;
|
|
19
|
+
this.referenceService = referenceService;
|
|
20
|
+
this.searchService = searchService;
|
|
21
|
+
this.pluginService = pluginService;
|
|
12
22
|
this.systemService = systemService;
|
|
13
23
|
this.datePipe = new DatePipe('en');
|
|
14
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Generates a reactive form based on a form model that may also include form scripts.
|
|
27
|
+
* @param formOptions `ObjectFormOptions` defining the form
|
|
28
|
+
* @param formScriptService Instance of a `ObjectFormScriptService`. This service is supposed to be
|
|
29
|
+
* scoped to the component rendering the form (providers array in component decorator).
|
|
30
|
+
* @param isInnerTableForm whether or not the form is part of another form (as is with table edit forms)
|
|
31
|
+
* @returns An `FormGenResult` object
|
|
32
|
+
*/
|
|
33
|
+
buildReactiveForm(formOptions, formScriptService, isInnerTableForm) {
|
|
34
|
+
const _scope = {
|
|
35
|
+
gCount: 0,
|
|
36
|
+
formOptions,
|
|
37
|
+
isInnerTableForm,
|
|
38
|
+
initialValidators: {},
|
|
39
|
+
formGenResult: {
|
|
40
|
+
formControls: {},
|
|
41
|
+
formModel: {},
|
|
42
|
+
controlValueSubscriptions: [],
|
|
43
|
+
scriptingScope: undefined,
|
|
44
|
+
scriptModel: {},
|
|
45
|
+
form: null
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const formModel = this._dataToForm(_scope, formOptions.formModel, formOptions.data);
|
|
49
|
+
_scope.formGenResult.formModel = formModel;
|
|
50
|
+
if (!formModel)
|
|
51
|
+
return;
|
|
52
|
+
// if a script is available, we'll init the form scripting for the
|
|
53
|
+
// current form
|
|
54
|
+
let scriptingScope;
|
|
55
|
+
if (_scope.isInnerTableForm || (formModel.script && formModel.script.length > 0)) {
|
|
56
|
+
this.logger.debug('adding form scripting scope');
|
|
57
|
+
scriptingScope = new ObjectFormScriptingScope(formModel.situation, this._getScriptingModelChanged(_scope), this.pluginService.getApi(), _scope.isInnerTableForm);
|
|
58
|
+
scriptingScope.objectId = formOptions.objectId;
|
|
59
|
+
}
|
|
60
|
+
_scope.formGenResult.scriptingScope = scriptingScope;
|
|
61
|
+
let form = new ObjectFormGroup({});
|
|
62
|
+
if (formModel.elements[0] && formModel.elements[0].elements) {
|
|
63
|
+
this._addFormControl(_scope, form, formModel.elements[0], 'core');
|
|
64
|
+
}
|
|
65
|
+
if (formModel.elements[1] && formModel.elements[1].elements) {
|
|
66
|
+
this._addFormControl(_scope, form, formModel.elements[1], 'data');
|
|
67
|
+
}
|
|
68
|
+
_scope.formGenResult.form = form;
|
|
69
|
+
this._initValidators(_scope.formGenResult.form, _scope);
|
|
70
|
+
this._initScriptingScope(_scope, formScriptService);
|
|
71
|
+
return _scope.formGenResult;
|
|
72
|
+
}
|
|
15
73
|
/**
|
|
16
74
|
* Converts a form element object to an ObjectFormControlWrapper which then can be used to
|
|
17
75
|
* render a from control. Result can be used as input for FormElementComponent.
|
|
@@ -167,10 +225,451 @@ export class ObjectFormHelperService {
|
|
|
167
225
|
}
|
|
168
226
|
return value;
|
|
169
227
|
}
|
|
228
|
+
// Functions involved in building an object form
|
|
229
|
+
/**
|
|
230
|
+
* Recursive method adding a new UntypedFormControl (group or control) to a parent form group
|
|
231
|
+
*
|
|
232
|
+
* @param parentGroup - the parent group to add the control to
|
|
233
|
+
* @param formElement - the enaio form model element to create the child control from
|
|
234
|
+
* @param [useName] - use this name instead of the one from the model
|
|
235
|
+
*/
|
|
236
|
+
_addFormControl(scope, parentGroup, formElement, useName) {
|
|
237
|
+
let ctrl;
|
|
238
|
+
let name;
|
|
239
|
+
// add a form group
|
|
240
|
+
if (formElement.type === 'o2mGroup' || formElement.type === 'o2mGroupStack') {
|
|
241
|
+
// do not add groups that are empty
|
|
242
|
+
if (!formElement.elements || formElement.elements.length === 0) {
|
|
243
|
+
this.logger.error('Found empty form group', formElement);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
ctrl = new ObjectFormGroup({});
|
|
247
|
+
ctrl._eoFormGroup = {
|
|
248
|
+
label: formElement.label,
|
|
249
|
+
//layoutgroup: formElement.layoutgroup,
|
|
250
|
+
layout: formElement.layout,
|
|
251
|
+
type: formElement.type
|
|
252
|
+
};
|
|
253
|
+
if (useName === 'core' || useName === 'data') {
|
|
254
|
+
ctrl._eoFormGroup.label = useName;
|
|
255
|
+
}
|
|
256
|
+
for (let e of formElement.elements) {
|
|
257
|
+
this._addFormControl(scope, ctrl, e);
|
|
258
|
+
}
|
|
259
|
+
name = useName || 'fg' + scope.gCount++;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// add form control
|
|
263
|
+
// To be able to integrate recursive form controls into the main form,
|
|
264
|
+
// we have to wrap them in a form group
|
|
265
|
+
ctrl = new ObjectFormControlWrapper({});
|
|
266
|
+
ctrl._eoFormControlWrapper = {
|
|
267
|
+
// the name of the wrapped UntypedFormControl
|
|
268
|
+
controlName: formElement.name,
|
|
269
|
+
situation: scope.formOptions.formModel.situation
|
|
270
|
+
};
|
|
271
|
+
if (scope.formOptions.formModel.situation === 'SEARCH' && formElement.value === null) {
|
|
272
|
+
formElement.isNotSetValue = true;
|
|
273
|
+
}
|
|
274
|
+
// do not set a reference as the form controls value
|
|
275
|
+
// otherwise we could not reset the form
|
|
276
|
+
let value;
|
|
277
|
+
if (Array.isArray(formElement.value)) {
|
|
278
|
+
// copy by value for arrays of objects (e.g. table data)
|
|
279
|
+
value = [];
|
|
280
|
+
formElement.value.forEach((o) => {
|
|
281
|
+
value.push(Utils.formDataParse(Utils.formDataStringify(o)));
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
value = formElement.value;
|
|
286
|
+
}
|
|
287
|
+
// for codesystem elements add entries if not yet provided
|
|
288
|
+
if (formElement.type === 'CODESYSTEM' && !formElement.codesystem.entries) {
|
|
289
|
+
formElement.codesystem = this.systemService.getCodesystem(formElement.codesystem.id);
|
|
290
|
+
}
|
|
291
|
+
// create the actual form control
|
|
292
|
+
let controlDisabled = scope.formOptions.disabled || !!formElement.readonly;
|
|
293
|
+
let formControl = new ObjectFormControl({
|
|
294
|
+
value: value,
|
|
295
|
+
disabled: controlDisabled
|
|
296
|
+
});
|
|
297
|
+
formElement.readonly = controlDisabled;
|
|
298
|
+
formControl._eoFormElement = formElement;
|
|
299
|
+
scope.formGenResult.formControls[formElement.name] = formControl;
|
|
300
|
+
if (formElement.type === 'CODESYSTEM' || (formElement.type === 'STRING' && formElement.classification === 'selector')) {
|
|
301
|
+
formControl._eoFormElement.applyFilter = (func) => {
|
|
302
|
+
formControl._eoFormElement.filterFunction = func;
|
|
303
|
+
};
|
|
304
|
+
formControl._eoFormElement.applyDisablingFilter = (func) => {
|
|
305
|
+
formControl._eoFormElement.disablingFilterFunction = func;
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
if (formElement.type === 'STRING' && formElement.classification === 'selector') {
|
|
309
|
+
formControl._eoFormElement.setList = (listObject) => {
|
|
310
|
+
formControl._eoFormElement.list = listObject;
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
if (formElement.type === 'ORGANIZATION') {
|
|
314
|
+
formControl._eoFormElement.setFilter = (filterObject) => {
|
|
315
|
+
formControl._eoFormElement.filter = filterObject;
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
if (formElement.type === 'TABLE') {
|
|
319
|
+
formControl._eoFormElement.object = scope.formOptions.object;
|
|
320
|
+
}
|
|
321
|
+
if (formElement.type === 'REFERENCE') {
|
|
322
|
+
formControl._eoFormElement.setQueryFilters = (queryFiltersObject, objectTypes) => {
|
|
323
|
+
formControl._eoFormElement.queryFilters = queryFiltersObject;
|
|
324
|
+
formControl._eoFormElement.objectTypesFilter = objectTypes;
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
if (scope.formOptions.formModel.situation === 'SEARCH') {
|
|
328
|
+
// in search situation even readonly fields should be editable ...
|
|
329
|
+
formControl._eoFormElement.readonly = false;
|
|
330
|
+
// ... and required makes no sense here
|
|
331
|
+
formControl._eoFormElement.required = false;
|
|
332
|
+
}
|
|
333
|
+
// remove empty descriptions
|
|
334
|
+
let desc = formControl._eoFormElement.description;
|
|
335
|
+
if (desc && desc.trim().length === 0) {
|
|
336
|
+
formControl._eoFormElement.description = null;
|
|
337
|
+
}
|
|
338
|
+
// add the form element to the script model that will be injected into
|
|
339
|
+
// the forms scripting scope later on
|
|
340
|
+
scope.formGenResult.scriptModel[formElement.name] = formControl._eoFormElement;
|
|
341
|
+
// apply change listener to the form control, that will trigger
|
|
342
|
+
// the form elements onChange listener
|
|
343
|
+
let controlWatch = ctrl.valueChanges.pipe(debounceTime(formElement.type === 'TABLE' ? 0 : 500));
|
|
344
|
+
controlWatch.subscribe((v) => {
|
|
345
|
+
if (formControl._eoFormElement.type === 'REFERENCE') {
|
|
346
|
+
this._getDataMeta(formControl._eoFormElement, v[formControl._eoFormElement.name]).subscribe(m => {
|
|
347
|
+
if (m) {
|
|
348
|
+
formControl._eoFormElement.dataMeta = formControl._eoFormElement.multiselect ? m : m[0];
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
delete formControl._eoFormElement.dataMeta;
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
if (scope.formGenResult.scriptingScope) {
|
|
356
|
+
scope.formGenResult.scriptingScope.modelChanged(v);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
scope.formGenResult.controlValueSubscriptions.push(controlWatch);
|
|
360
|
+
ctrl.addControl(formElement.name, formControl);
|
|
361
|
+
name = 'fg_' + formElement.name;
|
|
362
|
+
}
|
|
363
|
+
parentGroup.addControl(name, ctrl);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Merge data into a form model.
|
|
367
|
+
*
|
|
368
|
+
* @param model - form model
|
|
369
|
+
* @param data - data object or array of SearchFilter objects in case of a search form
|
|
370
|
+
*/
|
|
371
|
+
_dataToForm(scope, model, data) {
|
|
372
|
+
if (model && data) {
|
|
373
|
+
this._setElementValues(scope, model.elements, data);
|
|
374
|
+
}
|
|
375
|
+
return model;
|
|
376
|
+
}
|
|
377
|
+
// recursive method for adding values to model elements
|
|
378
|
+
_setElementValues(scope, elements, data) {
|
|
379
|
+
elements.forEach(element => {
|
|
380
|
+
if (this._hasValue(data, element)) {
|
|
381
|
+
element.value = this._getValue(scope, data, element);
|
|
382
|
+
if (element.value) {
|
|
383
|
+
// add meta data for some of the types
|
|
384
|
+
this._fetchMetaData(scope, data, element);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
delete element.value;
|
|
389
|
+
}
|
|
390
|
+
if (element.type !== 'TABLE' && element.elements && element.elements.length > 0) {
|
|
391
|
+
this._setElementValues(scope, element.elements, data);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
// in some cases required meta data may not be available on the element itself
|
|
396
|
+
// so they have to be fetched and added to the element for the form to be able
|
|
397
|
+
// to render the element correctly
|
|
398
|
+
_fetchMetaData(scope, data, element) {
|
|
399
|
+
if (scope.formOptions.formModel.situation === 'SEARCH') {
|
|
400
|
+
// todo: how to fetch meta data in search situation
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
if (element.type === 'ORGANIZATION' && data[element.name + '_meta']) {
|
|
404
|
+
element.dataMeta = data[element.name + '_meta'];
|
|
405
|
+
}
|
|
406
|
+
else if (element.type === 'CODESYSTEM' && data[element.name + '_meta']) {
|
|
407
|
+
element.dataMeta = data[element.name + '_meta'];
|
|
408
|
+
element.defaultrepresentation = data[element.name + '_meta'].defaultrepresentation;
|
|
409
|
+
}
|
|
410
|
+
else if (element.type === 'REFERENCE' && data[element.name + '_meta']) {
|
|
411
|
+
element.dataMeta = data[element.name + '_meta'];
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
_getDataMeta(formElement, newValue) {
|
|
416
|
+
if (newValue) {
|
|
417
|
+
switch (formElement.type) {
|
|
418
|
+
case 'ORGANIZATION': {
|
|
419
|
+
return this.systemService.getOrganizationObject(newValue);
|
|
420
|
+
}
|
|
421
|
+
case 'REFERENCE': {
|
|
422
|
+
return this.referenceService.fetchIDReferenceMetaData(Array.isArray(newValue) ? newValue : [newValue]);
|
|
423
|
+
}
|
|
424
|
+
case 'CODESYSTEM': {
|
|
425
|
+
return of(this.systemService.getCodesystem(formElement.codesystem.id).entries.find((entry) => {
|
|
426
|
+
return entry.defaultrepresentation === newValue;
|
|
427
|
+
}));
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return of(null);
|
|
432
|
+
}
|
|
433
|
+
_hasValue(data, element) {
|
|
434
|
+
// differ between array of SearchFilters and a form data object
|
|
435
|
+
if (Array.isArray(data)) {
|
|
436
|
+
if (element.type === 'TABLE') {
|
|
437
|
+
return !!(data.find((filter) => filter.property.startsWith(element.qname)));
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
return !!(data.find((filter) => filter.property === element.qname));
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
return data.hasOwnProperty(element.name);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
_getValue(scope, data, element) {
|
|
448
|
+
let value;
|
|
449
|
+
if (scope.formOptions.formModel.situation === 'SEARCH') {
|
|
450
|
+
if (scope.isInnerTableForm) {
|
|
451
|
+
if (element.type === 'DATETIME' || element.type === 'NUMBER') {
|
|
452
|
+
value = SearchService.toRangeValue(data[element.name]);
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
value = data[element.name];
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
else if (element.type === 'TABLE') {
|
|
459
|
+
value = this.searchService.tableFiltersToElementValue(this._getTableFilters(data, element.qname), element.elements);
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
const filter = data.find(f => f.property === element.qname);
|
|
463
|
+
value = this.searchService.filterToElementValue(filter, element.type);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
if (element.type === 'DATETIME' && data[element.name]) {
|
|
468
|
+
value = new Date(`${data[element.name]}${element.withtime ? '' : 'T00:00:00'}`);
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
value = data[element.name];
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return value;
|
|
475
|
+
}
|
|
476
|
+
_getTableFilters(filters, propertyName) {
|
|
477
|
+
return filters.filter(f => f.property.startsWith(propertyName + '.'));
|
|
478
|
+
}
|
|
479
|
+
_initValidators(formControl, scope) {
|
|
480
|
+
if (formControl) {
|
|
481
|
+
for (let key in formControl.controls) {
|
|
482
|
+
const control = formControl.controls[key];
|
|
483
|
+
if (control.controls) {
|
|
484
|
+
this._initValidators(control, scope);
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
scope.initialValidators[control._eoFormElement.name] = control.validator;
|
|
488
|
+
control.setValidators(Validators.compose(this._getValidators(scope, control._eoFormElement).concat([scope.initialValidators[control._eoFormElement.name]])));
|
|
489
|
+
control.updateValueAndValidity();
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Build validators for the given form element to be attached to
|
|
496
|
+
* a reactive formControl.
|
|
497
|
+
*
|
|
498
|
+
* @param formElement - form element object
|
|
499
|
+
*/
|
|
500
|
+
_getValidators(scope, formElement) {
|
|
501
|
+
let elmValidators = FormValidation.getValidators(formElement, scope.formOptions.formModel.situation);
|
|
502
|
+
// add custom validator for script enabled forms
|
|
503
|
+
if (scope.formGenResult.scriptingScope) {
|
|
504
|
+
elmValidators.push(FormValidation.customScriptingValidation);
|
|
505
|
+
}
|
|
506
|
+
return elmValidators;
|
|
507
|
+
}
|
|
508
|
+
_initScriptingScope(scope, formScriptService) {
|
|
509
|
+
let { data, actions, objects, context } = (scope.formOptions || {});
|
|
510
|
+
if (scope.formGenResult.scriptingScope) {
|
|
511
|
+
scope.formGenResult.scriptingScope.setModel(scope.formGenResult.scriptModel);
|
|
512
|
+
/** provide access to actions (used inside of BPM-Forms) */
|
|
513
|
+
scope.formGenResult.scriptingScope.actions = actions;
|
|
514
|
+
/** provide access to additional objects (used for example in BPM-Start-Forms to
|
|
515
|
+
* add data of DMS-Objects to start the process for)
|
|
516
|
+
*/
|
|
517
|
+
scope.formGenResult.scriptingScope.objects = objects;
|
|
518
|
+
scope.formGenResult.scriptingScope.context = context;
|
|
519
|
+
/** provide readonly access to initial form data (which may also contain values that
|
|
520
|
+
* are not rendered as form elements (invisible values))
|
|
521
|
+
*/
|
|
522
|
+
scope.formGenResult.scriptingScope.data = data;
|
|
523
|
+
/** by default, scripting scopes are applied to forms. But table elements create their own scope
|
|
524
|
+
* for editing rows. Being one of those inner forms should not run the form script again, but
|
|
525
|
+
* instead just provide the observing abilities of the scripting scope.
|
|
526
|
+
*/
|
|
527
|
+
if (!scope.formOptions.disabled && !scope.isInnerTableForm && scope.formGenResult.formModel) {
|
|
528
|
+
const scriptName = scope.formGenResult.formModel.name + '_' + scope.formGenResult.formModel.situation;
|
|
529
|
+
this.logger.debug('executing form script ' + scriptName);
|
|
530
|
+
formScriptService.runFormScript(scope.formGenResult.scriptingScope, scope.formGenResult.formModel.script, scriptName);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* This method will be called each time the script changes its internal model.
|
|
536
|
+
* It is used to transfer the script changes to the actual form model.
|
|
537
|
+
*
|
|
538
|
+
* To ensure the right context, we define an instance method as callback for the scripting scope
|
|
539
|
+
* @see: https://blog.johnnyreilly.com/2014/04/typescript-instance-methods.html
|
|
540
|
+
*
|
|
541
|
+
* @param formControlName
|
|
542
|
+
* @param change
|
|
543
|
+
*/
|
|
544
|
+
_getScriptingModelChanged(scope) {
|
|
545
|
+
return (formControlName, change) => {
|
|
546
|
+
// find the target control
|
|
547
|
+
let fc = scope.formGenResult.formControls[formControlName];
|
|
548
|
+
if (fc) {
|
|
549
|
+
// change only allowed properties
|
|
550
|
+
switch (change.name) {
|
|
551
|
+
case 'value': {
|
|
552
|
+
if (Array.isArray(change.newValue)) {
|
|
553
|
+
this._processArrayValueChange(fc, change);
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
fc._eoFormElement.value = change.newValue;
|
|
557
|
+
if (fc.value !== change.newValue) {
|
|
558
|
+
fc.patchValue(change.newValue);
|
|
559
|
+
fc.updateValueAndValidity();
|
|
560
|
+
fc.markAsDirty();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
scope.formGenResult.form.markAsDirty();
|
|
564
|
+
break;
|
|
565
|
+
}
|
|
566
|
+
case 'required': {
|
|
567
|
+
if (fc._eoFormElement.required !== change.newValue) {
|
|
568
|
+
fc._eoFormElement.required = change.newValue;
|
|
569
|
+
// apply new validators
|
|
570
|
+
// @see: https://scotch.io/tutorials/how-to-implement-conditional-validation-in-angular-2-model-driven-forms
|
|
571
|
+
fc.setValidators(Validators.compose(this._getValidators(scope, fc._eoFormElement).concat([scope.initialValidators[fc._eoFormElement.name]])));
|
|
572
|
+
// need to mark form control as touched because otherwise form validation will not show
|
|
573
|
+
// error messages
|
|
574
|
+
fc.markAsTouched();
|
|
575
|
+
fc.updateValueAndValidity();
|
|
576
|
+
}
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
case 'readonly': {
|
|
580
|
+
fc._eoFormElement.readonly = change.newValue;
|
|
581
|
+
if (change.newValue === true) {
|
|
582
|
+
fc.disable();
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
fc.enable();
|
|
586
|
+
}
|
|
587
|
+
break;
|
|
588
|
+
}
|
|
589
|
+
case 'error': {
|
|
590
|
+
if (JSON.stringify(fc._eoFormElement.error) !== JSON.stringify(change.newValue)) {
|
|
591
|
+
fc._eoFormElement.error = change.newValue;
|
|
592
|
+
fc.markAsTouched();
|
|
593
|
+
fc.updateValueAndValidity();
|
|
594
|
+
}
|
|
595
|
+
break;
|
|
596
|
+
}
|
|
597
|
+
// new onrowedit function was applied by the script
|
|
598
|
+
case 'onrowedit': {
|
|
599
|
+
fc._eoFormElement.onrowedit = change.newValue;
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
602
|
+
// new onchange function was applied by the script
|
|
603
|
+
case 'onchange': {
|
|
604
|
+
fc._eoFormElement.onchange = change.newValue;
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
// new contextId was applied by the script
|
|
608
|
+
case 'contextId': {
|
|
609
|
+
fc._eoFormElement.contextId = change.newValue;
|
|
610
|
+
break;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
_processArrayValueChange(fc, change) {
|
|
617
|
+
const newVal = change.newValue;
|
|
618
|
+
const targetType = fc._eoFormElement.type;
|
|
619
|
+
// for some types we have to ensure that meta data are provided as well
|
|
620
|
+
switch (targetType) {
|
|
621
|
+
case 'ORGANIZATION': {
|
|
622
|
+
this._getDataMeta(fc._eoFormElement, newVal).subscribe(m => {
|
|
623
|
+
fc._eoFormElement.dataMeta = m;
|
|
624
|
+
});
|
|
625
|
+
break;
|
|
626
|
+
}
|
|
627
|
+
case 'CODESYSTEM': {
|
|
628
|
+
if (!fc._eoFormElement.codesystem.entries) {
|
|
629
|
+
fc._eoFormElement.codesystem = this.systemService.getCodesystem(fc._eoFormElement.codesystem.id);
|
|
630
|
+
}
|
|
631
|
+
break;
|
|
632
|
+
}
|
|
633
|
+
case 'TABLE': {
|
|
634
|
+
const dataToBeProcessed = {};
|
|
635
|
+
fc._eoFormElement.elements.forEach(e => {
|
|
636
|
+
if (e.type === 'ORGANIZATION' || e.type === 'CODESYSTEM') {
|
|
637
|
+
dataToBeProcessed[e.name] = e;
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
if (Object.keys(dataToBeProcessed).length) {
|
|
641
|
+
let obs = [];
|
|
642
|
+
newVal.forEach(rowData => {
|
|
643
|
+
Object.keys(rowData).forEach(key => {
|
|
644
|
+
if (dataToBeProcessed[key]) {
|
|
645
|
+
obs.push(this._getDataMeta(dataToBeProcessed[key], rowData[key]).pipe(tap(m => {
|
|
646
|
+
if (m) {
|
|
647
|
+
rowData[key + '_meta'] = m;
|
|
648
|
+
}
|
|
649
|
+
else {
|
|
650
|
+
delete rowData[key + '_meta'];
|
|
651
|
+
}
|
|
652
|
+
})));
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
forkJoin(obs).subscribe(() => this._updateArrayValue(fc, newVal));
|
|
657
|
+
}
|
|
658
|
+
break;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
this._updateArrayValue(fc, newVal);
|
|
662
|
+
}
|
|
663
|
+
_updateArrayValue(fc, newValue) {
|
|
664
|
+
fc._eoFormElement.value = [].concat(newValue);
|
|
665
|
+
fc.patchValue([].concat(newValue));
|
|
666
|
+
fc.updateValueAndValidity();
|
|
667
|
+
fc.markAsDirty();
|
|
668
|
+
}
|
|
170
669
|
}
|
|
171
|
-
ObjectFormHelperService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ObjectFormHelperService, deps: [{ token: i1.Logger }, { token: i1.SystemService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
670
|
+
ObjectFormHelperService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ObjectFormHelperService, deps: [{ token: i1.Logger }, { token: i2.ReferenceService }, { token: i1.SearchService }, { token: i3.PluginsService }, { token: i1.SystemService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
172
671
|
ObjectFormHelperService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ObjectFormHelperService });
|
|
173
672
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ObjectFormHelperService, decorators: [{
|
|
174
673
|
type: Injectable
|
|
175
|
-
}], ctorParameters: function () { return [{ type: i1.Logger }, { type: i1.SystemService }]; } });
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWZvcm0taGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2VvLWZyYW1ld29yay9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUM3RSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQXdCLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUUvRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7OztBQUd6QyxNQUFNLE9BQU8sdUJBQXVCO0lBSWxDLFlBQW9CLE1BQWMsRUFBVSxhQUE0QjtRQUFwRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFGaEUsYUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBR3RDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsb0JBQW9CLENBQUMsT0FBWSxFQUFFLFNBQWtCO1FBRW5ELElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQy9CLElBQUk7Z0JBQ0YsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkM7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUMzRTtTQUNGO2FBQU07WUFDTCxXQUFXLEdBQUcsT0FB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dkIsdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtVmFsaWRhdGlvbn0gZnJvbSAnLi9vYmplY3QtZm9ybS9mb3JtLXZhbGlkYXRpb24vZm9ybS12YWxpZGF0aW9uJztcbmltcG9ydCB7T2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWNvbnRyb2wtd3JhcHBlcic7XG5pbXBvcnQge09iamVjdEZvcm1Db250cm9sfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHtPYmplY3RGb3JtR3JvdXB9IGZyb20gJy4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tZ3JvdXAubW9kZWwnO1xuaW1wb3J0IHtMb2dnZXIsIFN5c3RlbVNlcnZpY2UsIFJhbmdlVmFsdWV9IGZyb20gJ0Blby1zZGsvY29yZSc7XG5pbXBvcnQge09iamVjdEZvcm1Nb2RlbH0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS5tb2RlbCc7XG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT2JqZWN0Rm9ybUhlbHBlclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgZGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUoJ2VuJyk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IExvZ2dlciwgcHJpdmF0ZSBzeXN0ZW1TZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlKSB7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBmb3JtIGVsZW1lbnQgb2JqZWN0IHRvIGFuIE9iamVjdEZvcm1Db250cm9sV3JhcHBlciB3aGljaCB0aGVuIGNhbiBiZSB1c2VkIHRvXG4gICAqIHJlbmRlciBhIGZyb20gY29udHJvbC4gUmVzdWx0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBGb3JtRWxlbWVudENvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSB0aGUgZWxlbWVudCBvYmplY3Qgb3IgYSBqc29uIHN0cmluZ1xuICAgKiBAcGFyYW0gc2l0dWF0aW9uIC0gb3B0aW9uYWwgcHJvcGVydHkgdG8gc2V0IHVwIGEgZm9ybSBzaXR1YXRpb24gZm9yIHRoZSBjb250cm9sIChkZWZhdWx0IGlzIEVESVQpXG4gICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIgb3IgbnVsbCBpbiBjYXNlIG9mIGFuIGVycm9yXG4gICAqL1xuICBlbGVtZW50VG9Gb3JtQ29udHJvbChlbGVtZW50OiBhbnksIHNpdHVhdGlvbj86IHN0cmluZyk6IE9iamVjdEZvcm1Db250cm9sV3JhcHBlciB7XG5cbiAgICBsZXQgZm9ybUVsZW1lbnQ7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9ybUVsZW1lbnQgPSBKU09OLnBhcnNlKGVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHBhcnNlIGZvcm0gZWxlbWVudCBmcm9tIGpzb24gJywgZm9ybUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXJcbiAgICBsZXQgd3JhcHBlciA9IG5ldyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIoe30pO1xuICAgIGxldCBmb3JtU2l0dWF0aW9uID0gc2l0dWF0aW9uID8gc2l0dWF0aW9uIDogJ0VESVQnO1xuXG4gICAgd3JhcHBlci5fZW9Gb3JtQ29udHJvbFdyYXBwZXIgPSB7XG4gICAgICBjb250cm9sTmFtZTogZm9ybUVsZW1lbnQubmFtZSxcbiAgICAgIHNpdHVhdGlvbjogZm9ybVNpdHVhdGlvblxuICAgIH07XG5cbiAgICAvLyBmb3IgY29kZXN5c3RlbSBlbGVtZW50cyBhZGQgZW50cmllcyBpZiBub3QgeWV0IHByb3ZpZGVkXG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJyAmJiAoIWZvcm1FbGVtZW50LmNvZGVzeXN0ZW0gfHwgIWZvcm1FbGVtZW50LmNvZGVzeXN0ZW0uZW50cmllcykpIHtcbiAgICAgIGZvcm1FbGVtZW50LmNvZGVzeXN0ZW0gPSB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Q29kZXN5c3RlbShmb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmlkKTtcbiAgICB9XG4gICAgLy8gY3JlYXRlIHRoZSBhY3R1YWwgZm9ybSBjb250cm9sXG4gICAgbGV0IGNvbnRyb2xEaXNhYmxlZCA9ICEhZm9ybUVsZW1lbnQucmVhZG9ubHk7XG4gICAgbGV0IGZvcm1Db250cm9sID0gbmV3IE9iamVjdEZvcm1Db250cm9sKHtcbiAgICAgIHZhbHVlOiBmb3JtRWxlbWVudC52YWx1ZSxcbiAgICAgIGRpc2FibGVkOiBjb250cm9sRGlzYWJsZWRcbiAgICB9LCBGb3JtVmFsaWRhdGlvbi5nZXRWYWxpZGF0b3JzKGZvcm1FbGVtZW50LCBmb3JtU2l0dWF0aW9uKSk7XG5cbiAgICAvLyBGb3JtIGVsZW1lbnRzIGluIFNFQVJDSCBzaXR1YXRpb24gbWF5IGFycml2ZSB3aXRoIGEgdmFsdWUgc2V0IHRvIE5VTEwgKGV4cGxpY2l0IHNlYXJjaCBmb3JcbiAgICAvLyBmaWVsZHMgdGhhdCBhcmUgTk9UIHNldCkuIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHByZXBhcmUgdGhlIGZvcm0gY29udHJvbFxuICAgIGlmIChmb3JtU2l0dWF0aW9uID09PSAnU0VBUkNIJyAmJiBmb3JtRWxlbWVudC52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQgPSBmb3JtRWxlbWVudDtcbiAgICB3cmFwcGVyLmFkZENvbnRyb2woZm9ybUVsZW1lbnQubmFtZSwgZm9ybUNvbnRyb2wpO1xuXG4gICAgcmV0dXJuIHdyYXBwZXI7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBkYXRhIGZyb20gYW4gb2JqZWN0IGZvcm0gYmFzZWQgb24gc2l0dWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAtIGZvcm0gdG8gZXh0cmFjdCBkYXRhIGZyb21cbiAgICogQHBhcmFtIHNpdHVhdGlvbiAtIGZvcm0gc2l0dWF0aW9uXG4gICAqIEBwYXJhbSBbaW5pdGlhbERhdGFdIC0gb3B0aW9uYWwgZm9ybSBkYXRhIHRvIG1hdGNoIHRoZSBjdXJyZW50IHZhbHVlcyBhZ2FpbnN0XG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGVkaXRpZyBpbmRleGRhdGEgKEVESVQgc2l0dWF0aW9uKSwgYmVjYXVzZSB3ZSBoYXZlIHRvIGNvbXBhcmUgbmV3IHZhbHVlc1xuICAgKiBhZ2FpbnN0IHRoZSBpbml0aWFsIHZhbHVlcy4gSWYgYSBwcm9wZXJ0eSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgZm9ybXMgaW5pdGlhbCBkYXRhIGlzIHJlbW92ZWRcbiAgICogKGUuZy4gc2V0IHRvIG51bGwpIHRoZW4gd2UgaGF2ZSB0byBzZXQgdGhpcyBudWxsIHZhbHVlLCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgc2VydmVyIHdvdWxkXG4gICAqIGlnbm9yZSB0aGUgY2hhbmdlcy5cbiAgICogQHBhcmFtIGlzVGFibGVSb3dFZGl0Rm9ybSBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgcHJvdmlkZWQgZm9ybSBpcyBhbiBpbmxpbmUgZm9ybSB1c2VkIGJ5XG4gICAqIGEgZm9ybXMgdGFibGUgZWxlbWVudCBmb3IgZWRpdGluZyByb3dzLiBUaG9zZSBuZWVkIGEgc3BlY2lhbCBoYW5kbGluZy5cbiAgICogQHJldHVybiBleHRyYWN0ZWQgZGF0YSBhcyBvYmplY3RcbiAgICovXG4gIGV4dHJhY3RGb3JtRGF0YShmb3JtOiBPYmplY3RGb3JtR3JvdXAsIHNpdHVhdGlvbjogc3RyaW5nLCBpbml0aWFsRGF0YT86IGFueSwgaXNUYWJsZVJvd0VkaXRGb3JtPzogYm9vbGVhbikge1xuICAgIGxldCBleHRyYWN0ZWREYXRhID0ge307XG4gICAgdGhpcy5nZXRFbGVtZW50VmFsdWVzKGV4dHJhY3RlZERhdGEsIGZvcm0sIHNpdHVhdGlvbiB8fCAnRURJVCcsIGluaXRpYWxEYXRhLCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgIHJldHVybiBleHRyYWN0ZWREYXRhO1xuICB9XG5cbiAgLy8gUmVjdXJzaXZlIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlcyBmcm9tIGVhY2ggZm9ybSBjb250cm9sLlxuICBwcml2YXRlIGdldEVsZW1lbnRWYWx1ZXMoZGF0YTogYW55LCBmb3JtQ29udHJvbDogT2JqZWN0Rm9ybU1vZGVsLCBzaXR1YXRpb246IHN0cmluZywgaW5pdGlhbERhdGE/OiBhbnksIGlzVGFibGVSb3dFZGl0Rm9ybT86IGJvb2xlYW4pIHtcblxuICAgIGlmICghZm9ybUNvbnRyb2wgfHwgIWZvcm1Db250cm9sLmNvbnRyb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyKSB7XG5cbiAgICAgIGNvbnN0IGZjOiBhbnkgPSBmb3JtQ29udHJvbC5jb250cm9sc1tmb3JtQ29udHJvbC5fZW9Gb3JtQ29udHJvbFdyYXBwZXIuY29udHJvbE5hbWVdO1xuXG4gICAgICBpZiAoZmMuX2VvRm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBmb3JtIGVsZW1lbnRzIG1heSBleHBsaWNpdGx5IHNldCB0byBoYXZlIE5VTEwgdmFsdWUgKGUuZy4gZnJvbSBTZWFyY2ggZm9ybSBpZiB2YWx1ZXMgYXJlIHJlcXVlc3RlZCB0aGF0IGhhdmUgbm8gdmFsdWVzKVxuICAgICAgICBpZiAoaXNUYWJsZVJvd0VkaXRGb3JtKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQubmFtZSwgbnVsbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQucW5hbWUsIG51bGwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZmMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgdmFsID0gZmMudmFsdWU7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgbWV0YSBkYXRhIGFyZSBhbHNvIHVwIHRvIGRhdGVcbiAgICAgICAgaWYgKGZjLl9lb0Zvcm1FbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJykge1xuICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldENvZGVzeXN0ZW0oZmMuX2VvRm9ybUVsZW1lbnQuY29kZXN5c3RlbS5pZCk7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuZGF0YU1ldGEgPSBjcy5lbnRyaWVzLmZpbmQoZSA9PiBlLmRhdGEgPT09IHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHNpdHVhdGlvbikge1xuICAgICAgICAgIGNhc2UgJ1NFQVJDSCc6IHtcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gcm93IGVkaXRpbmcgZm9ybXMgdXNlIHRoZSBuYW1lIGluc3RlYWQgb2YgdGhlIHFuYW1lIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAvLyB0YWJsZXMgZ3JpZCBpc24ndCBhYmxlIHRvIG1hcCB0aGUgZmllbGRzXG4gICAgICAgICAgICAgIGlmICghaXNUYWJsZVJvd0VkaXRGb3JtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQucW5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZShmYy5fZW9Gb3JtRWxlbWVudC5uYW1lLCB2YWwsIGRhdGEsIGZjLl9lb0Zvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdDUkVBVEUnOiB7XG4gICAgICAgICAgICAvLyBhbHNvIGFkZCBOVUxMIHZhbHVlcyAob3ZlcnJpZGUgZXhpc3RpbmcgZGVmYXVsdHZhbHVlcylcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50Lm5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdFRElUJzoge1xuICAgICAgICAgICAgLy8gaW4gZWRpdCBzaXR1YXRpb24gd2UgaGF2ZSB0byBjb21wYXJlIG5ldyB2YWx1ZXMgYWdhaW5zdCB0aGUgaW5pdGlhbCB2YWx1ZXNcbiAgICAgICAgICAgIC8vIElmIGEgcHJvcGVydHkgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIGZvcm1zIGluaXRpYWwgZGF0YSBpcyByZW1vdmVkIChlLmcuIHNldCB0byBudWxsKVxuICAgICAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIHRvIHNldCB0aGlzIG51bGwgdmFsdWUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgd2lsbCBpZ25vcmUgdGhlIGNoYW5nZXNcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwgfHwgKGluaXRpYWxEYXRhICYmIGluaXRpYWxEYXRhW2ZjLl9lb0Zvcm1FbGVtZW50Lm5hbWVdICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgIC8vIGRhdGFbZmMuX2VvRm9ybUVsZW1lbnQubmFtZV0gPSB2YWw7XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50Lm5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhmb3JtQ29udHJvbC5jb250cm9scylcbiAgICAgICAgLmZvckVhY2goY29udHJvbEtleSA9PiB7XG4gICAgICAgICAgbGV0IGZvcm1Db250cm9sS2V5ZWQgPSA8T2JqZWN0Rm9ybUdyb3VwPmZvcm1Db250cm9sLmNvbnRyb2xzW2NvbnRyb2xLZXldO1xuICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudFZhbHVlcyhkYXRhLCBmb3JtQ29udHJvbEtleWVkLCBzaXR1YXRpb24sIGluaXRpYWxEYXRhLCBpc1RhYmxlUm93RWRpdEZvcm0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldERhdGFWYWx1ZShrZXksIHZhbHVlLCBkYXRhLCBmb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKSB7XG4gICAgZGF0YVtrZXldID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSwgZm9ybUVsZW1lbnQpO1xuXG4gICAgaWYgKGlzVGFibGVSb3dFZGl0Rm9ybSAmJiBmb3JtRWxlbWVudC5kYXRhTWV0YSkge1xuICAgICAgLy8gaW5uZXIgdGFibGVzIG5lZWQgdG8gc2V0IHVwIHRoZSBtZXRhIGRhdGEgYXMgd2VsbFxuICAgICAgZGF0YVtrZXkgKyAnX21ldGEnXSA9IGZvcm1FbGVtZW50LmRhdGFNZXRhO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFZhbHVlKHZhbHVlLCBmb3JtRWxlbWVudCkge1xuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnREFURVRJTUUnICYmICFmb3JtRWxlbWVudC53aXRodGltZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgJ3l5eXktTU0tZGQnKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSYW5nZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2VWYWx1ZShcbiAgICAgICAgICB2YWx1ZS5vcGVyYXRvcixcbiAgICAgICAgICB2YWx1ZS5maXJzdFZhbHVlICYmIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLmZpcnN0VmFsdWUsICd5eXl5LU1NLWRkJyksXG4gICAgICAgICAgdmFsdWUuc2Vjb25kVmFsdWUgJiYgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUuc2Vjb25kVmFsdWUsICd5eXl5LU1NLWRkJylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJykge1xuICAgICAgKGZvcm1FbGVtZW50LmVsZW1lbnRzIHx8IFtdKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgKHZhbHVlIHx8IFtdKS5mb3JFYWNoKHYgPT4gdltlbC5uYW1lXSA9IHRoaXMuZm9ybWF0VmFsdWUodltlbC5uYW1lXSwgZWwpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxufVxuIl19
|
|
674
|
+
}], ctorParameters: function () { return [{ type: i1.Logger }, { type: i2.ReferenceService }, { type: i1.SearchService }, { type: i3.PluginsService }, { type: i1.SystemService }]; } });
|
|
675
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWZvcm0taGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2VvLWZyYW1ld29yay9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFVLFVBQVUsRUFBZ0IsYUFBYSxFQUFpQixLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckcsT0FBTyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQzs7Ozs7QUF5QnhHLE1BQU0sT0FBTyx1QkFBdUI7SUFJbEMsWUFBb0IsTUFBYyxFQUN4QixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsYUFBNkIsRUFDN0IsYUFBNEI7UUFKbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGtCQUFhLEdBQWIs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QUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQixDQUFDOztvSEFwdEJVLHVCQUF1Qjt3SEFBdkIsdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IExvZ2dlciwgUmFuZ2VWYWx1ZSwgU2VhcmNoRmlsdGVyLCBTZWFyY2hTZXJ2aWNlLCBTeXN0ZW1TZXJ2aWNlLCBVdGlscyB9IGZyb20gJ0Blby1zZGsvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFBsdWdpbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZW8tZnJhbWV3b3JrLWNvcmUvYXBpL3BsdWdpbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZWZlcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZW8tZnJhbWV3b3JrLWNvcmUvcmVmZXJlbmNlcy9yZWZlcmVuY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtT3B0aW9ucyB9IGZyb20gJy4vb2JqZWN0LWZvcm0tb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRpb24gfSBmcm9tICcuL29iamVjdC1mb3JtL2Zvcm0tdmFsaWRhdGlvbi9mb3JtLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgT2JqZWN0Rm9ybUNvbnRyb2wgfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyIH0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1jb250cm9sLXdyYXBwZXInO1xuaW1wb3J0IHsgT2JqZWN0Rm9ybUdyb3VwIH0gZnJvbSAnLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1ncm91cC5tb2RlbCc7XG5pbXBvcnQgeyBPYmplY3RGb3JtU2NyaXB0U2VydmljZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdC5zZXJ2aWNlJztcbmltcG9ydCB7IE9iamVjdEZvcm1TY3JpcHRpbmdTY29wZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdGluZy1zY29wZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtTW9kZWwgfSBmcm9tICcuL29iamVjdC1mb3JtL29iamVjdC1mb3JtLm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR2VuU2NvcGUge1xuICBnQ291bnQ6IG51bWJlcjtcbiAgZm9ybU9wdGlvbnM6IE9iamVjdEZvcm1PcHRpb25zO1xuICBpc0lubmVyVGFibGVGb3JtOiBib29sZWFuO1xuICBpbml0aWFsVmFsaWRhdG9yczoge1tuYW1lOiBzdHJpbmddOiBWYWxpZGF0b3JGbiB8IG51bGx9O1xuICBmb3JtR2VuUmVzdWx0OiBGb3JtR2VuUmVzdWx0O1xufVxuZXhwb3J0IGludGVyZmFjZSBGb3JtR2VuUmVzdWx0IHtcbiAgLy8gRm9ybSBjb250cm9scyBnZW5lcmF0ZWQgZnJvbSB0aGUgbW9kZWwgYXMgJ1F1aWNrIGFjY2VzcyBvYmplY3QnXG4gIC8vIEZvcm0gZWxlbWVudHMgbmFtZSBpcyBrZXkgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgZm9ybSBjb250cm9sIGl0c2VsZlxuICBmb3JtQ29udHJvbHM6IHtbbmFtZTogc3RyaW5nXTogT2JqZWN0Rm9ybUNvbnRyb2x9O1xuICBmb3JtTW9kZWw6IGFueSxcbiAgLy8gU3Vic2NyaXB0aW9ucyB0byB2YWx1ZSBjaGFuZ2VzIG9mIHRoZSBnZW5lcmF0ZWQgZm9ybSBjb250cm9sc1xuICAvLyBZb3Ugc2hvdWxkIGFsd2F5cyB1bnN1YnNjcmliZSBmcm9tIGFsbCBvZiB0aGVtIHdoZW4gY29uc3VtaW5nIFxuICAvLyBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gIGNvbnRyb2xWYWx1ZVN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICBzY3JpcHRpbmdTY29wZTogT2JqZWN0Rm9ybVNjcmlwdGluZ1Njb3BlO1xuICBzY3JpcHRNb2RlbDoge1tuYW1lOiBzdHJpbmddOiBhbnl9O1xuICBmb3JtOiBPYmplY3RGb3JtR3JvdXA7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPYmplY3RGb3JtSGVscGVyU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4nKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVmZXJlbmNlU2VydmljZTogUmVmZXJlbmNlU2VydmljZSxcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwbHVnaW5TZXJ2aWNlOiBQbHVnaW5zU2VydmljZSxcbiAgICBwcml2YXRlIHN5c3RlbVNlcnZpY2U6IFN5c3RlbVNlcnZpY2UpIHtcbiAgfVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJlYWN0aXZlIGZvcm0gYmFzZWQgb24gYSBmb3JtIG1vZGVsIHRoYXQgbWF5IGFsc28gaW5jbHVkZSBmb3JtIHNjcmlwdHMuIFxuICogQHBhcmFtIGZvcm1PcHRpb25zIGBPYmplY3RGb3JtT3B0aW9uc2AgZGVmaW5pbmcgdGhlIGZvcm1cbiAqIEBwYXJhbSBmb3JtU2NyaXB0U2VydmljZSBJbnN0YW5jZSBvZiBhIGBPYmplY3RGb3JtU2NyaXB0U2VydmljZWAuIFRoaXMgc2VydmljZSBpcyBzdXBwb3NlZCB0byBiZSBcbiAqIHNjb3BlZCB0byB0aGUgY29tcG9uZW50IHJlbmRlcmluZyB0aGUgZm9ybSAocHJvdmlkZXJzIGFycmF5IGluIGNvbXBvbmVudCBkZWNvcmF0b3IpLlxuICogQHBhcmFtIGlzSW5uZXJUYWJsZUZvcm0gd2hldGhlciBvciBub3QgdGhlIGZvcm0gaXMgcGFydCBvZiBhbm90aGVyIGZvcm0gKGFzIGlzIHdpdGggdGFibGUgZWRpdCBmb3JtcylcbiAqIEByZXR1cm5zIEFuIGBGb3JtR2VuUmVzdWx0YCBvYmplY3QgXG4gKi9cbiAgYnVpbGRSZWFjdGl2ZUZvcm0oZm9ybU9wdGlvbnM6IE9iamVjdEZvcm1PcHRpb25zLCBmb3JtU2NyaXB0U2VydmljZTogT2JqZWN0Rm9ybVNjcmlwdFNlcnZpY2UsIGlzSW5uZXJUYWJsZUZvcm0/OiBib29sZWFuKTogRm9ybUdlblJlc3VsdCB7XG5cbiAgICBjb25zdCBfc2NvcGU6IEZvcm1HZW5TY29wZSA9IHtcbiAgICAgIGdDb3VudDogMCxcbiAgICAgIGZvcm1PcHRpb25zLFxuICAgICAgaXNJbm5lclRhYmxlRm9ybSxcbiAgICAgIGluaXRpYWxWYWxpZGF0b3JzOiB7fSxcbiAgICAgIGZvcm1HZW5SZXN1bHQ6IHtcbiAgICAgICAgZm9ybUNvbnRyb2xzOiB7fSxcbiAgICAgICAgZm9ybU1vZGVsOiB7fSxcbiAgICAgICAgY29udHJvbFZhbHVlU3Vic2NyaXB0aW9uczogW10sXG4gICAgICAgIHNjcmlwdGluZ1Njb3BlOiB1bmRlZmluZWQsXG4gICAgICAgIHNjcmlwdE1vZGVsOiB7fSxcbiAgICAgICAgZm9ybTogbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1Nb2RlbCA9IHRoaXMuX2RhdGFUb0Zvcm0oX3Njb3BlLCBmb3JtT3B0aW9ucy5mb3JtTW9kZWwsIGZvcm1PcHRpb25zLmRhdGEpO1xuICAgIF9zY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbCA9IGZvcm1Nb2RlbDtcbiAgICBpZiAoIWZvcm1Nb2RlbCkgcmV0dXJuO1xuXG4gICAgLy8gaWYgYSBzY3JpcHQgaXMgYXZhaWxhYmxlLCB3ZSdsbCBpbml0IHRoZSBmb3JtIHNjcmlwdGluZyBmb3IgdGhlXG4gICAgLy8gY3VycmVudCBmb3JtXG4gICAgbGV0IHNjcmlwdGluZ1Njb3BlOiBPYmplY3RGb3JtU2NyaXB0aW5nU2NvcGU7XG4gICAgaWYgKF9zY29wZS5pc0lubmVyVGFibGVGb3JtIHx8IChmb3JtTW9kZWwuc2NyaXB0ICYmIGZvcm1Nb2RlbC5zY3JpcHQubGVuZ3RoID4gMCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGRpbmcgZm9ybSBzY3JpcHRpbmcgc2NvcGUnKTtcbiAgICAgIHNjcmlwdGluZ1Njb3BlID0gbmV3IE9iamVjdEZvcm1TY3JpcHRpbmdTY29wZShcbiAgICAgICAgZm9ybU1vZGVsLnNpdHVhdGlvbixcbiAgICAgICAgdGhpcy5fZ2V0U2NyaXB0aW5nTW9kZWxDaGFuZ2VkKF9zY29wZSksXG4gICAgICAgIHRoaXMucGx1Z2luU2VydmljZS5nZXRBcGkoKSxcbiAgICAgICAgX3Njb3BlLmlzSW5uZXJUYWJsZUZvcm1cbiAgICAgICk7XG4gICAgICBzY3JpcHRpbmdTY29wZS5vYmplY3RJZCA9IGZvcm1PcHRpb25zLm9iamVjdElkO1xuICAgIH1cbiAgICBfc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSA9IHNjcmlwdGluZ1Njb3BlO1xuXG5cbiAgICBsZXQgZm9ybSA9IG5ldyBPYmplY3RGb3JtR3JvdXAoe30pO1xuICAgIGlmIChmb3JtTW9kZWwuZWxlbWVudHNbMF0gJiYgZm9ybU1vZGVsLmVsZW1lbnRzWzBdLmVsZW1lbnRzKSB7XG4gICAgICB0aGlzLl9hZGRGb3JtQ29udHJvbChfc2NvcGUsIGZvcm0sIGZvcm1Nb2RlbC5lbGVtZW50c1swXSwgJ2NvcmUnKTtcbiAgICB9XG4gICAgaWYgKGZvcm1Nb2RlbC5lbGVtZW50c1sxXSAmJiBmb3JtTW9kZWwuZWxlbWVudHNbMV0uZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuX2FkZEZvcm1Db250cm9sKF9zY29wZSwgZm9ybSwgZm9ybU1vZGVsLmVsZW1lbnRzWzFdLCAnZGF0YScpO1xuICAgIH1cbiAgICBfc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtID0gZm9ybTtcbiAgICB0aGlzLl9pbml0VmFsaWRhdG9ycyhfc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtLCBfc2NvcGUpO1xuICAgIHRoaXMuX2luaXRTY3JpcHRpbmdTY29wZShfc2NvcGUsIGZvcm1TY3JpcHRTZXJ2aWNlKTtcbiAgICByZXR1cm4gX3Njb3BlLmZvcm1HZW5SZXN1bHQ7XG4gIH1cblxuICBcbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGZvcm0gZWxlbWVudCBvYmplY3QgdG8gYW4gT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyIHdoaWNoIHRoZW4gY2FuIGJlIHVzZWQgdG9cbiAgICogcmVuZGVyIGEgZnJvbSBjb250cm9sLiBSZXN1bHQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEZvcm1FbGVtZW50Q29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIHRoZSBlbGVtZW50IG9iamVjdCBvciBhIGpzb24gc3RyaW5nXG4gICAqIEBwYXJhbSBzaXR1YXRpb24gLSBvcHRpb25hbCBwcm9wZXJ0eSB0byBzZXQgdXAgYSBmb3JtIHNpdHVhdGlvbiBmb3IgdGhlIGNvbnRyb2wgKGRlZmF1bHQgaXMgRURJVClcbiAgICogQHJldHVybiB0aGUgY29udmVydGVkIE9iamVjdEZvcm1Db250cm9sV3JhcHBlciBvciBudWxsIGluIGNhc2Ugb2YgYW4gZXJyb3JcbiAgICovXG4gIGVsZW1lbnRUb0Zvcm1Db250cm9sKGVsZW1lbnQ6IGFueSwgc2l0dWF0aW9uPzogc3RyaW5nKTogT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyIHtcblxuICAgIGxldCBmb3JtRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3JtRWxlbWVudCA9IEpTT04ucGFyc2UoZWxlbWVudCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgZm9ybSBlbGVtZW50IGZyb20ganNvbiAnLCBmb3JtRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1FbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICBpZiAoIWZvcm1FbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIE9iamVjdEZvcm1Db250cm9sV3JhcHBlclxuICAgIGxldCB3cmFwcGVyID0gbmV3IE9iamVjdEZvcm1Db250cm9sV3JhcHBlcih7fSk7XG4gICAgbGV0IGZvcm1TaXR1YXRpb24gPSBzaXR1YXRpb24gPyBzaXR1YXRpb24gOiAnRURJVCc7XG5cbiAgICB3cmFwcGVyLl9lb0Zvcm1Db250cm9sV3JhcHBlciA9IHtcbiAgICAgIGNvbnRyb2xOYW1lOiBmb3JtRWxlbWVudC5uYW1lLFxuICAgICAgc2l0dWF0aW9uOiBmb3JtU2l0dWF0aW9uXG4gICAgfTtcblxuICAgIC8vIGZvciBjb2Rlc3lzdGVtIGVsZW1lbnRzIGFkZCBlbnRyaWVzIGlmIG5vdCB5ZXQgcHJvdmlkZWRcbiAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ0NPREVTWVNURU0nICYmICghZm9ybUVsZW1lbnQuY29kZXN5c3RlbSB8fCAhZm9ybUVsZW1lbnQuY29kZXN5c3RlbS5lbnRyaWVzKSkge1xuICAgICAgZm9ybUVsZW1lbnQuY29kZXN5c3RlbSA9IHRoaXMuc3lzdGVtU2VydmljZS5nZXRDb2Rlc3lzdGVtKGZvcm1FbGVtZW50LmNvZGVzeXN0ZW0uaWQpO1xuICAgIH1cbiAgICAvLyBjcmVhdGUgdGhlIGFjdHVhbCBmb3JtIGNvbnRyb2xcbiAgICBsZXQgY29udHJvbERpc2FibGVkID0gISFmb3JtRWxlbWVudC5yZWFkb25seTtcbiAgICBsZXQgZm9ybUNvbnRyb2wgPSBuZXcgT2JqZWN0Rm9ybUNvbnRyb2woe1xuICAgICAgdmFsdWU6IGZvcm1FbGVtZW50LnZhbHVlLFxuICAgICAgZGlzYWJsZWQ6IGNvbnRyb2xEaXNhYmxlZFxuICAgIH0sIEZvcm1WYWxpZGF0aW9uLmdldFZhbGlkYXRvcnMoZm9ybUVsZW1lbnQsIGZvcm1TaXR1YXRpb24pKTtcblxuICAgIC8vIEZvcm0gZWxlbWVudHMgaW4gU0VBUkNIIHNpdHVhdGlvbiBtYXkgYXJyaXZlIHdpdGggYSB2YWx1ZSBzZXQgdG8gTlVMTCAoZXhwbGljaXQgc2VhcmNoIGZvclxuICAgIC8vIGZpZWxkcyB0aGF0IGFyZSBOT1Qgc2V0KS4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gcHJlcGFyZSB0aGUgZm9ybSBjb250cm9sXG4gICAgaWYgKGZvcm1TaXR1YXRpb24gPT09ICdTRUFSQ0gnICYmIGZvcm1FbGVtZW50LnZhbHVlID09PSBudWxsKSB7XG4gICAgICBmb3JtRWxlbWVudC5pc05vdFNldFZhbHVlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgIHdyYXBwZXIuYWRkQ29udHJvbChmb3JtRWxlbWVudC5uYW1lLCBmb3JtQ29udHJvbCk7XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGRhdGEgZnJvbSBhbiBvYmplY3QgZm9ybSBiYXNlZCBvbiBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtIC0gZm9ybSB0byBleHRyYWN0IGRhdGEgZnJvbVxuICAgKiBAcGFyYW0gc2l0dWF0aW9uIC0gZm9ybSBzaXR1YXRpb25cbiAgICogQHBhcmFtIFtpbml0aWFsRGF0YV0gLSBvcHRpb25hbCBmb3JtIGRhdGEgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgdmFsdWVzIGFnYWluc3RcbiAgICogVGhpcyBpcyByZXF1aXJlZCBmb3IgZWRpdGlnIGluZGV4ZGF0YSAoRURJVCBzaXR1YXRpb24pLCBiZWNhdXNlIHdlIGhhdmUgdG8gY29tcGFyZSBuZXcgdmFsdWVzXG4gICAqIGFnYWluc3QgdGhlIGluaXRpYWwgdmFsdWVzLiBJZiBhIHByb3BlcnR5IHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSBmb3JtcyBpbml0aWFsIGRhdGEgaXMgcmVtb3ZlZFxuICAgKiAoZS5nLiBzZXQgdG8gbnVsbCkgdGhlbiB3ZSBoYXZlIHRvIHNldCB0aGlzIG51bGwgdmFsdWUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBzZXJ2ZXIgd291bGRcbiAgICogaWdub3JlIHRoZSBjaGFuZ2VzLlxuICAgKiBAcGFyYW0gaXNUYWJsZVJvd0VkaXRGb3JtIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBwcm92aWRlZCBmb3JtIGlzIGFuIGlubGluZSBmb3JtIHVzZWQgYnlcbiAgICogYSBmb3JtcyB0YWJsZSBlbGVtZW50IGZvciBlZGl0aW5nIHJvd3MuIFRob3NlIG5lZWQgYSBzcGVjaWFsIGhhbmRsaW5nLlxuICAgKiBAcmV0dXJuIGV4dHJhY3RlZCBkYXRhIGFzIG9iamVjdFxuICAgKi9cbiAgZXh0cmFjdEZvcm1EYXRhKGZvcm06IE9iamVjdEZvcm1Hcm91cCwgc2l0dWF0aW9uOiBzdHJpbmcsIGluaXRpYWxEYXRhPzogYW55LCBpc1RhYmxlUm93RWRpdEZvcm0/OiBib29sZWFuKSB7XG4gICAgbGV0IGV4dHJhY3RlZERhdGEgPSB7fTtcbiAgICB0aGlzLmdldEVsZW1lbnRWYWx1ZXMoZXh0cmFjdGVkRGF0YSwgZm9ybSwgc2l0dWF0aW9uIHx8ICdFRElUJywgaW5pdGlhbERhdGEsIGlzVGFibGVSb3dFZGl0Rm9ybSk7XG4gICAgcmV0dXJuIGV4dHJhY3RlZERhdGE7XG4gIH1cblxuICAvLyBSZWN1cnNpdmUgbWV0aG9kIHRvIGdldCB0aGUgdmFsdWVzIGZyb20gZWFjaCBmb3JtIGNvbnRyb2wuXG4gIHByaXZhdGUgZ2V0RWxlbWVudFZhbHVlcyhkYXRhOiBhbnksIGZvcm1Db250cm9sOiBPYmplY3RGb3JtTW9kZWwsIHNpdHVhdGlvbjogc3RyaW5nLCBpbml0aWFsRGF0YT86IGFueSwgaXNUYWJsZVJvd0VkaXRGb3JtPzogYm9vbGVhbikge1xuXG4gICAgaWYgKCFmb3JtQ29udHJvbCB8fCAhZm9ybUNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIpIHtcblxuICAgICAgY29uc3QgZmM6IGFueSA9IGZvcm1Db250cm9sLmNvbnRyb2xzW2Zvcm1Db250cm9sLl9lb0Zvcm1Db250cm9sV3JhcHBlci5jb250cm9sTmFtZV07XG5cbiAgICAgIGlmIChmYy5fZW9Gb3JtRWxlbWVudC5pc05vdFNldFZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgbWF5IGV4cGxpY2l0bHkgc2V0IHRvIGhhdmUgTlVMTCB2YWx1ZSAoZS5nLiBmcm9tIFNlYXJjaCBmb3JtIGlmIHZhbHVlcyBhcmUgcmVxdWVzdGVkIHRoYXQgaGF2ZSBubyB2YWx1ZXMpXG4gICAgICAgIGlmIChpc1RhYmxlUm93RWRpdEZvcm0pIHtcbiAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZShmYy5fZW9Gb3JtRWxlbWVudC5uYW1lLCBudWxsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZShmYy5fZW9Gb3JtRWxlbWVudC5xbmFtZSwgbnVsbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChmYy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCB2YWwgPSBmYy52YWx1ZTtcblxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBtZXRhIGRhdGEgYXJlIGFsc28gdXAgdG8gZGF0ZVxuICAgICAgICBpZiAoZmMuX2VvRm9ybUVsZW1lbnQudHlwZSA9PT0gJ0NPREVTWVNURU0nKSB7XG4gICAgICAgICAgY29uc3QgY3MgPSB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Q29kZXN5c3RlbShmYy5fZW9Gb3JtRWxlbWVudC5jb2Rlc3lzdGVtLmlkKTtcbiAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5kYXRhTWV0YSA9IGNzLmVudHJpZXMuZmluZChlID0+IGUuZGF0YSA9PT0gdmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2l0dWF0aW9uKSB7XG4gICAgICAgICAgY2FzZSAnU0VBUkNIJzoge1xuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyByb3cgZWRpdGluZyBmb3JtcyB1c2UgdGhlIG5hbWUgaW5zdGVhZCBvZiB0aGUgcW5hbWUgYmVjYXVzZSBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgIC8vIHRhYmxlcyBncmlkIGlzbid0IGFibGUgdG8gbWFwIHRoZSBmaWVsZHNcbiAgICAgICAgICAgICAgaWYgKCFpc1RhYmxlUm93RWRpdEZvcm0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFWYWx1ZShmYy5fZW9Gb3JtRWxlbWVudC5xbmFtZSwgdmFsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlKGZjLl9lb0Zvcm1FbGVtZW50Lm5hbWUsIHZhbCwgZGF0YSwgZmMuX2VvRm9ybUVsZW1lbnQsIGlzVGFibGVSb3dFZGl0Rm9ybSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ0NSRUFURSc6IHtcbiAgICAgICAgICAgIC8vIGFsc28gYWRkIE5VTEwgdmFsdWVzIChvdmVycmlkZSBleGlzdGluZyBkZWZhdWx0dmFsdWVzKVxuICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQubmFtZSwgdmFsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ0VESVQnOiB7XG4gICAgICAgICAgICAvLyBpbiBlZGl0IHNpdHVhdGlvbiB3ZSBoYXZlIHRvIGNvbXBhcmUgbmV3IHZhbHVlcyBhZ2FpbnN0IHRoZSBpbml0aWFsIHZhbHVlc1xuICAgICAgICAgICAgLy8gSWYgYSBwcm9wZXJ0eSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgZm9ybXMgaW5pdGlhbCBkYXRhIGlzIHJlbW92ZWQgKGUuZy4gc2V0IHRvIG51bGwpXG4gICAgICAgICAgICAvLyB0aGVuIHdlIGhhdmUgdG8gc2V0IHRoaXMgbnVsbCB2YWx1ZSwgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHNlcnZlciB3aWxsIGlnbm9yZSB0aGUgY2hhbmdlc1xuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCB8fCAoaW5pdGlhbERhdGEgJiYgaW5pdGlhbERhdGFbZmMuX2VvRm9ybUVsZW1lbnQubmFtZV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgLy8gZGF0YVtmYy5fZW9Gb3JtRWxlbWVudC5uYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhVmFsdWUoZmMuX2VvRm9ybUVsZW1lbnQubmFtZSwgdmFsLCBkYXRhLCBmYy5fZW9Gb3JtRWxlbWVudCwgaXNUYWJsZVJvd0VkaXRGb3JtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5rZXlzKGZvcm1Db250cm9sLmNvbnRyb2xzKVxuICAgICAgICAuZm9yRWFjaChjb250cm9sS2V5ID0+IHtcbiAgICAgICAgICBsZXQgZm9ybUNvbnRyb2xLZXllZCA9IDxPYmplY3RGb3JtR3JvdXA+Zm9ybUNvbnRyb2wuY29udHJvbHNbY29udHJvbEtleV07XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50VmFsdWVzKGRhdGEsIGZvcm1Db250cm9sS2V5ZWQsIHNpdHVhdGlvbiwgaW5pdGlhbERhdGEsIGlzVGFibGVSb3dFZGl0Rm9ybSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0YVZhbHVlKGtleSwgdmFsdWUsIGRhdGEsIGZvcm1FbGVtZW50LCBpc1RhYmxlUm93RWRpdEZvcm0pIHtcbiAgICBkYXRhW2tleV0gPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlLCBmb3JtRWxlbWVudCk7XG5cbiAgICBpZiAoaXNUYWJsZVJvd0VkaXRGb3JtICYmIGZvcm1FbGVtZW50LmRhdGFNZXRhKSB7XG4gICAgICAvLyBpbm5lciB0YWJsZXMgbmVlZCB0byBzZXQgdXAgdGhlIG1ldGEgZGF0YSBhcyB3ZWxsXG4gICAgICBkYXRhW2tleSArICdfbWV0YSddID0gZm9ybUVsZW1lbnQuZGF0YU1ldGE7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0VmFsdWUodmFsdWUsIGZvcm1FbGVtZW50KSB7XG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdEQVRFVElNRScgJiYgIWZvcm1FbGVtZW50LndpdGh0aW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAneXl5eS1NTS1kZCcpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJhbmdlVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVZhbHVlKFxuICAgICAgICAgIHZhbHVlLm9wZXJhdG9yLFxuICAgICAgICAgIHZhbHVlLmZpcnN0VmFsdWUgJiYgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUuZmlyc3RWYWx1ZSwgJ3l5eXktTU0tZGQnKSxcbiAgICAgICAgICB2YWx1ZS5zZWNvbmRWYWx1ZSAmJiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZS5zZWNvbmRWYWx1ZSwgJ3l5eXktTU0tZGQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAoZm9ybUVsZW1lbnQuZWxlbWVudHMgfHwgW10pLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAodmFsdWUgfHwgW10pLmZvckVhY2godiA9PiB2W2VsLm5hbWVdID0gdGhpcy5mb3JtYXRWYWx1ZSh2W2VsLm5hbWVdLCBlbCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG5cbiAgLy8gRnVuY3Rpb25zIGludm9sdmVkIGluIGJ1aWxkaW5nIGFuIG9iamVjdCBmb3JtXG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBtZXRob2QgYWRkaW5nIGEgbmV3IFVudHlwZWRGb3JtQ29udHJvbCAoZ3JvdXAgb3IgY29udHJvbCkgdG8gYSBwYXJlbnQgZm9ybSBncm91cFxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50R3JvdXAgLSB0aGUgcGFyZW50IGdyb3VwIHRvIGFkZCB0aGUgY29udHJvbCB0b1xuICAgKiBAcGFyYW0gZm9ybUVsZW1lbnQgLSB0aGUgZW5haW8gZm9ybSBtb2RlbCBlbGVtZW50IHRvIGNyZWF0ZSB0aGUgY2hpbGQgY29udHJvbCBmcm9tXG4gICAqIEBwYXJhbSBbdXNlTmFtZV0gLSB1c2UgdGhpcyBuYW1lIGluc3RlYWQgb2YgdGhlIG9uZSBmcm9tIHRoZSBtb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkRm9ybUNvbnRyb2woc2NvcGU6IEZvcm1HZW5TY29wZSwgcGFyZW50R3JvdXA6IE9iamVjdEZvcm1Hcm91cCwgZm9ybUVsZW1lbnQ6IGFueSwgdXNlTmFtZT86IHN0cmluZykge1xuXG4gICAgbGV0IGN0cmw7XG4gICAgbGV0IG5hbWU7XG5cbiAgICAvLyBhZGQgYSBmb3JtIGdyb3VwXG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdvMm1Hcm91cCcgfHwgZm9ybUVsZW1lbnQudHlwZSA9PT0gJ28ybUdyb3VwU3RhY2snKSB7XG5cbiAgICAgIC8vIGRvIG5vdCBhZGQgZ3JvdXBzIHRoYXQgYXJlIGVtcHR5XG4gICAgICBpZiAoIWZvcm1FbGVtZW50LmVsZW1lbnRzIHx8IGZvcm1FbGVtZW50LmVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRm91bmQgZW1wdHkgZm9ybSBncm91cCcsIGZvcm1FbGVtZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjdHJsID0gbmV3IE9iamVjdEZvcm1Hcm91cCh7fSk7XG4gICAgICBjdHJsLl9lb0Zvcm1Hcm91cCA9IHtcbiAgICAgICAgbGFiZWw6IGZvcm1FbGVtZW50LmxhYmVsLFxuICAgICAgICAvL2xheW91dGdyb3VwOiBmb3JtRWxlbWVudC5sYXlvdXRncm91cCxcbiAgICAgICAgbGF5b3V0OiBmb3JtRWxlbWVudC5sYXlvdXQsXG4gICAgICAgIHR5cGU6IGZvcm1FbGVtZW50LnR5cGVcbiAgICAgIH07XG5cbiAgICAgIGlmICh1c2VOYW1lID09PSAnY29yZScgfHwgdXNlTmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgIGN0cmwuX2VvRm9ybUdyb3VwLmxhYmVsID0gdXNlTmFtZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgZSBvZiBmb3JtRWxlbWVudC5lbGVtZW50cykge1xuICAgICAgICB0aGlzLl9hZGRGb3JtQ29udHJvbChzY29wZSwgY3RybCwgZSk7XG4gICAgICB9XG4gICAgICBuYW1lID0gdXNlTmFtZSB8fCAnZmcnICsgc2NvcGUuZ0NvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkZCBmb3JtIGNvbnRyb2xcbiAgICAgIC8vIFRvIGJlIGFibGUgdG8gaW50ZWdyYXRlIHJlY3Vyc2l2ZSBmb3JtIGNvbnRyb2xzIGludG8gdGhlIG1haW4gZm9ybSxcbiAgICAgIC8vIHdlIGhhdmUgdG8gd3JhcCB0aGVtIGluIGEgZm9ybSBncm91cFxuICAgICAgY3RybCA9IG5ldyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIoe30pO1xuICAgICAgY3RybC5fZW9Gb3JtQ29udHJvbFdyYXBwZXIgPSB7XG4gICAgICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIFVudHlwZWRGb3JtQ29udHJvbFxuICAgICAgICBjb250cm9sTmFtZTogZm9ybUVsZW1lbnQubmFtZSxcbiAgICAgICAgc2l0dWF0aW9uOiBzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwuc2l0dWF0aW9uXG4gICAgICB9O1xuICAgICAgaWYgKHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5zaXR1YXRpb24gPT09ICdTRUFSQ0gnICYmIGZvcm1FbGVtZW50LnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGZvcm1FbGVtZW50LmlzTm90U2V0VmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gZG8gbm90IHNldCBhIHJlZmVyZW5jZSBhcyB0aGUgZm9ybSBjb250cm9scyB2YWx1ZVxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGNvdWxkIG5vdCByZXNldCB0aGUgZm9ybVxuICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtRWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgLy8gY29weSBieSB2YWx1ZSBmb3IgYXJyYXlzIG9mIG9iamVjdHMgKGUuZy4gdGFibGUgZGF0YSlcbiAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUuZm9yRWFjaCgobykgPT4ge1xuICAgICAgICAgIHZhbHVlLnB1c2goVXRpbHMuZm9ybURhdGFQYXJzZShVdGlscy5mb3JtRGF0YVN0cmluZ2lmeShvKSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZm9ybUVsZW1lbnQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvciBjb2Rlc3lzdGVtIGVsZW1lbnRzIGFkZCBlbnRyaWVzIGlmIG5vdCB5ZXQgcHJvdmlkZWRcbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnQ09ERVNZU1RFTScgJiYgIWZvcm1FbGVtZW50LmNvZGVzeXN0ZW0uZW50cmllcykge1xuICAgICAgICBmb3JtRWxlbWVudC5jb2Rlc3lzdGVtID0gdGhpcy5zeXN0ZW1TZXJ2aWNlLmdldENvZGVzeXN0ZW0oZm9ybUVsZW1lbnQuY29kZXN5c3RlbS5pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSB0aGUgYWN0dWFsIGZvcm0gY29udHJvbFxuICAgICAgbGV0IGNvbnRyb2xEaXNhYmxlZCA9IHNjb3BlLmZvcm1PcHRpb25zLmRpc2FibGVkIHx8ICEhZm9ybUVsZW1lbnQucmVhZG9ubHk7XG4gICAgICBsZXQgZm9ybUNvbnRyb2wgPSBuZXcgT2JqZWN0Rm9ybUNvbnRyb2woe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGRpc2FibGVkOiBjb250cm9sRGlzYWJsZWRcbiAgICAgIH0pO1xuXG4gICAgICBmb3JtRWxlbWVudC5yZWFkb25seSA9IGNvbnRyb2xEaXNhYmxlZDtcblxuICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQgPSBmb3JtRWxlbWVudDtcbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybUNvbnRyb2xzW2Zvcm1FbGVtZW50Lm5hbWVdID0gZm9ybUNvbnRyb2w7XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnQ09ERVNZU1RFTScgfHwgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdTVFJJTkcnICYmIGZvcm1FbGVtZW50LmNsYXNzaWZpY2F0aW9uID09PSAnc2VsZWN0b3InKSkge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5hcHBseUZpbHRlciA9IChmdW5jOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmZpbHRlckZ1bmN0aW9uID0gZnVuYztcbiAgICAgICAgfTtcbiAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuYXBwbHlEaXNhYmxpbmdGaWx0ZXIgPSAoZnVuYzogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5kaXNhYmxpbmdGaWx0ZXJGdW5jdGlvbiA9IGZ1bmM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnU1RSSU5HJyAmJiBmb3JtRWxlbWVudC5jbGFzc2lmaWNhdGlvbiA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5zZXRMaXN0ID0gKGxpc3RPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50Lmxpc3QgPSBsaXN0T2JqZWN0O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ09SR0FOSVpBVElPTicpIHtcbiAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuc2V0RmlsdGVyID0gKGZpbHRlck9iamVjdDogYW55KSA9PiB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZmlsdGVyID0gZmlsdGVyT2JqZWN0O1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5vYmplY3QgPSBzY29wZS5mb3JtT3B0aW9ucy5vYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnUkVGRVJFTkNFJykge1xuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5zZXRRdWVyeUZpbHRlcnMgPSAocXVlcnlGaWx0ZXJzT2JqZWN0OiB7W2ZpZWxkUW5hbWU6IHN0cmluZ106IHtvOiBzdHJpbmcsIHYxOiBhbnksIHYyOiBhbnl9fSwgb2JqZWN0VHlwZXM/OiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnF1ZXJ5RmlsdGVycyA9IHF1ZXJ5RmlsdGVyc09iamVjdDtcbiAgICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5vYmplY3RUeXBlc0ZpbHRlciA9IG9iamVjdFR5cGVzO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcGUuZm9ybU9wdGlvbnMuZm9ybU1vZGVsLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgICAgLy8gaW4gc2VhcmNoIHNpdHVhdGlvbiBldmVuIHJlYWRvbmx5IGZpZWxkcyBzaG91bGQgYmUgZWRpdGFibGUgLi4uXG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnJlYWRvbmx5ID0gZmFsc2U7XG4gICAgICAgIC8vIC4uLiBhbmQgcmVxdWlyZWQgbWFrZXMgbm8gc2Vuc2UgaGVyZVxuICAgICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5yZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyByZW1vdmUgZW1wdHkgZGVzY3JpcHRpb25zXG4gICAgICBsZXQgZGVzYyA9IGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmb3JtIGVsZW1lbnQgdG8gdGhlIHNjcmlwdCBtb2RlbCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgaW50b1xuICAgICAgLy8gdGhlIGZvcm1zIHNjcmlwdGluZyBzY29wZSBsYXRlciBvblxuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRNb2RlbFtmb3JtRWxlbWVudC5uYW1lXSA9IGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50O1xuXG4gICAgICAvLyBhcHBseSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhlIGZvcm0gY29udHJvbCwgdGhhdCB3aWxsIHRyaWdnZXJcbiAgICAgIC8vIHRoZSBmb3JtIGVsZW1lbnRzIG9uQ2hhbmdlIGxpc3RlbmVyXG4gICAgICBsZXQgY29udHJvbFdhdGNoID0gY3RybC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoZm9ybUVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJyA/IDAgOiA1MDApKTtcbiAgICAgIGNvbnRyb2xXYXRjaC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgaWYgKGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnR5cGUgPT09ICdSRUZFUkVOQ0UnKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0RGF0YU1ldGEoZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQsIHZbZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQubmFtZV0pLnN1YnNjcmliZShtID0+IHtcbiAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRhdGFNZXRhID0gZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQubXVsdGlzZWxlY3QgPyBtIDogbVswXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC5kYXRhTWV0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSkge1xuICAgICAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUubW9kZWxDaGFuZ2VkKHYpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuY29udHJvbFZhbHVlU3Vic2NyaXB0aW9ucy5wdXNoKGNvbnRyb2xXYXRjaCk7XG5cbiAgICAgIGN0cmwuYWRkQ29udHJvbChmb3JtRWxlbWVudC5uYW1lLCBmb3JtQ29udHJvbCk7XG4gICAgICBuYW1lID0gJ2ZnXycgKyBmb3JtRWxlbWVudC5uYW1lO1xuICAgIH1cbiAgICBwYXJlbnRHcm91cC5hZGRDb250cm9sKG5hbWUsIGN0cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGRhdGEgaW50byBhIGZvcm0gbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIGZvcm0gbW9kZWxcbiAgICogQHBhcmFtIGRhdGEgLSBkYXRhIG9iamVjdCBvciBhcnJheSBvZiBTZWFyY2hGaWx0ZXIgb2JqZWN0cyBpbiBjYXNlIG9mIGEgc2VhcmNoIGZvcm1cbiAgICovXG4gIHByaXZhdGUgX2RhdGFUb0Zvcm0oc2NvcGU6IEZvcm1HZW5TY29wZSwgbW9kZWw6IGFueSwgZGF0YTogYW55KSB7XG4gICAgaWYgKG1vZGVsICYmIGRhdGEpIHtcbiAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZXMoc2NvcGUsIG1vZGVsLmVsZW1lbnRzLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlIG1ldGhvZCBmb3IgYWRkaW5nIHZhbHVlcyB0byBtb2RlbCBlbGVtZW50c1xuICBwcml2YXRlIF9zZXRFbGVtZW50VmFsdWVzKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGVsZW1lbnRzLCBkYXRhKSB7XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKHRoaXMuX2hhc1ZhbHVlKGRhdGEsIGVsZW1lbnQpKSB7XG5cbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IHRoaXMuX2dldFZhbHVlKHNjb3BlLCBkYXRhLCBlbGVtZW50KTtcbiAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAvLyBhZGQgbWV0YSBkYXRhIGZvciBzb21lIG9mIHRoZSB0eXBlc1xuICAgICAgICAgIHRoaXMuX2ZldGNoTWV0YURhdGEoc2NvcGUsIGRhdGEsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZWxlbWVudC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50LnR5cGUgIT09ICdUQUJMRScgJiYgZWxlbWVudC5lbGVtZW50cyAmJiBlbGVtZW50LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlcyhzY29wZSwgZWxlbWVudC5lbGVtZW50cywgZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBpbiBzb21lIGNhc2VzIHJlcXVpcmVkIG1ldGEgZGF0YSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiB0aGUgZWxlbWVudCBpdHNlbGZcbiAgLy8gc28gdGhleSBoYXZlIHRvIGJlIGZldGNoZWQgYW5kIGFkZGVkIHRvIHRoZSBlbGVtZW50IGZvciB0aGUgZm9ybSB0byBiZSBhYmxlXG4gIC8vIHRvIHJlbmRlciB0aGUgZWxlbWVudCBjb3JyZWN0bHlcbiAgcHJpdmF0ZSBfZmV0Y2hNZXRhRGF0YShzY29wZTogRm9ybUdlblNjb3BlLCBkYXRhLCBlbGVtZW50KSB7XG5cbiAgICBpZiAoc2NvcGUuZm9ybU9wdGlvbnMuZm9ybU1vZGVsLnNpdHVhdGlvbiA9PT0gJ1NFQVJDSCcpIHtcbiAgICAgIC8vIHRvZG86IGhvdyB0byBmZXRjaCBtZXRhIGRhdGEgaW4gc2VhcmNoIHNpdHVhdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnT1JHQU5JWkFUSU9OJyAmJiBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddKSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YU1ldGEgPSBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdDT0RFU1lTVEVNJyAmJiBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddKSB7XG4gICAgICAgIGVsZW1lbnQuZGF0YU1ldGEgPSBkYXRhW2VsZW1lbnQubmFtZSArICdfbWV0YSddO1xuICAgICAgICBlbGVtZW50LmRlZmF1bHRyZXByZXNlbnRhdGlvbiA9IGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ10uZGVmYXVsdHJlcHJlc2VudGF0aW9uO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdSRUZFUkVOQ0UnICYmIGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ10pIHtcbiAgICAgICAgZWxlbWVudC5kYXRhTWV0YSA9IGRhdGFbZWxlbWVudC5uYW1lICsgJ19tZXRhJ107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGF0YU1ldGEoZm9ybUVsZW1lbnQ6IGFueSwgbmV3VmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgIHN3aXRjaCAoZm9ybUVsZW1lbnQudHlwZSkge1xuICAgICAgICBjYXNlICdPUkdBTklaQVRJT04nOiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3lzdGVtU2VydmljZS5nZXRPcmdhbml6YXRpb25PYmplY3QobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JFRkVSRU5DRSc6IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VTZXJ2aWNlLmZldGNoSURSZWZlcmVuY2VNZXRhRGF0YShBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSA/IG5ld1ZhbHVlIDogW25ld1ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ09ERVNZU1RFTSc6IHtcbiAgICAgICAgICByZXR1cm4gb2YodGhpcy5zeXN0ZW1TZXJ2aWNlLmdldENvZGVzeXN0ZW0oZm9ybUVsZW1lbnQuY29kZXN5c3RlbS5pZCkuZW50cmllcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmRlZmF1bHRyZXByZXNlbnRhdGlvbiA9PT0gbmV3VmFsdWU7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhc1ZhbHVlKGRhdGEsIGVsZW1lbnQpIHtcblxuICAgIC8vIGRpZmZlciBiZXR3ZWVuIGFycmF5IG9mIFNlYXJjaEZpbHRlcnMgYW5kIGEgZm9ybSBkYXRhIG9iamVjdFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAgIHJldHVybiAhIShkYXRhLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLnByb3BlcnR5LnN0YXJ0c1dpdGgoZWxlbWVudC5xbmFtZSkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhIShkYXRhLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLnByb3BlcnR5ID09PSBlbGVtZW50LnFuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkYXRhLmhhc093blByb3BlcnR5KGVsZW1lbnQubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmFsdWUoc2NvcGU6IEZvcm1HZW5TY29wZSwgZGF0YSwgZWxlbWVudCkge1xuXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChzY29wZS5mb3JtT3B0aW9ucy5mb3JtTW9kZWwuc2l0dWF0aW9uID09PSAnU0VBUkNIJykge1xuICAgICAgaWYgKHNjb3BlLmlzSW5uZXJUYWJsZUZvcm0pIHtcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ0RBVEVUSU1FJyB8fCBlbGVtZW50LnR5cGUgPT09ICdOVU1CRVInKSB7XG4gICAgICAgICAgdmFsdWUgPSBTZWFyY2hTZXJ2aWNlLnRvUmFuZ2VWYWx1ZShkYXRhW2VsZW1lbnQubmFtZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gZGF0YVtlbGVtZW50Lm5hbWVdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1RBQkxFJykge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuc2VhcmNoU2VydmljZS50YWJsZUZpbHRlcnNUb0VsZW1lbnRWYWx1ZSh0aGlzLl9nZXRUYWJsZUZpbHRlcnMoZGF0YSwgZWxlbWVudC5xbmFtZSksIGVsZW1lbnQuZWxlbWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gZGF0YS5maW5kKGYgPT4gZi5wcm9wZXJ0eSA9PT0gZWxlbWVudC5xbmFtZSk7XG4gICAgICAgIHZhbHVlID0gdGhpcy5zZWFyY2hTZXJ2aWNlLmZpbHRlclRvRWxlbWVudFZhbHVlKGZpbHRlciwgZWxlbWVudC50eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuXG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnREFURVRJTUUnICYmIGRhdGFbZWxlbWVudC5uYW1lXSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKGAke2RhdGFbZWxlbWVudC5uYW1lXX0ke2VsZW1lbnQud2l0aHRpbWUgPyAnJyA6ICdUMDA6MDA6MDAnfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBkYXRhW2VsZW1lbnQubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRhYmxlRmlsdGVycyhmaWx0ZXJzOiBTZWFyY2hGaWx0ZXJbXSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBTZWFyY2hGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIGZpbHRlcnMuZmlsdGVyKGYgPT4gZi5wcm9wZXJ0eS5zdGFydHNXaXRoKHByb3BlcnR5TmFtZSArICcuJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZhbGlkYXRvcnMoZm9ybUNvbnRyb2w6IE9iamVjdEZvcm1Hcm91cCwgc2NvcGU6IEZvcm1HZW5TY29wZSkge1xuICAgIGlmIChmb3JtQ29udHJvbCkge1xuICAgICAgZm9yIChsZXQga2V5IGluIGZvcm1Db250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtQ29udHJvbC5jb250cm9sc1trZXldIGFzIGFueTtcbiAgICAgICAgaWYgKGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICB0aGlzLl9pbml0VmFsaWRhdG9ycyhjb250cm9sLCBzY29wZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NvcGUuaW5pdGlhbFZhbGlkYXRvcnNbY29udHJvbC5fZW9Gb3JtRWxlbWVudC5uYW1lXSA9IGNvbnRyb2wudmFsaWRhdG9yO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoXG4gICAgICAgICAgICB0aGlzLl9nZXRWYWxpZGF0b3JzKHNjb3BlLCBjb250cm9sLl9lb0Zvcm1FbGVtZW50KS5jb25jYXQoXG4gICAgICAgICAgICAgIFtzY29wZS5pbml0aWFsVmFsaWRhdG9yc1tjb250cm9sLl9lb0Zvcm1FbGVtZW50Lm5hbWVdXSlcbiAgICAgICAgICApKTtcbiAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIEJ1aWxkIHZhbGlkYXRvcnMgZm9yIHRoZSBnaXZlbiBmb3JtIGVsZW1lbnQgdG8gYmUgYXR0YWNoZWQgdG9cbiAgKiBhIHJlYWN0aXZlIGZvcm1Db250cm9sLlxuICAqXG4gICogQHBhcmFtIGZvcm1FbGVtZW50IC0gZm9ybSBlbGVtZW50IG9iamVjdFxuICAqL1xuICBwcml2YXRlIF9nZXRWYWxpZGF0b3JzKHNjb3BlOiBGb3JtR2VuU2NvcGUsIGZvcm1FbGVtZW50OiBhbnkpOiBWYWxpZGF0b3JGbltdIHtcbiAgICBsZXQgZWxtVmFsaWRhdG9ycyA9IEZvcm1WYWxpZGF0aW9uLmdldFZhbGlkYXRvcnMoZm9ybUVsZW1lbnQsIHNjb3BlLmZvcm1PcHRpb25zLmZvcm1Nb2RlbC5zaXR1YXRpb24pO1xuICAgIC8vIGFkZCBjdXN0b20gdmFsaWRhdG9yIGZvciBzY3JpcHQgZW5hYmxlZCBmb3Jtc1xuICAgIGlmIChzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlKSB7XG4gICAgICBlbG1WYWxpZGF0b3JzLnB1c2goRm9ybVZhbGlkYXRpb24uY3VzdG9tU2NyaXB0aW5nVmFsaWRhdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsbVZhbGlkYXRvcnM7XG4gIH1cblxuICBwcml2YXRlIF9pbml0U2NyaXB0aW5nU2NvcGUoc2NvcGU6IEZvcm1HZW5TY29wZSwgZm9ybVNjcmlwdFNlcnZpY2U6IE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlKSB7XG4gICAgbGV0IHtkYXRhLCBhY3Rpb25zLCBvYmplY3RzLCBjb250ZXh0fSA9IDxPYmplY3RGb3JtT3B0aW9ucz4oc2NvcGUuZm9ybU9wdGlvbnMgfHwge30pO1xuXG4gICAgaWYgKHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUpIHtcbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUuc2V0TW9kZWwoc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRNb2RlbCk7XG4gICAgICAvKiogcHJvdmlkZSBhY2Nlc3MgdG8gYWN0aW9ucyAodXNlZCBpbnNpZGUgb2YgQlBNLUZvcm1zKSAqL1xuICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZS5hY3Rpb25zID0gYWN0aW9ucztcbiAgICAgIC8qKiBwcm92aWRlIGFjY2VzcyB0byBhZGRpdGlvbmFsIG9iamVjdHMgKHVzZWQgZm9yIGV4YW1wbGUgaW4gQlBNLVN0YXJ0LUZvcm1zIHRvXG4gICAgICAgKiBhZGQgZGF0YSBvZiBETVMtT2JqZWN0cyB0byBzdGFydCB0aGUgcHJvY2VzcyBmb3IpXG4gICAgICAgKi9cbiAgICAgIHNjb3BlLmZvcm1HZW5SZXN1bHQuc2NyaXB0aW5nU2NvcGUub2JqZWN0cyA9IG9iamVjdHM7XG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgLyoqIHByb3ZpZGUgcmVhZG9ubHkgYWNjZXNzIHRvIGluaXRpYWwgZm9ybSBkYXRhICh3aGljaCBtYXkgYWxzbyBjb250YWluIHZhbHVlcyB0aGF0XG4gICAgICAgKiBhcmUgbm90IHJlbmRlcmVkIGFzIGZvcm0gZWxlbWVudHMgKGludmlzaWJsZSB2YWx1ZXMpKVxuICAgICAgICovXG4gICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LnNjcmlwdGluZ1Njb3BlLmRhdGEgPSBkYXRhO1xuXG4gICAgICAvKiogYnkgZGVmYXVsdCwgc2NyaXB0aW5nIHNjb3BlcyBhcmUgYXBwbGllZCB0byBmb3Jtcy4gQnV0IHRhYmxlIGVsZW1lbnRzIGNyZWF0ZSB0aGVpciBvd24gc2NvcGVcbiAgICAgICAqIGZvciBlZGl0aW5nIHJvd3MuIEJlaW5nIG9uZSBvZiB0aG9zZSBpbm5lciBmb3JtcyBzaG91bGQgbm90IHJ1biB0aGUgZm9ybSBzY3JpcHQgYWdhaW4sIGJ1dFxuICAgICAgICogaW5zdGVhZCBqdXN0IHByb3ZpZGUgdGhlIG9ic2VydmluZyBhYmlsaXRpZXMgb2YgdGhlIHNjcmlwdGluZyBzY29wZS5cbiAgICAgICAqL1xuICAgICAgaWYgKCFzY29wZS5mb3JtT3B0aW9ucy5kaXNhYmxlZCAmJiAhc2NvcGUuaXNJbm5lclRhYmxlRm9ybSAmJiBzY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbCkge1xuICAgICAgICBjb25zdCBzY3JpcHROYW1lID0gc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtTW9kZWwubmFtZSArICdfJyArIHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybU1vZGVsLnNpdHVhdGlvbjtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2V4ZWN1dGluZyBmb3JtIHNjcmlwdCAnICsgc2NyaXB0TmFtZSk7XG4gICAgICAgIGZvcm1TY3JpcHRTZXJ2aWNlLnJ1bkZvcm1TY3JpcHQoXG4gICAgICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5zY3JpcHRpbmdTY29wZSxcbiAgICAgICAgICBzY29wZS5mb3JtR2VuUmVzdWx0LmZvcm1Nb2RlbC5zY3JpcHQsXG4gICAgICAgICAgc2NyaXB0TmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgc2NyaXB0IGNoYW5nZXMgaXRzIGludGVybmFsIG1vZGVsLlxuICAgICAqIEl0IGlzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIHNjcmlwdCBjaGFuZ2VzIHRvIHRoZSBhY3R1YWwgZm9ybSBtb2RlbC5cbiAgICAgKlxuICAgICAqIFRvIGVuc3VyZSB0aGUgcmlnaHQgY29udGV4dCwgd2UgZGVmaW5lIGFuIGluc3RhbmNlIG1ldGhvZCBhcyBjYWxsYmFjayBmb3IgdGhlIHNjcmlwdGluZyBzY29wZVxuICAgICAqIEBzZWU6IGh0dHBzOi8vYmxvZy5qb2hubnlyZWlsbHkuY29tLzIwMTQvMDQvdHlwZXNjcmlwdC1pbnN0YW5jZS1tZXRob2RzLmh0bWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JtQ29udHJvbE5hbWVcbiAgICAgKiBAcGFyYW0gY2hhbmdlXG4gICAgICovXG5cbiAgcHJpdmF0ZSBfZ2V0U2NyaXB0aW5nTW9kZWxDaGFuZ2VkKHNjb3BlOiBGb3JtR2VuU2NvcGUpOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIChmb3JtQ29udHJvbE5hbWUsIGNoYW5nZSkgPT4ge1xuXG4gICAgICAvLyBmaW5kIHRoZSB0YXJnZXQgY29udHJvbFxuICAgICAgbGV0IGZjOiBPYmplY3RGb3JtQ29udHJvbCA9IHNjb3BlLmZvcm1HZW5SZXN1bHQuZm9ybUNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0gYXMgT2JqZWN0Rm9ybUNvbnRyb2w7XG4gICAgICBpZiAoZmMpIHtcblxuICAgICAgICAvLyBjaGFuZ2Ugb25seSBhbGxvd2VkIHByb3BlcnRpZXNcbiAgICAgICAgc3dpdGNoIChjaGFuZ2UubmFtZSkge1xuICAgICAgICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzQXJyYXlWYWx1ZUNoYW5nZShmYywgY2hhbmdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZmMudmFsdWUgIT09IGNoYW5nZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZjLnBhdGNoVmFsdWUoY2hhbmdlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgZmMubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuZm9ybUdlblJlc3VsdC5mb3JtLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVxdWlyZWQnOiB7XG4gICAgICAgICAgICBpZiAoZmMuX2VvRm9ybUVsZW1lbnQucmVxdWlyZWQgIT09IGNoYW5nZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5yZXF1aXJlZCA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgICAgLy8gYXBwbHkgbmV3IHZhbGlkYXRvcnNcbiAgICAgICAgICAgICAgLy8gQHNlZTogaHR0cHM6Ly9zY290Y2guaW8vdHV0b3JpYWxzL2hvdy10by1pbXBsZW1lbnQtY29uZGl0aW9uYWwtdmFsaWRhdGlvbi1pbi1hbmd1bGFyLTItbW9kZWwtZHJpdmVuLWZvcm1zXG4gICAgICAgICAgICAgIGZjLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKHRoaXMuX2dldFZhbGlkYXRvcnMoc2NvcGUsIGZjLl9lb0Zvcm1FbGVtZW50KS5jb25jYXQoW3Njb3BlLmluaXRpYWxWYWxpZGF0b3JzW2ZjLl9lb0Zvcm1FbGVtZW50Lm5hbWVdXSkpKTtcbiAgICAgICAgICAgICAgLy8gbmVlZCB0byBtYXJrIGZvcm0gY29udHJvbCBhcyB0b3VjaGVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGZvcm0gdmFsaWRhdGlvbiB3aWxsIG5vdCBzaG93XG4gICAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICAgIGZjLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgICAgZmMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlYWRvbmx5Jzoge1xuICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQucmVhZG9ubHkgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLm5ld1ZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGZjLmRpc2FibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZjLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGZjLl9lb0Zvcm1FbGVtZW50LmVycm9yKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5lcnJvciA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgICAgZmMubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbmV3IG9ucm93ZWRpdCBmdW5jdGlvbiB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgICAgY2FzZSAnb25yb3dlZGl0Jzoge1xuICAgICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQub25yb3dlZGl0ID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG5ldyBvbmNoYW5nZSBmdW5jdGlvbiB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgICAgY2FzZSAnb25jaGFuZ2UnOiB7XG4gICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5vbmNoYW5nZSA9IGNoYW5nZS5uZXdWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBuZXcgY29udGV4dElkIHdhcyBhcHBsaWVkIGJ5IHRoZSBzY3JpcHRcbiAgICAgICAgICBjYXNlICdjb250ZXh0SWQnOiB7XG4gICAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5jb250ZXh0SWQgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzQXJyYXlWYWx1ZUNoYW5nZShmYywgY2hhbmdlKSB7XG4gICAgY29uc3QgbmV3VmFsID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBmYy5fZW9Gb3JtRWxlbWVudC50eXBlO1xuICAgIC8vIGZvciBzb21lIHR5cGVzIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgbWV0YSBkYXRhIGFyZSBwcm92aWRlZCBhcyB3ZWxsXG4gICAgc3dpdGNoICh0YXJnZXRUeXBlKSB7XG4gICAgICBjYXNlICdPUkdBTklaQVRJT04nOiB7XG4gICAgICAgIHRoaXMuX2dldERhdGFNZXRhKGZjLl9lb0Zvcm1FbGVtZW50LCBuZXdWYWwpLnN1YnNjcmliZShtID0+IHtcbiAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5kYXRhTWV0YSA9IG07XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NPREVTWVNURU0nOiB7XG4gICAgICAgIGlmICghZmMuX2VvRm9ybUVsZW1lbnQuY29kZXN5c3RlbS5lbnRyaWVzKSB7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQuY29kZXN5c3RlbSA9IHRoaXMuc3lzdGVtU2VydmljZS5nZXRDb2Rlc3lzdGVtKGZjLl9lb0Zvcm1FbGVtZW50LmNvZGVzeXN0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVEFCTEUnOiB7XG4gICAgICAgIGNvbnN0IGRhdGFUb0JlUHJvY2Vzc2VkID0ge307XG4gICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmVsZW1lbnRzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ09SR0FOSVpBVElPTicgfHwgZS50eXBlID09PSAnQ09ERVNZU1RFTScpIHtcbiAgICAgICAgICAgIGRhdGFUb0JlUHJvY2Vzc2VkW2UubmFtZV0gPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhVG9CZVByb2Nlc3NlZCkubGVuZ3RoKSB7XG4gICAgICAgICAgbGV0IG9icyA9IFtdO1xuICAgICAgICAgIG5ld1ZhbC5mb3JFYWNoKHJvd0RhdGEgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocm93RGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YVRvQmVQcm9jZXNzZWRba2V5XSkge1xuICAgICAgICAgICAgICAgIG9icy5wdXNoKHRoaXMuX2dldERhdGFNZXRhKGRhdGFUb0JlUHJvY2Vzc2VkW2tleV0sIHJvd0RhdGFba2V5XSkucGlwZShcbiAgICAgICAgICAgICAgICAgIHRhcChtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2tleSArICdfbWV0YSddID0gbTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm93RGF0YVtrZXkgKyAnX21ldGEnXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9ya0pvaW4ob2JzKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdXBkYXRlQXJyYXlWYWx1ZShmYywgbmV3VmFsKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUFycmF5VmFsdWUoZmMsIG5ld1ZhbCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVBcnJheVZhbHVlKGZjLCBuZXdWYWx1ZSkge1xuICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gW10uY29uY2F0KG5ld1ZhbHVlKTtcbiAgICBmYy5wYXRjaFZhbHVlKFtdLmNvbmNhdChuZXdWYWx1ZSkpO1xuICAgIGZjLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICBmYy5tYXJrQXNEaXJ0eSgpO1xuICB9XG59XG4iXX0=
|