@mediusinc/mng-commons 0.2.5 → 0.2.9
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/README.md +46 -0
- package/assets/i18n/en.json +202 -147
- package/assets/i18n/sl.json +202 -147
- package/esm2020/lib/api/models/builders/query-param.builder.mjs +1 -1
- package/esm2020/lib/api/models/filter-match-type.model.mjs +1 -1
- package/esm2020/lib/api/models/filter-param.model.mjs +16 -27
- package/esm2020/lib/api/models/mappers.mjs +7 -7
- package/esm2020/lib/api/models/query-mode.model.mjs +1 -1
- package/esm2020/lib/api/models/query-param.model.mjs +38 -37
- package/esm2020/lib/api/models/query-result.model.mjs +14 -13
- package/esm2020/lib/api/services/crud-api.abstract.service.mjs +28 -21
- package/esm2020/lib/api/utils/medius-rest.util.mjs +11 -7
- package/esm2020/lib/api/utils/object-serializer.util.mjs +34 -27
- package/esm2020/lib/components/action/action.component.mjs +10 -7
- package/esm2020/lib/components/action/dialog/action-dialog.component.mjs +17 -14
- package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
- package/esm2020/lib/components/action/models/action-execution.model.mjs +1 -1
- package/esm2020/lib/components/action/route/action-route.component.mjs +8 -6
- package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +16 -14
- package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +16 -15
- package/esm2020/lib/components/form/editor/form-editor.component.mjs +21 -24
- package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +3 -3
- package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +3 -3
- package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
- package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +8 -4
- package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +13 -14
- package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +12 -11
- package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +4 -4
- package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +1 -3
- package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +1 -3
- package/esm2020/lib/components/form/models/form-editor.event.mjs +1 -1
- package/esm2020/lib/components/layout/breadcrumb.component.mjs +3 -3
- package/esm2020/lib/components/layout/footer.component.mjs +3 -3
- package/esm2020/lib/components/layout/main-layout.component.mjs +4 -4
- package/esm2020/lib/components/layout/menu-item.component.mjs +36 -34
- package/esm2020/lib/components/layout/menu.component.mjs +3 -3
- package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +4 -1
- package/esm2020/lib/components/layout/topbar.component.mjs +5 -4
- package/esm2020/lib/components/tableview/index.mjs +2 -1
- package/esm2020/lib/components/tableview/models/table.event.mjs +1 -1
- package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +4 -4
- package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +33 -0
- package/esm2020/lib/components/tableview/services/tableview.component.service.mjs +9 -5
- package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +4 -3
- package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +1 -1
- package/esm2020/lib/components/tableview/table/table.component.mjs +29 -27
- package/esm2020/lib/components/tableview/tableview.component.mjs +11 -3
- package/esm2020/lib/config/formly.config.mjs +30 -22
- package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
- package/esm2020/lib/data-providers/base.data-provider.mjs +1 -8
- package/esm2020/lib/data-providers/editor.data-provider.mjs +2 -2
- package/esm2020/lib/data-providers/lookup.data-provider.mjs +1 -1
- package/esm2020/lib/data-providers/tableview.data-provider.mjs +2 -2
- package/esm2020/lib/descriptors/action.descriptor.mjs +3 -5
- package/esm2020/lib/descriptors/editor.descriptor.mjs +105 -72
- package/esm2020/lib/descriptors/field.validator.mjs +1 -1
- package/esm2020/lib/descriptors/lookup.descriptor.mjs +1 -1
- package/esm2020/lib/descriptors/model.descriptor.mjs +3 -3
- package/esm2020/lib/descriptors/table.descriptor.mjs +52 -43
- package/esm2020/lib/descriptors/tableview.descriptor.mjs +7 -7
- package/esm2020/lib/directives/component.directive.mjs +2 -2
- package/esm2020/lib/directives/template.directive.mjs +2 -3
- package/esm2020/lib/mng-commons.module.mjs +36 -41
- package/esm2020/lib/models/enum.model.mjs +2 -0
- package/esm2020/lib/models/index.mjs +2 -2
- package/esm2020/lib/models/user.model.mjs +1 -1
- package/esm2020/lib/pipes/boolean.pipe.mjs +1 -1
- package/esm2020/lib/pipes/i18n-property.pipe.mjs +18 -0
- package/esm2020/lib/pipes/index.mjs +2 -1
- package/esm2020/lib/pipes/property-path.pipe.mjs +1 -1
- package/esm2020/lib/router/index.mjs +2 -0
- package/esm2020/lib/router/models/index.mjs +2 -0
- package/esm2020/lib/router/models/router.model.mjs +2 -0
- package/esm2020/lib/router/route-builder.mjs +293 -0
- package/esm2020/lib/services/action.service.mjs +19 -15
- package/esm2020/lib/services/commons.service.mjs +15 -23
- package/esm2020/lib/services/configuration.service.mjs +3 -4
- package/esm2020/lib/services/navigation.service.mjs +2 -2
- package/esm2020/lib/services/providers/config-service.provider.mjs +2 -2
- package/esm2020/lib/services/providers/formly-config.provider.mjs +1 -1
- package/esm2020/lib/services/tokens/browser-storage.token.mjs +1 -1
- package/esm2020/lib/types/type.decorator.mjs +7 -1
- package/esm2020/lib/types/type.model.mjs +1 -1
- package/esm2020/lib/utils/editor-formly.util.mjs +10 -21
- package/esm2020/lib/utils/enum.util.mjs +61 -0
- package/esm2020/lib/utils/i18n.util.mjs +39 -27
- package/esm2020/lib/utils/index.mjs +2 -1
- package/esm2020/lib/utils/model.util.mjs +1 -1
- package/esm2020/lib/utils/route.util.mjs +24 -0
- package/esm2020/lib/utils/toast.util.mjs +3 -2
- package/esm2020/lib/utils/type.util.mjs +40 -2
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/mediusinc-mng-commons.mjs +3138 -2599
- package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
- package/fesm2020/mediusinc-mng-commons.mjs +3129 -2589
- package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
- package/lib/api/models/filter-param.model.d.ts +1 -1
- package/lib/api/services/crud-api.abstract.service.d.ts +6 -6
- package/lib/api/utils/medius-rest.util.d.ts +1 -1
- package/lib/api/utils/object-serializer.util.d.ts +6 -5
- package/lib/components/action/action.component.d.ts +3 -3
- package/lib/components/action/dialog/action-dialog.component.d.ts +9 -8
- package/lib/components/action/models/action-execution.model.d.ts +1 -1
- package/lib/components/action/route/action-route.component.d.ts +2 -2
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +4 -3
- package/lib/components/form/dropdown/dropdown.component.d.ts +4 -3
- package/lib/components/form/editor/form-editor.component.d.ts +7 -6
- package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +2 -1
- package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +2 -1
- package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +1 -1
- package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +1 -3
- package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +1 -3
- package/lib/components/layout/main-layout.component.d.ts +3 -3
- package/lib/components/layout/menu-item.component.d.ts +7 -7
- package/lib/components/layout/services/main-layout.component.service.d.ts +1 -1
- package/lib/components/layout/topbar.component.d.ts +4 -4
- package/lib/components/tableview/index.d.ts +1 -0
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +4 -3
- package/lib/components/tableview/route/tableview-route.component.d.ts +15 -0
- package/lib/components/tableview/services/tableview.component.service.d.ts +3 -2
- package/lib/components/tableview/table/table.component.d.ts +21 -19
- package/lib/components/tableview/tableview.component.d.ts +6 -4
- package/lib/config/formly.config.d.ts +2 -1
- package/lib/data-providers/base.data-provider.d.ts +0 -3
- package/lib/descriptors/action.descriptor.d.ts +2 -2
- package/lib/descriptors/editor.descriptor.d.ts +40 -33
- package/lib/descriptors/lookup.descriptor.d.ts +1 -1
- package/lib/descriptors/table.descriptor.d.ts +19 -16
- package/lib/descriptors/tableview.descriptor.d.ts +9 -9
- package/lib/mng-commons.module.d.ts +68 -65
- package/lib/models/enum.model.d.ts +5 -0
- package/lib/models/index.d.ts +1 -1
- package/lib/pipes/i18n-property.pipe.d.ts +8 -0
- package/lib/pipes/index.d.ts +1 -0
- package/lib/router/index.d.ts +1 -0
- package/lib/router/models/index.d.ts +1 -0
- package/lib/router/models/router.model.d.ts +22 -0
- package/lib/router/route-builder.d.ts +66 -0
- package/lib/services/action.service.d.ts +3 -3
- package/lib/services/commons.service.d.ts +6 -6
- package/lib/services/navigation.service.d.ts +1 -1
- package/lib/services/providers/formly-config.provider.d.ts +1 -1
- package/lib/types/type.decorator.d.ts +2 -0
- package/lib/types/type.model.d.ts +2 -2
- package/lib/utils/editor-formly.util.d.ts +1 -1
- package/lib/utils/enum.util.d.ts +39 -0
- package/lib/utils/i18n.util.d.ts +6 -2
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/model.util.d.ts +1 -1
- package/lib/utils/route.util.d.ts +4 -0
- package/lib/utils/toast.util.d.ts +1 -1
- package/lib/utils/type.util.d.ts +22 -1
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
- package/scss/common/layout/_breadcrumb.scss +6 -6
- package/scss/common/layout/_config.scss +7 -8
- package/scss/common/layout/_exception.scss +12 -11
- package/scss/common/layout/_footer.scss +3 -3
- package/scss/common/layout/_help.scss +8 -9
- package/scss/common/layout/_inlinemenu.scss +3 -3
- package/scss/common/layout/_invoice.scss +16 -16
- package/scss/common/layout/_landing.scss +57 -60
- package/scss/common/layout/_loader.scss +0 -1
- package/scss/common/layout/_login.scss +3 -4
- package/scss/common/layout/_main.scss +3 -3
- package/scss/common/layout/_mixins.scss +28 -20
- package/scss/common/layout/_rightmenu.scss +5 -5
- package/scss/common/layout/_topbar.scss +7 -5
- package/scss/common/layout/_typography.scss +11 -6
- package/scss/common/layout/_utils.scss +1 -1
- package/scss/common/layout/_widgets.scss +20 -19
- package/scss/common/layout/menu/_menu_common.scss +6 -6
- package/scss/common/layout/menu/_menu_overlay.scss +1 -1
- package/scss/common/layout/menu/_menu_sidebar.scss +6 -5
- package/scss/common/layout/menu/_menu_slim.scss +2 -3
- package/scss/common/layout/menu/_menu_static.scss +1 -1
- package/scss/common/layout/menu/_menu_theme.scss +2 -3
- package/scss/common/theme/designer/_colors.scss +11 -12
- package/scss/common/theme/designer/_common.scss +4 -3
- package/scss/common/theme/designer/_mixins.scss +56 -56
- package/scss/common/theme/designer/components/button/_button.scss +32 -20
- package/scss/common/theme/designer/components/button/_speeddial.scss +1 -1
- package/scss/common/theme/designer/components/button/_splitbutton.scss +2 -1
- package/scss/common/theme/designer/components/data/_carousel.scss +1 -1
- package/scss/common/theme/designer/components/data/_datatable.scss +5 -5
- package/scss/common/theme/designer/components/data/_filter.scss +2 -3
- package/scss/common/theme/designer/components/data/_fullcalendar.scss +10 -10
- package/scss/common/theme/designer/components/data/_orderlist.scss +2 -2
- package/scss/common/theme/designer/components/data/_paginator.scss +1 -1
- package/scss/common/theme/designer/components/data/_picklist.scss +1 -1
- package/scss/common/theme/designer/components/data/_timeline.scss +3 -6
- package/scss/common/theme/designer/components/data/_tree.scss +2 -2
- package/scss/common/theme/designer/components/data/_treetable.scss +2 -3
- package/scss/common/theme/designer/components/input/_autocomplete.scss +8 -8
- package/scss/common/theme/designer/components/input/_calendar.scss +6 -6
- package/scss/common/theme/designer/components/input/_cascadeselect.scss +1 -1
- package/scss/common/theme/designer/components/input/_checkbox.scss +4 -4
- package/scss/common/theme/designer/components/input/_chips.scss +4 -4
- package/scss/common/theme/designer/components/input/_colorpicker.scss +2 -2
- package/scss/common/theme/designer/components/input/_dropdown.scss +2 -2
- package/scss/common/theme/designer/components/input/_editor.scss +7 -7
- package/scss/common/theme/designer/components/input/_inputgroup.scss +1 -1
- package/scss/common/theme/designer/components/input/_inputmask.scss +1 -1
- package/scss/common/theme/designer/components/input/_inputnumber.scss +1 -1
- package/scss/common/theme/designer/components/input/_inputswitch.scss +2 -2
- package/scss/common/theme/designer/components/input/_inputtext.scss +3 -3
- package/scss/common/theme/designer/components/input/_listbox.scss +1 -1
- package/scss/common/theme/designer/components/input/_multiselect.scss +5 -6
- package/scss/common/theme/designer/components/input/_radiobutton.scss +2 -2
- package/scss/common/theme/designer/components/input/_rating.scss +1 -1
- package/scss/common/theme/designer/components/input/_selectbutton.scss +1 -1
- package/scss/common/theme/designer/components/input/_togglebutton.scss +1 -1
- package/scss/common/theme/designer/components/input/_treeselect.scss +2 -2
- package/scss/common/theme/designer/components/menu/_contextmenu.scss +3 -2
- package/scss/common/theme/designer/components/menu/_dock.scss +4 -4
- package/scss/common/theme/designer/components/menu/_megamenu.scss +10 -9
- package/scss/common/theme/designer/components/menu/_menu.scss +2 -2
- package/scss/common/theme/designer/components/menu/_menubar.scss +12 -11
- package/scss/common/theme/designer/components/menu/_panelmenu.scss +1 -2
- package/scss/common/theme/designer/components/menu/_slidemenu.scss +3 -2
- package/scss/common/theme/designer/components/menu/_steps.scss +1 -2
- package/scss/common/theme/designer/components/menu/_tieredmenu.scss +3 -2
- package/scss/common/theme/designer/components/messages/_message.scss +1 -1
- package/scss/common/theme/designer/components/messages/_toast.scss +1 -2
- package/scss/common/theme/designer/components/misc/_avatar.scss +1 -1
- package/scss/common/theme/designer/components/misc/_badge.scss +1 -1
- package/scss/common/theme/designer/components/misc/_blockui.scss +1 -1
- package/scss/common/theme/designer/components/misc/_chip.scss +2 -2
- package/scss/common/theme/designer/components/misc/_inplace.scss +0 -1
- package/scss/common/theme/designer/components/misc/_scrolltop.scss +1 -1
- package/scss/common/theme/designer/components/misc/_skeleton.scss +1 -1
- package/scss/common/theme/designer/components/misc/_tag.scss +1 -1
- package/scss/common/theme/designer/components/misc/_terminal.scss +8 -8
- package/scss/common/theme/designer/components/multimedia/_galleria.scss +1 -1
- package/scss/common/theme/designer/components/overlay/_confirmpopup.scss +2 -4
- package/scss/common/theme/designer/components/overlay/_dialog.scss +3 -3
- package/scss/common/theme/designer/components/overlay/_overlaypanel.scss +2 -4
- package/scss/common/theme/designer/components/panel/_accordion.scss +2 -2
- package/scss/common/theme/designer/components/panel/_divider.scss +1 -1
- package/scss/common/theme/designer/components/panel/_scrollpanel.scss +1 -1
- package/scss/common/theme/designer/components/panel/_splitter.scss +1 -1
- package/scss/common/theme/extensions/_button.scss +18 -6
- package/scss/common/theme/extensions/_orderlist.scss +0 -1
- package/scss/common/theme/extensions/_picklist.scss +0 -1
- package/scss/common/theme/extensions/_tree.scss +0 -1
- package/scss/common/variables/layout/_common.scss +9 -9
- package/scss/common/variables/layout/_layout_dark.scss +12 -12
- package/scss/common/variables/layout/_layout_light.scss +13 -13
- package/scss/common/variables/theme/_theme_dark.scss +76 -76
- package/scss/common/variables/theme/_theme_light.scss +80 -80
- package/scss/layout/default/_mng-variables-layout-dark.scss +1 -1
- package/scss/mng-commons-dark.scss +2 -2
- package/scss/mng-commons-light.scss +2 -2
- package/scss/mng-overrides/_layout_dialog.scss +4 -3
- package/scss/mng-overrides/_layout_forms.scss +6 -1
- package/scss/mng-overrides/_layout_radio.scss +1 -1
- package/scss/mng-overrides/_theme_datepicker.scss +7 -0
- package/scss/mng-overrides/_theme_dialog.scss +0 -1
- package/scss/mng-overrides/_theme_dropdown.scss +0 -1
- package/scss/mng-overrides/_theme_styles.scss +1 -0
- package/scss/mng-overrides/_theme_tableview.scss +6 -6
- package/scss/theme/default/_mng-variables-theme-dark.scss +2 -1
- package/scss/theme/default/_mng-variables-theme-light.scss +2 -1
- package/esm2020/lib/models/router.model.mjs +0 -2
- package/lib/models/router.model.d.ts +0 -14
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { Validators } from '@angular/forms';
|
|
1
2
|
import { of } from 'rxjs';
|
|
2
3
|
import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { ModelUtil } from '../utils';
|
|
4
|
+
import { EnumUtil, I18nUtil, ModelUtil, TypeUtil } from '../utils';
|
|
5
|
+
import { FieldValidator, ModelDescriptor } from './';
|
|
6
6
|
export class EditorDescriptor {
|
|
7
7
|
constructor(modelType, idProperty, titleProperty) {
|
|
8
8
|
this._tabs = [];
|
|
@@ -11,29 +11,33 @@ export class EditorDescriptor {
|
|
|
11
11
|
this._disabled = false;
|
|
12
12
|
this._model = new ModelDescriptor(modelType, idProperty, titleProperty);
|
|
13
13
|
}
|
|
14
|
+
get disabled() {
|
|
15
|
+
return this._disabled;
|
|
16
|
+
}
|
|
14
17
|
get model() {
|
|
15
18
|
return this._model;
|
|
16
19
|
}
|
|
17
20
|
get tabs() {
|
|
18
21
|
return this._tabs;
|
|
19
22
|
}
|
|
20
|
-
get disabled() {
|
|
21
|
-
return this._disabled;
|
|
22
|
-
}
|
|
23
23
|
get fields() {
|
|
24
24
|
return this._fields;
|
|
25
25
|
}
|
|
26
26
|
createTabGroup(name, title) {
|
|
27
27
|
const tabGroup = new FieldTabGroupDescriptor(this, name);
|
|
28
|
-
if (title) {
|
|
29
|
-
|
|
28
|
+
if (!title) {
|
|
29
|
+
title = I18nUtil.getModelTabKey(this.model, name);
|
|
30
30
|
}
|
|
31
|
+
tabGroup.withTitle(title);
|
|
31
32
|
this.createTabGroupDescriptor(tabGroup);
|
|
32
33
|
return tabGroup;
|
|
33
34
|
}
|
|
34
35
|
createFieldGroup(name, title) {
|
|
35
36
|
const fieldGroup = new FieldGroupDescriptor(this, name);
|
|
36
|
-
if (title) {
|
|
37
|
+
if (title !== null) {
|
|
38
|
+
if (!title) {
|
|
39
|
+
title = I18nUtil.getModelGroupKey(this.model, name);
|
|
40
|
+
}
|
|
37
41
|
fieldGroup.withTitle(title);
|
|
38
42
|
}
|
|
39
43
|
this.createFieldGroupDescriptor(fieldGroup);
|
|
@@ -73,16 +77,8 @@ export class EditorDescriptor {
|
|
|
73
77
|
this.addFieldDescriptor(field);
|
|
74
78
|
return field;
|
|
75
79
|
}
|
|
76
|
-
addFieldLookupEnum(property, options) {
|
|
77
|
-
const
|
|
78
|
-
if (!propDef) {
|
|
79
|
-
throw new Error(`Property (attribute) definition not found for property ${property} on class type ${this._model.typeName}`);
|
|
80
|
-
}
|
|
81
|
-
const enumDef = ObjectSerializer.get().findEnum(propDef.type);
|
|
82
|
-
if (!enumDef) {
|
|
83
|
-
throw new Error(`Enum definition ${propDef.type} not found for property ${property} on class type ${this._model.typeName}`);
|
|
84
|
-
}
|
|
85
|
-
const field = new FieldLookupEnumDescriptor(this, property, propDef.type, options);
|
|
80
|
+
addFieldLookupEnum(property, enumType, options, nameAsValue = false, optionsTitlePath) {
|
|
81
|
+
const field = new FieldLookupEnumDescriptor(this, property, enumType, options, nameAsValue, optionsTitlePath);
|
|
86
82
|
this.addFieldDescriptor(field);
|
|
87
83
|
return field;
|
|
88
84
|
}
|
|
@@ -121,11 +117,6 @@ export class EditorDescriptor {
|
|
|
121
117
|
editor._disabled = this._disabled;
|
|
122
118
|
return editor;
|
|
123
119
|
}
|
|
124
|
-
createTabGroupDescriptor(tabGroup) {
|
|
125
|
-
this._currentTabGroup = tabGroup;
|
|
126
|
-
this._tabs.push(tabGroup);
|
|
127
|
-
return this;
|
|
128
|
-
}
|
|
129
120
|
createFieldGroupDescriptor(fieldGroup) {
|
|
130
121
|
this.createDefaultTabGroup();
|
|
131
122
|
this._currentGroup = fieldGroup;
|
|
@@ -133,15 +124,20 @@ export class EditorDescriptor {
|
|
|
133
124
|
this._currentTabGroup?.addField(fieldGroup);
|
|
134
125
|
return this;
|
|
135
126
|
}
|
|
127
|
+
createTabGroupDescriptor(tabGroup) {
|
|
128
|
+
this._currentTabGroup = tabGroup;
|
|
129
|
+
this._tabs.push(tabGroup);
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
136
132
|
createDefaultGroup() {
|
|
137
133
|
this.createDefaultTabGroup();
|
|
138
134
|
if (this._currentTabGroup?.fields.length === 0) {
|
|
139
|
-
this.createFieldGroup(EditorDescriptor.defaultGroupName);
|
|
135
|
+
this.createFieldGroup(EditorDescriptor.defaultGroupName, null);
|
|
140
136
|
}
|
|
141
137
|
}
|
|
142
138
|
createDefaultTabGroup() {
|
|
143
139
|
if (this._tabs.length === 0) {
|
|
144
|
-
this.createTabGroup(EditorDescriptor.defaultGroupName);
|
|
140
|
+
this.createTabGroup(EditorDescriptor.defaultGroupName, 'general.general');
|
|
145
141
|
}
|
|
146
142
|
}
|
|
147
143
|
}
|
|
@@ -162,10 +158,7 @@ export class AFieldDescriptor extends AGenericFieldDescriptor {
|
|
|
162
158
|
this._className = '';
|
|
163
159
|
this._validators = [];
|
|
164
160
|
this._property = property;
|
|
165
|
-
this._label = this._editor.model
|
|
166
|
-
}
|
|
167
|
-
get property() {
|
|
168
|
-
return this._property;
|
|
161
|
+
this._label = I18nUtil.getModelPropertyKey(this._editor.model, property);
|
|
169
162
|
}
|
|
170
163
|
get group() {
|
|
171
164
|
return this._group;
|
|
@@ -182,6 +175,9 @@ export class AFieldDescriptor extends AGenericFieldDescriptor {
|
|
|
182
175
|
get disabled() {
|
|
183
176
|
return this._disabled;
|
|
184
177
|
}
|
|
178
|
+
get defaultValue() {
|
|
179
|
+
return this._defaultValue;
|
|
180
|
+
}
|
|
185
181
|
get className() {
|
|
186
182
|
return this._className;
|
|
187
183
|
}
|
|
@@ -194,6 +190,12 @@ export class AFieldDescriptor extends AGenericFieldDescriptor {
|
|
|
194
190
|
get validators() {
|
|
195
191
|
return this._validators;
|
|
196
192
|
}
|
|
193
|
+
get disabledFunction() {
|
|
194
|
+
return this._disabledFunction;
|
|
195
|
+
}
|
|
196
|
+
get property() {
|
|
197
|
+
return this._property;
|
|
198
|
+
}
|
|
197
199
|
withLabel(label) {
|
|
198
200
|
this._label = label;
|
|
199
201
|
return this;
|
|
@@ -206,8 +208,15 @@ export class AFieldDescriptor extends AGenericFieldDescriptor {
|
|
|
206
208
|
this._required = required;
|
|
207
209
|
return this;
|
|
208
210
|
}
|
|
209
|
-
withDisabled(disabled = true) {
|
|
211
|
+
withDisabled(disabled = true, disabledFunction) {
|
|
210
212
|
this._disabled = disabled;
|
|
213
|
+
if (disabledFunction) {
|
|
214
|
+
this._disabledFunction = disabledFunction;
|
|
215
|
+
}
|
|
216
|
+
return this;
|
|
217
|
+
}
|
|
218
|
+
withDefaultValue(defaultValue) {
|
|
219
|
+
this._defaultValue = defaultValue;
|
|
211
220
|
return this;
|
|
212
221
|
}
|
|
213
222
|
withClassName(className) {
|
|
@@ -231,6 +240,8 @@ export class AFieldDescriptor extends AGenericFieldDescriptor {
|
|
|
231
240
|
obj._placeholder = this._placeholder;
|
|
232
241
|
obj._required = this._required;
|
|
233
242
|
obj._disabled = this._disabled;
|
|
243
|
+
obj._defaultValue = this._defaultValue;
|
|
244
|
+
obj._disabledFunction = this._disabledFunction;
|
|
234
245
|
obj._className = this._className;
|
|
235
246
|
obj._getter = this._getter;
|
|
236
247
|
obj._setter = this._setter;
|
|
@@ -248,8 +259,8 @@ export class FieldInputDescriptor extends AFieldDescriptor {
|
|
|
248
259
|
get fieldType() {
|
|
249
260
|
return this._fieldType;
|
|
250
261
|
}
|
|
251
|
-
get
|
|
252
|
-
return this.
|
|
262
|
+
get rows() {
|
|
263
|
+
return this._rows;
|
|
253
264
|
}
|
|
254
265
|
get numberMin() {
|
|
255
266
|
return this._numberMin;
|
|
@@ -257,8 +268,8 @@ export class FieldInputDescriptor extends AFieldDescriptor {
|
|
|
257
268
|
get numberMax() {
|
|
258
269
|
return this._numberMax;
|
|
259
270
|
}
|
|
260
|
-
get
|
|
261
|
-
return this.
|
|
271
|
+
get numberStep() {
|
|
272
|
+
return this._numberStep;
|
|
262
273
|
}
|
|
263
274
|
get numberMinFractionDigits() {
|
|
264
275
|
return this._numberMinFractionDigits;
|
|
@@ -290,16 +301,22 @@ export class FieldInputDescriptor extends AFieldDescriptor {
|
|
|
290
301
|
get pattern() {
|
|
291
302
|
return this._pattern;
|
|
292
303
|
}
|
|
293
|
-
asText(minLength, maxLength, pattern) {
|
|
304
|
+
asText(minLength, maxLength, pattern, isEmail) {
|
|
294
305
|
this._fieldType = FieldInputDescriptor.TypeEnum.Text;
|
|
295
306
|
this._minLength = minLength;
|
|
296
307
|
this._maxLength = maxLength;
|
|
297
308
|
this._pattern = pattern;
|
|
309
|
+
if (isEmail) {
|
|
310
|
+
this.withValidator('email', control => !Validators.email(control));
|
|
311
|
+
}
|
|
298
312
|
return this;
|
|
299
313
|
}
|
|
300
|
-
asTextarea(rows = 3) {
|
|
314
|
+
asTextarea(rows = 3, minLength, maxLength, pattern) {
|
|
301
315
|
this._fieldType = FieldInputDescriptor.TypeEnum.Textarea;
|
|
302
316
|
this._rows = rows;
|
|
317
|
+
this._minLength = minLength;
|
|
318
|
+
this._maxLength = maxLength;
|
|
319
|
+
this._pattern = pattern;
|
|
303
320
|
return this;
|
|
304
321
|
}
|
|
305
322
|
asNumber(step, min, max, minFractionDigits, maxFractionDigits) {
|
|
@@ -315,9 +332,19 @@ export class FieldInputDescriptor extends AFieldDescriptor {
|
|
|
315
332
|
this._fieldType = FieldInputDescriptor.TypeEnum.Switch;
|
|
316
333
|
return this;
|
|
317
334
|
}
|
|
318
|
-
asRadio(options) {
|
|
335
|
+
asRadio(options, optionsTitlePath) {
|
|
319
336
|
this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
|
|
320
|
-
this._radioOptions = options;
|
|
337
|
+
this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
|
|
338
|
+
return this;
|
|
339
|
+
}
|
|
340
|
+
asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
|
|
341
|
+
this._fieldType = FieldInputDescriptor.TypeEnum.Radio;
|
|
342
|
+
if (typeof optionsTitlePath === 'undefined') {
|
|
343
|
+
optionsTitlePath = TypeUtil.findEnumName(enumType);
|
|
344
|
+
}
|
|
345
|
+
this._radioOptions = Array.isArray(values)
|
|
346
|
+
? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
|
|
347
|
+
: EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
|
|
321
348
|
return this;
|
|
322
349
|
}
|
|
323
350
|
asDatePicker(format, min, max, showTime) {
|
|
@@ -338,7 +365,7 @@ export class FieldInputDescriptor extends AFieldDescriptor {
|
|
|
338
365
|
field._numberStep = this._numberStep;
|
|
339
366
|
field._numberMinFractionDigits = this._numberMinFractionDigits;
|
|
340
367
|
field._numberMaxFractionDigits = this._numberMaxFractionDigits;
|
|
341
|
-
field._radioOptions = this._radioOptions;
|
|
368
|
+
field._radioOptions = [...this._radioOptions];
|
|
342
369
|
field._datePickerFormat = this._datePickerFormat;
|
|
343
370
|
field._datePickerMin = this._datePickerMin;
|
|
344
371
|
field._datePickerMax = this._datePickerMax;
|
|
@@ -367,9 +394,6 @@ export class FieldLookupDescriptor extends AFieldDescriptor {
|
|
|
367
394
|
this._modelType = modelType;
|
|
368
395
|
ModelUtil.trySetLookupItemsProperties(this);
|
|
369
396
|
}
|
|
370
|
-
get modelType() {
|
|
371
|
-
return this._modelType;
|
|
372
|
-
}
|
|
373
397
|
get lookupType() {
|
|
374
398
|
return this._lookupType;
|
|
375
399
|
}
|
|
@@ -385,6 +409,9 @@ export class FieldLookupDescriptor extends AFieldDescriptor {
|
|
|
385
409
|
get dataProvider() {
|
|
386
410
|
return this._dataProvider;
|
|
387
411
|
}
|
|
412
|
+
get modelType() {
|
|
413
|
+
return this._modelType;
|
|
414
|
+
}
|
|
388
415
|
withItemsLabelProperty(itemsLabelProperty) {
|
|
389
416
|
this._itemsLabelProperty = itemsLabelProperty;
|
|
390
417
|
return this;
|
|
@@ -433,19 +460,25 @@ export class FieldLookupDescriptor extends AFieldDescriptor {
|
|
|
433
460
|
})(LookupTypeEnum = FieldLookupDescriptor.LookupTypeEnum || (FieldLookupDescriptor.LookupTypeEnum = {}));
|
|
434
461
|
})(FieldLookupDescriptor || (FieldLookupDescriptor = {}));
|
|
435
462
|
export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
|
|
436
|
-
constructor(editor, property,
|
|
463
|
+
constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
|
|
437
464
|
super(editor, property, null);
|
|
438
|
-
this.
|
|
439
|
-
|
|
440
|
-
.
|
|
441
|
-
|
|
465
|
+
this._enumType = enumType;
|
|
466
|
+
if (typeof optionsTitlePath === 'undefined') {
|
|
467
|
+
optionsTitlePath = TypeUtil.findEnumName(enumType);
|
|
468
|
+
}
|
|
469
|
+
const optionEnumValues = Array.isArray(options)
|
|
470
|
+
? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
|
|
471
|
+
: EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
|
|
472
|
+
const dataProvider = new LookupDataProvider(null).withLookup(() => of(optionEnumValues));
|
|
442
473
|
this.withLookupDataProvider(dataProvider);
|
|
474
|
+
this.withItemsLabelProperty('title');
|
|
475
|
+
this.withItemsValueProperty('value');
|
|
443
476
|
}
|
|
444
|
-
get
|
|
445
|
-
return this.
|
|
477
|
+
get enumType() {
|
|
478
|
+
return this._enumType;
|
|
446
479
|
}
|
|
447
480
|
copy() {
|
|
448
|
-
const field = new FieldLookupEnumDescriptor(this._editor, this._property, this.
|
|
481
|
+
const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
|
|
449
482
|
this.copyFieldsTo(field);
|
|
450
483
|
field._lookupType = this._lookupType;
|
|
451
484
|
field._itemsLabelProperty = this._itemsLabelProperty;
|
|
@@ -469,11 +502,8 @@ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
|
|
|
469
502
|
this._lookupTableDescriptor = lookupTableDescriptor;
|
|
470
503
|
this._actions.push(FieldManyToManyEditorDescriptor.ActionEnum.Add, FieldManyToManyEditorDescriptor.ActionEnum.Delete);
|
|
471
504
|
}
|
|
472
|
-
get
|
|
473
|
-
return this.
|
|
474
|
-
}
|
|
475
|
-
get lookupTableDescriptor() {
|
|
476
|
-
return this._lookupTableDescriptor;
|
|
505
|
+
get fieldType() {
|
|
506
|
+
return this._fieldType;
|
|
477
507
|
}
|
|
478
508
|
get lookupTableDataProvider() {
|
|
479
509
|
return this._lookupTableDataProvider;
|
|
@@ -481,9 +511,6 @@ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
|
|
|
481
511
|
get actions() {
|
|
482
512
|
return this._actions;
|
|
483
513
|
}
|
|
484
|
-
get fieldType() {
|
|
485
|
-
return this._fieldType;
|
|
486
|
-
}
|
|
487
514
|
get hasLookupExcludeValues() {
|
|
488
515
|
return this._hasLookupExcludeValues;
|
|
489
516
|
}
|
|
@@ -493,6 +520,12 @@ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
|
|
|
493
520
|
get excludeValueProperty() {
|
|
494
521
|
return this._excludeValueProperty;
|
|
495
522
|
}
|
|
523
|
+
get mainTableDescriptor() {
|
|
524
|
+
return this._mainTableDescriptor;
|
|
525
|
+
}
|
|
526
|
+
get lookupTableDescriptor() {
|
|
527
|
+
return this._lookupTableDescriptor;
|
|
528
|
+
}
|
|
496
529
|
withLookup(getAll, serviceType) {
|
|
497
530
|
const dataProvider = new TableviewDataProvider(this._model.type);
|
|
498
531
|
if (serviceType) {
|
|
@@ -548,6 +581,12 @@ export class FieldManyEditorDescriptor extends AFieldDescriptor {
|
|
|
548
581
|
this._tableviewDescriptor = tableviewDescriptor;
|
|
549
582
|
this._actions.push(FieldManyEditorDescriptor.ActionEnum.Add, FieldManyEditorDescriptor.ActionEnum.Edit, FieldManyEditorDescriptor.ActionEnum.Delete);
|
|
550
583
|
}
|
|
584
|
+
get fieldType() {
|
|
585
|
+
return this._fieldType;
|
|
586
|
+
}
|
|
587
|
+
get actions() {
|
|
588
|
+
return this._actions;
|
|
589
|
+
}
|
|
551
590
|
get tableviewDescriptor() {
|
|
552
591
|
return this._tableviewDescriptor;
|
|
553
592
|
}
|
|
@@ -563,12 +602,6 @@ export class FieldManyEditorDescriptor extends AFieldDescriptor {
|
|
|
563
602
|
get editorForUpdate() {
|
|
564
603
|
return this._tableviewDescriptor.editEditor;
|
|
565
604
|
}
|
|
566
|
-
get fieldType() {
|
|
567
|
-
return this._fieldType;
|
|
568
|
-
}
|
|
569
|
-
get actions() {
|
|
570
|
-
return this._actions;
|
|
571
|
-
}
|
|
572
605
|
withActions(actions = []) {
|
|
573
606
|
this.actions.push(...actions);
|
|
574
607
|
return this;
|
|
@@ -601,6 +634,12 @@ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
|
|
|
601
634
|
this._name = `${this.baseName}${name}`;
|
|
602
635
|
this._default = name === EditorDescriptor.defaultGroupName;
|
|
603
636
|
}
|
|
637
|
+
get title() {
|
|
638
|
+
return this._title;
|
|
639
|
+
}
|
|
640
|
+
get validators() {
|
|
641
|
+
return this._validators;
|
|
642
|
+
}
|
|
604
643
|
get baseName() {
|
|
605
644
|
return `${this.groupName()}_`;
|
|
606
645
|
}
|
|
@@ -610,12 +649,6 @@ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
|
|
|
610
649
|
get default() {
|
|
611
650
|
return this._default;
|
|
612
651
|
}
|
|
613
|
-
get title() {
|
|
614
|
-
return this._title;
|
|
615
|
-
}
|
|
616
|
-
get validators() {
|
|
617
|
-
return this._validators;
|
|
618
|
-
}
|
|
619
652
|
withTitle(title) {
|
|
620
653
|
this._title = title;
|
|
621
654
|
return this;
|
|
@@ -667,4 +700,4 @@ export class FieldGroupDescriptor extends AFieldGroupDescriptor {
|
|
|
667
700
|
return group;
|
|
668
701
|
}
|
|
669
702
|
}
|
|
670
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2VkaXRvci5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUEwQyxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3JILE9BQU8sRUFBQyxlQUFlLEVBQXdDLGNBQWMsRUFBb0IsTUFBTSxJQUFJLENBQUM7QUFHNUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbkMsTUFBTSxPQUFPLGdCQUFnQjtJQWF6QixZQUFZLFNBQXVCLEVBQUUsVUFBbUIsRUFBRSxhQUFzQjtRQVIvRCxVQUFLLEdBQXNDLEVBQUUsQ0FBQztRQUM5QyxZQUFPLEdBQW1DLEVBQUUsQ0FBQztRQUM3QyxZQUFPLEdBQW9DLEVBQUUsQ0FBQztRQUl2RCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUksU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBWSxFQUFFLEtBQWM7UUFDOUMs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TyxHQUFHLENBQUM7SUFDZixDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sb0JBQXlCLFNBQVEscUJBQXlCO0lBRW5FLFlBQVksTUFBNEIsRUFBRSxJQUFZO1FBQ2xELEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQTJDLENBQUM7SUFDNUQsQ0FBQztJQUVNLFNBQVM7UUFDWixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWdDO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxJQUFJO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBb0IsQ0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NsYXNzVHlwZSwgRW51bU1lbWJlclR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7SUxvb2t1cERhdGFQcm92aWRlciwgSVRhYmxlRGF0YVByb3ZpZGVyLCBMb29rdXBEYXRhUHJvdmlkZXIsIFRhYmxldmlld0RhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNb2RlbERlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvciwgRmllbGRWYWxpZGF0b3IsIElMb29rdXBEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtPYmplY3RTZXJpYWxpemVyfSBmcm9tICcuLi9hcGkvdXRpbHMnO1xuaW1wb3J0IHtNb2RlbFV0aWx9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0R3JvdXBOYW1lID0gJ19kZWZhdWx0JztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGVsOiBNb2RlbERlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiczogQXJyYXk8RmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4+ID0gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ3JvdXBzOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPj4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9maWVsZHM6IEFycmF5PEFGaWVsZERlc2NyaXB0b3I8YW55LCBUPj4gPSBbXTtcbiAgICBwcml2YXRlIF9jdXJyZW50VGFiR3JvdXA/OiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIF9jdXJyZW50R3JvdXA/OiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPjtcblxuICAgIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiwgaWRQcm9wZXJ0eT86IHN0cmluZywgdGl0bGVQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG5ldyBNb2RlbERlc2NyaXB0b3I8VD4obW9kZWxUeXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFicztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVRhYkdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IHRhYkdyb3VwID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+KHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIHRhYkdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGFiR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpZWxkR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZmllbGRHcm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPih0aGlzLCBuYW1lKTtcbiAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICBmaWVsZEdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwRGVzY3JpcHRvcihmaWVsZEdyb3VwKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkRGVzY3JpcHRvcjxGVD4oZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RlQsIFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwPy5hZGRGaWVsZChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogRmllbGRJbnB1dERlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxUPih0aGlzLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5fZmllbGRzLmZpbmRJbmRleChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWVsZCAke3Byb3BlcnR5fSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2ZpZWxkc1tmaWVsZElkeF07XG4gICAgICAgIGlmIChmaWVsZC5ncm91cCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBGaWVsZElkeCA9IGZpZWxkLmdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmIGluc3RhbmNlb2YgQUZpZWxkRGVzY3JpcHRvciAmJiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBGaWVsZElkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZ3JvdXAuZmllbGRzLnNwbGljZShncm91cEZpZWxkSWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKGZpZWxkSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkKHByb3BlcnR5OiBzdHJpbmcpOiBBRmllbGREZXNjcmlwdG9yPGFueSwgVD58bnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cDxGVD4ocHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8RlQ+KTogRmllbGRMb29rdXBEZXNjcmlwdG9yPEZULCBUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxGVCwgVD4odGhpcywgcHJvcGVydHksIG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cEVudW0ocHJvcGVydHk6IHN0cmluZywgb3B0aW9uczogQXJyYXk8RW51bU1lbWJlclR5cGU+KTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IHByb3BEZWYgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRBdHRyaWJ1dGVEZWZpbml0aW9uQnlDbGFzc1R5cGUodGhpcy5tb2RlbC50eXBlLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghcHJvcERlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAoYXR0cmlidXRlKSBkZWZpbml0aW9uIG5vdCBmb3VuZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eX0gb24gY2xhc3MgdHlwZSAke3RoaXMuX21vZGVsLnR5cGVOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudW1EZWYgPSBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BEZWYudHlwZSk7XG4gICAgICAgIGlmICghZW51bURlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnVtIGRlZmluaXRpb24gJHtwcm9wRGVmLnR5cGV9IG5vdCBmb3VuZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eX0gb24gY2xhc3MgdHlwZSAke3RoaXMuX21vZGVsLnR5cGVOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3IodGhpcywgcHJvcGVydHksIHByb3BEZWYudHlwZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlFZGl0b3I8RlQ+KHByb3BlcnR5OiBzdHJpbmcsIHR5cGU6IENsYXNzVHlwZTxGVD4sIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8RlQ+KTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCB0YWJsZXZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxGVD4ocHJvcGVydHk6IHN0cmluZywgdHlwZTogQ2xhc3NUeXBlPEZUPiwgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPEZUPiwgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8RlQ+KTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXAud2l0aFZhbGlkYXRvcihuYW1lLCBleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBuZXcgRWRpdG9yRGVzY3JpcHRvcjxUPih0aGlzLm1vZGVsLnR5cGUsIHRoaXMubW9kZWwuaWRQcm9wZXJ0eU5hbWUsIHRoaXMubW9kZWwudGl0bGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIHRoaXMuX3RhYnMpIHtcbiAgICAgICAgICAgIGVkaXRvci5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXAuY29weSgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIGVkaXRvci5fdGFicykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZEdyb3VwIG9mIHRhYkdyb3VwLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGVkaXRvci5fZmllbGRzLnB1c2goLi4uZmllbGRHcm91cC5maWVsZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWRpdG9yLl9ncm91cHMucHVzaCguLi50YWJHcm91cC5maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvci5fY3VycmVudFRhYkdyb3VwID0gZWRpdG9yLl90YWJzW2VkaXRvci5fdGFicy5sZW5ndGggLSAxXTtcbiAgICAgICAgZWRpdG9yLl9jdXJyZW50R3JvdXAgPSBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cC5maWVsZHNbZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBlZGl0b3IuX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIHJldHVybiBlZGl0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXA6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYWJHcm91cCA9IHRhYkdyb3VwO1xuICAgICAgICB0aGlzLl90YWJzLnB1c2godGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmllbGRHcm91cERlc2NyaXB0b3IoZmllbGRHcm91cDogRmllbGRHcm91cERlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0VGFiR3JvdXAoKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwID0gZmllbGRHcm91cDtcbiAgICAgICAgdGhpcy5fZ3JvdXBzLnB1c2goZmllbGRHcm91cCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYWJHcm91cD8uYWRkRmllbGQoZmllbGRHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdEdyb3VwKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRUYWJHcm91cCgpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhYkdyb3VwPy5maWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFiR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4pIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+IHtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfcHJvcGVydHk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2dyb3VwPzogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcbiAgICBwcm90ZWN0ZWQgX2xhYmVsPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZTogc3RyaW5nID0gJyc7XG4gICAgcHJvdGVjdGVkIF9nZXR0ZXI/OiAoaXRlbTogRVQpID0+IFQ7XG4gICAgcHJvdGVjdGVkIF9zZXR0ZXI/OiAoaXRlbTogRVQsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8RmllbGRWYWxpZGF0b3I+ID0gW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IpO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLl9sYWJlbCA9IHRoaXMuX2VkaXRvci5tb2RlbC50eXBlTmFtZSArICcucHJvcGVydGllcy4nICsgcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD47XG5cbiAgICBwdWJsaWMgZ2V0IHByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXF1aXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTGFiZWwobGFiZWw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSByZXF1aXJlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbiA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdldHRlcihnZXR0ZXI6IChpdGVtOiBFVCkgPT4gVCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2V0dGVyKHNldHRlcjogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zZXR0ZXIgPSBzZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAoZXJyOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4gc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMucHVzaChuZXcgRmllbGRWYWxpZGF0b3IobmFtZSwgZXhwcmVzc2lvbiwgbWVzc2FnZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4pIHtcbiAgICAgICAgb2JqLl9sYWJlbCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICBvYmouX3BsYWNlaG9sZGVyID0gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgICAgIG9iai5fcmVxdWlyZWQgPSB0aGlzLl9yZXF1aXJlZDtcbiAgICAgICAgb2JqLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9nZXR0ZXIgPSB0aGlzLl9nZXR0ZXI7XG4gICAgICAgIG9iai5fc2V0dGVyID0gdGhpcy5fc2V0dGVyO1xuICAgICAgICBvYmouX3ZhbGlkYXRvcnMgPSB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkSW5wdXREZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8c3RyaW5nfG51bWJlcnxib29sZWFufERhdGUsIEVUPiB7XG5cbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dDtcblxuICAgIC8vIHRleHRhcmVhIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9yb3dzPzogbnVtYmVyO1xuXG4gICAgLy8gbnVtYmVyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9udW1iZXJNaW4/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4PzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlclN0ZXA/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG5cbiAgICAvLyByYWRpbyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcmFkaW9PcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAvLyBkYXRlcGlja2VyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyRm9ybWF0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNaW4/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNYXg/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJTaG93VGltZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gaW5wdXQgc3BlY2lmaWNcbiAgICBwcml2YXRlIF9tYXhMZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbWluTGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX3BhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHA7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyU3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNYXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbkZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXhGcmFjdGlvbkRpZ2l0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dChtaW5MZW5ndGg/OiBudW1iZXIsIG1heExlbmd0aD86IG51bWJlciwgcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuICAgICAgICB0aGlzLl9taW5MZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1RleHRhcmVhKHJvd3M6IG51bWJlciA9IDMpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uVGV4dGFyZWE7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNOdW1iZXIoc3RlcD86IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1pbkZyYWN0aW9uRGlnaXRzPzogbnVtYmVyLCBtYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5OdW1iZXI7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW4gPSBtaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzU3dpdGNoKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5Td2l0Y2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvKG9wdGlvbnM6IEFycmF5PHN0cmluZz4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uUmFkaW87XG4gICAgICAgIHRoaXMuX3JhZGlvT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RhdGVQaWNrZXIoZm9ybWF0Pzogc3RyaW5nLCBtaW4/OiBEYXRlLCBtYXg/OiBEYXRlLCBzaG93VGltZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uRGF0ZXBpY2tlcjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlckZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6ICdkZC5tbS55eSc7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNaW4gPSBtaW47XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNYXggPSBtYXg7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZSA9IHNob3dUaW1lID8/IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX3Jvd3MgPSB0aGlzLl9yb3dzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluID0gdGhpcy5fbnVtYmVyTWluO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4ID0gdGhpcy5fbnVtYmVyTWF4O1xuICAgICAgICBmaWVsZC5fbnVtYmVyU3RlcCA9IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX3JhZGlvT3B0aW9ucyA9IHRoaXMuX3JhZGlvT3B0aW9ucztcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJGb3JtYXQgPSB0aGlzLl9kYXRlUGlja2VyRm9ybWF0O1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1pbiA9IHRoaXMuX2RhdGVQaWNrZXJNaW47XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyTWF4ID0gdGhpcy5fZGF0ZVBpY2tlck1heDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJTaG93VGltZSA9IHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZTtcbiAgICAgICAgZmllbGQuX21heExlbmd0aCA9IHRoaXMuX21heExlbmd0aDtcbiAgICAgICAgZmllbGQuX21pbkxlbmd0aCA9IHRoaXMuX21pbkxlbmd0aDtcbiAgICAgICAgZmllbGQuX3BhdHRlcm4gPSB0aGlzLl9wYXR0ZXJuO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZElucHV0RGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBUZXh0LFxuICAgICAgICBUZXh0YXJlYSxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICBTd2l0Y2gsXG4gICAgICAgIFJhZGlvLFxuICAgICAgICBEYXRlcGlja2VyXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGltcGxlbWVudHMgSUxvb2t1cERlc2NyaXB0b3I8VD4ge1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPnxudWxsO1xuICAgIHByb3RlY3RlZCBfbG9va3VwVHlwZTogRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkRyb3Bkb3duO1xuICAgIHByb3RlY3RlZCBfaXRlbXNMYWJlbFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YVByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8VD58bnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICBNb2RlbFV0aWwudHJ5U2V0TG9va3VwSXRlbXNQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWxUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0xhYmVsUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5ID0gaXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eShpdGVtc1ZhbHVlUHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSBpdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YUtleVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGF0YUtleVByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGxvb2t1cDogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aExvb2t1cChsb29rdXApO1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQXV0b2NvbXBsZXRlKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkF1dG9jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tb2RlbFR5cGUpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgRmllbGRMb29rdXBEZXNjcmlwdG9yPEVudW1NZW1iZXJUeXBlLCBFVD4ge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bU5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1OYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEFycmF5PEVudW1NZW1iZXJUeXBlPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcblxuICAgICAgICB0aGlzLl9lbnVtTmFtZSA9IGVudW1OYW1lO1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPEVudW1NZW1iZXJUeXBlLCBhbnk+KG51bGwpXG4gICAgICAgICAgICAud2l0aEVudW1OYW1lKGVudW1OYW1lKVxuICAgICAgICAgICAgLndpdGhMb29rdXAoKCkgPT4gb2Yob3B0aW9ucykpO1xuICAgICAgICB0aGlzLndpdGhMb29rdXBEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVudW1OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW51bU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvcHkoKTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9lbnVtTmFtZSwgW10pO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIG1haW4gdGFibGUgY29tcG9uZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHdoZXJlIHNlbGVjdCB3aWxsIGJlIGFwcGxpZWRcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0gPSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtLkRpYWxvZ1RhYmxlTXVsdGlzZWxlY3Q7XG4gICAgcHJpdmF0ZSBfbG9va3VwVGFibGVEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+fG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9oYXNMb29rdXBFeGNsdWRlVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZUZpbHRlclByb3BlcnR5OiBzdHJpbmcgPSAnJztcbiAgICBwcml2YXRlIF9leGNsdWRlVmFsdWVQcm9wZXJ0eTogc3RyaW5nID0gJyc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPiwgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBuZXcgTW9kZWxEZXNjcmlwdG9yPFQ+KG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IgPSBtYWluVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IgPSBsb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uQWRkLCBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0uRGVsZXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1haW5UYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGdldEFsbDogKHF1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0sIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBUYWJsZXZpZXdEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWwudHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhHZXRBbGwoZ2V0QWxsKTtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9ucyhhY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLkFjdGlvbkVudW0+ID0gW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zLnB1c2goLi4uYWN0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRXhjbHVkZShmaWx0ZXJQcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZVByb3BlcnR5OiBzdHJpbmcsIGhhc0xvb2t1cEV4Y2x1ZGU6IGJvb2xlYW4gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSBoYXNMb29rdXBFeGNsdWRlO1xuICAgICAgICB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSBmaWx0ZXJQcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHkgPSB2YWx1ZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IodGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fbW9kZWwudHlwZSwgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvci5jb3B5KCksIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcztcbiAgICAgICAgZmllbGQuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSA9IHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5ID0gdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvciB7XG4gICAgZXhwb3J0IGVudW0gVHlwZUVudW0ge1xuICAgICAgICBEaWFsb2dUYWJsZU11bHRpc2VsZWN0XG4gICAgfVxuXG4gICAgZXhwb3J0IGVudW0gQWN0aW9uRW51bSB7XG4gICAgICAgIEFkZCxcbiAgICAgICAgRGVsZXRlXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bSA9IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0uRGlhbG9nRWRpdG9yO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IgPSB0YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkFkZCwgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkVkaXQsIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3RGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLnRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yQ3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5hZGRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JSZWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci52aWV3RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yVXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5lZGl0RWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb25zKGFjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSwgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ0VkaXRvclxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBBZGQsXG4gICAgICAgIEVkaXQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF92YWxpZGF0b3JzOiBBcnJheTxGaWVsZFZhbGlkYXRvcj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGAke3RoaXMuYmFzZU5hbWV9JHtuYW1lfWA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHQgPSBuYW1lID09PSBFZGl0b3JEZXNjcmlwdG9yLmRlZmF1bHRHcm91cE5hbWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IGZpZWxkcygpOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXTtcblxuICAgIGFic3RyYWN0IGdyb3VwTmFtZSgpOiBzdHJpbmc7XG5cbiAgICBhYnN0cmFjdCBhZGRGaWVsZChmaWVsZDogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+KTogdGhpcztcblxuICAgIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcblxuICAgIHB1YmxpYyBnZXQgYmFzZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdyb3VwTmFtZSgpfV9gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMucHVzaChuZXcgRmllbGRWYWxpZGF0b3IobmFtZSwgZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFiJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IG5ldyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIHRhYi5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgdGFiLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuIl19
|
|
703
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2VkaXRvci5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBa0IsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0QsT0FBTyxFQUFhLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUdwQyxPQUFPLEVBQTBDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHckgsT0FBTyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNqRSxPQUFPLEVBQUMsY0FBYyxFQUFxQixlQUFlLEVBQXVDLE1BQU0sSUFBSSxDQUFDO0FBRTVHLE1BQU0sT0FBTyxnQkFBZ0I7SUFVekIsWUFBWSxTQUF1QixFQUFFLFVBQW1CLEVBQUUsYUFBc0I7UUFOL0QsVUFBSyxHQUFzQyxFQUFFLENBQUM7UUFDOUMsWUFBTyxHQUFtQyxFQUFFLENBQUM7UUFDN0MsWUFBTyxHQUFvQyxFQUFFLENBQUM7UUFRdkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUh0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFJLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRU0s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QUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUEyQyxDQUFDO0lBQzVELENBQUM7SUFFTSxTQUFTO1FBQ1osT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVNLFFBQVEsQ0FBQyxLQUFnQztRQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sSUFBSTtRQUNQLE1BQU0sS0FBSyxHQUFHLElBQUksb0JBQW9CLENBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEcsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge0lMb29rdXBEYXRhUHJvdmlkZXIsIElUYWJsZURhdGFQcm92aWRlciwgTG9va3VwRGF0YVByb3ZpZGVyLCBUYWJsZXZpZXdEYXRhUHJvdmlkZXJ9IGZyb20gJy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7RW51bVZhbHVlfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtDbGFzc1R5cGUsIEVudW1Db25zdGFudFR5cGUsIEVudW1UeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0VudW1VdGlsLCBJMThuVXRpbCwgTW9kZWxVdGlsLCBUeXBlVXRpbH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtGaWVsZFZhbGlkYXRvciwgSUxvb2t1cERlc2NyaXB0b3IsIE1vZGVsRGVzY3JpcHRvciwgVGFibGVEZXNjcmlwdG9yLCBUYWJsZXZpZXdEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRHcm91cE5hbWUgPSAnX2RlZmF1bHQnO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJzOiBBcnJheTxGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxUPj4gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ncm91cHM6IEFycmF5PEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+PiA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpZWxkczogQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIFQ+PiA9IFtdO1xuICAgIHByaXZhdGUgX2N1cnJlbnRUYWJHcm91cD86IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX2N1cnJlbnRHcm91cD86IEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+O1xuXG4gICAgY29uc3RydWN0b3IobW9kZWxUeXBlOiBDbGFzc1R5cGU8VD4sIGlkUHJvcGVydHk/OiBzdHJpbmcsIHRpdGxlUHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBuZXcgTW9kZWxEZXNjcmlwdG9yPFQ+KG1vZGVsVHlwZSwgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFicztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlVGFiR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgdGFiR3JvdXAgPSBuZXcgRmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4odGhpcywgbmFtZSk7XG4gICAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgICAgIHRpdGxlID0gSTE4blV0aWwuZ2V0TW9kZWxUYWJLZXkodGhpcy5tb2RlbCwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFiR3JvdXAud2l0aFRpdGxlKHRpdGxlKTtcbiAgICAgICAgdGhpcy5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXApO1xuICAgICAgICByZXR1cm4gdGFiR3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpZWxkR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyB8IG51bGwpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkR3JvdXAgPSBuZXcgRmllbGRHcm91cERlc2NyaXB0b3I8VD4odGhpcywgbmFtZSk7XG4gICAgICAgIGlmICh0aXRsZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICAgICAgICAgIHRpdGxlID0gSTE4blV0aWwuZ2V0TW9kZWxHcm91cEtleSh0aGlzLm1vZGVsLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkR3JvdXAud2l0aFRpdGxlKHRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXBEZXNjcmlwdG9yKGZpZWxkR3JvdXApO1xuICAgICAgICByZXR1cm4gZmllbGRHcm91cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGREZXNjcmlwdG9yPEZUPihmaWVsZDogQUZpZWxkRGVzY3JpcHRvcjxGVCwgVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0R3JvdXAoKTtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXA/LmFkZEZpZWxkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkKHByb3BlcnR5OiBzdHJpbmcpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkSW5wdXREZXNjcmlwdG9yPFQ+KHRoaXMsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZpZWxkKHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZmllbGRJZHggPSB0aGlzLl9maWVsZHMuZmluZEluZGV4KGYgPT4gZi5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICBpZiAoZmllbGRJZHggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpZWxkICR7cHJvcGVydHl9IGRvZXMgbm90IGV4aXN0LmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZmllbGRzW2ZpZWxkSWR4XTtcbiAgICAgICAgaWYgKGZpZWxkLmdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cEZpZWxkSWR4ID0gZmllbGQuZ3JvdXAuZmllbGRzLmZpbmRJbmRleChmID0+IGYgaW5zdGFuY2VvZiBBRmllbGREZXNjcmlwdG9yICYmIGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChncm91cEZpZWxkSWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5ncm91cC5maWVsZHMuc3BsaWNlKGdyb3VwRmllbGRJZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5zcGxpY2UoZmllbGRJZHgsIDEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmllbGQocHJvcGVydHk6IHN0cmluZyk6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBUPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXA8RlQ+KHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPEZUPik6IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cERlc2NyaXB0b3I8RlQsIFQ+KHRoaXMsIHByb3BlcnR5LCBtb2RlbFR5cGUpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRMb29rdXBFbnVtKFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnVtVHlwZTogRW51bVR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBBcnJheTxFbnVtQ29uc3RhbnRUeXBlPixcbiAgICAgICAgbmFtZUFzVmFsdWUgPSBmYWxzZSxcbiAgICAgICAgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyB8IG51bGxcbiAgICApOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcih0aGlzLCBwcm9wZXJ0eSwgZW51bVR5cGUsIG9wdGlvbnMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoKTtcbiAgICAgICAgdGhpcy5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkTWFueUVkaXRvcjxGVD4ocHJvcGVydHk6IHN0cmluZywgdHlwZTogQ2xhc3NUeXBlPEZUPiwgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxGVD4pOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPEZULCBUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IodGhpcywgcHJvcGVydHksIHR5cGUsIHRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPEZUPihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgdHlwZTogQ2xhc3NUeXBlPEZUPixcbiAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPEZUPixcbiAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8RlQ+XG4gICAgKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGVCwgVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCB0eXBlLCBtYWluVGFibGVEZXNjcmlwdG9yLCBsb29rdXBUYWJsZURlc2NyaXB0b3IpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkKGRpc2FibGVkID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXAud2l0aFZhbGlkYXRvcihuYW1lLCBleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBuZXcgRWRpdG9yRGVzY3JpcHRvcjxUPih0aGlzLm1vZGVsLnR5cGUsIHRoaXMubW9kZWwuaWRQcm9wZXJ0eU5hbWUsIHRoaXMubW9kZWwudGl0bGVQcm9wZXJ0eU5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIHRoaXMuX3RhYnMpIHtcbiAgICAgICAgICAgIGVkaXRvci5jcmVhdGVUYWJHcm91cERlc2NyaXB0b3IodGFiR3JvdXAuY29weSgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHRhYkdyb3VwIG9mIGVkaXRvci5fdGFicykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZEdyb3VwIG9mIHRhYkdyb3VwLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIGVkaXRvci5fZmllbGRzLnB1c2goLi4uZmllbGRHcm91cC5maWVsZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWRpdG9yLl9ncm91cHMucHVzaCguLi50YWJHcm91cC5maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvci5fY3VycmVudFRhYkdyb3VwID0gZWRpdG9yLl90YWJzW2VkaXRvci5fdGFicy5sZW5ndGggLSAxXTtcbiAgICAgICAgZWRpdG9yLl9jdXJyZW50R3JvdXAgPSBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cC5maWVsZHNbZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBlZGl0b3IuX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIHJldHVybiBlZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUZpZWxkR3JvdXBEZXNjcmlwdG9yKGZpZWxkR3JvdXA6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cCA9IGZpZWxkR3JvdXA7XG4gICAgICAgIHRoaXMuX2dyb3Vwcy5wdXNoKGZpZWxkR3JvdXApO1xuICAgICAgICB0aGlzLl9jdXJyZW50VGFiR3JvdXA/LmFkZEZpZWxkKGZpZWxkR3JvdXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRhYkdyb3VwRGVzY3JpcHRvcih0YWJHcm91cDogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhYkdyb3VwID0gdGFiR3JvdXA7XG4gICAgICAgIHRoaXMuX3RhYnMucHVzaCh0YWJHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdEdyb3VwKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRUYWJHcm91cCgpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhYkdyb3VwPy5maWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFiR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lLCAnZ2VuZXJhbC5nZW5lcmFsJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPjtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+KSB7XG4gICAgICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wcm9wZXJ0eTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZ3JvdXA/OiBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+O1xuICAgIHByb3RlY3RlZCBfbGFiZWw/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9wbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3JlcXVpcmVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdFZhbHVlPzogVDtcbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfZ2V0dGVyPzogKGl0ZW06IEVUKSA9PiBUO1xuICAgIHByb3RlY3RlZCBfc2V0dGVyPzogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRvcnM6IEFycmF5PEZpZWxkVmFsaWRhdG9yPiA9IFtdO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWRGdW5jdGlvbj86IChtb2RlbDogYW55KSA9PiBib29sZWFuO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fcHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5fbGFiZWwgPSBJMThuVXRpbC5nZXRNb2RlbFByb3BlcnR5S2V5KHRoaXMuX2VkaXRvci5tb2RlbCwgcHJvcGVydHkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBnZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXR0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkRnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgY29weSgpOiBBRmllbGREZXNjcmlwdG9yPFQsIEVUPjtcblxuICAgIHB1YmxpYyB3aXRoTGFiZWwobGFiZWw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZXF1aXJlZChyZXF1aXJlZCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSByZXF1aXJlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZChkaXNhYmxlZCA9IHRydWUsIGRpc2FibGVkRnVuY3Rpb24/OiAobW9kZWw6IGFueSkgPT4gYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICBpZiAoZGlzYWJsZWRGdW5jdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWRGdW5jdGlvbiA9IGRpc2FibGVkRnVuY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlOiBUKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEdldHRlcihnZXR0ZXI6IChpdGVtOiBFVCkgPT4gVCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2V0dGVyKHNldHRlcjogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zZXR0ZXIgPSBzZXR0ZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbiwgbWVzc2FnZT86IChlcnI6IGFueSwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9ycy5wdXNoKG5ldyBGaWVsZFZhbGlkYXRvcihuYW1lLCBleHByZXNzaW9uLCBtZXNzYWdlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb3B5RmllbGRzVG8ob2JqOiBBRmllbGREZXNjcmlwdG9yPFQsIEVUPikge1xuICAgICAgICBvYmouX2xhYmVsID0gdGhpcy5fbGFiZWw7XG4gICAgICAgIG9iai5fcGxhY2Vob2xkZXIgPSB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgICAgICAgb2JqLl9yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xuICAgICAgICBvYmouX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIG9iai5fZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICBvYmouX2Rpc2FibGVkRnVuY3Rpb24gPSB0aGlzLl9kaXNhYmxlZEZ1bmN0aW9uO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9nZXR0ZXIgPSB0aGlzLl9nZXR0ZXI7XG4gICAgICAgIG9iai5fc2V0dGVyID0gdGhpcy5fc2V0dGVyO1xuICAgICAgICBvYmouX3ZhbGlkYXRvcnMgPSB0aGlzLl92YWxpZGF0b3JzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkSW5wdXREZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUsIEVUPiB7XG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlRleHQ7XG5cbiAgICAvLyB0ZXh0YXJlYSBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcm93cz86IG51bWJlcjtcblxuICAgIC8vIG51bWJlciBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfbnVtYmVyTWluPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlck1heD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJTdGVwPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlck1pbkZyYWN0aW9uRGlnaXRzPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX251bWJlck1heEZyYWN0aW9uRGlnaXRzPzogbnVtYmVyO1xuXG4gICAgLy8gcmFkaW8gc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX3JhZGlvT3B0aW9uczogQXJyYXk8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlPj4gPSBbXTtcblxuICAgIC8vIGRhdGVwaWNrZXIgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJGb3JtYXQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlck1pbj86IERhdGU7XG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlck1heD86IERhdGU7XG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlclNob3dUaW1lID0gZmFsc2U7XG5cbiAgICAvLyBpbnB1dCBzcGVjaWZpY1xuICAgIHByaXZhdGUgX21heExlbmd0aD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9taW5MZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cDtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlclN0ZXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJTdGVwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heEZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByYWRpb09wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWRpb09wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlckZvcm1hdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWluO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlck1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJNYXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyU2hvd1RpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXhMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhMZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtaW5MZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5MZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0dGVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNUZXh0KG1pbkxlbmd0aD86IG51bWJlciwgbWF4TGVuZ3RoPzogbnVtYmVyLCBwYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwLCBpc0VtYWlsPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5UZXh0O1xuICAgICAgICB0aGlzLl9taW5MZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgIHRoaXMuX21heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgICAgICB0aGlzLndpdGhWYWxpZGF0b3IoJ2VtYWlsJywgY29udHJvbCA9PiAhVmFsaWRhdG9ycy5lbWFpbChjb250cm9sKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dGFyZWEocm93cyA9IDMsIG1pbkxlbmd0aD86IG51bWJlciwgbWF4TGVuZ3RoPzogbnVtYmVyLCBwYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXREZXNjcmlwdG9yLlR5cGVFbnVtLlRleHRhcmVhO1xuICAgICAgICB0aGlzLl9yb3dzID0gcm93cztcbiAgICAgICAgdGhpcy5fbWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgICAgIHRoaXMuX3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNOdW1iZXIoc3RlcD86IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1pbkZyYWN0aW9uRGlnaXRzPzogbnVtYmVyLCBtYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5OdW1iZXI7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLl9udW1iZXJNaW4gPSBtaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzU3dpdGNoKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5Td2l0Y2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvKG9wdGlvbnM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIG9wdGlvbnNUaXRsZVBhdGg/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uUmFkaW87XG4gICAgICAgIHRoaXMuX3JhZGlvT3B0aW9ucyA9IG9wdGlvbnMubWFwKG8gPT4gPEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+Pnt2YWx1ZTogbywgdGl0bGU6IGAke29wdGlvbnNUaXRsZVBhdGggPyBgJHtvcHRpb25zVGl0bGVQYXRofS5gIDogJyd9JHtvfWB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzUmFkaW9Gcm9tRW51bShlbnVtVHlwZTogRW51bVR5cGUsIG9wdGlvbnNUaXRsZVBhdGg/OiBzdHJpbmcgfCBudWxsLCB2YWx1ZXM/OiBBcnJheTxFbnVtQ29uc3RhbnRUeXBlPiwgbmFtZUFzVmFsdWUgPSBmYWxzZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0RGVzY3JpcHRvci5UeXBlRW51bS5SYWRpbztcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmFkaW9PcHRpb25zID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpXG4gICAgICAgICAgICA/IEVudW1VdGlsLmZyb21WYWx1ZXNBc0VudW1WYWx1ZUFycmF5KGVudW1UeXBlLCB2YWx1ZXMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RhdGVQaWNrZXIoZm9ybWF0Pzogc3RyaW5nLCBtaW4/OiBEYXRlLCBtYXg/OiBEYXRlLCBzaG93VGltZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dERlc2NyaXB0b3IuVHlwZUVudW0uRGF0ZXBpY2tlcjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlckZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6ICdkZC5tbS55eSc7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNaW4gPSBtaW47XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJNYXggPSBtYXg7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZSA9IHNob3dUaW1lID8/IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX3Jvd3MgPSB0aGlzLl9yb3dzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluID0gdGhpcy5fbnVtYmVyTWluO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4ID0gdGhpcy5fbnVtYmVyTWF4O1xuICAgICAgICBmaWVsZC5fbnVtYmVyU3RlcCA9IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIGZpZWxkLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuX251bWJlck1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX3JhZGlvT3B0aW9ucyA9IFsuLi50aGlzLl9yYWRpb09wdGlvbnNdO1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlckZvcm1hdCA9IHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyTWluID0gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJNYXggPSB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlclNob3dUaW1lID0gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgICAgICBmaWVsZC5fbWF4TGVuZ3RoID0gdGhpcy5fbWF4TGVuZ3RoO1xuICAgICAgICBmaWVsZC5fbWluTGVuZ3RoID0gdGhpcy5fbWluTGVuZ3RoO1xuICAgICAgICBmaWVsZC5fcGF0dGVybiA9IHRoaXMuX3BhdHRlcm47XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmllbGRJbnB1dERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIFR5cGVFbnVtIHtcbiAgICAgICAgVGV4dCxcbiAgICAgICAgVGV4dGFyZWEsXG4gICAgICAgIE51bWJlcixcbiAgICAgICAgU3dpdGNoLFxuICAgICAgICBSYWRpbyxcbiAgICAgICAgRGF0ZXBpY2tlclxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBpbXBsZW1lbnRzIElMb29rdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX21vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2xvb2t1cFR5cGU6IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bSA9IEZpZWxkTG9va3VwRGVzY3JpcHRvci5Mb29rdXBUeXBlRW51bS5Ecm9wZG93bjtcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zTGFiZWxQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFLZXlQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2RhdGFQcm92aWRlcj86IElMb29rdXBEYXRhUHJvdmlkZXI8VCwgYW55PjtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICBNb2RlbFV0aWwudHJ5U2V0TG9va3VwSXRlbXNQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0xhYmVsUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc1ZhbHVlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhS2V5UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb2RlbFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0xhYmVsUHJvcGVydHkoaXRlbXNMYWJlbFByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5ID0gaXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eShpdGVtc1ZhbHVlUHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSBpdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YUtleVByb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGF0YUtleVByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGxvb2t1cDogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aExvb2t1cChsb29rdXApO1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQXV0b2NvbXBsZXRlKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUeXBlID0gRmllbGRMb29rdXBEZXNjcmlwdG9yLkxvb2t1cFR5cGVFbnVtLkF1dG9jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tb2RlbFR5cGUpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZExvb2t1cERlc2NyaXB0b3Ige1xuICAgIGV4cG9ydCBlbnVtIExvb2t1cFR5cGVFbnVtIHtcbiAgICAgICAgRHJvcGRvd24sXG4gICAgICAgIEF1dG9jb21wbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgRmllbGRMb29rdXBEZXNjcmlwdG9yPEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+LCBFVD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VudW1UeXBlOiBFbnVtVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9ucz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcbiAgICAgICAgdGhpcy5fZW51bVR5cGUgPSBlbnVtVHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uRW51bVZhbHVlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG9wdGlvbnMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIGFueT4obnVsbCkud2l0aExvb2t1cCgoKSA9PiBvZihvcHRpb25FbnVtVmFsdWVzKSk7XG4gICAgICAgIHRoaXMud2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXIpO1xuICAgICAgICB0aGlzLndpdGhJdGVtc0xhYmVsUHJvcGVydHkoJ3RpdGxlJyk7XG4gICAgICAgIHRoaXMud2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVudW1UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW51bVR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNvcHkoKTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9lbnVtVHlwZSwgW10pO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUeXBlID0gdGhpcy5fbG9va3VwVHlwZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zTGFiZWxQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGVsOiBNb2RlbERlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+OyAvLyB0YWJsZSBkZXNjcmlwdG9yIGZvciBtYWluIHRhYmxlIGNvbXBvbmVudFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+OyAvLyB0YWJsZSBkZXNjcmlwdG9yIGZvciB3aGVyZSBzZWxlY3Qgd2lsbCBiZSBhcHBsaWVkXG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLlR5cGVFbnVtID0gRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bS5EaWFsb2dUYWJsZU11bHRpc2VsZWN0O1xuICAgIHByaXZhdGUgX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55PiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gJyc7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZVZhbHVlUHJvcGVydHkgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD4sIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG5ldyBNb2RlbERlc2NyaXB0b3I8VD4obW9kZWxUeXBlKTtcbiAgICAgICAgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvciA9IG1haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvciA9IGxvb2t1cFRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fYWN0aW9ucy5wdXNoKEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5BZGQsIEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWFpblRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb29rdXBUYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXA8Uz4oZ2V0QWxsOiAocXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+LCBzZXJ2aWNlVHlwZT86IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IFRhYmxldmlld0RhdGFQcm92aWRlcjxULCBTPih0aGlzLl9tb2RlbC50eXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aEdldEFsbChnZXRBbGwpO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXBEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb25zKGFjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXBFeGNsdWRlKGZpbHRlclByb3BlcnR5OiBzdHJpbmcsIHZhbHVlUHJvcGVydHk6IHN0cmluZywgaGFzTG9va3VwRXhjbHVkZSA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcyA9IGhhc0xvb2t1cEV4Y2x1ZGU7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSA9IGZpbHRlclByb3BlcnR5O1xuICAgICAgICB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9IHZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tb2RlbC50eXBlLCB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yLmNvcHkoKSwgdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yLmNvcHkoKSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX2FjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLm1hcChhID0+IGEpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICAgICAgZmllbGQuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzO1xuICAgICAgICBmaWVsZC5fZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZXhjbHVkZVZhbHVlUHJvcGVydHkgPSB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ1RhYmxlTXVsdGlzZWxlY3RcbiAgICB9XG5cbiAgICBleHBvcnQgZW51bSBBY3Rpb25FbnVtIHtcbiAgICAgICAgQWRkLFxuICAgICAgICBEZWxldGVcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlbFR5cGU6IENsYXNzVHlwZTxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+O1xuICAgIHByaXZhdGUgX2ZpZWxkVHlwZTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5UeXBlRW51bSA9IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuVHlwZUVudW0uRGlhbG9nRWRpdG9yO1xuICAgIHByaXZhdGUgX2FjdGlvbnM6IEFycmF5PEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IgPSB0YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkFkZCwgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvci5BY3Rpb25FbnVtLkVkaXQsIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZXZpZXdEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IudGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JDcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmFkZEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvclJlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLnZpZXdFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JVcGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmVkaXRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb25zKGFjdGlvbnM6IEFycmF5PEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IuQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSwgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9hY3Rpb25zID0gdGhpcy5fYWN0aW9ucy5tYXAoYSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yIHtcbiAgICBleHBvcnQgZW51bSBUeXBlRW51bSB7XG4gICAgICAgIERpYWxvZ0VkaXRvclxuICAgIH1cblxuICAgIGV4cG9ydCBlbnVtIEFjdGlvbkVudW0ge1xuICAgICAgICBBZGQsXG4gICAgICAgIEVkaXQsXG4gICAgICAgIERlbGV0ZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGVmYXVsdDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX3RpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZmllbGRzOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXSA9IFtdO1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdG9yczogQXJyYXk8RmllbGRWYWxpZGF0b3I+ID0gW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX25hbWUgPSBgJHt0aGlzLmJhc2VOYW1lfSR7bmFtZX1gO1xuICAgICAgICB0aGlzLl9kZWZhdWx0ID0gbmFtZSA9PT0gRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgZmllbGRzKCk6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdO1xuXG4gICAgcHVibGljIGdldCB2YWxpZGF0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhc2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5ncm91cE5hbWUoKX1fYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHQ7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ3JvdXBOYW1lKCk6IHN0cmluZztcblxuICAgIGFic3RyYWN0IGFkZEZpZWxkKGZpZWxkOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4pOiB0aGlzO1xuXG4gICAgYWJzdHJhY3QgY29weSgpOiBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+O1xuXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdG9yKG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbikge1xuICAgICAgICB0aGlzLl92YWxpZGF0b3JzLnB1c2gobmV3IEZpZWxkVmFsaWRhdG9yKG5hbWUsIGV4cHJlc3Npb24sIHVuZGVmaW5lZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcyBhcyBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4+O1xuICAgIH1cblxuICAgIHB1YmxpYyBncm91cE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICd0YWInO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChmaWVsZDogRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMubmFtZS5zdWJzdHJpbmcodGhpcy5iYXNlTmFtZS5sZW5ndGgpKTtcbiAgICAgICAgdGFiLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICB0YWIuX2ZpZWxkcyA9IHRoaXMuZmllbGRzLm1hcChmID0+IGYuY29weSgpKTtcbiAgICAgICAgcmV0dXJuIHRhYjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj47XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2dyb3VwJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxufVxuIl19
|