@sapui5/sap.fe.core 1.102.3 → 1.105.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +120 -0
- package/src/sap/fe/core/ActionRuntime.ts +108 -0
- package/src/sap/fe/core/AppComponent.js +81 -35
- package/src/sap/fe/core/AppComponent.ts +68 -44
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- package/src/sap/fe/core/BaseController.js +12 -10
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +291 -218
- package/src/sap/fe/core/CommonUtils.ts +315 -251
- package/src/sap/fe/core/ExtensionAPI.js +25 -28
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +5 -5
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +9 -6
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
- package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
- package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +171 -140
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +12 -26
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +9 -4
- package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
- package/src/sap/fe/core/controls/FilterBar.js +7 -3
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +48 -34
- package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
- package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
- package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
- package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
- package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
- package/src/sap/fe/core/converters/helpers/ID.js +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
- package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +39 -67
- package/src/sap/fe/core/messagebundle_ar.properties +27 -44
- package/src/sap/fe/core/messagebundle_bg.properties +27 -44
- package/src/sap/fe/core/messagebundle_ca.properties +27 -44
- package/src/sap/fe/core/messagebundle_cs.properties +27 -44
- package/src/sap/fe/core/messagebundle_cy.properties +26 -43
- package/src/sap/fe/core/messagebundle_da.properties +27 -44
- package/src/sap/fe/core/messagebundle_de.properties +25 -42
- package/src/sap/fe/core/messagebundle_el.properties +28 -45
- package/src/sap/fe/core/messagebundle_en.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
- package/src/sap/fe/core/messagebundle_es.properties +27 -44
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
- package/src/sap/fe/core/messagebundle_et.properties +27 -44
- package/src/sap/fe/core/messagebundle_fi.properties +27 -44
- package/src/sap/fe/core/messagebundle_fr.properties +26 -43
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
- package/src/sap/fe/core/messagebundle_hi.properties +27 -44
- package/src/sap/fe/core/messagebundle_hr.properties +27 -44
- package/src/sap/fe/core/messagebundle_hu.properties +27 -44
- package/src/sap/fe/core/messagebundle_id.properties +27 -44
- package/src/sap/fe/core/messagebundle_it.properties +43 -60
- package/src/sap/fe/core/messagebundle_iw.properties +27 -44
- package/src/sap/fe/core/messagebundle_ja.properties +27 -44
- package/src/sap/fe/core/messagebundle_kk.properties +27 -44
- package/src/sap/fe/core/messagebundle_ko.properties +30 -47
- package/src/sap/fe/core/messagebundle_lt.properties +27 -44
- package/src/sap/fe/core/messagebundle_lv.properties +27 -44
- package/src/sap/fe/core/messagebundle_ms.properties +27 -44
- package/src/sap/fe/core/messagebundle_nl.properties +29 -46
- package/src/sap/fe/core/messagebundle_no.properties +27 -44
- package/src/sap/fe/core/messagebundle_pl.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
- package/src/sap/fe/core/messagebundle_ro.properties +27 -44
- package/src/sap/fe/core/messagebundle_ru.properties +27 -44
- package/src/sap/fe/core/messagebundle_sh.properties +27 -44
- package/src/sap/fe/core/messagebundle_sk.properties +27 -44
- package/src/sap/fe/core/messagebundle_sl.properties +27 -44
- package/src/sap/fe/core/messagebundle_sv.properties +27 -44
- package/src/sap/fe/core/messagebundle_th.properties +25 -42
- package/src/sap/fe/core/messagebundle_tr.properties +27 -44
- package/src/sap/fe/core/messagebundle_uk.properties +27 -44
- package/src/sap/fe/core/messagebundle_vi.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +18 -17
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +3 -3
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -17,7 +17,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
17
17
|
|
|
18
18
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
19
19
|
|
|
20
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf
|
|
20
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
21
21
|
|
|
22
22
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
23
23
|
|
|
@@ -106,8 +106,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
106
106
|
/**
|
|
107
107
|
* Parse a manifest routing configuration for internal usage.
|
|
108
108
|
*
|
|
109
|
-
* @param
|
|
110
|
-
* @param
|
|
109
|
+
* @param oRoutingConfig The routing configuration from the manifest
|
|
110
|
+
* @param oRootViewConfig The root view configuration from the manifest
|
|
111
111
|
* @private
|
|
112
112
|
*/
|
|
113
113
|
;
|
|
@@ -137,7 +137,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
137
137
|
sRoutePattern = oRouteManifestInfo.pattern; // Check route pattern: all patterns need to end with ':?query:', that we use for parameters
|
|
138
138
|
|
|
139
139
|
if (sRoutePattern.length < 8 || sRoutePattern.indexOf(":?query:") !== sRoutePattern.length - 8) {
|
|
140
|
-
Log.warning("Pattern for route "
|
|
140
|
+
Log.warning("Pattern for route ".concat(sRouteName, " doesn't end with ':?query:' : ").concat(sRoutePattern));
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
var iRouteLevel = this._getViewLevelFromPattern(sRoutePattern, 0);
|
|
@@ -229,11 +229,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
229
229
|
|
|
230
230
|
if (this._mTargets[sDefaultTargetName].options && this._mTargets[sDefaultTargetName].options.settings) {
|
|
231
231
|
var oSettings = this._mTargets[sDefaultTargetName].options.settings;
|
|
232
|
-
this.sContextPath = oSettings.contextPath || "/"
|
|
232
|
+
this.sContextPath = oSettings.contextPath || "/".concat(oSettings.entitySet);
|
|
233
233
|
}
|
|
234
234
|
|
|
235
235
|
if (!this.sContextPath) {
|
|
236
|
-
Log.warning("Cannot determine default contextPath: contextPath or entitySet missing in default target: "
|
|
236
|
+
Log.warning("Cannot determine default contextPath: contextPath or entitySet missing in default target: ".concat(sDefaultTargetName));
|
|
237
237
|
}
|
|
238
238
|
} else {
|
|
239
239
|
Log.warning("Cannot determine default contextPath: no default route found.");
|
|
@@ -248,10 +248,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
248
248
|
// After sorting the targets per level we can then go through their navigation object and update the paths accordingly.
|
|
249
249
|
if (target.options) {
|
|
250
250
|
var settings = target.options.settings;
|
|
251
|
-
var sContextPath = settings.contextPath || (settings.entitySet ? "/"
|
|
251
|
+
var sContextPath = settings.contextPath || (settings.entitySet ? "/".concat(settings.entitySet) : "");
|
|
252
252
|
|
|
253
253
|
if (!settings.fullContextPath && sContextPath) {
|
|
254
|
-
settings.fullContextPath = sContextPath
|
|
254
|
+
settings.fullContextPath = "".concat(sContextPath, "/");
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
Object.keys(settings.navigation || {}).forEach(function (sNavName) {
|
|
@@ -262,9 +262,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
262
262
|
targetRoute.targets.forEach(function (sTargetName) {
|
|
263
263
|
if (_this3._mTargets[sTargetName].options && _this3._mTargets[sTargetName].options.settings && !_this3._mTargets[sTargetName].options.settings.fullContextPath) {
|
|
264
264
|
if (target.viewLevel === 0) {
|
|
265
|
-
_this3._mTargets[sTargetName].options.settings.fullContextPath = (sNavName.startsWith("/") ? "" : "/") + sNavName
|
|
265
|
+
_this3._mTargets[sTargetName].options.settings.fullContextPath = "".concat((sNavName.startsWith("/") ? "" : "/") + sNavName, "/");
|
|
266
266
|
} else {
|
|
267
|
-
_this3._mTargets[sTargetName].options.settings.fullContextPath = settings.fullContextPath + sNavName
|
|
267
|
+
_this3._mTargets[sTargetName].options.settings.fullContextPath = "".concat(settings.fullContextPath + sNavName, "/");
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
270
|
});
|
|
@@ -276,9 +276,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
276
276
|
/**
|
|
277
277
|
* Calculates a view level from a pattern by counting the number of segments.
|
|
278
278
|
*
|
|
279
|
-
* @param
|
|
280
|
-
* @param
|
|
281
|
-
* @returns
|
|
279
|
+
* @param sPattern The pattern
|
|
280
|
+
* @param viewLevel The current level of view
|
|
281
|
+
* @returns The level
|
|
282
282
|
*/
|
|
283
283
|
;
|
|
284
284
|
|
|
@@ -287,7 +287,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
287
287
|
var regex = new RegExp("/[^/]*$");
|
|
288
288
|
|
|
289
289
|
if (sPattern && sPattern[0] !== "/" && sPattern[0] !== "?") {
|
|
290
|
-
sPattern = "/"
|
|
290
|
+
sPattern = "/".concat(sPattern);
|
|
291
291
|
}
|
|
292
292
|
|
|
293
293
|
if (sPattern.length) {
|
|
@@ -312,7 +312,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
312
312
|
};
|
|
313
313
|
|
|
314
314
|
_proto._getComponentId = function _getComponentId(sOwnerId, sComponentId) {
|
|
315
|
-
if (sComponentId.indexOf(sOwnerId
|
|
315
|
+
if (sComponentId.indexOf("".concat(sOwnerId, "---")) === 0) {
|
|
316
316
|
return sComponentId.substr(sOwnerId.length + 3);
|
|
317
317
|
}
|
|
318
318
|
|
|
@@ -321,8 +321,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
321
321
|
/**
|
|
322
322
|
* Get target information for a given component.
|
|
323
323
|
*
|
|
324
|
-
* @param
|
|
325
|
-
* @returns
|
|
324
|
+
* @param oComponentInstance Instance of the component
|
|
325
|
+
* @returns The configuration for the target
|
|
326
326
|
*/
|
|
327
327
|
;
|
|
328
328
|
|
|
@@ -373,10 +373,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
373
373
|
/**
|
|
374
374
|
* Method to return a map of routing target parameters where the binding syntax is resolved to the current model.
|
|
375
375
|
*
|
|
376
|
-
* @param
|
|
377
|
-
* @param
|
|
378
|
-
* @param
|
|
379
|
-
* @returns
|
|
376
|
+
* @param mParameters Parameters map in the format [k: string] : ComplexBindingSyntax
|
|
377
|
+
* @param sTargetRoute Name of the target route
|
|
378
|
+
* @param oContext The instance of the binding context
|
|
379
|
+
* @returns A promise which resolves to the routing target parameters
|
|
380
380
|
*/
|
|
381
381
|
;
|
|
382
382
|
|
|
@@ -423,7 +423,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
423
423
|
return oParameters;
|
|
424
424
|
});
|
|
425
425
|
} catch (oError) {
|
|
426
|
-
Log.error("Could not parse the parameters for the navigation to route "
|
|
426
|
+
Log.error("Could not parse the parameters for the navigation to route ".concat(sTargetRoute));
|
|
427
427
|
oParametersPromise = Promise.resolve(undefined);
|
|
428
428
|
}
|
|
429
429
|
|
|
@@ -438,22 +438,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
438
438
|
/**
|
|
439
439
|
* Navigates to a context.
|
|
440
440
|
*
|
|
441
|
-
* @param
|
|
442
|
-
* @param
|
|
443
|
-
* @param
|
|
444
|
-
* @param
|
|
441
|
+
* @param oContext The Context to be navigated to
|
|
442
|
+
* @param [mParameters] Optional, map containing the following attributes:
|
|
443
|
+
* @param [mParameters.checkNoHashChange] Navigate to the context without changing the URL
|
|
444
|
+
* @param [mParameters.asyncContext] The context is created async, navigate to (...) and
|
|
445
445
|
* wait for Promise to be resolved and then navigate into the context
|
|
446
|
-
* @param
|
|
447
|
-
* @param
|
|
448
|
-
* @param
|
|
449
|
-
* @param
|
|
450
|
-
* @param
|
|
451
|
-
* @param
|
|
452
|
-
* @param
|
|
453
|
-
* @param
|
|
454
|
-
* @param
|
|
455
|
-
* @returns
|
|
456
|
-
*
|
|
446
|
+
* @param [mParameters.bDeferredContext] The context shall be created deferred at the target page
|
|
447
|
+
* @param [mParameters.editable] The target page shall be immediately in the edit mode to avoid flickering
|
|
448
|
+
* @param [mParameters.bPersistOPScroll] The bPersistOPScroll will be used for scrolling to first tab
|
|
449
|
+
* @param [mParameters.updateFCLLevel] `+1` if we add a column in FCL, `-1` to remove a column, 0 to stay on the same column
|
|
450
|
+
* @param [mParameters.noPreservationCache] Do navigation without taking into account the preserved cache mechanism
|
|
451
|
+
* @param [mParameters.bRecreateContext] Force re-creation of the context instead of using the one passed as parameter
|
|
452
|
+
* @param [mParameters.bForceFocus] Forces focus selection after navigation
|
|
453
|
+
* @param [oViewData] View data
|
|
454
|
+
* @param [oCurrentTargetInfo] The target information from which the navigation is triggered
|
|
455
|
+
* @returns Promise which is resolved once the navigation is triggered
|
|
457
456
|
* @ui5-restricted
|
|
458
457
|
* @final
|
|
459
458
|
*/
|
|
@@ -498,7 +497,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
498
497
|
var sLayout = this._calculateLayout(sTargetPath, mParameters);
|
|
499
498
|
|
|
500
499
|
if (sLayout) {
|
|
501
|
-
sTargetPath += "?layout="
|
|
500
|
+
sTargetPath += "?layout=".concat(sLayout);
|
|
502
501
|
} // Navigation parameters for later usage
|
|
503
502
|
|
|
504
503
|
|
|
@@ -593,10 +592,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
593
592
|
* @name sap.fe.core.controllerextensions.Routing#navigateToRoute
|
|
594
593
|
* @memberof sap.fe.core.controllerextensions.Routing
|
|
595
594
|
* @static
|
|
596
|
-
* @param
|
|
597
|
-
* @param
|
|
598
|
-
* @returns
|
|
599
|
-
*
|
|
595
|
+
* @param sTargetRouteName Name of the target route
|
|
596
|
+
* @param [oRouteParameters] Parameters to be used with route to create the target hash
|
|
597
|
+
* @returns Promise that is resolved when the navigation is finalized
|
|
600
598
|
* @ui5-restricted
|
|
601
599
|
* @final
|
|
602
600
|
*/
|
|
@@ -609,8 +607,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
609
607
|
/**
|
|
610
608
|
* Checks if one of the current views on the screen is bound to a given context.
|
|
611
609
|
*
|
|
612
|
-
* @param
|
|
613
|
-
* @returns
|
|
610
|
+
* @param oContext The context
|
|
611
|
+
* @returns `true` or `false` if the current state is impacted or not
|
|
614
612
|
*/
|
|
615
613
|
;
|
|
616
614
|
|
|
@@ -649,7 +647,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
649
647
|
}
|
|
650
648
|
};
|
|
651
649
|
|
|
652
|
-
_proto.
|
|
650
|
+
_proto._checkIfContextSupportsSemanticPath = function _checkIfContextSupportsSemanticPath(oContext) {
|
|
653
651
|
var sPath = oContext.getPath(); // First, check if this is a level-1 object (path = /aaa(bbb))
|
|
654
652
|
|
|
655
653
|
if (!/^\/[^\(]+\([^\)]+\)$/.test(sPath)) {
|
|
@@ -657,8 +655,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
657
655
|
} // Then check if the entity has semantic keys
|
|
658
656
|
|
|
659
657
|
|
|
660
|
-
var oMetaModel = oContext.getModel().getMetaModel()
|
|
661
|
-
|
|
658
|
+
var oMetaModel = oContext.getModel().getMetaModel();
|
|
659
|
+
var sEntitySetName = oMetaModel.getMetaContext(oContext.getPath()).getObject("@sapui.name");
|
|
662
660
|
|
|
663
661
|
if (!SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName)) {
|
|
664
662
|
return false;
|
|
@@ -684,7 +682,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
684
682
|
if (this.oLastSemanticMapping && this.oLastSemanticMapping.technicalPath === sPath) {
|
|
685
683
|
sPath = this.oLastSemanticMapping.semanticPath;
|
|
686
684
|
}
|
|
687
|
-
} else if (this.
|
|
685
|
+
} else if (this._checkIfContextSupportsSemanticPath(oContext)) {
|
|
688
686
|
// We check if we have to use a semantic path
|
|
689
687
|
var sSemanticPath = SemanticKeyHelper.getSemanticPath(oContext, true);
|
|
690
688
|
|
|
@@ -746,7 +744,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
746
744
|
* Event handler when a route is matched.
|
|
747
745
|
* Hides the busy indicator and fires its own 'routematched' event.
|
|
748
746
|
*
|
|
749
|
-
* @param
|
|
747
|
+
* @param oEvent The event
|
|
750
748
|
*/
|
|
751
749
|
;
|
|
752
750
|
|
|
@@ -853,7 +851,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
853
851
|
EditState.resetEditState();
|
|
854
852
|
this.bExitOnNavigateBackToRoot = !this.oRouter.match("");
|
|
855
853
|
var bIsIappState = this.oRouter.getHashChanger().getHash().indexOf("sap-iapp-state") !== -1;
|
|
856
|
-
|
|
854
|
+
return this.oAppComponent.getStartupParameters().then(function (oStartupParameters) {
|
|
857
855
|
var bHasStartUpParameters = oStartupParameters !== undefined && Object.keys(oStartupParameters).length !== 0;
|
|
858
856
|
|
|
859
857
|
var sHash = _this10.oRouter.getHashChanger().getHash(); // Manage startup parameters (in case of no iapp-state)
|
|
@@ -871,7 +869,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
871
869
|
}).catch(function (oError) {
|
|
872
870
|
Log.error("Error during routing initialization", oError);
|
|
873
871
|
});
|
|
874
|
-
return initPromise;
|
|
875
872
|
};
|
|
876
873
|
|
|
877
874
|
_proto.getDefaultCreateHash = function getDefaultCreateHash(oStartupParameters) {
|
|
@@ -885,6 +882,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
885
882
|
if (sNewHash) {
|
|
886
883
|
_this11.oRouter.getHashChanger().replaceHash(sNewHash);
|
|
887
884
|
|
|
885
|
+
_this11.oAppComponent.setStartupModeCreate();
|
|
886
|
+
|
|
888
887
|
_this11.bExitOnNavigateBackToRoot = true;
|
|
889
888
|
}
|
|
890
889
|
});
|
|
@@ -897,8 +896,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
897
896
|
var sHash;
|
|
898
897
|
|
|
899
898
|
if (oDeepLink.context) {
|
|
900
|
-
var sTechnicalPath = oDeepLink.context.getPath()
|
|
901
|
-
|
|
899
|
+
var sTechnicalPath = oDeepLink.context.getPath();
|
|
900
|
+
var sSemanticPath = _this12._checkIfContextSupportsSemanticPath(oDeepLink.context) ? SemanticKeyHelper.getSemanticPath(oDeepLink.context) : sTechnicalPath;
|
|
902
901
|
|
|
903
902
|
if (sSemanticPath !== sTechnicalPath) {
|
|
904
903
|
// Store the mapping technical <-> semantic path to avoid recalculating it later
|
|
@@ -917,6 +916,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
917
916
|
if (sHash) {
|
|
918
917
|
//Replace the hash with newly created hash
|
|
919
918
|
_this12.oRouter.getHashChanger().replaceHash(sHash);
|
|
919
|
+
|
|
920
|
+
_this12.oAppComponent.setStartupModeDeeplink();
|
|
920
921
|
}
|
|
921
922
|
});
|
|
922
923
|
};
|
|
@@ -927,8 +928,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
927
928
|
/**
|
|
928
929
|
* Gets the name of the Draft root entity set or the sticky-enabled entity set.
|
|
929
930
|
*
|
|
930
|
-
* @returns
|
|
931
|
-
*
|
|
931
|
+
* @returns The name of the root EntitySet
|
|
932
932
|
* @ui5-restricted
|
|
933
933
|
*/
|
|
934
934
|
;
|
|
@@ -965,4 +965,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/controllerextensions/BusyLocker", "s
|
|
|
965
965
|
|
|
966
966
|
return RoutingServiceFactory;
|
|
967
967
|
}, false);
|
|
968
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJSb3V0aW5nU2VydmljZUV2ZW50aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJldmVudCIsIkV2ZW50UHJvdmlkZXIiLCJSb3V0aW5nU2VydmljZSIsIm5hdmlnYXRpb25JbmZvUXVldWUiLCJpbml0Iiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwic2NvcGVUeXBlIiwib0FwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiZXZlbnRQcm92aWRlciIsIm9Sb3V0aW5nQ29uZmlnIiwiZ2V0TWFuaWZlc3RFbnRyeSIsIm9Sb290Vmlld0NvbmZpZyIsIl9wYXJzZVJvdXRpbmdDb25maWd1cmF0aW9uIiwib0FwcENvbmZpZyIsIm91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJiZWZvcmVFeGl0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuT25Sb3V0ZU1hdGNoZWQiLCJmaXJlRXZlbnQiLCJleGl0IiwiZGVzdHJveSIsImlzRkNMIiwidmlld05hbWUiLCJfbVRhcmdldHMiLCJPYmplY3QiLCJrZXlzIiwidGFyZ2V0cyIsImZvckVhY2giLCJzVGFyZ2V0TmFtZSIsImFzc2lnbiIsInRhcmdldE5hbWUiLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsInZpZXdMZXZlbCIsIl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybiIsIl9tUm91dGVzIiwic1JvdXRlS2V5Iiwicm91dGVzIiwib1JvdXRlTWFuaWZlc3RJbmZvIiwiYVJvdXRlVGFyZ2V0cyIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsInNSb3V0ZU5hbWUiLCJuYW1lIiwic1JvdXRlUGF0dGVybiIsInBhdHRlcm4iLCJsZW5ndGgiLCJpbmRleE9mIiwiTG9nIiwid2FybmluZyIsImlSb3V0ZUxldmVsIiwicm91dGVMZXZlbCIsImkiLCJzUGFyZW50VGFyZ2V0TmFtZSIsInBhcmVudCIsInB1c2giLCJGQ0xMZXZlbCIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImFMZXZlbDBSb3V0ZU5hbWVzIiwiYUxldmVsMVJvdXRlTmFtZXMiLCJzRGVmYXVsdFJvdXRlTmFtZSIsInNOYW1lIiwiaUxldmVsIiwic0RlZmF1bHRUYXJnZXROYW1lIiwic2xpY2UiLCJzQ29udGV4dFBhdGgiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJvU2V0dGluZ3MiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm1hcCIsInNUYXJnZXRLZXkiLCJzb3J0IiwiYSIsImIiLCJmdWxsQ29udGV4dFBhdGgiLCJuYXZpZ2F0aW9uIiwic05hdk5hbWUiLCJ0YXJnZXRSb3V0ZSIsImRldGFpbCIsInJvdXRlIiwic3RhcnRzV2l0aCIsInNQYXR0ZXJuIiwicmVwbGFjZSIsInJlZ2V4IiwiUmVnRXhwIiwibWF0Y2giLCJfZ2V0Um91dGVJbmZvcm1hdGlvbiIsIl9nZXRUYXJnZXRJbmZvcm1hdGlvbiIsIl9nZXRDb21wb25lbnRJZCIsInNPd25lcklkIiwic0NvbXBvbmVudElkIiwic3Vic3RyIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvQ29tcG9uZW50SW5zdGFuY2UiLCJzVGFyZ2V0Q29tcG9uZW50SWQiLCJfc093bmVySWQiLCJnZXRJZCIsInNDb3JyZWN0VGFyZ2V0TmFtZSIsImlkIiwidmlld0lkIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9NYXBwaW5nIiwibmF2aWdhdGVUbyIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwiYlByZXNlcnZlSGlzdG9yeSIsInNUYXJnZXRVUkxQcm9taXNlIiwiYklzU3RpY2t5TW9kZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY1BhdGgiLCJwcmVwYXJlUGFyYW1ldGVycyIsInRoZW4iLCJtUGFyYW1ldGVycyIsImdldFVSTCIsInNUYXJnZXRVUkwiLCJuYXZUb0hhc2giLCJzVGFyZ2V0Um91dGUiLCJvUGFyYW1ldGVyc1Byb21pc2UiLCJnZXRQYXRoIiwiYUNvbnRleHRQYXRoUGFydHMiLCJzcGxpdCIsImFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwic1BhcmFtZXRlcktleSIsInNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbiIsIm9QYXJzZWRFeHByZXNzaW9uIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJhUGFydHMiLCJwYXJ0cyIsImFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwib1BhdGhQYXJ0IiwiYVJlbGF0aXZlUGFydHMiLCJwYXRoIiwiYUxvY2FsUGFydHMiLCJzUHJvcGVydHlQYXRoIiwiam9pbiIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5Iiwib1ZhbHVlIiwib1Byb3BlcnR5SW5mbyIsImdldE9iamVjdCIsInNFZG1UeXBlIiwiJFR5cGUiLCJPRGF0YVV0aWxzIiwiZm9ybWF0TGl0ZXJhbCIsImFsbCIsImFSZXNvbHZlZFBhcmFtZXRlcnMiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImFwcGx5Iiwia2V5IiwiYUFsbFJlc29sdmVkUGFyYW1ldGVycyIsIm9QYXJhbWV0ZXJzIiwib1Jlc29sdmVkUGFyYW1ldGVyIiwib0Vycm9yIiwiZXJyb3IiLCJfZmlyZVJvdXRlTWF0Y2hFdmVudHMiLCJFZGl0U3RhdGUiLCJjbGVhblByb2Nlc3NlZEVkaXRTdGF0ZSIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib1ZpZXdEYXRhIiwib0N1cnJlbnRUYXJnZXRJbmZvIiwib1JvdXRlUGFyYW1ldGVyc1Byb21pc2UiLCJ0YXJnZXRQYXRoIiwib1JvdXRlRGV0YWlsIiwicGFyYW1ldGVycyIsInNUYXJnZXRQYXRoIiwiX2dldFBhdGhGcm9tQ29udGV4dCIsImJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QiLCJleGl0RnJvbUFwcCIsImFzeW5jQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJzTGF5b3V0IiwiX2NhbGN1bGF0ZUxheW91dCIsIm9OYXZpZ2F0aW9uSW5mbyIsIm9Bc3luY0NvbnRleHQiLCJiVGFyZ2V0RWRpdGFibGUiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1c2VDb250ZXh0IiwidXBkYXRlRkNMTGV2ZWwiLCJiUmVjcmVhdGVDb250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsImJTaG93UGxhY2Vob2xkZXIiLCJzaG93UGxhY2Vob2xkZXIiLCJiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJjaGVja05vSGFzaENoYW5nZSIsInNDdXJyZW50SGFzaE5vQXBwU3RhdGUiLCJnZXRIYXNoIiwibUV2ZW50UGFyYW1ldGVycyIsImdldFJvdXRlSW5mb0J5SGFzaCIsIm5hdmlnYXRpb25JbmZvIiwicm91dGVJbmZvcm1hdGlvbiIsInNDdXJyZW50Um91dGVOYW1lIiwicm91dGVQYXR0ZXJuIiwic0N1cnJlbnRSb3V0ZVBhdHRlcm4iLCJ2aWV3cyIsImFDdXJyZW50Vmlld3MiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZUZvY3VzIiwidHJhbnNpZW50Iiwib1JvdXRlSW5mbyIsIm9Sb3V0ZSIsInNMYXN0VGFyZ2V0TmFtZSIsIm9UYXJnZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwib1JvdXRlUGFyYW1ldGVycyIsIm5hdlRvIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJOYXZpZ2F0ZWQiLCJwb3AiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwic1BhdGgiLCJ0ZXN0Iiwic1NlbWFudGljUGF0aCIsInRlY2huaWNhbFBhdGgiLCJzZW1hbnRpY1BhdGgiLCJfZmluZFBhdGhUb05hdmlnYXRlIiwiX2NoZWNrQ29udGV4dEZvclNlbWFudGljUGF0aCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0U2VtYW50aWNLZXlzIiwiaXNEcmFmdFN1cHBvcnRlZCIsImlzQSIsImlzUmVsYXRpdmUiLCJnZXRIZWFkZXJDb250ZXh0Iiwic3Vic3RyaW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY2FsY3VsYXRlTGF5b3V0Iiwia2VlcEN1cnJlbnRMYXlvdXQiLCJfYmVmb3JlUm91dGVNYXRjaGVkIiwiYlBsYWNlaG9sZGVyRW5hYmxlZCIsIlBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiX29uUm91dGVNYXRjaGVkIiwib0V2ZW50Iiwib0FwcFN0YXRlSGFuZGxlciIsImdldEFwcFN0YXRlSGFuZGxlciIsImlzTG9ja2VkIiwidW5sb2NrIiwiZ2V0UGFyYW1ldGVycyIsImNoZWNrSWZSb3V0ZUNoYW5nZWRCeUlBcHAiLCJiUmVhc29uSXNJYXBwU3RhdGUiLCJyZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCIsImdldFBhcmFtZXRlciIsImNvbmZpZyIsImhpc3RvcnkiLCJzdGF0ZSIsImZlTGV2ZWwiLCJyZXN0b3JlSGlzdG9yeSIsInJlc29sdmVSb3V0ZU1hdGNoIiwiY2F0Y2giLCJhdHRhY2hSb3V0ZU1hdGNoZWQiLCJvRGF0YSIsImZuRnVuY3Rpb24iLCJvTGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsImRldGFjaEV2ZW50IiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImdldFJvdXRlRnJvbUhhc2giLCJzSGFzaCIsImdldEhhc2hDaGFuZ2VyIiwiaGFzaCIsImdldE1ldGFkYXRhIiwiZmlsdGVyIiwiZ2V0VGFyZ2V0c0Zyb21Sb3V0ZSIsImFUYXJnZXQiLCJzVGFyZ2V0IiwiaW5pdGlhbGl6ZVJvdXRpbmciLCJiaW5kIiwiYXR0YWNoQmVmb3JlUm91dGVNYXRjaGVkIiwicmVzZXRFZGl0U3RhdGUiLCJiSXNJYXBwU3RhdGUiLCJnZXRTdGFydHVwUGFyYW1ldGVycyIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJIYXNTdGFydFVwUGFyYW1ldGVycyIsInByZWZlcnJlZE1vZGUiLCJfbWFuYWdlQ3JlYXRlU3RhcnR1cCIsIl9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAiLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsIkFwcFN0YXJ0dXBIZWxwZXIiLCJnZXRDb250ZXh0UGF0aCIsImdldENyZWF0ZVN0YXJ0dXBIYXNoIiwic05ld0hhc2giLCJyZXBsYWNlSGFzaCIsImdldERlZXBMaW5rU3RhcnR1cEhhc2giLCJnZXRNYW5pZmVzdCIsInJvdXRpbmciLCJvRGVlcExpbmsiLCJjb250ZXh0Iiwic1RlY2huaWNhbFBhdGgiLCJnZXRPdXRib3VuZHMiLCJnZXRJbnRlcmZhY2UiLCJTZXJ2aWNlIiwiUm91dGluZ1NlcnZpY2VGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJvU2VydmljZUNvbnRleHQiLCJvUm91dGluZ1NlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXNCTUEsc0IsV0FETEMsY0FBYyxDQUFDLDZDQUFELEMsVUFFYkMsS0FBSyxFLFVBRUxBLEtBQUssRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFIOEJDLGE7Ozs7Ozs7Ozs7OztNQVd4QkMsYzs7Ozs7Ozs7Ozs7YUFnQlpDLG1CLEdBQTZCLEU7Ozs7Ozs7V0FHN0JDLEksR0FBQSxnQkFBTztBQUNOLFVBQU1DLFFBQVEsR0FBRyxLQUFLQyxVQUFMLEVBQWpCOztBQUNBLFVBQUlELFFBQVEsQ0FBQ0UsU0FBVCxLQUF1QixXQUEzQixFQUF3QztBQUN2QyxhQUFLQyxhQUFMLEdBQXFCSCxRQUFRLENBQUNJLFdBQTlCO0FBQ0EsYUFBS0MsTUFBTCxHQUFjLEtBQUtGLGFBQUwsQ0FBbUJHLFFBQW5CLEVBQWQ7QUFDQSxhQUFLQyxVQUFMLEdBQWtCLEtBQUtGLE1BQUwsQ0FBWUcsWUFBWixFQUFsQjtBQUNBLGFBQUtDLE9BQUwsR0FBZSxLQUFLTixhQUFMLENBQW1CTyxTQUFuQixFQUFmO0FBQ0EsYUFBS0MsWUFBTCxHQUFvQixLQUFLUixhQUFMLENBQW1CUyxjQUFuQixFQUFwQjtBQUNBLGFBQUtDLGFBQUwsR0FBcUIsSUFBS3BCLHNCQUFMLEVBQXJCO0FBRUEsWUFBTXFCLGNBQWMsR0FBRyxLQUFLWCxhQUFMLENBQW1CWSxnQkFBbkIsQ0FBb0Msa0JBQXBDLENBQXZCO0FBQ0EsWUFBTUMsZUFBZSxHQUFHLEtBQUtiLGFBQUwsQ0FBbUJZLGdCQUFuQixDQUFvQyxtQkFBcEMsQ0FBeEI7O0FBQ0EsYUFBS0UsMEJBQUwsQ0FBZ0NILGNBQWhDLEVBQWdERSxlQUFoRDs7QUFFQSxZQUFNRSxVQUFVLEdBQUcsS0FBS2YsYUFBTCxDQUFtQlksZ0JBQW5CLENBQW9DLFVBQXBDLENBQW5CO0FBQ0EsYUFBS0ksU0FBTCxHQUFpQkQsVUFBVSxJQUFJQSxVQUFVLENBQUNFLGVBQXpCLElBQTRDRixVQUFVLENBQUNFLGVBQVgsQ0FBMkJELFNBQXhGO0FBQ0E7O0FBRUQsV0FBS0UsV0FBTCxHQUFtQkMsT0FBTyxDQUFDQyxPQUFSLENBQWdCLElBQWhCLENBQW5CO0FBQ0EsSzs7V0FDREMsVSxHQUFBLHNCQUFhO0FBQ1osV0FBS2YsT0FBTCxDQUFhZ0Isa0JBQWIsQ0FBZ0MsS0FBS0MsaUJBQXJDLEVBQXdELElBQXhEO0FBQ0EsV0FBS2IsYUFBTCxDQUFtQmMsU0FBbkIsQ0FBNkIsY0FBN0IsRUFBNkMsRUFBN0M7QUFDQSxLOztXQUNEQyxJLEdBQUEsZ0JBQU87QUFDTixXQUFLZixhQUFMLENBQW1CZ0IsT0FBbkI7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ1osMEIsR0FBQSxvQ0FBMkJILGNBQTNCLEVBQWdERSxlQUFoRCxFQUFzRTtBQUFBOztBQUNyRSxVQUFNYyxLQUFLLEdBQUdkLGVBQWUsSUFBSUEsZUFBZSxDQUFDZSxRQUFoQixLQUE2Qix5Q0FBOUQsQ0FEcUUsQ0FHckU7O0FBQ0EsV0FBS0MsU0FBTCxHQUFpQixFQUFqQjtBQUNBQyxNQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWXBCLGNBQWMsQ0FBQ3FCLE9BQTNCLEVBQW9DQyxPQUFwQyxDQUE0QyxVQUFDQyxXQUFELEVBQXlCO0FBQ3BFLFFBQUEsTUFBSSxDQUFDTCxTQUFMLENBQWVLLFdBQWYsSUFBOEJKLE1BQU0sQ0FBQ0ssTUFBUCxDQUFjO0FBQUVDLFVBQUFBLFVBQVUsRUFBRUY7QUFBZCxTQUFkLEVBQTJDdkIsY0FBYyxDQUFDcUIsT0FBZixDQUF1QkUsV0FBdkIsQ0FBM0MsQ0FBOUIsQ0FEb0UsQ0FHcEU7O0FBQ0EsWUFBSSxNQUFJLENBQUNMLFNBQUwsQ0FBZUssV0FBZixFQUE0QkcsY0FBNUIsS0FBK0NDLFNBQW5ELEVBQThEO0FBQzdELFVBQUEsTUFBSSxDQUFDVCxTQUFMLENBQWVLLFdBQWYsRUFBNEJLLFNBQTVCLEdBQXdDLE1BQUksQ0FBQ0Msd0JBQUwsQ0FBOEIsTUFBSSxDQUFDWCxTQUFMLENBQWVLLFdBQWYsRUFBNEJHLGNBQTFELEVBQTBFLENBQTFFLENBQXhDO0FBQ0E7QUFDRCxPQVBELEVBTHFFLENBY3JFOztBQUNBLFdBQUtJLFFBQUwsR0FBZ0IsRUFBaEI7O0FBQ0EsV0FBSyxJQUFNQyxTQUFYLElBQXdCL0IsY0FBYyxDQUFDZ0MsTUFBdkMsRUFBK0M7QUFDOUMsWUFBTUMsa0JBQWtCLEdBQUdqQyxjQUFjLENBQUNnQyxNQUFmLENBQXNCRCxTQUF0QixDQUEzQjtBQUFBLFlBQ0NHLGFBQWEsR0FBR0MsS0FBSyxDQUFDQyxPQUFOLENBQWNILGtCQUFrQixDQUFDSSxNQUFqQyxJQUEyQ0osa0JBQWtCLENBQUNJLE1BQTlELEdBQXVFLENBQUNKLGtCQUFrQixDQUFDSSxNQUFwQixDQUR4RjtBQUFBLFlBRUNDLFVBQVUsR0FBR0gsS0FBSyxDQUFDQyxPQUFOLENBQWNwQyxjQUFjLENBQUNnQyxNQUE3QixJQUF1Q0Msa0JBQWtCLENBQUNNLElBQTFELEdBQWlFUixTQUYvRTtBQUFBLFlBR0NTLGFBQWEsR0FBR1Asa0JBQWtCLENBQUNRLE9BSHBDLENBRDhDLENBTTlDOztBQUNBLFlBQUlELGFBQWEsQ0FBQ0UsTUFBZCxHQUF1QixDQUF2QixJQUE0QkYsYUFBYSxDQUFDRyxPQUFkLENBQXNCLFVBQXRCLE1BQXNDSCxhQUFhLENBQUNFLE1BQWQsR0FBdUIsQ0FBN0YsRUFBZ0c7QUFDL0ZFLFVBQUFBLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLHVCQUF1QlAsVUFBdkIsR0FBb0MsaUNBQXBDLEdBQXdFRSxhQUFwRjtBQUNBOztBQUNELFlBQU1NLFdBQVcsR0FBRyxLQUFLakIsd0JBQUwsQ0FBOEJXLGFBQTlCLEVBQTZDLENBQTdDLENBQXBCOztBQUNBLGFBQUtWLFFBQUwsQ0FBY1EsVUFBZCxJQUE0QjtBQUMzQkMsVUFBQUEsSUFBSSxFQUFFRCxVQURxQjtBQUUzQkcsVUFBQUEsT0FBTyxFQUFFRCxhQUZrQjtBQUczQm5CLFVBQUFBLE9BQU8sRUFBRWEsYUFIa0I7QUFJM0JhLFVBQUFBLFVBQVUsRUFBRUQ7QUFKZSxTQUE1QixDQVg4QyxDQWtCOUM7O0FBQ0EsYUFBSyxJQUFJRSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHZCxhQUFhLENBQUNRLE1BQWxDLEVBQTBDTSxDQUFDLEVBQTNDLEVBQStDO0FBQzlDLGNBQU1DLGlCQUFpQixHQUFHLEtBQUsvQixTQUFMLENBQWVnQixhQUFhLENBQUNjLENBQUQsQ0FBNUIsRUFBaUNFLE1BQTNEOztBQUNBLGNBQUlELGlCQUFKLEVBQXVCO0FBQ3RCZixZQUFBQSxhQUFhLENBQUNpQixJQUFkLENBQW1CRixpQkFBbkI7QUFDQTtBQUNEOztBQUVELFlBQUksQ0FBQ2pDLEtBQUwsRUFBWTtBQUNYO0FBQ0EsY0FBSSxLQUFLRSxTQUFMLENBQWVnQixhQUFhLENBQUMsQ0FBRCxDQUE1QixFQUFpQ04sU0FBakMsS0FBK0NELFNBQS9DLElBQTRELEtBQUtULFNBQUwsQ0FBZWdCLGFBQWEsQ0FBQyxDQUFELENBQTVCLEVBQWlDTixTQUFqQyxHQUE2Q2tCLFdBQTdHLEVBQTBIO0FBQ3pIO0FBQ0E7QUFDQSxpQkFBSzVCLFNBQUwsQ0FBZWdCLGFBQWEsQ0FBQyxDQUFELENBQTVCLEVBQWlDTixTQUFqQyxHQUE2Q2tCLFdBQTdDO0FBQ0EsV0FOVSxDQVFYOzs7QUFDQSxlQUFLNUIsU0FBTCxDQUFlZ0IsYUFBYSxDQUFDLENBQUQsQ0FBNUIsRUFBaUNrQixRQUFqQyxHQUE0QyxDQUFDLENBQTdDO0FBQ0EsU0FWRCxNQVVPLElBQUlsQixhQUFhLENBQUNRLE1BQWQsS0FBeUIsQ0FBekIsSUFBOEIsS0FBS3hCLFNBQUwsQ0FBZWdCLGFBQWEsQ0FBQyxDQUFELENBQTVCLEVBQWlDbUIsa0JBQWpDLEtBQXdELGtCQUExRixFQUE4RztBQUNwSDtBQUNBO0FBQ0EsZUFBS25DLFNBQUwsQ0FBZWdCLGFBQWEsQ0FBQyxDQUFELENBQTVCLEVBQWlDa0IsUUFBakMsR0FBNEMsQ0FBNUM7QUFDQSxTQUpNLE1BSUE7QUFDTjtBQUNBbEIsVUFBQUEsYUFBYSxDQUFDWixPQUFkLENBQXNCLFVBQUNDLFdBQUQsRUFBc0I7QUFDM0Msb0JBQVEsTUFBSSxDQUFDTCxTQUFMLENBQWVLLFdBQWYsRUFBNEI4QixrQkFBcEM7QUFDQyxtQkFBSyxrQkFBTDtBQUNDLGdCQUFBLE1BQUksQ0FBQ25DLFNBQUwsQ0FBZUssV0FBZixFQUE0QjZCLFFBQTVCLEdBQXVDLENBQXZDO0FBQ0E7O0FBRUQsbUJBQUssZ0JBQUw7QUFDQyxnQkFBQSxNQUFJLENBQUNsQyxTQUFMLENBQWVLLFdBQWYsRUFBNEI2QixRQUE1QixHQUF1QyxDQUF2QztBQUNBOztBQUVEO0FBQ0MsZ0JBQUEsTUFBSSxDQUFDbEMsU0FBTCxDQUFlSyxXQUFmLEVBQTRCNkIsUUFBNUIsR0FBdUMsQ0FBdkM7QUFWRjtBQVlBLFdBYkQ7QUFjQTtBQUNELE9BekVvRSxDQTJFckU7OztBQUNBakMsTUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS0YsU0FBakIsRUFBNEJJLE9BQTVCLENBQW9DLFVBQUNDLFdBQUQsRUFBeUI7QUFDNUQsZUFBTyxNQUFJLENBQUNMLFNBQUwsQ0FBZUssV0FBZixFQUE0QjJCLE1BQW5DLEVBQTJDO0FBQzFDLGNBQU1ELGtCQUFpQixHQUFHLE1BQUksQ0FBQy9CLFNBQUwsQ0FBZUssV0FBZixFQUE0QjJCLE1BQXREO0FBQ0EsVUFBQSxNQUFJLENBQUNoQyxTQUFMLENBQWUrQixrQkFBZixFQUFrQ3JCLFNBQWxDLEdBQ0MsTUFBSSxDQUFDVixTQUFMLENBQWUrQixrQkFBZixFQUFrQ3JCLFNBQWxDLElBQStDLE1BQUksQ0FBQ1YsU0FBTCxDQUFlSyxXQUFmLEVBQTRCSyxTQUQ1RTtBQUVBLFVBQUEsTUFBSSxDQUFDVixTQUFMLENBQWUrQixrQkFBZixFQUFrQ3ZCLGNBQWxDLEdBQ0MsTUFBSSxDQUFDUixTQUFMLENBQWUrQixrQkFBZixFQUFrQ3ZCLGNBQWxDLElBQW9ELE1BQUksQ0FBQ1IsU0FBTCxDQUFlSyxXQUFmLEVBQTRCRyxjQURqRjtBQUVBLFVBQUEsTUFBSSxDQUFDUixTQUFMLENBQWUrQixrQkFBZixFQUFrQ0csUUFBbEMsR0FDQyxNQUFJLENBQUNsQyxTQUFMLENBQWUrQixrQkFBZixFQUFrQ0csUUFBbEMsSUFBOEMsTUFBSSxDQUFDbEMsU0FBTCxDQUFlSyxXQUFmLEVBQTRCNkIsUUFEM0U7QUFFQSxVQUFBLE1BQUksQ0FBQ2xDLFNBQUwsQ0FBZStCLGtCQUFmLEVBQWtDSSxrQkFBbEMsR0FDQyxNQUFJLENBQUNuQyxTQUFMLENBQWUrQixrQkFBZixFQUFrQ0ksa0JBQWxDLElBQXdELE1BQUksQ0FBQ25DLFNBQUwsQ0FBZUssV0FBZixFQUE0QjhCLGtCQURyRjtBQUVBOUIsVUFBQUEsV0FBVyxHQUFHMEIsa0JBQWQ7QUFDQTtBQUNELE9BYkQsRUE1RXFFLENBMkZyRTs7QUFDQSxVQUFNSyxpQkFBaUIsR0FBRyxFQUExQjtBQUNBLFVBQU1DLGlCQUFpQixHQUFHLEVBQTFCO0FBQ0EsVUFBSUMsaUJBQUo7O0FBRUEsV0FBSyxJQUFNQyxLQUFYLElBQW9CLEtBQUszQixRQUF6QixFQUFtQztBQUNsQyxZQUFNNEIsTUFBTSxHQUFHLEtBQUs1QixRQUFMLENBQWMyQixLQUFkLEVBQXFCVixVQUFwQzs7QUFDQSxZQUFJVyxNQUFNLEtBQUssQ0FBZixFQUFrQjtBQUNqQkosVUFBQUEsaUJBQWlCLENBQUNILElBQWxCLENBQXVCTSxLQUF2QjtBQUNBLFNBRkQsTUFFTyxJQUFJQyxNQUFNLEtBQUssQ0FBZixFQUFrQjtBQUN4QkgsVUFBQUEsaUJBQWlCLENBQUNKLElBQWxCLENBQXVCTSxLQUF2QjtBQUNBO0FBQ0Q7O0FBRUQsVUFBSUgsaUJBQWlCLENBQUNaLE1BQWxCLEtBQTZCLENBQWpDLEVBQW9DO0FBQ25DYyxRQUFBQSxpQkFBaUIsR0FBR0YsaUJBQWlCLENBQUMsQ0FBRCxDQUFyQztBQUNBLE9BRkQsTUFFTyxJQUFJQyxpQkFBaUIsQ0FBQ2IsTUFBbEIsS0FBNkIsQ0FBakMsRUFBb0M7QUFDMUNjLFFBQUFBLGlCQUFpQixHQUFHRCxpQkFBaUIsQ0FBQyxDQUFELENBQXJDO0FBQ0E7O0FBRUQsVUFBSUMsaUJBQUosRUFBdUI7QUFDdEIsWUFBTUcsa0JBQWtCLEdBQUcsS0FBSzdCLFFBQUwsQ0FBYzBCLGlCQUFkLEVBQWlDbkMsT0FBakMsQ0FBeUN1QyxLQUF6QyxDQUErQyxDQUFDLENBQWhELEVBQW1ELENBQW5ELENBQTNCOztBQUNBLGFBQUtDLFlBQUwsR0FBb0IsRUFBcEI7O0FBQ0EsWUFBSSxLQUFLM0MsU0FBTCxDQUFleUMsa0JBQWYsRUFBbUNHLE9BQW5DLElBQThDLEtBQUs1QyxTQUFMLENBQWV5QyxrQkFBZixFQUFtQ0csT0FBbkMsQ0FBMkNDLFFBQTdGLEVBQXVHO0FBQ3RHLGNBQU1DLFNBQVMsR0FBRyxLQUFLOUMsU0FBTCxDQUFleUMsa0JBQWYsRUFBbUNHLE9BQW5DLENBQTJDQyxRQUE3RDtBQUNBLGVBQUtGLFlBQUwsR0FBb0JHLFNBQVMsQ0FBQ0MsV0FBVixJQUF5QixNQUFNRCxTQUFTLENBQUNFLFNBQTdEO0FBQ0E7O0FBQ0QsWUFBSSxDQUFDLEtBQUtMLFlBQVYsRUFBd0I7QUFDdkJqQixVQUFBQSxHQUFHLENBQUNDLE9BQUosQ0FDQywrRkFBK0ZjLGtCQURoRztBQUdBO0FBQ0QsT0FaRCxNQVlPO0FBQ05mLFFBQUFBLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLCtEQUFaO0FBQ0EsT0E3SG9FLENBK0hyRTs7O0FBQ0ExQixNQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWSxLQUFLRixTQUFqQixFQUNFaUQsR0FERixDQUNNLFVBQUNDLFVBQUQsRUFBd0I7QUFDNUIsZUFBTyxNQUFJLENBQUNsRCxTQUFMLENBQWVrRCxVQUFmLENBQVA7QUFDQSxPQUhGLEVBSUVDLElBSkYsQ0FJTyxVQUFDQyxDQUFELEVBQVNDLENBQVQsRUFBb0I7QUFDekIsZUFBT0QsQ0FBQyxDQUFDMUMsU0FBRixHQUFjMkMsQ0FBQyxDQUFDM0MsU0FBaEIsR0FBNEIsQ0FBQyxDQUE3QixHQUFpQyxDQUF4QztBQUNBLE9BTkYsRUFPRU4sT0FQRixDQU9VLFVBQUNlLE1BQUQsRUFBaUI7QUFDekI7QUFDQSxZQUFJQSxNQUFNLENBQUN5QixPQUFYLEVBQW9CO0FBQ25CLGNBQU1DLFFBQVEsR0FBRzFCLE1BQU0sQ0FBQ3lCLE9BQVAsQ0FBZUMsUUFBaEM7QUFDQSxjQUFNRixZQUFZLEdBQUdFLFFBQVEsQ0FBQ0UsV0FBVCxLQUF5QkYsUUFBUSxDQUFDRyxTQUFULEdBQXFCLE1BQU1ILFFBQVEsQ0FBQ0csU0FBcEMsR0FBZ0QsRUFBekUsQ0FBckI7O0FBQ0EsY0FBSSxDQUFDSCxRQUFRLENBQUNTLGVBQVYsSUFBNkJYLFlBQWpDLEVBQStDO0FBQzlDRSxZQUFBQSxRQUFRLENBQUNTLGVBQVQsR0FBMkJYLFlBQVksR0FBRyxHQUExQztBQUNBOztBQUNEMUMsVUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVkyQyxRQUFRLENBQUNVLFVBQVQsSUFBdUIsRUFBbkMsRUFBdUNuRCxPQUF2QyxDQUErQyxVQUFDb0QsUUFBRCxFQUFzQjtBQUNwRTtBQUNBLGdCQUFNQyxXQUFXLEdBQUcsTUFBSSxDQUFDN0MsUUFBTCxDQUFjaUMsUUFBUSxDQUFDVSxVQUFULENBQW9CQyxRQUFwQixFQUE4QkUsTUFBOUIsQ0FBcUNDLEtBQW5ELENBQXBCOztBQUNBLGdCQUFJRixXQUFXLElBQUlBLFdBQVcsQ0FBQ3RELE9BQS9CLEVBQXdDO0FBQ3ZDc0QsY0FBQUEsV0FBVyxDQUFDdEQsT0FBWixDQUFvQkMsT0FBcEIsQ0FBNEIsVUFBQ0MsV0FBRCxFQUFzQjtBQUNqRCxvQkFDQyxNQUFJLENBQUNMLFNBQUwsQ0FBZUssV0FBZixFQUE0QnVDLE9BQTVCLElBQ0EsTUFBSSxDQUFDNUMsU0FBTCxDQUFlSyxXQUFmLEVBQTRCdUMsT0FBNUIsQ0FBb0NDLFFBRHBDLElBRUEsQ0FBQyxNQUFJLENBQUM3QyxTQUFMLENBQWVLLFdBQWYsRUFBNEJ1QyxPQUE1QixDQUFvQ0MsUUFBcEMsQ0FBNkNTLGVBSC9DLEVBSUU7QUFDRCxzQkFBSW5DLE1BQU0sQ0FBQ1QsU0FBUCxLQUFxQixDQUF6QixFQUE0QjtBQUMzQixvQkFBQSxNQUFJLENBQUNWLFNBQUwsQ0FBZUssV0FBZixFQUE0QnVDLE9BQTVCLENBQW9DQyxRQUFwQyxDQUE2Q1MsZUFBN0MsR0FDQyxDQUFDRSxRQUFRLENBQUNJLFVBQVQsQ0FBb0IsR0FBcEIsSUFBMkIsRUFBM0IsR0FBZ0MsR0FBakMsSUFBd0NKLFFBQXhDLEdBQW1ELEdBRHBEO0FBRUEsbUJBSEQsTUFHTztBQUNOLG9CQUFBLE1BQUksQ0FBQ3hELFNBQUwsQ0FBZUssV0FBZixFQUE0QnVDLE9BQTVCLENBQW9DQyxRQUFwQyxDQUE2Q1MsZUFBN0MsR0FDQ1QsUUFBUSxDQUFDUyxlQUFULEdBQTJCRSxRQUEzQixHQUFzQyxHQUR2QztBQUVBO0FBQ0Q7QUFDRCxlQWREO0FBZUE7QUFDRCxXQXBCRDtBQXFCQTtBQUNELE9BckNGO0FBc0NBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDN0Msd0IsR0FBQSxrQ0FBeUJrRCxRQUF6QixFQUEyQ25ELFNBQTNDLEVBQXNFO0FBQ3JFbUQsTUFBQUEsUUFBUSxHQUFHQSxRQUFRLENBQUNDLE9BQVQsQ0FBaUIsVUFBakIsRUFBNkIsRUFBN0IsQ0FBWDtBQUNBLFVBQU1DLEtBQUssR0FBRyxJQUFJQyxNQUFKLENBQVcsU0FBWCxDQUFkOztBQUNBLFVBQUlILFFBQVEsSUFBSUEsUUFBUSxDQUFDLENBQUQsQ0FBUixLQUFnQixHQUE1QixJQUFtQ0EsUUFBUSxDQUFDLENBQUQsQ0FBUixLQUFnQixHQUF2RCxFQUE0RDtBQUMzREEsUUFBQUEsUUFBUSxHQUFHLE1BQU1BLFFBQWpCO0FBQ0E7O0FBQ0QsVUFBSUEsUUFBUSxDQUFDckMsTUFBYixFQUFxQjtBQUNwQnFDLFFBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDQyxPQUFULENBQWlCQyxLQUFqQixFQUF3QixFQUF4QixDQUFYOztBQUNBLFlBQUksS0FBS3RGLE9BQUwsQ0FBYXdGLEtBQWIsQ0FBbUJKLFFBQW5CLEtBQWdDQSxRQUFRLEtBQUssRUFBakQsRUFBcUQ7QUFDcEQsaUJBQU8sS0FBS2xELHdCQUFMLENBQThCa0QsUUFBOUIsRUFBd0MsRUFBRW5ELFNBQTFDLENBQVA7QUFDQSxTQUZELE1BRU87QUFDTixpQkFBTyxLQUFLQyx3QkFBTCxDQUE4QmtELFFBQTlCLEVBQXdDbkQsU0FBeEMsQ0FBUDtBQUNBO0FBQ0QsT0FQRCxNQU9PO0FBQ04sZUFBT0EsU0FBUDtBQUNBO0FBQ0QsSzs7V0FFRHdELG9CLEdBQUEsOEJBQXFCOUMsVUFBckIsRUFBc0M7QUFDckMsYUFBTyxLQUFLUixRQUFMLENBQWNRLFVBQWQsQ0FBUDtBQUNBLEs7O1dBRUQrQyxxQixHQUFBLCtCQUFzQjlELFdBQXRCLEVBQXdDO0FBQ3ZDLGFBQU8sS0FBS0wsU0FBTCxDQUFlSyxXQUFmLENBQVA7QUFDQSxLOztXQUVEK0QsZSxHQUFBLHlCQUFnQkMsUUFBaEIsRUFBK0JDLFlBQS9CLEVBQWtEO0FBQ2pELFVBQUlBLFlBQVksQ0FBQzdDLE9BQWIsQ0FBcUI0QyxRQUFRLEdBQUcsS0FBaEMsTUFBMkMsQ0FBL0MsRUFBa0Q7QUFDakQsZUFBT0MsWUFBWSxDQUFDQyxNQUFiLENBQW9CRixRQUFRLENBQUM3QyxNQUFULEdBQWtCLENBQXRDLENBQVA7QUFDQTs7QUFDRCxhQUFPOEMsWUFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0UsdUIsR0FBQSxpQ0FBd0JDLGtCQUF4QixFQUFpRDtBQUFBOztBQUNoRCxVQUFNQyxrQkFBa0IsR0FBRyxLQUFLTixlQUFMLENBQXFCSyxrQkFBa0IsQ0FBQ0UsU0FBeEMsRUFBbURGLGtCQUFrQixDQUFDRyxLQUFuQixFQUFuRCxDQUEzQjs7QUFDQSxVQUFJQyxrQkFBa0IsR0FBRyxJQUF6QjtBQUNBNUUsTUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS0YsU0FBakIsRUFBNEJJLE9BQTVCLENBQW9DLFVBQUNDLFdBQUQsRUFBeUI7QUFDNUQsWUFBSSxNQUFJLENBQUNMLFNBQUwsQ0FBZUssV0FBZixFQUE0QnlFLEVBQTVCLEtBQW1DSixrQkFBbkMsSUFBeUQsTUFBSSxDQUFDMUUsU0FBTCxDQUFlSyxXQUFmLEVBQTRCMEUsTUFBNUIsS0FBdUNMLGtCQUFwRyxFQUF3SDtBQUN2SEcsVUFBQUEsa0JBQWtCLEdBQUd4RSxXQUFyQjtBQUNBO0FBQ0QsT0FKRDtBQUtBLGFBQU8sS0FBSzhELHFCQUFMLENBQTJCVSxrQkFBM0IsQ0FBUDtBQUNBLEs7O1dBRURHLHNCLEdBQUEsa0NBQXNEO0FBQ3JELGFBQU8sS0FBS0Msb0JBQVo7QUFDQSxLOztXQUVEQyxzQixHQUFBLGdDQUF1QkMsUUFBdkIsRUFBbUQ7QUFDbEQsV0FBS0Ysb0JBQUwsR0FBNEJFLFFBQTVCO0FBQ0EsSzs7V0FFREMsVSxHQUFBLG9CQUFXcEgsUUFBWCxFQUEwQm9ELFVBQTFCLEVBQTJDaUUsaUJBQTNDLEVBQW1FQyxnQkFBbkUsRUFBMEY7QUFBQTs7QUFDekYsVUFBSUMsaUJBQUosRUFBdUJDLGFBQXZCOztBQUNBLFVBQUl4SCxRQUFRLENBQUNNLFFBQVQsTUFBdUJOLFFBQVEsQ0FBQ00sUUFBVCxHQUFvQkUsWUFBM0MsSUFBMkRSLFFBQVEsQ0FBQ00sUUFBVCxHQUFvQkUsWUFBcEIsRUFBL0QsRUFBbUc7QUFDbEdnSCxRQUFBQSxhQUFhLEdBQUdDLFdBQVcsQ0FBQ0Msd0JBQVosQ0FBcUMxSCxRQUFRLENBQUNNLFFBQVQsR0FBb0JFLFlBQXBCLEVBQXJDLENBQWhCO0FBQ0E7O0FBQ0QsVUFBSSxDQUFDNkcsaUJBQUwsRUFBd0I7QUFDdkI7QUFDQUUsUUFBQUEsaUJBQWlCLEdBQUdqRyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JvRyxpQkFBaUIsQ0FBQ0MsZUFBbEIsQ0FBa0M1SCxRQUFsQyxDQUFoQixDQUFwQjtBQUNBLE9BSEQsTUFHTztBQUNOdUgsUUFBQUEsaUJBQWlCLEdBQUcsS0FBS00saUJBQUwsQ0FBdUJSLGlCQUF2QixFQUEwQ2pFLFVBQTFDLEVBQXNEcEQsUUFBdEQsRUFBZ0U4SCxJQUFoRSxDQUFxRSxVQUFDQyxXQUFELEVBQXNCO0FBQzlHLGlCQUFPLE1BQUksQ0FBQ3RILE9BQUwsQ0FBYXVILE1BQWIsQ0FBb0I1RSxVQUFwQixFQUFnQzJFLFdBQWhDLENBQVA7QUFDQSxTQUZtQixDQUFwQjtBQUdBOztBQUNELGFBQU9SLGlCQUFpQixDQUFDTyxJQUFsQixDQUF1QixVQUFDRyxVQUFELEVBQXFCO0FBQ2xELFFBQUEsTUFBSSxDQUFDdEgsWUFBTCxDQUFrQnVILFNBQWxCLENBQTRCRCxVQUE1QixFQUF3Q1gsZ0JBQXhDLEVBQTBELEtBQTFELEVBQWlFLEtBQWpFLEVBQXdFLENBQUNFLGFBQXpFO0FBQ0EsT0FGTSxDQUFQO0FBR0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0ssaUIsR0FBQSwyQkFBa0JFLFdBQWxCLEVBQW9DSSxZQUFwQyxFQUEwRG5JLFFBQTFELEVBQTZFO0FBQUE7O0FBQzVFLFVBQUlvSSxrQkFBSjs7QUFDQSxVQUFJO0FBQ0gsWUFBTXpELFlBQVksR0FBRzNFLFFBQVEsQ0FBQ3FJLE9BQVQsRUFBckI7QUFDQSxZQUFNOUgsVUFBMEIsR0FBR1AsUUFBUSxDQUFDTSxRQUFULEdBQW9CRSxZQUFwQixFQUFuQztBQUNBLFlBQU04SCxpQkFBaUIsR0FBRzNELFlBQVksQ0FBQzRELEtBQWIsQ0FBbUIsR0FBbkIsQ0FBMUI7QUFDQSxZQUFNQyw2QkFBNkIsR0FBR3ZHLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZNkYsV0FBWixFQUF5QjlDLEdBQXpCLENBQTZCLFVBQUN3RCxhQUFELEVBQXdCO0FBQzFGLGNBQU1DLDJCQUEyQixHQUFHWCxXQUFXLENBQUNVLGFBQUQsQ0FBL0MsQ0FEMEYsQ0FFMUY7O0FBQ0EsY0FBTUUsaUJBQWlCLEdBQUdDLGFBQWEsQ0FBQ0MsYUFBZCxDQUE0QkgsMkJBQTVCLENBQTFCO0FBQ0EsY0FBTUksTUFBTSxHQUFHSCxpQkFBaUIsQ0FBQ0ksS0FBbEIsSUFBMkIsQ0FBQ0osaUJBQUQsQ0FBMUM7QUFDQSxjQUFNSywwQkFBMEIsR0FBR0YsTUFBTSxDQUFDN0QsR0FBUCxDQUFXLFVBQVVnRSxTQUFWLEVBQTBCO0FBQ3ZFLGdCQUFNQyxjQUFjLEdBQUdELFNBQVMsQ0FBQ0UsSUFBVixDQUFlWixLQUFmLENBQXFCLEtBQXJCLENBQXZCLENBRHVFLENBRXZFOztBQUNBLGdCQUFNYSxXQUFXLEdBQUdkLGlCQUFpQixDQUFDNUQsS0FBbEIsQ0FBd0IsQ0FBeEIsRUFBMkI0RCxpQkFBaUIsQ0FBQzlFLE1BQWxCLEdBQTJCMEYsY0FBYyxDQUFDMUYsTUFBMUMsR0FBbUQsQ0FBOUUsQ0FBcEI7QUFDQTRGLFlBQUFBLFdBQVcsQ0FBQ25GLElBQVosQ0FBaUJpRixjQUFjLENBQUNBLGNBQWMsQ0FBQzFGLE1BQWYsR0FBd0IsQ0FBekIsQ0FBL0I7QUFFQSxnQkFBTTZGLGFBQWEsR0FBR0QsV0FBVyxDQUFDRSxJQUFaLENBQWlCLEdBQWpCLENBQXRCO0FBQ0EsZ0JBQU1DLFlBQVksR0FBSWhKLFVBQUQsQ0FBb0JpSixjQUFwQixDQUFtQ0gsYUFBbkMsQ0FBckI7QUFDQSxtQkFBT3JKLFFBQVEsQ0FBQ3lKLGVBQVQsQ0FBeUJKLGFBQXpCLEVBQXdDdkIsSUFBeEMsQ0FBNkMsVUFBVTRCLE1BQVYsRUFBdUI7QUFDMUUsa0JBQU1DLGFBQWEsR0FBR0osWUFBWSxDQUFDSyxTQUFiLEVBQXRCO0FBQ0Esa0JBQU1DLFFBQVEsR0FBR0YsYUFBYSxDQUFDRyxLQUEvQjtBQUNBLHFCQUFPQyxVQUFVLENBQUNDLGFBQVgsQ0FBeUJOLE1BQXpCLEVBQWlDRyxRQUFqQyxDQUFQO0FBQ0EsYUFKTSxDQUFQO0FBS0EsV0Fia0MsQ0FBbkM7QUFlQSxpQkFBT3ZJLE9BQU8sQ0FBQzJJLEdBQVIsQ0FBWWpCLDBCQUFaLEVBQXdDbEIsSUFBeEMsQ0FBNkMsVUFBQ29DLG1CQUFELEVBQThCO0FBQ2pGLGdCQUFNQyxLQUFLLEdBQUd4QixpQkFBaUIsQ0FBQ3lCLFNBQWxCLEdBQ1h6QixpQkFBaUIsQ0FBQ3lCLFNBQWxCLENBQTRCQyxLQUE1QixDQUFrQyxNQUFsQyxFQUF3Q0gsbUJBQXhDLENBRFcsR0FFWEEsbUJBQW1CLENBQUNaLElBQXBCLENBQXlCLEVBQXpCLENBRkg7QUFHQSxtQkFBTztBQUFFZ0IsY0FBQUEsR0FBRyxFQUFFN0IsYUFBUDtBQUFzQjBCLGNBQUFBLEtBQUssRUFBRUE7QUFBN0IsYUFBUDtBQUNBLFdBTE0sQ0FBUDtBQU1BLFNBMUJxQyxDQUF0QztBQTRCQS9CLFFBQUFBLGtCQUFrQixHQUFHOUcsT0FBTyxDQUFDMkksR0FBUixDQUFZekIsNkJBQVosRUFBMkNWLElBQTNDLENBQWdELFVBQ3BFeUMsc0JBRG9FLEVBRW5FO0FBQ0QsY0FBTUMsV0FBZ0IsR0FBRyxFQUF6QjtBQUNBRCxVQUFBQSxzQkFBc0IsQ0FBQ25JLE9BQXZCLENBQStCLFVBQVVxSSxrQkFBVixFQUF3RDtBQUN0RkQsWUFBQUEsV0FBVyxDQUFDQyxrQkFBa0IsQ0FBQ0gsR0FBcEIsQ0FBWCxHQUFzQ0csa0JBQWtCLENBQUNOLEtBQXpEO0FBQ0EsV0FGRDtBQUdBLGlCQUFPSyxXQUFQO0FBQ0EsU0FSb0IsQ0FBckI7QUFTQSxPQXpDRCxDQXlDRSxPQUFPRSxNQUFQLEVBQWU7QUFDaEJoSCxRQUFBQSxHQUFHLENBQUNpSCxLQUFKLENBQVUsZ0VBQWdFeEMsWUFBMUU7QUFDQUMsUUFBQUEsa0JBQWtCLEdBQUc5RyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JrQixTQUFoQixDQUFyQjtBQUNBOztBQUNELGFBQU8yRixrQkFBUDtBQUNBLEs7O1dBRUR3QyxxQixHQUFBLCtCQUFzQjdDLFdBQXRCLEVBQXdDO0FBQ3ZDLFdBQUtsSCxhQUFMLENBQW1CYyxTQUFuQixDQUE2QixjQUE3QixFQUE2Q29HLFdBQTdDO0FBQ0EsV0FBS2xILGFBQUwsQ0FBbUJjLFNBQW5CLENBQTZCLG1CQUE3QixFQUFrRG9HLFdBQWxEO0FBRUE4QyxNQUFBQSxTQUFTLENBQUNDLHVCQUFWLEdBSnVDLENBSUY7QUFDckM7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NDLGlCLEdBQUEsMkJBQ0MvSyxRQURELEVBRUMrSCxXQUZELEVBb0JDaUQsU0FwQkQsRUFxQkNDLGtCQXJCRCxFQXNCb0I7QUFBQTs7QUFDbkIsVUFBSTlDLFlBQW9CLEdBQUcsRUFBM0I7QUFBQSxVQUNDK0MsdUJBREQ7QUFBQSxVQUVDMUQsYUFBc0IsR0FBRyxLQUYxQjs7QUFJQSxVQUFJeEgsUUFBUSxDQUFDTSxRQUFULE1BQXVCTixRQUFRLENBQUNNLFFBQVQsR0FBb0JFLFlBQS9DLEVBQTZEO0FBQzVEZ0gsUUFBQUEsYUFBYSxHQUFHQyxXQUFXLENBQUNDLHdCQUFaLENBQXFDMUgsUUFBUSxDQUFDTSxRQUFULEdBQW9CRSxZQUFwQixFQUFyQyxDQUFoQjtBQUNBLE9BUGtCLENBUW5COzs7QUFDQSxVQUFJdUgsV0FBVyxJQUFJQSxXQUFXLENBQUNvRCxVQUEzQixJQUF5Q0gsU0FBekMsSUFBc0RBLFNBQVMsQ0FBQ3pGLFVBQXBFLEVBQWdGO0FBQy9FLFlBQU02RixZQUFZLEdBQUdKLFNBQVMsQ0FBQ3pGLFVBQVYsQ0FBcUJ3QyxXQUFXLENBQUNvRCxVQUFqQyxFQUE2Q3pGLE1BQWxFO0FBQ0F5QyxRQUFBQSxZQUFZLEdBQUdpRCxZQUFZLENBQUN6RixLQUE1Qjs7QUFFQSxZQUFJeUYsWUFBWSxDQUFDQyxVQUFqQixFQUE2QjtBQUM1QkgsVUFBQUEsdUJBQXVCLEdBQUcsS0FBS3JELGlCQUFMLENBQXVCdUQsWUFBWSxDQUFDQyxVQUFwQyxFQUFnRGxELFlBQWhELEVBQThEbkksUUFBOUQsQ0FBMUI7QUFDQTtBQUNEOztBQUVELFVBQUlzTCxXQUFXLEdBQUcsS0FBS0MsbUJBQUwsQ0FBeUJ2TCxRQUF6QixFQUFtQytILFdBQW5DLENBQWxCLENBbEJtQixDQW1CbkI7QUFDQTs7O0FBQ0EsVUFBSXVELFdBQVcsQ0FBQzlILE1BQVosS0FBdUIsQ0FBdkIsSUFBNEIsS0FBS2dJLHlCQUFyQyxFQUFnRTtBQUMvRCxhQUFLN0ssWUFBTCxDQUFrQjhLLFdBQWxCO0FBQ0EsZUFBT25LLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFQO0FBQ0EsT0F4QmtCLENBMEJuQjs7O0FBQ0EsVUFBSXdHLFdBQVcsU0FBWCxJQUFBQSxXQUFXLFdBQVgsSUFBQUEsV0FBVyxDQUFFMkQsWUFBYixJQUE2QjNELFdBQTdCLGFBQTZCQSxXQUE3QixlQUE2QkEsV0FBVyxDQUFFNEQsZ0JBQTlDLEVBQWdFO0FBQy9ETCxRQUFBQSxXQUFXLElBQUksT0FBZjtBQUNBLE9BN0JrQixDQStCbkI7OztBQUNBLFVBQU1NLE9BQU8sR0FBRyxLQUFLQyxnQkFBTCxDQUFzQlAsV0FBdEIsRUFBbUN2RCxXQUFuQyxDQUFoQjs7QUFDQSxVQUFJNkQsT0FBSixFQUFhO0FBQ1pOLFFBQUFBLFdBQVcsSUFBSSxhQUFhTSxPQUE1QjtBQUNBLE9BbkNrQixDQXFDbkI7OztBQUNBLFVBQU1FLGVBQWUsR0FBRztBQUN2QkMsUUFBQUEsYUFBYSxFQUFFaEUsV0FBRixhQUFFQSxXQUFGLHVCQUFFQSxXQUFXLENBQUUyRCxZQURMO0FBRXZCQyxRQUFBQSxnQkFBZ0IsRUFBRTVELFdBQUYsYUFBRUEsV0FBRix1QkFBRUEsV0FBVyxDQUFFNEQsZ0JBRlI7QUFHdkJLLFFBQUFBLGVBQWUsRUFBRWpFLFdBQUYsYUFBRUEsV0FBRix1QkFBRUEsV0FBVyxDQUFFa0UsUUFIUDtBQUl2QkMsUUFBQUEsZ0JBQWdCLEVBQUVuRSxXQUFGLGFBQUVBLFdBQUYsdUJBQUVBLFdBQVcsQ0FBRW1FLGdCQUpSO0FBS3ZCQyxRQUFBQSxVQUFVLEVBQUUsQ0FBQXBFLFdBQVcsU0FBWCxJQUFBQSxXQUFXLFdBQVgsWUFBQUEsV0FBVyxDQUFFcUUsY0FBYixNQUFnQyxDQUFDLENBQWpDLElBQXNDckUsV0FBdEMsYUFBc0NBLFdBQXRDLGVBQXNDQSxXQUFXLENBQUVzRSxnQkFBbkQsR0FBc0U1SixTQUF0RSxHQUFrRnpDLFFBTHZFO0FBTXZCc00sUUFBQUEsZ0JBQWdCLEVBQUV2RSxXQUFGLGFBQUVBLFdBQUYsdUJBQUVBLFdBQVcsQ0FBRXVFLGdCQU5SO0FBT3ZCQyxRQUFBQSxnQkFBZ0IsRUFBRSxDQUFBeEUsV0FBVyxTQUFYLElBQUFBLFdBQVcsV0FBWCxZQUFBQSxXQUFXLENBQUV5RSxlQUFiLE1BQWlDL0osU0FBakMsR0FBNkNzRixXQUE3QyxhQUE2Q0EsV0FBN0MsdUJBQTZDQSxXQUFXLENBQUV5RSxlQUExRCxHQUE0RSxJQVB2RTtBQVF2QkMsUUFBQUEsd0JBQXdCLEVBQUUxRSxXQUFGLGFBQUVBLFdBQUYsdUJBQUVBLFdBQVcsQ0FBRTBFO0FBUmhCLE9BQXhCOztBQVdBLFVBQUkxRSxXQUFKLGFBQUlBLFdBQUosZUFBSUEsV0FBVyxDQUFFMkUsaUJBQWpCLEVBQW9DO0FBQ25DO0FBQ0EsWUFBTUMsc0JBQXNCLEdBQUcsS0FBS2hNLFlBQUwsQ0FBa0JpTSxPQUFsQixHQUE0QjlHLE9BQTVCLENBQW9DLGlDQUFwQyxFQUF1RSxFQUF2RSxDQUEvQjs7QUFDQSxZQUFJd0YsV0FBVyxLQUFLcUIsc0JBQXBCLEVBQTRDO0FBQzNDO0FBQ0EsY0FBTUUsZ0JBQXFCLEdBQUcsS0FBS3BNLE9BQUwsQ0FBYXFNLGtCQUFiLENBQWdDLEtBQUtuTSxZQUFMLENBQWtCaU0sT0FBbEIsRUFBaEMsQ0FBOUI7O0FBQ0EsY0FBSUMsZ0JBQUosRUFBc0I7QUFDckJBLFlBQUFBLGdCQUFnQixDQUFDRSxjQUFqQixHQUFrQ2pCLGVBQWxDO0FBQ0FlLFlBQUFBLGdCQUFnQixDQUFDRyxnQkFBakIsR0FBb0MsS0FBSzlHLG9CQUFMLENBQTBCLEtBQUsrRyxpQkFBL0IsQ0FBcEM7QUFDQUosWUFBQUEsZ0JBQWdCLENBQUNLLFlBQWpCLEdBQWdDLEtBQUtDLG9CQUFyQztBQUNBTixZQUFBQSxnQkFBZ0IsQ0FBQ08sS0FBakIsR0FBeUIsS0FBS0MsYUFBOUI7QUFDQTs7QUFFRCxlQUFLMU0sWUFBTCxDQUFrQjJNLGNBQWxCLENBQWlDLENBQUMsQ0FBQ3ZGLFdBQVcsQ0FBQ3dGLFdBQS9DOztBQUVBLGVBQUszQyxxQkFBTCxDQUEyQmlDLGdCQUEzQjs7QUFFQSxpQkFBT3ZMLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFQO0FBQ0E7QUFDRDs7QUFFRCxVQUFJd0csV0FBVyxTQUFYLElBQUFBLFdBQVcsV0FBWCxJQUFBQSxXQUFXLENBQUV5RixTQUFiLElBQTBCekYsV0FBVyxDQUFDa0UsUUFBWixJQUF3QixJQUFsRCxJQUEwRFgsV0FBVyxDQUFDN0gsT0FBWixDQUFvQixPQUFwQixNQUFpQyxDQUFDLENBQWhHLEVBQW1HO0FBQ2xHLFlBQUk2SCxXQUFXLENBQUM3SCxPQUFaLENBQW9CLEdBQXBCLElBQTJCLENBQUMsQ0FBaEMsRUFBbUM7QUFDbEM2SCxVQUFBQSxXQUFXLElBQUksa0JBQWY7QUFDQSxTQUZELE1BRU87QUFDTkEsVUFBQUEsV0FBVyxJQUFJLGtCQUFmO0FBQ0E7QUFDRCxPQTVFa0IsQ0E4RW5CO0FBQ0E7OztBQUNBLFVBQUlMLGtCQUFrQixJQUFJQSxrQkFBa0IsQ0FBQzVILElBQW5CLEtBQTRCLDZCQUF0RCxFQUFxRjtBQUNwRixZQUFNb0ssVUFBVSxHQUFHLEtBQUtoTixPQUFMLENBQWFxTSxrQkFBYixDQUFnQ3hCLFdBQWhDLENBQW5COztBQUNBLFlBQUltQyxVQUFKLEVBQWdCO0FBQ2YsY0FBTUMsTUFBTSxHQUFHLEtBQUt4SCxvQkFBTCxDQUEwQnVILFVBQVUsQ0FBQ3BLLElBQXJDLENBQWY7O0FBQ0EsY0FBSXFLLE1BQU0sSUFBSUEsTUFBTSxDQUFDdkwsT0FBakIsSUFBNEJ1TCxNQUFNLENBQUN2TCxPQUFQLENBQWVxQixNQUFmLEdBQXdCLENBQXhELEVBQTJEO0FBQzFELGdCQUFNbUssZUFBZSxHQUFHRCxNQUFNLENBQUN2TCxPQUFQLENBQWV1TCxNQUFNLENBQUN2TCxPQUFQLENBQWVxQixNQUFmLEdBQXdCLENBQXZDLENBQXhCOztBQUNBLGdCQUFNb0ssT0FBTyxHQUFHLEtBQUt6SCxxQkFBTCxDQUEyQndILGVBQTNCLENBQWhCOztBQUNBLGdCQUFJQyxPQUFPLElBQUlBLE9BQU8sQ0FBQ3ZLLElBQVIsS0FBaUIsNkJBQWhDLEVBQStEO0FBQzlEd0ssY0FBQUEsZUFBZSxDQUFDQywrQkFBaEI7QUFDQTtBQUNEO0FBQ0Q7QUFDRCxPQTVGa0IsQ0E4Rm5COzs7QUFDQSxXQUFLaE8sbUJBQUwsQ0FBeUJtRSxJQUF6QixDQUE4QjZILGVBQTlCOztBQUVBLFVBQUkzRCxZQUFZLElBQUkrQyx1QkFBcEIsRUFBNkM7QUFDNUMsZUFBT0EsdUJBQXVCLENBQUNwRCxJQUF4QixDQUE2QixVQUFDaUcsZ0JBQUQsRUFBMkI7QUFDOURBLFVBQUFBLGdCQUFnQixDQUFDdkcsYUFBakIsR0FBaUNBLGFBQWpDOztBQUNBLFVBQUEsTUFBSSxDQUFDL0csT0FBTCxDQUFhdU4sS0FBYixDQUFtQjdGLFlBQW5CLEVBQWlDNEYsZ0JBQWpDOztBQUNBLGlCQUFPek0sT0FBTyxDQUFDQyxPQUFSLENBQWdCLElBQWhCLENBQVA7QUFDQSxTQUpNLENBQVA7QUFLQTs7QUFDRCxhQUFPLEtBQUtaLFlBQUwsQ0FDTHVILFNBREssQ0FDS29ELFdBREwsRUFDa0IsS0FEbEIsRUFDeUJ2RCxXQUR6QixhQUN5QkEsV0FEekIsdUJBQ3lCQSxXQUFXLENBQUVrRyxtQkFEdEMsRUFDMkRsRyxXQUQzRCxhQUMyREEsV0FEM0QsdUJBQzJEQSxXQUFXLENBQUV3RixXQUR4RSxFQUNxRixDQUFDL0YsYUFEdEYsRUFFTE0sSUFGSyxDQUVBLFVBQUNvRyxVQUFELEVBQXFCO0FBQzFCLFlBQUksQ0FBQ0EsVUFBTCxFQUFpQjtBQUNoQjtBQUNBLFVBQUEsTUFBSSxDQUFDcE8sbUJBQUwsQ0FBeUJxTyxHQUF6QjtBQUNBOztBQUNELGVBQU9ELFVBQVA7QUFDQSxPQVJLLENBQVA7QUFTQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDRSxlLEdBQUEseUJBQWdCQyxnQkFBaEIsRUFBMENOLGdCQUExQyxFQUFrRTtBQUNqRSxVQUFNOUYsVUFBVSxHQUFHLEtBQUt4SCxPQUFMLENBQWF1SCxNQUFiLENBQW9CcUcsZ0JBQXBCLEVBQXNDTixnQkFBdEMsQ0FBbkI7QUFDQSxhQUFPLEtBQUtwTixZQUFMLENBQWtCdUgsU0FBbEIsQ0FBNEJELFVBQTVCLEVBQXdDeEYsU0FBeEMsRUFBbURBLFNBQW5ELEVBQThEQSxTQUE5RCxFQUF5RSxDQUFDc0wsZ0JBQWdCLENBQUN2RyxhQUEzRixDQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDOEcsd0IsR0FBQSxrQ0FBeUJ0TyxRQUF6QixFQUF3QztBQUN2QyxVQUFNdU8sS0FBSyxHQUFHdk8sUUFBUSxDQUFDcUksT0FBVCxFQUFkLENBRHVDLENBR3ZDO0FBQ0E7O0FBQ0EsVUFBSSxLQUFLMUgsWUFBTCxDQUFrQjJOLHdCQUFsQixDQUEyQ0MsS0FBM0MsQ0FBSixFQUF1RDtBQUN0RCxlQUFPLElBQVA7QUFDQSxPQUZELE1BRU8sSUFBSSx5QkFBeUJDLElBQXpCLENBQThCRCxLQUE5QixDQUFKLEVBQTBDO0FBQ2hEO0FBQ0E7QUFDQSxZQUFJRSxhQUFKOztBQUNBLFlBQUksS0FBS3hILG9CQUFMLElBQTZCLEtBQUtBLG9CQUFMLENBQTBCeUgsYUFBMUIsS0FBNENILEtBQTdFLEVBQW9GO0FBQ25GO0FBQ0FFLFVBQUFBLGFBQWEsR0FBRyxLQUFLeEgsb0JBQUwsQ0FBMEIwSCxZQUExQztBQUNBLFNBSEQsTUFHTztBQUNORixVQUFBQSxhQUFhLEdBQUc5RyxpQkFBaUIsQ0FBQ0MsZUFBbEIsQ0FBa0M1SCxRQUFsQyxDQUFoQjtBQUNBOztBQUVELGVBQU95TyxhQUFhLElBQUlGLEtBQWpCLEdBQXlCLEtBQUs1TixZQUFMLENBQWtCMk4sd0JBQWxCLENBQTJDRyxhQUEzQyxDQUF6QixHQUFxRixLQUE1RjtBQUNBLE9BWk0sTUFZQTtBQUNOLGVBQU8sS0FBUDtBQUNBO0FBQ0QsSzs7V0FFREcsbUIsR0FBQSw2QkFBb0JMLEtBQXBCLEVBQXdDO0FBQ3ZDLFVBQU14SSxLQUFLLEdBQUcsSUFBSUMsTUFBSixDQUFXLFNBQVgsQ0FBZDtBQUNBdUksTUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUN6SSxPQUFOLENBQWNDLEtBQWQsRUFBcUIsRUFBckIsQ0FBUjs7QUFDQSxVQUFJLEtBQUt0RixPQUFMLENBQWF3RixLQUFiLENBQW1Cc0ksS0FBbkIsS0FBNkJBLEtBQUssS0FBSyxFQUEzQyxFQUErQztBQUM5QyxlQUFPQSxLQUFQO0FBQ0EsT0FGRCxNQUVPO0FBQ04sZUFBTyxLQUFLSyxtQkFBTCxDQUF5QkwsS0FBekIsQ0FBUDtBQUNBO0FBQ0QsSzs7V0FFRE0sNEIsR0FBQSxzQ0FBNkI3TyxRQUE3QixFQUE0QztBQUMzQyxVQUFNdU8sS0FBSyxHQUFHdk8sUUFBUSxDQUFDcUksT0FBVCxFQUFkLENBRDJDLENBRzNDOztBQUNBLFVBQUksQ0FBQyx1QkFBdUJtRyxJQUF2QixDQUE0QkQsS0FBNUIsQ0FBTCxFQUF5QztBQUN4QyxlQUFPLEtBQVA7QUFDQSxPQU4wQyxDQVEzQzs7O0FBQ0EsVUFBTWhPLFVBQVUsR0FBR1AsUUFBUSxDQUFDTSxRQUFULEdBQW9CRSxZQUFwQixFQUFuQjtBQUFBLFVBQ0NzTyxjQUFjLEdBQUd2TyxVQUFVLENBQUNpSixjQUFYLENBQTBCeEosUUFBUSxDQUFDcUksT0FBVCxFQUExQixFQUE4Q3VCLFNBQTlDLENBQXdELGFBQXhELENBRGxCOztBQUVBLFVBQUksQ0FBQ2pDLGlCQUFpQixDQUFDb0gsZUFBbEIsQ0FBa0N4TyxVQUFsQyxFQUE4Q3VPLGNBQTlDLENBQUwsRUFBb0U7QUFDbkUsZUFBTyxLQUFQO0FBQ0EsT0FiMEMsQ0FlM0M7OztBQUNBLGFBQU9ySCxXQUFXLENBQUN1SCxnQkFBWixDQUE2QnpPLFVBQTdCLEVBQXlDZ08sS0FBekMsQ0FBUDtBQUNBLEs7O1dBRURoRCxtQixHQUFBLDZCQUFvQnZMLFFBQXBCLEVBQW1DK0gsV0FBbkMsRUFBcUQ7QUFDcEQsVUFBSXdHLEtBQUo7O0FBRUEsVUFBSXZPLFFBQVEsQ0FBQ2lQLEdBQVQsQ0FBYSx3Q0FBYixLQUEwRGpQLFFBQVEsQ0FBQ2tQLFVBQVQsRUFBOUQsRUFBcUY7QUFDcEZYLFFBQUFBLEtBQUssR0FBR3ZPLFFBQVEsQ0FBQ21QLGdCQUFULEdBQTRCOUcsT0FBNUIsRUFBUjtBQUNBLE9BRkQsTUFFTztBQUNOa0csUUFBQUEsS0FBSyxHQUFHdk8sUUFBUSxDQUFDcUksT0FBVCxFQUFSO0FBQ0E7O0FBRUQsVUFBSU4sV0FBVyxDQUFDcUUsY0FBWixLQUErQixDQUFDLENBQXBDLEVBQXVDO0FBQ3RDO0FBQ0FtQyxRQUFBQSxLQUFLLEdBQUcsS0FBS0ssbUJBQUwsQ0FBeUJMLEtBQXpCLENBQVIsQ0FGc0MsQ0FJdEM7O0FBQ0EsWUFBSSxLQUFLdEgsb0JBQUwsSUFBNkIsS0FBS0Esb0JBQUwsQ0FBMEJ5SCxhQUExQixLQUE0Q0gsS0FBN0UsRUFBb0Y7QUFDbkZBLFVBQUFBLEtBQUssR0FBRyxLQUFLdEgsb0JBQUwsQ0FBMEIwSCxZQUFsQztBQUNBO0FBQ0QsT0FSRCxNQVFPLElBQUksS0FBS0UsNEJBQUwsQ0FBa0M3TyxRQUFsQyxDQUFKLEVBQWlEO0FBQ3ZEO0FBQ0EsWUFBTXlPLGFBQWEsR0FBRzlHLGlCQUFpQixDQUFDQyxlQUFsQixDQUFrQzVILFFBQWxDLEVBQTRDLElBQTVDLENBQXRCOztBQUVBLFlBQUksQ0FBQ3lPLGFBQUwsRUFBb0I7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsZUFBS3ZILHNCQUFMLENBQTRCekUsU0FBNUI7QUFDQSxTQUxELE1BS08sSUFBSWdNLGFBQWEsS0FBS0YsS0FBdEIsRUFBNkI7QUFDbkM7QUFDQTtBQUNBLGVBQUtySCxzQkFBTCxDQUE0QjtBQUFFd0gsWUFBQUEsYUFBYSxFQUFFSCxLQUFqQjtBQUF3QkksWUFBQUEsWUFBWSxFQUFFRjtBQUF0QyxXQUE1QjtBQUNBRixVQUFBQSxLQUFLLEdBQUdFLGFBQVI7QUFDQTtBQUNELE9BaENtRCxDQWtDcEQ7OztBQUNBLFVBQUlGLEtBQUssQ0FBQyxDQUFELENBQUwsS0FBYSxHQUFqQixFQUFzQjtBQUNyQkEsUUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNhLFNBQU4sQ0FBZ0IsQ0FBaEIsQ0FBUjtBQUNBOztBQUVELGFBQU9iLEtBQVA7QUFDQSxLOztXQUVEMUMsZ0IsR0FBQSwwQkFBaUIwQyxLQUFqQixFQUE2QnhHLFdBQTdCLEVBQStDO0FBQzlDLFVBQUk3RCxRQUFRLEdBQUc2RCxXQUFXLENBQUM3RCxRQUEzQjs7QUFDQSxVQUFJNkQsV0FBVyxDQUFDcUUsY0FBaEIsRUFBZ0M7QUFDL0JsSSxRQUFBQSxRQUFRLElBQUk2RCxXQUFXLENBQUNxRSxjQUF4Qjs7QUFDQSxZQUFJbEksUUFBUSxHQUFHLENBQWYsRUFBa0I7QUFDakJBLFVBQUFBLFFBQVEsR0FBRyxDQUFYO0FBQ0E7QUFDRDs7QUFFRCxhQUFRLEtBQUsvRCxhQUFMLENBQW1Ca1AscUJBQW5CLEVBQUQsQ0FBb0RDLGVBQXBELENBQ05wTCxRQURNLEVBRU5xSyxLQUZNLEVBR054RyxXQUFXLENBQUM2RCxPQUhOLEVBSU43RCxXQUFXLENBQUN3SCxpQkFKTixDQUFQO0FBTUE7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0MsbUIsR0FBQTtBQUFvQjtBQUFwQiwwQkFBdUM7QUFDdEMsVUFBTUMsbUJBQW1CLEdBQUcsSUFBSUMsV0FBSixHQUFrQkMsb0JBQWxCLEVBQTVCOztBQUNBLFVBQUksQ0FBQ0YsbUJBQUwsRUFBMEI7QUFDekIsWUFBTUcsU0FBUyxHQUFHLEtBQUt6UCxhQUFMLENBQW1CMFAsY0FBbkIsRUFBbEI7QUFDQUMsUUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCSCxTQUFoQjtBQUNBO0FBQ0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDSSxlLEdBQUEseUJBQWdCQyxNQUFoQixFQUErQjtBQUFBOztBQUM5QixVQUFNQyxnQkFBZ0IsR0FBRyxLQUFLL1AsYUFBTCxDQUFtQmdRLGtCQUFuQixFQUF6QjtBQUFBLFVBQ0NQLFNBQVMsR0FBRyxLQUFLelAsYUFBTCxDQUFtQjBQLGNBQW5CLEVBRGI7QUFFQSxVQUFNSixtQkFBbUIsR0FBRyxJQUFJQyxXQUFKLEdBQWtCQyxvQkFBbEIsRUFBNUI7O0FBQ0EsVUFBSUcsVUFBVSxDQUFDTSxRQUFYLENBQW9CUixTQUFwQixLQUFrQyxDQUFDSCxtQkFBdkMsRUFBNEQ7QUFDM0RLLFFBQUFBLFVBQVUsQ0FBQ08sTUFBWCxDQUFrQlQsU0FBbEI7QUFDQTs7QUFDRCxVQUFNN0gsV0FBZ0IsR0FBR2tJLE1BQU0sQ0FBQ0ssYUFBUCxFQUF6Qjs7QUFDQSxVQUFJLEtBQUt4USxtQkFBTCxDQUF5QjBELE1BQTdCLEVBQXFDO0FBQ3BDdUUsUUFBQUEsV0FBVyxDQUFDZ0YsY0FBWixHQUE2QixLQUFLak4sbUJBQUwsQ0FBeUIsQ0FBekIsQ0FBN0I7QUFDQSxhQUFLQSxtQkFBTCxHQUEyQixLQUFLQSxtQkFBTCxDQUF5QjRFLEtBQXpCLENBQStCLENBQS9CLENBQTNCO0FBQ0EsT0FIRCxNQUdPO0FBQ05xRCxRQUFBQSxXQUFXLENBQUNnRixjQUFaLEdBQTZCLEVBQTdCO0FBQ0E7O0FBQ0QsVUFBSW1ELGdCQUFnQixDQUFDSyx5QkFBakIsRUFBSixFQUFrRDtBQUNqRHhJLFFBQUFBLFdBQVcsQ0FBQ2dGLGNBQVosQ0FBMkJ5RCxrQkFBM0IsR0FBZ0QsSUFBaEQ7QUFDQU4sUUFBQUEsZ0JBQWdCLENBQUNPLHVCQUFqQjtBQUNBOztBQUVELFdBQUt4RCxpQkFBTCxHQUF5QmdELE1BQU0sQ0FBQ1MsWUFBUCxDQUFvQixNQUFwQixDQUF6QjtBQUNBLFdBQUt2RCxvQkFBTCxHQUE0QnBGLFdBQVcsQ0FBQzRJLE1BQVosQ0FBbUJwTixPQUEvQztBQUNBLFdBQUs4SixhQUFMLEdBQXFCNEMsTUFBTSxDQUFDUyxZQUFQLENBQW9CLE9BQXBCLENBQXJCO0FBRUEzSSxNQUFBQSxXQUFXLENBQUNpRixnQkFBWixHQUErQixLQUFLOUcsb0JBQUwsQ0FBMEIsS0FBSytHLGlCQUEvQixDQUEvQjtBQUNBbEYsTUFBQUEsV0FBVyxDQUFDbUYsWUFBWixHQUEyQixLQUFLQyxvQkFBaEM7O0FBRUEsV0FBS3ZDLHFCQUFMLENBQTJCN0MsV0FBM0IsRUExQjhCLENBNEI5QjtBQUNBOzs7QUFDQSxVQUFJLENBQUM2SSxPQUFPLENBQUNDLEtBQVQsSUFBa0JELE9BQU8sQ0FBQ0MsS0FBUixDQUFjQyxPQUFkLEtBQTBCck8sU0FBaEQsRUFBMkQ7QUFDMUQsYUFBSzlCLFlBQUwsQ0FDRW9RLGNBREYsR0FFRWpKLElBRkYsQ0FFTyxZQUFNO0FBQ1gsVUFBQSxNQUFJLENBQUNuSCxZQUFMLENBQWtCcVEsaUJBQWxCO0FBQ0EsU0FKRixFQUtFQyxLQUxGLENBS1EsVUFBVXZHLE1BQVYsRUFBdUI7QUFDN0JoSCxVQUFBQSxHQUFHLENBQUNpSCxLQUFKLENBQVUsK0JBQVYsRUFBMkNELE1BQTNDO0FBQ0EsU0FQRjtBQVFBLE9BVEQsTUFTTztBQUNOLGFBQUsvSixZQUFMLENBQWtCcVEsaUJBQWxCO0FBQ0E7QUFDRCxLOztXQUVERSxrQixHQUFBLDRCQUFtQkMsS0FBbkIsRUFBK0JDLFVBQS9CLEVBQWlEQyxTQUFqRCxFQUFrRTtBQUNqRSxXQUFLeFEsYUFBTCxDQUFtQnlRLFdBQW5CLENBQStCLGNBQS9CLEVBQStDSCxLQUEvQyxFQUFzREMsVUFBdEQsRUFBa0VDLFNBQWxFO0FBQ0EsSzs7V0FDRDVQLGtCLEdBQUEsNEJBQW1CMlAsVUFBbkIsRUFBb0NDLFNBQXBDLEVBQXFEO0FBQ3BELFdBQUt4USxhQUFMLENBQW1CMFEsV0FBbkIsQ0FBK0IsY0FBL0IsRUFBK0NILFVBQS9DLEVBQTJEQyxTQUEzRDtBQUNBLEs7O1dBQ0RHLHVCLEdBQUEsaUNBQXdCTCxLQUF4QixFQUFvQ0MsVUFBcEMsRUFBcURDLFNBQXJELEVBQXNFO0FBQ3JFLFdBQUt4USxhQUFMLENBQW1CeVEsV0FBbkIsQ0FBK0IsbUJBQS9CLEVBQW9ESCxLQUFwRCxFQUEyREMsVUFBM0QsRUFBdUVDLFNBQXZFO0FBQ0EsSzs7V0FDREksdUIsR0FBQSxpQ0FBd0JMLFVBQXhCLEVBQXlDQyxTQUF6QyxFQUF5RDtBQUN4RCxXQUFLeFEsYUFBTCxDQUFtQjBRLFdBQW5CLENBQStCLG1CQUEvQixFQUFvREgsVUFBcEQsRUFBZ0VDLFNBQWhFO0FBQ0EsSzs7V0FFREssZ0IsR0FBQSwwQkFBaUJqUixPQUFqQixFQUErQk4sYUFBL0IsRUFBbUQ7QUFDbEQsVUFBTXdSLEtBQUssR0FBR2xSLE9BQU8sQ0FBQ21SLGNBQVIsR0FBeUJDLElBQXZDO0FBQ0EsVUFBTXBFLFVBQVUsR0FBR2hOLE9BQU8sQ0FBQ3FNLGtCQUFSLENBQTJCNkUsS0FBM0IsQ0FBbkI7QUFDQSxhQUFPeFIsYUFBYSxDQUNsQjJSLFdBREssR0FFTC9RLGdCQUZLLENBRVkseUJBRlosRUFHTGdSLE1BSEssQ0FHRSxVQUFVckUsTUFBVixFQUF1QjtBQUM5QixlQUFPQSxNQUFNLENBQUNySyxJQUFQLEtBQWdCb0ssVUFBVSxDQUFDcEssSUFBbEM7QUFDQSxPQUxLLEVBS0gsQ0FMRyxDQUFQO0FBTUEsSzs7V0FDRDJPLG1CLEdBQUEsNkJBQW9CdEUsTUFBcEIsRUFBaUM7QUFBQTs7QUFDaEMsVUFBTUUsT0FBTyxHQUFHRixNQUFNLENBQUN2SyxNQUF2Qjs7QUFDQSxVQUFJLE9BQU95SyxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQ2hDLGVBQU8sQ0FBQyxLQUFLNUwsU0FBTCxDQUFlNEwsT0FBZixDQUFELENBQVA7QUFDQSxPQUZELE1BRU87QUFDTixZQUFNcUUsT0FBYyxHQUFHLEVBQXZCO0FBQ0FyRSxRQUFBQSxPQUFPLENBQUN4TCxPQUFSLENBQWdCLFVBQUM4UCxPQUFELEVBQWtCO0FBQ2pDRCxVQUFBQSxPQUFPLENBQUNoTyxJQUFSLENBQWEsTUFBSSxDQUFDakMsU0FBTCxDQUFla1EsT0FBZixDQUFiO0FBQ0EsU0FGRDtBQUdBLGVBQU9ELE9BQVA7QUFDQTtBQUNELEs7O1dBRURFLGlCLEdBQUEsNkJBQW9CO0FBQUE7O0FBQ25CO0FBQ0EsV0FBS3pRLGlCQUFMLEdBQXlCLEtBQUtzTyxlQUFMLENBQXFCb0MsSUFBckIsQ0FBMEIsSUFBMUIsQ0FBekI7QUFDQSxXQUFLM1IsT0FBTCxDQUFheVEsa0JBQWIsQ0FBZ0MsS0FBS3hQLGlCQUFyQyxFQUF3RCxJQUF4RDtBQUNBLFVBQU0rTixtQkFBbUIsR0FBRyxJQUFJQyxXQUFKLEdBQWtCQyxvQkFBbEIsRUFBNUI7O0FBQ0EsVUFBSSxDQUFDRixtQkFBTCxFQUEwQjtBQUN6QixhQUFLaFAsT0FBTCxDQUFhNFIsd0JBQWIsQ0FBc0MsS0FBSzdDLG1CQUFMLENBQXlCNEMsSUFBekIsQ0FBOEIsSUFBOUIsQ0FBdEM7QUFDQSxPQVBrQixDQVFuQjs7O0FBQ0EsV0FBS3RTLG1CQUFMLEdBQTJCLEVBQTNCO0FBQ0ErSyxNQUFBQSxTQUFTLENBQUN5SCxjQUFWO0FBQ0EsV0FBSzlHLHlCQUFMLEdBQWlDLENBQUMsS0FBSy9LLE9BQUwsQ0FBYXdGLEtBQWIsQ0FBbUIsRUFBbkIsQ0FBbEM7QUFFQSxVQUFNc00sWUFBWSxHQUFHLEtBQUs5UixPQUFMLENBQWFtUixjQUFiLEdBQThCaEYsT0FBOUIsR0FBd0NuSixPQUF4QyxDQUFnRCxnQkFBaEQsTUFBc0UsQ0FBQyxDQUE1RjtBQUNBLFVBQU1wQyxXQUFXLEdBQUcsS0FBS2xCLGFBQUwsQ0FDbEJxUyxvQkFEa0IsR0FFbEIxSyxJQUZrQixDQUViLFVBQUMySyxrQkFBRCxFQUE2QjtBQUNsQyxZQUFNQyxxQkFBcUIsR0FBR0Qsa0JBQWtCLEtBQUtoUSxTQUF2QixJQUFvQ1IsTUFBTSxDQUFDQyxJQUFQLENBQVl1USxrQkFBWixFQUFnQ2pQLE1BQWhDLEtBQTJDLENBQTdHOztBQUNBLFlBQU1tTyxLQUFLLEdBQUcsT0FBSSxDQUFDbFIsT0FBTCxDQUFhbVIsY0FBYixHQUE4QmhGLE9BQTlCLEVBQWQsQ0FGa0MsQ0FHbEM7OztBQUNBLFlBQUksQ0FBQzJGLFlBQUQsSUFBaUJHLHFCQUFqQixJQUEwQyxDQUFDZixLQUEvQyxFQUFzRDtBQUNyRCxjQUFJYyxrQkFBa0IsQ0FBQ0UsYUFBbkIsSUFBb0NGLGtCQUFrQixDQUFDRSxhQUFuQixDQUFpQyxDQUFqQyxFQUFvQ2xQLE9BQXBDLENBQTRDLFFBQTVDLE1BQTBELENBQUMsQ0FBbkcsRUFBc0c7QUFDckc7QUFDQSxtQkFBTyxPQUFJLENBQUNtUCxvQkFBTCxDQUEwQkgsa0JBQTFCLENBQVA7QUFDQSxXQUhELE1BR087QUFDTjtBQUNBLG1CQUFPLE9BQUksQ0FBQ0ksc0JBQUwsQ0FBNEJKLGtCQUE1QixDQUFQO0FBQ0E7QUFDRDtBQUNELE9BZmtCLEVBZ0JsQnhCLEtBaEJrQixDQWdCWixVQUFVdkcsTUFBVixFQUF1QjtBQUM3QmhILFFBQUFBLEdBQUcsQ0FBQ2lILEtBQUosQ0FBVSxxQ0FBVixFQUFpREQsTUFBakQ7QUFDQSxPQWxCa0IsQ0FBcEI7QUFvQkEsYUFBT3JKLFdBQVA7QUFDQSxLOztXQUVEeVIsb0IsR0FBQSw4QkFBcUJMLGtCQUFyQixFQUErQztBQUM5QyxhQUFPTSxnQkFBZ0IsQ0FBQ0Qsb0JBQWpCLENBQXNDTCxrQkFBdEMsRUFBMEQsS0FBS08sY0FBTCxFQUExRCxFQUFpRixLQUFLdlMsT0FBdEYsQ0FBUDtBQUNBLEs7O1dBRURtUyxvQixHQUFBLDhCQUFxQkgsa0JBQXJCLEVBQThDO0FBQUE7O0FBQzdDLGFBQU9NLGdCQUFnQixDQUFDRSxvQkFBakIsQ0FBc0NSLGtCQUF0QyxFQUEwRCxLQUFLTyxjQUFMLEVBQTFELEVBQWlGLEtBQUt2UyxPQUF0RixFQUErRixLQUFLRixVQUFwRyxFQUFnSHVILElBQWhILENBQ04sVUFBQ29MLFFBQUQsRUFBbUI7QUFDbEIsWUFBSUEsUUFBSixFQUFjO0FBQ1osVUFBQSxPQUFJLENBQUN6UyxPQUFMLENBQWFtUixjQUFiLEdBQThCdUIsV0FBL0IsQ0FBbURELFFBQW5EOztBQUNBLFVBQUEsT0FBSSxDQUFDMUgseUJBQUwsR0FBaUMsSUFBakM7QUFDQTtBQUNELE9BTkssQ0FBUDtBQVFBLEs7O1dBRURxSCxzQixHQUFBLGdDQUF1Qkosa0JBQXZCLEVBQWdEO0FBQUE7O0FBQy9DLGFBQU9NLGdCQUFnQixDQUFDSyxzQkFBakIsQ0FDTCxLQUFLalQsYUFBTCxDQUFtQmtULFdBQW5CLEVBQUQsQ0FBMEMsU0FBMUMsRUFBcURDLE9BRC9DLEVBRU5iLGtCQUZNLEVBR04sS0FBS3BTLE1BSEMsRUFJTHlILElBSkssQ0FJQSxVQUFDeUwsU0FBRCxFQUFvQjtBQUMxQixZQUFJNUIsS0FBSjs7QUFDQSxZQUFJNEIsU0FBUyxDQUFDQyxPQUFkLEVBQXVCO0FBQ3RCLGNBQU1DLGNBQWMsR0FBR0YsU0FBUyxDQUFDQyxPQUFWLENBQWtCbkwsT0FBbEIsRUFBdkI7QUFBQSxjQUNDb0csYUFBYSxHQUFHOUcsaUJBQWlCLENBQUNDLGVBQWxCLENBQWtDMkwsU0FBUyxDQUFDQyxPQUE1QyxDQURqQjs7QUFHQSxjQUFJL0UsYUFBYSxLQUFLZ0YsY0FBdEIsRUFBc0M7QUFDckM7QUFDQTtBQUNBLFlBQUEsT0FBSSxDQUFDdk0sc0JBQUwsQ0FBNEI7QUFBRXdILGNBQUFBLGFBQWEsRUFBRStFLGNBQWpCO0FBQWlDOUUsY0FBQUEsWUFBWSxFQUFFRjtBQUEvQyxhQUE1QjtBQUNBOztBQUVEa0QsVUFBQUEsS0FBSyxHQUFHbEQsYUFBYSxDQUFDVyxTQUFkLENBQXdCLENBQXhCLENBQVIsQ0FWc0IsQ0FVYztBQUNwQyxTQVhELE1BV08sSUFBSW1FLFNBQVMsQ0FBQzFCLElBQWQsRUFBb0I7QUFDMUJGLFVBQUFBLEtBQUssR0FBRzRCLFNBQVMsQ0FBQzFCLElBQWxCO0FBQ0E7O0FBRUQsWUFBSUYsS0FBSixFQUFXO0FBQ1Y7QUFDQyxVQUFBLE9BQUksQ0FBQ2xSLE9BQUwsQ0FBYW1SLGNBQWIsR0FBOEJ1QixXQUEvQixDQUFtRHhCLEtBQW5EO0FBQ0E7QUFDRCxPQXpCTSxDQUFQO0FBMEJBLEs7O1dBRUQrQixZLEdBQUEsd0JBQWU7QUFDZCxhQUFPLEtBQUt2UyxTQUFaO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0M2UixjLEdBQUEsMEJBQWlCO0FBQ2hCLGFBQU8sS0FBS3JPLFlBQVo7QUFDQSxLOztXQUNEZ1AsWSxHQUFBLHdCQUFvQjtBQUNuQixhQUFPLElBQVA7QUFDQSxLOzs7SUE5MUJrQ0MsTzs7OztNQWkyQjlCQyxxQjs7Ozs7Ozs7O1lBQ0xDLGMsR0FBQSx3QkFBZUMsZUFBZixFQUF3RTtBQUN2RSxVQUFNQyxlQUFlLEdBQUcsSUFBSW5VLGNBQUosQ0FBbUJrVSxlQUFuQixDQUF4QjtBQUNBLGFBQU9DLGVBQWUsQ0FBQzNTLFdBQXZCO0FBQ0EsSzs7O0lBSmtDNFMsYzs7U0FPckJKLHFCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgQXBwU3RhcnR1cEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9BcHBTdGFydHVwSGVscGVyXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXZlbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBFdmVudFByb3ZpZGVyIGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFByb3ZpZGVyXCI7XG5pbXBvcnQgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YVV0aWxzIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFVdGlsc1wiO1xuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG50eXBlIFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3MgPSB7fTtcbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJvdXRpbmdTZXJ2aWNlRXZlbnRpbmdcIilcbmNsYXNzIFJvdXRpbmdTZXJ2aWNlRXZlbnRpbmcgZXh0ZW5kcyBFdmVudFByb3ZpZGVyIHtcblx0QGV2ZW50KClcblx0cm91dGVNYXRjaGVkITogRnVuY3Rpb247XG5cdEBldmVudCgpXG5cdGFmdGVyUm91dGVNYXRjaGVkITogRnVuY3Rpb247XG59XG5cbmV4cG9ydCB0eXBlIFNlbWFudGljTWFwcGluZyA9IHtcblx0c2VtYW50aWNQYXRoOiBzdHJpbmc7XG5cdHRlY2huaWNhbFBhdGg6IHN0cmluZztcbn07XG5leHBvcnQgY2xhc3MgUm91dGluZ1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0b0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0b01vZGVsITogT0RhdGFNb2RlbDtcblx0b01ldGFNb2RlbCE6IE9EYXRhTWV0YU1vZGVsO1xuXHRvUm91dGVyITogUm91dGVyO1xuXHRvUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0ZXZlbnRQcm92aWRlciE6IEV2ZW50UHJvdmlkZXI7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRvdXRib3VuZHM6IGFueTtcblx0X21UYXJnZXRzOiBhbnk7XG5cdF9tUm91dGVzOiBhbnk7XG5cdG9MYXN0U2VtYW50aWNNYXBwaW5nPzogU2VtYW50aWNNYXBwaW5nO1xuXHRiRXhpdE9uTmF2aWdhdGVCYWNrVG9Sb290PzogYm9vbGVhbjtcblx0c0N1cnJlbnRSb3V0ZU5hbWU/OiBzdHJpbmc7XG5cdHNDdXJyZW50Um91dGVQYXR0ZXJuPzogc3RyaW5nO1xuXHRhQ3VycmVudFZpZXdzPzogYW55W107XG5cdG5hdmlnYXRpb25JbmZvUXVldWU6IGFueVtdID0gW107XG5cdHNDb250ZXh0UGF0aCE6IHN0cmluZztcblx0X2ZuT25Sb3V0ZU1hdGNoZWQhOiBGdW5jdGlvbjtcblx0aW5pdCgpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGlmIChvQ29udGV4dC5zY29wZVR5cGUgPT09IFwiY29tcG9uZW50XCIpIHtcblx0XHRcdHRoaXMub0FwcENvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdFx0dGhpcy5vTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdFx0dGhpcy5vTWV0YU1vZGVsID0gdGhpcy5vTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eSA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0dGhpcy5ldmVudFByb3ZpZGVyID0gbmV3IChSb3V0aW5nU2VydmljZUV2ZW50aW5nIGFzIGFueSkoKTtcblxuXHRcdFx0Y29uc3Qgb1JvdXRpbmdDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmdcIik7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3Jvb3RWaWV3XCIpO1xuXHRcdFx0dGhpcy5fcGFyc2VSb3V0aW5nQ29uZmlndXJhdGlvbihvUm91dGluZ0NvbmZpZywgb1Jvb3RWaWV3Q29uZmlnKTtcblxuXHRcdFx0Y29uc3Qgb0FwcENvbmZpZyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC5hcHBcIik7XG5cdFx0XHR0aGlzLm91dGJvdW5kcyA9IG9BcHBDb25maWcgJiYgb0FwcENvbmZpZy5jcm9zc05hdmlnYXRpb24gJiYgb0FwcENvbmZpZy5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cblx0YmVmb3JlRXhpdCgpIHtcblx0XHR0aGlzLm9Sb3V0ZXIuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuT25Sb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwge30pO1xuXHR9XG5cdGV4aXQoKSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBhIG1hbmlmZXN0IHJvdXRpbmcgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgdXNhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUm91dGluZ0NvbmZpZyBUaGUgcm91dGluZyBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUm9vdFZpZXdDb25maWcgVGhlIHJvb3QgdmlldyBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcGFyc2VSb3V0aW5nQ29uZmlndXJhdGlvbihvUm91dGluZ0NvbmZpZzogYW55LCBvUm9vdFZpZXdDb25maWc6IGFueSkge1xuXHRcdGNvbnN0IGlzRkNMID0gb1Jvb3RWaWV3Q29uZmlnICYmIG9Sb290Vmlld0NvbmZpZy52aWV3TmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIudmlldy5GY2xcIjtcblxuXHRcdC8vIEluZm9ybWF0aW9uIG9mIHRhcmdldHNcblx0XHR0aGlzLl9tVGFyZ2V0cyA9IHt9O1xuXHRcdE9iamVjdC5rZXlzKG9Sb3V0aW5nQ29uZmlnLnRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXSA9IE9iamVjdC5hc3NpZ24oeyB0YXJnZXROYW1lOiBzVGFyZ2V0TmFtZSB9LCBvUm91dGluZ0NvbmZpZy50YXJnZXRzW3NUYXJnZXROYW1lXSk7XG5cblx0XHRcdC8vIFZpZXcgbGV2ZWwgZm9yIEZDTCBjYXNlcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnZpZXdMZXZlbCA9IHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiwgMCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbmZvcm1hdGlvbiBvZiByb3V0ZXNcblx0XHR0aGlzLl9tUm91dGVzID0ge307XG5cdFx0Zm9yIChjb25zdCBzUm91dGVLZXkgaW4gb1JvdXRpbmdDb25maWcucm91dGVzKSB7XG5cdFx0XHRjb25zdCBvUm91dGVNYW5pZmVzdEluZm8gPSBvUm91dGluZ0NvbmZpZy5yb3V0ZXNbc1JvdXRlS2V5XSxcblx0XHRcdFx0YVJvdXRlVGFyZ2V0cyA9IEFycmF5LmlzQXJyYXkob1JvdXRlTWFuaWZlc3RJbmZvLnRhcmdldCkgPyBvUm91dGVNYW5pZmVzdEluZm8udGFyZ2V0IDogW29Sb3V0ZU1hbmlmZXN0SW5mby50YXJnZXRdLFxuXHRcdFx0XHRzUm91dGVOYW1lID0gQXJyYXkuaXNBcnJheShvUm91dGluZ0NvbmZpZy5yb3V0ZXMpID8gb1JvdXRlTWFuaWZlc3RJbmZvLm5hbWUgOiBzUm91dGVLZXksXG5cdFx0XHRcdHNSb3V0ZVBhdHRlcm4gPSBvUm91dGVNYW5pZmVzdEluZm8ucGF0dGVybjtcblxuXHRcdFx0Ly8gQ2hlY2sgcm91dGUgcGF0dGVybjogYWxsIHBhdHRlcm5zIG5lZWQgdG8gZW5kIHdpdGggJzo/cXVlcnk6JywgdGhhdCB3ZSB1c2UgZm9yIHBhcmFtZXRlcnNcblx0XHRcdGlmIChzUm91dGVQYXR0ZXJuLmxlbmd0aCA8IDggfHwgc1JvdXRlUGF0dGVybi5pbmRleE9mKFwiOj9xdWVyeTpcIikgIT09IHNSb3V0ZVBhdHRlcm4ubGVuZ3RoIC0gOCkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlBhdHRlcm4gZm9yIHJvdXRlIFwiICsgc1JvdXRlTmFtZSArIFwiIGRvZXNuJ3QgZW5kIHdpdGggJzo/cXVlcnk6JyA6IFwiICsgc1JvdXRlUGF0dGVybik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpUm91dGVMZXZlbCA9IHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNSb3V0ZVBhdHRlcm4sIDApO1xuXHRcdFx0dGhpcy5fbVJvdXRlc1tzUm91dGVOYW1lXSA9IHtcblx0XHRcdFx0bmFtZTogc1JvdXRlTmFtZSxcblx0XHRcdFx0cGF0dGVybjogc1JvdXRlUGF0dGVybixcblx0XHRcdFx0dGFyZ2V0czogYVJvdXRlVGFyZ2V0cyxcblx0XHRcdFx0cm91dGVMZXZlbDogaVJvdXRlTGV2ZWxcblx0XHRcdH07XG5cblx0XHRcdC8vIEFkZCB0aGUgcGFyZW50IHRhcmdldHMgaW4gdGhlIGxpc3Qgb2YgdGFyZ2V0cyBmb3IgdGhlIHJvdXRlXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFSb3V0ZVRhcmdldHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmVudFRhcmdldE5hbWUgPSB0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzW2ldXS5wYXJlbnQ7XG5cdFx0XHRcdGlmIChzUGFyZW50VGFyZ2V0TmFtZSkge1xuXHRcdFx0XHRcdGFSb3V0ZVRhcmdldHMucHVzaChzUGFyZW50VGFyZ2V0TmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0ZDTCkge1xuXHRcdFx0XHQvLyBWaWV3IGxldmVsIGZvciBub24tRkNMIGNhc2VzIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcm91dGUgcGF0dGVyblxuXHRcdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0udmlld0xldmVsID09PSB1bmRlZmluZWQgfHwgdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0udmlld0xldmVsIDwgaVJvdXRlTGV2ZWwpIHtcblx0XHRcdFx0XHQvLyBUaGVyZSBhcmUgY2FzZXMgd2hlbiBkaWZmZXJlbnQgcm91dGVzIHBvaW50IHRvIHRoZSBzYW1lIHRhcmdldC4gV2UgdGFrZSB0aGVcblx0XHRcdFx0XHQvLyBsYXJnZXN0IHZpZXdMZXZlbCBpbiB0aGF0IGNhc2UuXG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0udmlld0xldmVsID0gaVJvdXRlTGV2ZWw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGQ0wgbGV2ZWwgZm9yIG5vbi1GQ0wgY2FzZXMgaXMgZXF1YWwgdG8gLTFcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0uRkNMTGV2ZWwgPSAtMTtcblx0XHRcdH0gZWxzZSBpZiAoYVJvdXRlVGFyZ2V0cy5sZW5ndGggPT09IDEgJiYgdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0uY29udHJvbEFnZ3JlZ2F0aW9uICE9PSBcImJlZ2luQ29sdW1uUGFnZXNcIikge1xuXHRcdFx0XHQvLyBXZSdyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzIG9ubHkgMSB0YXJnZXQgZm9yIHRoZSByb3V0ZSwgYW5kIGl0J3Mgbm90IGluIHRoZSBmaXJzdCBjb2x1bW5cblx0XHRcdFx0Ly8gLS0+IHRoaXMgaXMgYSBmdWxsc2NyZWVuIGNvbHVtbiBhZnRlciBhbGwgY29sdW1ucyBpbiB0aGUgRkNMIGhhdmUgYmVlbiB1c2VkXG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLkZDTExldmVsID0gMztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyIEZDTCBjYXNlc1xuXHRcdFx0XHRhUm91dGVUYXJnZXRzLmZvckVhY2goKHNUYXJnZXROYW1lOiBhbnkpID0+IHtcblx0XHRcdFx0XHRzd2l0Y2ggKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJiZWdpbkNvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlIFwibWlkQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsID0gMTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcm9wYWdhdGUgdmlld0xldmVsLCBjb250ZXh0UGF0dGVybiwgRkNMTGV2ZWwgYW5kIGNvbnRyb2xBZ2dyZWdhdGlvbiB0byBwYXJlbnQgdGFyZ2V0c1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHR3aGlsZSAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnBhcmVudCkge1xuXHRcdFx0XHRjb25zdCBzUGFyZW50VGFyZ2V0TmFtZSA9IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5wYXJlbnQ7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS52aWV3TGV2ZWwgPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS52aWV3TGV2ZWwgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnZpZXdMZXZlbDtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4gfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuO1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5GQ0xMZXZlbCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWw7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb24gPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb24gfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRyb2xBZ2dyZWdhdGlvbjtcblx0XHRcdFx0c1RhcmdldE5hbWUgPSBzUGFyZW50VGFyZ2V0TmFtZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIERldGVybWluZSB0aGUgcm9vdCBlbnRpdHkgZm9yIHRoZSBhcHBcblx0XHRjb25zdCBhTGV2ZWwwUm91dGVOYW1lcyA9IFtdO1xuXHRcdGNvbnN0IGFMZXZlbDFSb3V0ZU5hbWVzID0gW107XG5cdFx0bGV0IHNEZWZhdWx0Um91dGVOYW1lO1xuXG5cdFx0Zm9yIChjb25zdCBzTmFtZSBpbiB0aGlzLl9tUm91dGVzKSB7XG5cdFx0XHRjb25zdCBpTGV2ZWwgPSB0aGlzLl9tUm91dGVzW3NOYW1lXS5yb3V0ZUxldmVsO1xuXHRcdFx0aWYgKGlMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRhTGV2ZWwwUm91dGVOYW1lcy5wdXNoKHNOYW1lKTtcblx0XHRcdH0gZWxzZSBpZiAoaUxldmVsID09PSAxKSB7XG5cdFx0XHRcdGFMZXZlbDFSb3V0ZU5hbWVzLnB1c2goc05hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhTGV2ZWwwUm91dGVOYW1lcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHNEZWZhdWx0Um91dGVOYW1lID0gYUxldmVsMFJvdXRlTmFtZXNbMF07XG5cdFx0fSBlbHNlIGlmIChhTGV2ZWwxUm91dGVOYW1lcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHNEZWZhdWx0Um91dGVOYW1lID0gYUxldmVsMVJvdXRlTmFtZXNbMF07XG5cdFx0fVxuXG5cdFx0aWYgKHNEZWZhdWx0Um91dGVOYW1lKSB7XG5cdFx0XHRjb25zdCBzRGVmYXVsdFRhcmdldE5hbWUgPSB0aGlzLl9tUm91dGVzW3NEZWZhdWx0Um91dGVOYW1lXS50YXJnZXRzLnNsaWNlKC0xKVswXTtcblx0XHRcdHRoaXMuc0NvbnRleHRQYXRoID0gXCJcIjtcblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzRGVmYXVsdFRhcmdldE5hbWVdLm9wdGlvbnMgJiYgdGhpcy5fbVRhcmdldHNbc0RlZmF1bHRUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzKSB7XG5cdFx0XHRcdGNvbnN0IG9TZXR0aW5ncyA9IHRoaXMuX21UYXJnZXRzW3NEZWZhdWx0VGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncztcblx0XHRcdFx0dGhpcy5zQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY29udGV4dFBhdGggfHwgXCIvXCIgKyBvU2V0dGluZ3MuZW50aXR5U2V0O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0aGlzLnNDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcblx0XHRcdFx0XHRcIkNhbm5vdCBkZXRlcm1pbmUgZGVmYXVsdCBjb250ZXh0UGF0aDogY29udGV4dFBhdGggb3IgZW50aXR5U2V0IG1pc3NpbmcgaW4gZGVmYXVsdCB0YXJnZXQ6IFwiICsgc0RlZmF1bHRUYXJnZXROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy53YXJuaW5nKFwiQ2Fubm90IGRldGVybWluZSBkZWZhdWx0IGNvbnRleHRQYXRoOiBubyBkZWZhdWx0IHJvdXRlIGZvdW5kLlwiKTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVzdGFibGlzaCB0aGUgY29ycmVjdCBwYXRoIHRvIHRoZSBkaWZmZXJlbnQgcGFnZXMsIGluY2x1ZGluZyB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0T2JqZWN0LmtleXModGhpcy5fbVRhcmdldHMpXG5cdFx0XHQubWFwKChzVGFyZ2V0S2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX21UYXJnZXRzW3NUYXJnZXRLZXldO1xuXHRcdFx0fSlcblx0XHRcdC5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYS52aWV3TGV2ZWwgPCBiLnZpZXdMZXZlbCA/IC0xIDogMTtcblx0XHRcdH0pXG5cdFx0XHQuZm9yRWFjaCgodGFyZ2V0OiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gQWZ0ZXIgc29ydGluZyB0aGUgdGFyZ2V0cyBwZXIgbGV2ZWwgd2UgY2FuIHRoZW4gZ28gdGhyb3VnaCB0aGVpciBuYXZpZ2F0aW9uIG9iamVjdCBhbmQgdXBkYXRlIHRoZSBwYXRocyBhY2NvcmRpbmdseS5cblx0XHRcdFx0aWYgKHRhcmdldC5vcHRpb25zKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSB0YXJnZXQub3B0aW9ucy5zZXR0aW5ncztcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBzZXR0aW5ncy5jb250ZXh0UGF0aCB8fCAoc2V0dGluZ3MuZW50aXR5U2V0ID8gXCIvXCIgKyBzZXR0aW5ncy5lbnRpdHlTZXQgOiBcIlwiKTtcblx0XHRcdFx0XHRpZiAoIXNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCAmJiBzQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0XHRcdHNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCA9IHNDb250ZXh0UGF0aCArIFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRPYmplY3Qua2V5cyhzZXR0aW5ncy5uYXZpZ2F0aW9uIHx8IHt9KS5mb3JFYWNoKChzTmF2TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBDaGVjayBpZiBpdCdzIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0Um91dGUgPSB0aGlzLl9tUm91dGVzW3NldHRpbmdzLm5hdmlnYXRpb25bc05hdk5hbWVdLmRldGFpbC5yb3V0ZV07XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0Um91dGUgJiYgdGFyZ2V0Um91dGUudGFyZ2V0cykge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRSb3V0ZS50YXJnZXRzLmZvckVhY2goKHNUYXJnZXROYW1lOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucyAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCF0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGhcblx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0YXJnZXQudmlld0xldmVsID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KHNOYXZOYW1lLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiKSArIHNOYXZOYW1lICsgXCIvXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCArIHNOYXZOYW1lICsgXCIvXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyBhIHZpZXcgbGV2ZWwgZnJvbSBhIHBhdHRlcm4gYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBzZWdtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQYXR0ZXJuIFRoZSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3TGV2ZWwgVGhlIGN1cnJlbnQgbGV2ZWwgb2Ygdmlld1xuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGV2ZWxcblx0ICovXG5cdF9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUGF0dGVybjogc3RyaW5nLCB2aWV3TGV2ZWw6IG51bWJlcik6IG51bWJlciB7XG5cdFx0c1BhdHRlcm4gPSBzUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiL1teL10qJFwiKTtcblx0XHRpZiAoc1BhdHRlcm4gJiYgc1BhdHRlcm5bMF0gIT09IFwiL1wiICYmIHNQYXR0ZXJuWzBdICE9PSBcIj9cIikge1xuXHRcdFx0c1BhdHRlcm4gPSBcIi9cIiArIHNQYXR0ZXJuO1xuXHRcdH1cblx0XHRpZiAoc1BhdHRlcm4ubGVuZ3RoKSB7XG5cdFx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuXHRcdFx0aWYgKHRoaXMub1JvdXRlci5tYXRjaChzUGF0dGVybikgfHwgc1BhdHRlcm4gPT09IFwiXCIpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNQYXR0ZXJuLCArK3ZpZXdMZXZlbCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm4sIHZpZXdMZXZlbCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB2aWV3TGV2ZWw7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvdXRlSW5mb3JtYXRpb24oc1JvdXRlTmFtZTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX21Sb3V0ZXNbc1JvdXRlTmFtZV07XG5cdH1cblxuXHRfZ2V0VGFyZ2V0SW5mb3JtYXRpb24oc1RhcmdldE5hbWU6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV07XG5cdH1cblxuXHRfZ2V0Q29tcG9uZW50SWQoc093bmVySWQ6IGFueSwgc0NvbXBvbmVudElkOiBhbnkpIHtcblx0XHRpZiAoc0NvbXBvbmVudElkLmluZGV4T2Yoc093bmVySWQgKyBcIi0tLVwiKSA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHNDb21wb25lbnRJZC5zdWJzdHIoc093bmVySWQubGVuZ3RoICsgMyk7XG5cdFx0fVxuXHRcdHJldHVybiBzQ29tcG9uZW50SWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRhcmdldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29tcG9uZW50SW5zdGFuY2UgSW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldFxuXHQgKi9cblx0Z2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudEluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0Q29tcG9uZW50SWQgPSB0aGlzLl9nZXRDb21wb25lbnRJZChvQ29tcG9uZW50SW5zdGFuY2UuX3NPd25lcklkLCBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0SWQoKSk7XG5cdFx0bGV0IHNDb3JyZWN0VGFyZ2V0TmFtZSA9IG51bGw7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fbVRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uaWQgPT09IHNUYXJnZXRDb21wb25lbnRJZCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0udmlld0lkID09PSBzVGFyZ2V0Q29tcG9uZW50SWQpIHtcblx0XHRcdFx0c0NvcnJlY3RUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFRhcmdldEluZm9ybWF0aW9uKHNDb3JyZWN0VGFyZ2V0TmFtZSk7XG5cdH1cblxuXHRnZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmc7XG5cdH1cblxuXHRzZXRMYXN0U2VtYW50aWNNYXBwaW5nKG9NYXBwaW5nPzogU2VtYW50aWNNYXBwaW5nKSB7XG5cdFx0dGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyA9IG9NYXBwaW5nO1xuXHR9XG5cblx0bmF2aWdhdGVUbyhvQ29udGV4dDogYW55LCBzUm91dGVOYW1lOiBhbnksIG1QYXJhbWV0ZXJNYXBwaW5nOiBhbnksIGJQcmVzZXJ2ZUhpc3Rvcnk6IGFueSkge1xuXHRcdGxldCBzVGFyZ2V0VVJMUHJvbWlzZSwgYklzU3RpY2t5TW9kZTogYm9vbGVhbjtcblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKSAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSB7XG5cdFx0XHRiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0XHRpZiAoIW1QYXJhbWV0ZXJNYXBwaW5nKSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgbWFwcGluZyBkZWZpbmUgdGhpcyBtZWFuIHdlIHJlbHkgZW50aXJlbHkgb24gdGhlIGJpbmRpbmcgY29udGV4dCBwYXRoXG5cdFx0XHRzVGFyZ2V0VVJMUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c1RhcmdldFVSTFByb21pc2UgPSB0aGlzLnByZXBhcmVQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJNYXBwaW5nLCBzUm91dGVOYW1lLCBvQ29udGV4dCkudGhlbigobVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHNUYXJnZXRVUkxQcm9taXNlLnRoZW4oKHNUYXJnZXRVUkw6IGFueSkgPT4ge1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkubmF2VG9IYXNoKHNUYXJnZXRVUkwsIGJQcmVzZXJ2ZUhpc3RvcnksIGZhbHNlLCBmYWxzZSwgIWJJc1N0aWNreU1vZGUpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXR1cm4gYSBtYXAgb2Ygcm91dGluZyB0YXJnZXQgcGFyYW1ldGVycyB3aGVyZSB0aGUgYmluZGluZyBzeW50YXggaXMgcmVzb2x2ZWQgdG8gdGhlIGN1cnJlbnQgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIG1hcCBpbiB0aGUgZm9ybWF0IFtrOiBzdHJpbmddIDogQ29tcGxleEJpbmRpbmdTeW50YXhcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRSb3V0ZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIHJvdXRpbmcgdGFyZ2V0IHBhcmFtZXRlcnNcblx0ICovXG5cdHByZXBhcmVQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzOiBhbnksIHNUYXJnZXRSb3V0ZTogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGxldCBvUGFyYW1ldGVyc1Byb21pc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdGNvbnN0IGFDb250ZXh0UGF0aFBhcnRzID0gc0NvbnRleHRQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IGFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzID0gT2JqZWN0LmtleXMobVBhcmFtZXRlcnMpLm1hcCgoc1BhcmFtZXRlcktleTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbiA9IG1QYXJhbWV0ZXJzW3NQYXJhbWV0ZXJLZXldO1xuXHRcdFx0XHQvLyBXZSBhc3N1bWUgdGhlIGRlZmluZWQgcGFyYW1ldGVycyB3aWxsIGJlIGNvbXBhdGlibGUgd2l0aCBhIGJpbmRpbmcgZXhwcmVzc2lvblxuXHRcdFx0XHRjb25zdCBvUGFyc2VkRXhwcmVzc2lvbiA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzUGFyYW1ldGVyTWFwcGluZ0V4cHJlc3Npb24pO1xuXHRcdFx0XHRjb25zdCBhUGFydHMgPSBvUGFyc2VkRXhwcmVzc2lvbi5wYXJ0cyB8fCBbb1BhcnNlZEV4cHJlc3Npb25dO1xuXHRcdFx0XHRjb25zdCBhUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcyA9IGFQYXJ0cy5tYXAoZnVuY3Rpb24gKG9QYXRoUGFydDogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgYVJlbGF0aXZlUGFydHMgPSBvUGF0aFBhcnQucGF0aC5zcGxpdChcIi4uL1wiKTtcblx0XHRcdFx0XHQvLyBXZSBnbyB1cCB0aGUgY3VycmVudCBjb250ZXh0IHBhdGggYXMgbWFueSB0aW1lcyBhcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRjb25zdCBhTG9jYWxQYXJ0cyA9IGFDb250ZXh0UGF0aFBhcnRzLnNsaWNlKDAsIGFDb250ZXh0UGF0aFBhcnRzLmxlbmd0aCAtIGFSZWxhdGl2ZVBhcnRzLmxlbmd0aCArIDEpO1xuXHRcdFx0XHRcdGFMb2NhbFBhcnRzLnB1c2goYVJlbGF0aXZlUGFydHNbYVJlbGF0aXZlUGFydHMubGVuZ3RoIC0gMV0pO1xuXG5cdFx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGFMb2NhbFBhcnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhQ29udGV4dCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQoc1Byb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShzUHJvcGVydHlQYXRoKS50aGVuKGZ1bmN0aW9uIChvVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5SW5mbyA9IG9NZXRhQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNFZG1UeXBlID0gb1Byb3BlcnR5SW5mby4kVHlwZTtcblx0XHRcdFx0XHRcdHJldHVybiBPRGF0YVV0aWxzLmZvcm1hdExpdGVyYWwob1ZhbHVlLCBzRWRtVHlwZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcykudGhlbigoYVJlc29sdmVkUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvUGFyc2VkRXhwcmVzc2lvbi5mb3JtYXR0ZXJcblx0XHRcdFx0XHRcdD8gb1BhcnNlZEV4cHJlc3Npb24uZm9ybWF0dGVyLmFwcGx5KHRoaXMsIGFSZXNvbHZlZFBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IGFSZXNvbHZlZFBhcmFtZXRlcnMuam9pbihcIlwiKTtcblx0XHRcdFx0XHRyZXR1cm4geyBrZXk6IHNQYXJhbWV0ZXJLZXksIHZhbHVlOiB2YWx1ZSB9O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvUGFyYW1ldGVyc1Byb21pc2UgPSBQcm9taXNlLmFsbChhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJQcm9taXNlcykudGhlbihmdW5jdGlvbiAoXG5cdFx0XHRcdGFBbGxSZXNvbHZlZFBhcmFtZXRlcnM6IHsga2V5OiBhbnk7IHZhbHVlOiBhbnkgfVtdXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlcnM6IGFueSA9IHt9O1xuXHRcdFx0XHRhQWxsUmVzb2x2ZWRQYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKG9SZXNvbHZlZFBhcmFtZXRlcjogeyBrZXk6IGFueTsgdmFsdWU6IGFueSB9KSB7XG5cdFx0XHRcdFx0b1BhcmFtZXRlcnNbb1Jlc29sdmVkUGFyYW1ldGVyLmtleV0gPSBvUmVzb2x2ZWRQYXJhbWV0ZXIudmFsdWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb1BhcmFtZXRlcnM7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkNvdWxkIG5vdCBwYXJzZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIG5hdmlnYXRpb24gdG8gcm91dGUgXCIgKyBzVGFyZ2V0Um91dGUpO1xuXHRcdFx0b1BhcmFtZXRlcnNQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdHJldHVybiBvUGFyYW1ldGVyc1Byb21pc2U7XG5cdH1cblxuXHRfZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgbVBhcmFtZXRlcnMpO1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBtUGFyYW1ldGVycyk7XG5cblx0XHRFZGl0U3RhdGUuY2xlYW5Qcm9jZXNzZWRFZGl0U3RhdGUoKTsgLy8gUmVzZXQgVUkgc3RhdGUgd2hlbiBhbGwgYmluZGluZ3MgaGF2ZSBiZWVuIHJlZnJlc2hlZFxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0ge29iamVjdH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgbWFwIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZV0gTmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgd2l0aG91dCBjaGFuZ2luZyB0aGUgVVJMXG5cdCAqIEBwYXJhbSB7UHJvbWlzZX0gW21QYXJhbWV0ZXJzLmFzeW5jQ29udGV4dF0gVGhlIGNvbnRleHQgaXMgY3JlYXRlZCBhc3luYywgbmF2aWdhdGUgdG8gKC4uLikgYW5kXG5cdCAqICAgICAgICAgICAgICAgICAgICB3YWl0IGZvciBQcm9taXNlIHRvIGJlIHJlc29sdmVkIGFuZCB0aGVuIG5hdmlnYXRlIGludG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkRlZmVycmVkQ29udGV4dF0gVGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBkZWZlcnJlZCBhdCB0aGUgdGFyZ2V0IHBhZ2Vcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuZWRpdGFibGVdIFRoZSB0YXJnZXQgcGFnZSBzaGFsbCBiZSBpbW1lZGlhdGVseSBpbiB0aGUgZWRpdCBtb2RlIHRvIGF2b2lkIGZsaWNrZXJpbmdcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbF0gVGhlIGJQZXJzaXN0T1BTY3JvbGwgd2lsbCBiZSB1c2VkIGZvciBzY3JvbGxpbmcgdG8gZmlyc3QgdGFiXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWxdIGArMWAgaWYgd2UgYWRkIGEgY29sdW1uIGluIEZDTCwgYC0xYCB0byByZW1vdmUgYSBjb2x1bW4sIDAgdG8gc3RheSBvbiB0aGUgc2FtZSBjb2x1bW5cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMubm9QcmVzZXJ2YXRpb25DYWNoZV0gRG8gbmF2aWdhdGlvbiB3aXRob3V0IHRha2luZyBpbnRvIGFjY291bnQgdGhlIHByZXNlcnZlZCBjYWNoZSBtZWNoYW5pc21cblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlJlY3JlYXRlQ29udGV4dF0gRm9yY2UgcmUtY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lIHBhc3NlZCBhcyBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXNdIEZvcmNlcyBmb2N1cyBzZWxlY3Rpb24gYWZ0ZXIgbmF2aWdhdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29WaWV3RGF0YV0gVmlldyBkYXRhXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0N1cnJlbnRUYXJnZXRJbmZvXSBUaGUgdGFyZ2V0IGluZm9ybWF0aW9uIGZyb20gd2hpY2ggdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdG5hdmlnYXRlVG9Db250ZXh0KFxuXHRcdG9Db250ZXh0OiBhbnksXG5cdFx0bVBhcmFtZXRlcnM6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZT86IGJvb2xlYW47XG5cdFx0XHRcdFx0YXN5bmNDb250ZXh0PzogUHJvbWlzZTxhbnk+O1xuXHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGVkaXRhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0XHR0cmFuc2llbnQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsPzogbnVtYmVyO1xuXHRcdFx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJSZWNyZWF0ZUNvbnRleHQ/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbjtcblx0XHRcdFx0XHR0YXJnZXRQYXRoPzogc3RyaW5nO1xuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcj86IGJvb2xlYW47XG5cdFx0XHRcdFx0YkRyYWZ0TmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5PzogYm9vbGVhbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQsXG5cdFx0b1ZpZXdEYXRhOiBhbnkgfCB1bmRlZmluZWQsXG5cdFx0b0N1cnJlbnRUYXJnZXRJbmZvOiBhbnkgfCB1bmRlZmluZWRcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0bGV0IHNUYXJnZXRSb3V0ZTogc3RyaW5nID0gXCJcIixcblx0XHRcdG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlLFxuXHRcdFx0YklzU3RpY2t5TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkgJiYgb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwpIHtcblx0XHRcdGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0fVxuXHRcdC8vIE1hbmFnZSBwYXJhbWV0ZXIgbWFwcGluZ1xuXHRcdGlmIChtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy50YXJnZXRQYXRoICYmIG9WaWV3RGF0YSAmJiBvVmlld0RhdGEubmF2aWdhdGlvbikge1xuXHRcdFx0Y29uc3Qgb1JvdXRlRGV0YWlsID0gb1ZpZXdEYXRhLm5hdmlnYXRpb25bbVBhcmFtZXRlcnMudGFyZ2V0UGF0aF0uZGV0YWlsO1xuXHRcdFx0c1RhcmdldFJvdXRlID0gb1JvdXRlRGV0YWlsLnJvdXRlO1xuXG5cdFx0XHRpZiAob1JvdXRlRGV0YWlsLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0b1JvdXRlUGFyYW1ldGVyc1Byb21pc2UgPSB0aGlzLnByZXBhcmVQYXJhbWV0ZXJzKG9Sb3V0ZURldGFpbC5wYXJhbWV0ZXJzLCBzVGFyZ2V0Um91dGUsIG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc1RhcmdldFBhdGggPSB0aGlzLl9nZXRQYXRoRnJvbUNvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBJZiB0aGUgcGF0aCBpcyBlbXB0eSwgd2UncmUgc3VwcG9zZWQgdG8gbmF2aWdhdGUgdG8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGFwcFxuXHRcdC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gZXhpdCBmcm9tIHRoZSBhcHAgaW5zdGVhZFxuXHRcdGlmIChzVGFyZ2V0UGF0aC5sZW5ndGggPT09IDAgJiYgdGhpcy5iRXhpdE9uTmF2aWdhdGVCYWNrVG9Sb290KSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgY29udGV4dCBpcyBkZWZlcnJlZCBvciBhc3luYywgd2UgYWRkICguLi4pIHRvIHRoZSBwYXRoXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy5hc3luY0NvbnRleHQgfHwgbVBhcmFtZXRlcnM/LmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdHNUYXJnZXRQYXRoICs9IFwiKC4uLilcIjtcblx0XHR9XG5cblx0XHQvLyBBZGQgbGF5b3V0IHBhcmFtZXRlciBpZiBuZWVkZWRcblx0XHRjb25zdCBzTGF5b3V0ID0gdGhpcy5fY2FsY3VsYXRlTGF5b3V0KHNUYXJnZXRQYXRoLCBtUGFyYW1ldGVycyk7XG5cdFx0aWYgKHNMYXlvdXQpIHtcblx0XHRcdHNUYXJnZXRQYXRoICs9IFwiP2xheW91dD1cIiArIHNMYXlvdXQ7XG5cdFx0fVxuXG5cdFx0Ly8gTmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGZvciBsYXRlciB1c2FnZVxuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uSW5mbyA9IHtcblx0XHRcdG9Bc3luY0NvbnRleHQ6IG1QYXJhbWV0ZXJzPy5hc3luY0NvbnRleHQsXG5cdFx0XHRiRGVmZXJyZWRDb250ZXh0OiBtUGFyYW1ldGVycz8uYkRlZmVycmVkQ29udGV4dCxcblx0XHRcdGJUYXJnZXRFZGl0YWJsZTogbVBhcmFtZXRlcnM/LmVkaXRhYmxlLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogbVBhcmFtZXRlcnM/LmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHR1c2VDb250ZXh0OiBtUGFyYW1ldGVycz8udXBkYXRlRkNMTGV2ZWwgPT09IC0xIHx8IG1QYXJhbWV0ZXJzPy5iUmVjcmVhdGVDb250ZXh0ID8gdW5kZWZpbmVkIDogb0NvbnRleHQsXG5cdFx0XHRiRHJhZnROYXZpZ2F0aW9uOiBtUGFyYW1ldGVycz8uYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdGJTaG93UGxhY2Vob2xkZXI6IG1QYXJhbWV0ZXJzPy5zaG93UGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCA/IG1QYXJhbWV0ZXJzPy5zaG93UGxhY2Vob2xkZXIgOiB0cnVlLFxuXHRcdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBtUGFyYW1ldGVycz8uYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0fTtcblxuXHRcdGlmIChtUGFyYW1ldGVycz8uY2hlY2tOb0hhc2hDaGFuZ2UpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSBuZXcgaGFzaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHRcdGNvbnN0IHNDdXJyZW50SGFzaE5vQXBwU3RhdGUgPSB0aGlzLm9Sb3V0ZXJQcm94eS5nZXRIYXNoKCkucmVwbGFjZSgvWyY/XXsxfXNhcC1pYXBwLXN0YXRlPVtBLVowLTldKy8sIFwiXCIpO1xuXHRcdFx0aWYgKHNUYXJnZXRQYXRoID09PSBzQ3VycmVudEhhc2hOb0FwcFN0YXRlKSB7XG5cdFx0XHRcdC8vIFRoZSBoYXNoIGRvZXNuJ3QgY2hhbmdlLCBidXQgd2UgZmlyZSB0aGUgcm91dGVNYXRjaCBldmVudCB0byB0cmlnZ2VyIHBhZ2UgcmVmcmVzaCAvIGJpbmRpbmdcblx0XHRcdFx0Y29uc3QgbUV2ZW50UGFyYW1ldGVyczogYW55ID0gdGhpcy5vUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaCh0aGlzLm9Sb3V0ZXJQcm94eS5nZXRIYXNoKCkpO1xuXHRcdFx0XHRpZiAobUV2ZW50UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMubmF2aWdhdGlvbkluZm8gPSBvTmF2aWdhdGlvbkluZm87XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy5yb3V0ZUluZm9ybWF0aW9uID0gdGhpcy5fZ2V0Um91dGVJbmZvcm1hdGlvbih0aGlzLnNDdXJyZW50Um91dGVOYW1lKTtcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLnJvdXRlUGF0dGVybiA9IHRoaXMuc0N1cnJlbnRSb3V0ZVBhdHRlcm47XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy52aWV3cyA9IHRoaXMuYUN1cnJlbnRWaWV3cztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMub1JvdXRlclByb3h5LnNldEZvY3VzRm9yY2VkKCEhbVBhcmFtZXRlcnMuYkZvcmNlRm9jdXMpO1xuXG5cdFx0XHRcdHRoaXMuX2ZpcmVSb3V0ZU1hdGNoRXZlbnRzKG1FdmVudFBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy50cmFuc2llbnQgJiYgbVBhcmFtZXRlcnMuZWRpdGFibGUgPT0gdHJ1ZSAmJiBzVGFyZ2V0UGF0aC5pbmRleE9mKFwiKC4uLilcIikgPT09IC0xKSB7XG5cdFx0XHRpZiAoc1RhcmdldFBhdGguaW5kZXhPZihcIj9cIikgPiAtMSkge1xuXHRcdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiZpLWFjdGlvbj1jcmVhdGVcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYXJnZXRQYXRoICs9IFwiP2ktYWN0aW9uPWNyZWF0ZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsZWFyIHVuYm91bmQgbWVzc2FnZXMgdXBvbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1Bcblx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSBzdGFsZSBlcnJvciBtZXNzYWdlcyBmcm9tIExSIGFyZSBub3Qgc2hvd24gdG8gdGhlIHVzZXIgYWZ0ZXIgbmF2aWdhdGlvbiB0byBPUC5cblx0XHRpZiAob0N1cnJlbnRUYXJnZXRJbmZvICYmIG9DdXJyZW50VGFyZ2V0SW5mby5uYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRjb25zdCBvUm91dGVJbmZvID0gdGhpcy5vUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzVGFyZ2V0UGF0aCk7XG5cdFx0XHRpZiAob1JvdXRlSW5mbykge1xuXHRcdFx0XHRjb25zdCBvUm91dGUgPSB0aGlzLl9nZXRSb3V0ZUluZm9ybWF0aW9uKG9Sb3V0ZUluZm8ubmFtZSk7XG5cdFx0XHRcdGlmIChvUm91dGUgJiYgb1JvdXRlLnRhcmdldHMgJiYgb1JvdXRlLnRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IHNMYXN0VGFyZ2V0TmFtZSA9IG9Sb3V0ZS50YXJnZXRzW29Sb3V0ZS50YXJnZXRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSB0aGlzLl9nZXRUYXJnZXRJbmZvcm1hdGlvbihzTGFzdFRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0ICYmIG9UYXJnZXQubmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2VcIikge1xuXHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgcXVldWVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUucHVzaChvTmF2aWdhdGlvbkluZm8pO1xuXG5cdFx0aWYgKHNUYXJnZXRSb3V0ZSAmJiBvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlLnRoZW4oKG9Sb3V0ZVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUgPSBiSXNTdGlja3lNb2RlO1xuXHRcdFx0XHR0aGlzLm9Sb3V0ZXIubmF2VG8oc1RhcmdldFJvdXRlLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyUHJveHlcblx0XHRcdC5uYXZUb0hhc2goc1RhcmdldFBhdGgsIGZhbHNlLCBtUGFyYW1ldGVycz8ubm9QcmVzZXJ2YXRpb25DYWNoZSwgbVBhcmFtZXRlcnM/LmJGb3JjZUZvY3VzLCAhYklzU3RpY2t5TW9kZSlcblx0XHRcdC50aGVuKChiTmF2aWdhdGVkOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKCFiTmF2aWdhdGVkKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIG5hdmlnYXRpb24gZGlkIG5vdCBoYXBwZW4gLS0+IHJlbW92ZSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlIHF1ZXVlIGFzIHRoZXkgc2hvdWxkbid0IGJlIHVzZWRcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUucG9wKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGJOYXZpZ2F0ZWQ7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSByb3V0ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlJvdXRpbmcjbmF2aWdhdGVUb1JvdXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5Sb3V0aW5nXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb1JvdXRlUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9Sb3V0ZVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0VVJMID0gdGhpcy5vUm91dGVyLmdldFVSTChzVGFyZ2V0Um91dGVOYW1lLCBvUm91dGVQYXJhbWV0ZXJzKTtcblx0XHRyZXR1cm4gdGhpcy5vUm91dGVyUHJveHkubmF2VG9IYXNoKHNUYXJnZXRVUkwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICFvUm91dGVQYXJhbWV0ZXJzLmJJc1N0aWNreU1vZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgb3IgYGZhbHNlYCBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBpbXBhY3RlZCBvciBub3Rcblx0ICovXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cblx0XHQvLyBGaXJzdCwgY2hlY2sgd2l0aCB0aGUgdGVjaG5pY2FsIHBhdGguIFdlIGhhdmUgdG8gdHJ5IGl0LCBiZWNhdXNlIGZvciBsZXZlbCA+IDEsIHdlXG5cdFx0Ly8gdXNlcyB0ZWNobmljYWwga2V5cyBldmVuIGlmIFNlbWFudGljIGtleXMgYXJlIGVuYWJsZWRcblx0XHRpZiAodGhpcy5vUm91dGVyUHJveHkuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIGlmICgvXlteXFwoXFwpXStcXChbXlxcKFxcKV0rXFwpJC8udGVzdChzUGF0aCkpIHtcblx0XHRcdC8vIElmIHRoZSBjdXJyZW50IHBhdGggY2FuIGJlIHNlbWFudGljIChpLmUuIGlzIGxpa2UgeHh4KHl5eSkpXG5cdFx0XHQvLyBjaGVjayB3aXRoIHRoZSBzZW1hbnRpYyBwYXRoIGlmIHdlIGNhbiBmaW5kIGl0XG5cdFx0XHRsZXQgc1NlbWFudGljUGF0aDtcblx0XHRcdGlmICh0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nICYmIHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9PT0gc1BhdGgpIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSBhbHJlYWR5IHJlc29sdmVkIHRoaXMgc2VtYW50aWMgcGF0aFxuXHRcdFx0XHRzU2VtYW50aWNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNTZW1hbnRpY1BhdGggIT0gc1BhdGggPyB0aGlzLm9Sb3V0ZXJQcm94eS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkoc1NlbWFudGljUGF0aCkgOiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdF9maW5kUGF0aFRvTmF2aWdhdGUoc1BhdGg6IGFueSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiL1teL10qJFwiKTtcblx0XHRzUGF0aCA9IHNQYXRoLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuXHRcdGlmICh0aGlzLm9Sb3V0ZXIubWF0Y2goc1BhdGgpIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9maW5kUGF0aFRvTmF2aWdhdGUoc1BhdGgpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIGlmIHRoaXMgaXMgYSBsZXZlbC0xIG9iamVjdCAocGF0aCA9IC9hYWEoYmJiKSlcblx0XHRpZiAoIS9eXFwvW15cXChdK1xcKFteXFwpXStcXCkkLy50ZXN0KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFRoZW4gY2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgc2VtYW50aWMga2V5c1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0aWYgKCFTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlbiBjaGVjayB0aGUgZW50aXR5IGlzIGRyYWZ0LWVuYWJsZWRcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBzUGF0aCk7XG5cdH1cblxuXHRfZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRsZXQgc1BhdGg7XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiYgb0NvbnRleHQuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEpIHtcblx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBiYWNrIGZyb20gYSBjb250ZXh0LCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhcblx0XHRcdHNQYXRoID0gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UncmUgbmF2aWdhdGluZyBiYWNrIHRvIGEgc2VtYW50aWMgcGF0aCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlc29sdmVkXG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdHNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9jaGVja0NvbnRleHRGb3JTZW1hbnRpY1BhdGgob0NvbnRleHQpKSB7XG5cdFx0XHQvLyBXZSBjaGVjayBpZiB3ZSBoYXZlIHRvIHVzZSBhIHNlbWFudGljIHBhdGhcblx0XHRcdGNvbnN0IHNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXG5cdFx0XHRpZiAoIXNTZW1hbnRpY1BhdGgpIHtcblx0XHRcdFx0Ly8gV2Ugd2VyZSBub3QgYWJsZSB0byBidWlsZCB0aGUgc2VtYW50aWMgcGF0aCAtLT4gVXNlIHRoZSB0ZWNobmljYWwgcGF0aCBhbmRcblx0XHRcdFx0Ly8gY2xlYXIgdGhlIHByZXZpb3VzIG1hcHBpbmcsIG90aGVyd2lzZSB0aGUgb2xkIG1hcHBpbmcgaXMgdXNlZCBpbiBFZGl0RmxvdyN1cGRhdGVEb2N1bWVudFxuXHRcdFx0XHQvLyBhbmQgaXQgbGVhZHMgdG8gdW53YW50ZWQgcGFnZSByZWxvYWRzXG5cdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh1bmRlZmluZWQpO1xuXHRcdFx0fSBlbHNlIGlmIChzU2VtYW50aWNQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHQvLyBhbmQgdXNlIHRoZSBzZW1hbnRpYyBwYXRoIGluc3RlYWQgb2YgdGhlIHRlY2huaWNhbCBvbmVcblx0XHRcdFx0dGhpcy5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHsgdGVjaG5pY2FsUGF0aDogc1BhdGgsIHNlbWFudGljUGF0aDogc1NlbWFudGljUGF0aCB9KTtcblx0XHRcdFx0c1BhdGggPSBzU2VtYW50aWNQYXRoO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSBleHRyYSAnLycgYXQgdGhlIGJlZ2lubmluZyBvZiBwYXRoXG5cdFx0aWYgKHNQYXRoWzBdID09PSBcIi9cIikge1xuXHRcdFx0c1BhdGggPSBzUGF0aC5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNQYXRoO1xuXHR9XG5cblx0X2NhbGN1bGF0ZUxheW91dChzUGF0aDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bGV0IEZDTExldmVsID0gbVBhcmFtZXRlcnMuRkNMTGV2ZWw7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsKSB7XG5cdFx0XHRGQ0xMZXZlbCArPSBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbDtcblx0XHRcdGlmIChGQ0xMZXZlbCA8IDApIHtcblx0XHRcdFx0RkNMTGV2ZWwgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAodGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueSkuY2FsY3VsYXRlTGF5b3V0KFxuXHRcdFx0RkNMTGV2ZWwsXG5cdFx0XHRzUGF0aCxcblx0XHRcdG1QYXJhbWV0ZXJzLnNMYXlvdXQsXG5cdFx0XHRtUGFyYW1ldGVycy5rZWVwQ3VycmVudExheW91dFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciBiZWZvcmUgYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBEaXNwbGF5cyBhIGJ1c3kgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKi9cblx0X2JlZm9yZVJvdXRlTWF0Y2hlZCgvKm9FdmVudDogRXZlbnQqLykge1xuXHRcdGNvbnN0IGJQbGFjZWhvbGRlckVuYWJsZWQgPSBuZXcgUGxhY2Vob2xkZXIoKS5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpO1xuXHRcdGlmICghYlBsYWNlaG9sZGVyRW5hYmxlZCkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob1Jvb3RWaWV3KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXZlbnQgaGFuZGxlciB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogSGlkZXMgdGhlIGJ1c3kgaW5kaWNhdG9yIGFuZCBmaXJlcyBpdHMgb3duICdyb3V0ZW1hdGNoZWQnIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IFRoZSBldmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBvQXBwU3RhdGVIYW5kbGVyID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldEFwcFN0YXRlSGFuZGxlcigpLFxuXHRcdFx0b1Jvb3RWaWV3ID0gdGhpcy5vQXBwQ29tcG9uZW50LmdldFJvb3RDb250cm9sKCk7XG5cdFx0Y29uc3QgYlBsYWNlaG9sZGVyRW5hYmxlZCA9IG5ldyBQbGFjZWhvbGRlcigpLmlzUGxhY2Vob2xkZXJFbmFibGVkKCk7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob1Jvb3RWaWV3KSAmJiAhYlBsYWNlaG9sZGVyRW5hYmxlZCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob1Jvb3RWaWV3KTtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IGFueSA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cdFx0aWYgKHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5sZW5ndGgpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvID0gdGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlWzBdO1xuXHRcdFx0dGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlID0gdGhpcy5uYXZpZ2F0aW9uSW5mb1F1ZXVlLnNsaWNlKDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IHt9O1xuXHRcdH1cblx0XHRpZiAob0FwcFN0YXRlSGFuZGxlci5jaGVja0lmUm91dGVDaGFuZ2VkQnlJQXBwKCkpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLm5hdmlnYXRpb25JbmZvLmJSZWFzb25Jc0lhcHBTdGF0ZSA9IHRydWU7XG5cdFx0XHRvQXBwU3RhdGVIYW5kbGVyLnJlc2V0Um91dGVDaGFuZ2VkQnlJQXBwKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zQ3VycmVudFJvdXRlTmFtZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYW1lXCIpO1xuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZVBhdHRlcm4gPSBtUGFyYW1ldGVycy5jb25maWcucGF0dGVybjtcblx0XHR0aGlzLmFDdXJyZW50Vmlld3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmlld3NcIik7XG5cblx0XHRtUGFyYW1ldGVycy5yb3V0ZUluZm9ybWF0aW9uID0gdGhpcy5fZ2V0Um91dGVJbmZvcm1hdGlvbih0aGlzLnNDdXJyZW50Um91dGVOYW1lKTtcblx0XHRtUGFyYW1ldGVycy5yb3V0ZVBhdHRlcm4gPSB0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuO1xuXG5cdFx0dGhpcy5fZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnMpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY3VycmVudCBoYXNoIGhhcyBiZWVuIHNldCBieSB0aGUgcm91dGVyUHJveHkubmF2VG9IYXNoIGZ1bmN0aW9uXG5cdFx0Ly8gSWYgbm90LCByZWJ1aWxkIGhpc3RvcnkgcHJvcGVybHkgKGJvdGggaW4gdGhlIGJyb3dzZXIgYW5kIHRoZSBSb3V0ZXJQcm94eSlcblx0XHRpZiAoIWhpc3Rvcnkuc3RhdGUgfHwgaGlzdG9yeS5zdGF0ZS5mZUxldmVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5XG5cdFx0XHRcdC5yZXN0b3JlSGlzdG9yeSgpXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5yZXNvbHZlUm91dGVNYXRjaCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzdG9yaW5nIGhpc3RvcnlcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub1JvdXRlclByb3h5LnJlc29sdmVSb3V0ZU1hdGNoKCk7XG5cdFx0fVxuXHR9XG5cblx0YXR0YWNoUm91dGVNYXRjaGVkKG9EYXRhOiBhbnksIGZuRnVuY3Rpb24/OiBhbnksIG9MaXN0ZW5lcj86IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChcInJvdXRlTWF0Y2hlZFwiLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRkZXRhY2hSb3V0ZU1hdGNoZWQoZm5GdW5jdGlvbjogYW55LCBvTGlzdGVuZXI/OiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGV0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZChvRGF0YTogYW55LCBmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcj86IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5hdHRhY2hFdmVudChcImFmdGVyUm91dGVNYXRjaGVkXCIsIG9EYXRhLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cdGRldGFjaEFmdGVyUm91dGVNYXRjaGVkKGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyOiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuZGV0YWNoRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBmbkZ1bmN0aW9uLCBvTGlzdGVuZXIpO1xuXHR9XG5cblx0Z2V0Um91dGVGcm9tSGFzaChvUm91dGVyOiBhbnksIG9BcHBDb21wb25lbnQ6IGFueSkge1xuXHRcdGNvbnN0IHNIYXNoID0gb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmhhc2g7XG5cdFx0Y29uc3Qgb1JvdXRlSW5mbyA9IG9Sb3V0ZXIuZ2V0Um91dGVJbmZvQnlIYXNoKHNIYXNoKTtcblx0XHRyZXR1cm4gb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldE1ldGFkYXRhKClcblx0XHRcdC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC51aTUvcm91dGluZy9yb3V0ZXNcIilcblx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9Sb3V0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvUm91dGUubmFtZSA9PT0gb1JvdXRlSW5mby5uYW1lO1xuXHRcdFx0fSlbMF07XG5cdH1cblx0Z2V0VGFyZ2V0c0Zyb21Sb3V0ZShvUm91dGU6IGFueSkge1xuXHRcdGNvbnN0IG9UYXJnZXQgPSBvUm91dGUudGFyZ2V0O1xuXHRcdGlmICh0eXBlb2Ygb1RhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmV0dXJuIFt0aGlzLl9tVGFyZ2V0c1tvVGFyZ2V0XV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGFUYXJnZXQ6IGFueVtdID0gW107XG5cdFx0XHRvVGFyZ2V0LmZvckVhY2goKHNUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRhVGFyZ2V0LnB1c2godGhpcy5fbVRhcmdldHNbc1RhcmdldF0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gYVRhcmdldDtcblx0XHR9XG5cdH1cblxuXHRpbml0aWFsaXplUm91dGluZygpIHtcblx0XHQvLyBBdHRhY2ggcm91dGVyIGhhbmRsZXJzXG5cdFx0dGhpcy5fZm5PblJvdXRlTWF0Y2hlZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5vUm91dGVyLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mbk9uUm91dGVNYXRjaGVkLCB0aGlzKTtcblx0XHRjb25zdCBiUGxhY2Vob2xkZXJFbmFibGVkID0gbmV3IFBsYWNlaG9sZGVyKCkuaXNQbGFjZWhvbGRlckVuYWJsZWQoKTtcblx0XHRpZiAoIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdHRoaXMub1JvdXRlci5hdHRhY2hCZWZvcmVSb3V0ZU1hdGNoZWQodGhpcy5fYmVmb3JlUm91dGVNYXRjaGVkLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHQvLyBSZXNldCBpbnRlcm5hbCBzdGF0ZVxuXHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZSA9IFtdO1xuXHRcdEVkaXRTdGF0ZS5yZXNldEVkaXRTdGF0ZSgpO1xuXHRcdHRoaXMuYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCA9ICF0aGlzLm9Sb3V0ZXIubWF0Y2goXCJcIik7XG5cblx0XHRjb25zdCBiSXNJYXBwU3RhdGUgPSB0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuaW5kZXhPZihcInNhcC1pYXBwLXN0YXRlXCIpICE9PSAtMTtcblx0XHRjb25zdCBpbml0UHJvbWlzZSA9IHRoaXMub0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFN0YXJ0dXBQYXJhbWV0ZXJzKClcblx0XHRcdC50aGVuKChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBiSGFzU3RhcnRVcFBhcmFtZXRlcnMgPSBvU3RhcnR1cFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhvU3RhcnR1cFBhcmFtZXRlcnMpLmxlbmd0aCAhPT0gMDtcblx0XHRcdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdC8vIE1hbmFnZSBzdGFydHVwIHBhcmFtZXRlcnMgKGluIGNhc2Ugb2Ygbm8gaWFwcC1zdGF0ZSlcblx0XHRcdFx0aWYgKCFiSXNJYXBwU3RhdGUgJiYgYkhhc1N0YXJ0VXBQYXJhbWV0ZXJzICYmICFzSGFzaCkge1xuXHRcdFx0XHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXS5pbmRleE9mKFwiY3JlYXRlXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIG1vZGVcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9tYW5hZ2VDcmVhdGVTdGFydHVwKG9TdGFydHVwUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIERlZXAgbGlua1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX21hbmFnZURlZXBMaW5rU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHJvdXRpbmcgaW5pdGlhbGl6YXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIGluaXRQcm9taXNlO1xuXHR9XG5cblx0Z2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0cmV0dXJuIEFwcFN0YXJ0dXBIZWxwZXIuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCB0aGlzLmdldENvbnRleHRQYXRoKCksIHRoaXMub1JvdXRlcik7XG5cdH1cblxuXHRfbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiBBcHBTdGFydHVwSGVscGVyLmdldENyZWF0ZVN0YXJ0dXBIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgdGhpcy5nZXRDb250ZXh0UGF0aCgpLCB0aGlzLm9Sb3V0ZXIsIHRoaXMub01ldGFNb2RlbCkudGhlbihcblx0XHRcdChzTmV3SGFzaDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzTmV3SGFzaCkge1xuXHRcdFx0XHRcdCh0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKHNOZXdIYXNoKTtcblx0XHRcdFx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdF9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gQXBwU3RhcnR1cEhlbHBlci5nZXREZWVwTGlua1N0YXJ0dXBIYXNoKFxuXHRcdFx0KHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmcsXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHR0aGlzLm9Nb2RlbFxuXHRcdCkudGhlbigob0RlZXBMaW5rOiBhbnkpID0+IHtcblx0XHRcdGxldCBzSGFzaDtcblx0XHRcdGlmIChvRGVlcExpbmsuY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzVGVjaG5pY2FsUGF0aCA9IG9EZWVwTGluay5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9EZWVwTGluay5jb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1NlbWFudGljUGF0aCAhPT0gc1RlY2huaWNhbFBhdGgpIHtcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHRcdC8vIGFuZCB1c2UgdGhlIHNlbWFudGljIHBhdGggaW5zdGVhZCBvZiB0aGUgdGVjaG5pY2FsIG9uZVxuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzSGFzaCA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlIGxlYWRpbmcgJy8nXG5cdFx0XHR9IGVsc2UgaWYgKG9EZWVwTGluay5oYXNoKSB7XG5cdFx0XHRcdHNIYXNoID0gb0RlZXBMaW5rLmhhc2g7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzSGFzaCkge1xuXHRcdFx0XHQvL1JlcGxhY2UgdGhlIGhhc2ggd2l0aCBuZXdseSBjcmVhdGVkIGhhc2hcblx0XHRcdFx0KHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkoc0hhc2gpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0T3V0Ym91bmRzKCkge1xuXHRcdHJldHVybiB0aGlzLm91dGJvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEcmFmdCByb290IGVudGl0eSBzZXQgb3IgdGhlIHN0aWNreS1lbmFibGVkIGVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSByb290IEVudGl0eVNldFxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGdldENvbnRleHRQYXRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNDb250ZXh0UGF0aDtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBSb3V0aW5nU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Um91dGluZ1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBuZXcgUm91dGluZ1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1JvdXRpbmdTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRpbmdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
|
|
968
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSb3V0aW5nU2VydmljZUV2ZW50aW5nIiwiZGVmaW5lVUk1Q2xhc3MiLCJldmVudCIsIkV2ZW50UHJvdmlkZXIiLCJSb3V0aW5nU2VydmljZSIsIm5hdmlnYXRpb25JbmZvUXVldWUiLCJpbml0Iiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwic2NvcGVUeXBlIiwib0FwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Sb3V0ZXJQcm94eSIsImdldFJvdXRlclByb3h5IiwiZXZlbnRQcm92aWRlciIsIm9Sb3V0aW5nQ29uZmlnIiwiZ2V0TWFuaWZlc3RFbnRyeSIsIm9Sb290Vmlld0NvbmZpZyIsIl9wYXJzZVJvdXRpbmdDb25maWd1cmF0aW9uIiwib0FwcENvbmZpZyIsIm91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJiZWZvcmVFeGl0IiwiZGV0YWNoUm91dGVNYXRjaGVkIiwiX2ZuT25Sb3V0ZU1hdGNoZWQiLCJmaXJlRXZlbnQiLCJleGl0IiwiZGVzdHJveSIsImlzRkNMIiwidmlld05hbWUiLCJfbVRhcmdldHMiLCJPYmplY3QiLCJrZXlzIiwidGFyZ2V0cyIsImZvckVhY2giLCJzVGFyZ2V0TmFtZSIsImFzc2lnbiIsInRhcmdldE5hbWUiLCJjb250ZXh0UGF0dGVybiIsInVuZGVmaW5lZCIsInZpZXdMZXZlbCIsIl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybiIsIl9tUm91dGVzIiwic1JvdXRlS2V5Iiwicm91dGVzIiwib1JvdXRlTWFuaWZlc3RJbmZvIiwiYVJvdXRlVGFyZ2V0cyIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsInNSb3V0ZU5hbWUiLCJuYW1lIiwic1JvdXRlUGF0dGVybiIsInBhdHRlcm4iLCJsZW5ndGgiLCJpbmRleE9mIiwiTG9nIiwid2FybmluZyIsImlSb3V0ZUxldmVsIiwicm91dGVMZXZlbCIsImkiLCJzUGFyZW50VGFyZ2V0TmFtZSIsInBhcmVudCIsInB1c2giLCJGQ0xMZXZlbCIsImNvbnRyb2xBZ2dyZWdhdGlvbiIsImFMZXZlbDBSb3V0ZU5hbWVzIiwiYUxldmVsMVJvdXRlTmFtZXMiLCJzRGVmYXVsdFJvdXRlTmFtZSIsInNOYW1lIiwiaUxldmVsIiwic0RlZmF1bHRUYXJnZXROYW1lIiwic2xpY2UiLCJzQ29udGV4dFBhdGgiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJvU2V0dGluZ3MiLCJjb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm1hcCIsInNUYXJnZXRLZXkiLCJzb3J0IiwiYSIsImIiLCJmdWxsQ29udGV4dFBhdGgiLCJuYXZpZ2F0aW9uIiwic05hdk5hbWUiLCJ0YXJnZXRSb3V0ZSIsImRldGFpbCIsInJvdXRlIiwic3RhcnRzV2l0aCIsInNQYXR0ZXJuIiwicmVwbGFjZSIsInJlZ2V4IiwiUmVnRXhwIiwibWF0Y2giLCJfZ2V0Um91dGVJbmZvcm1hdGlvbiIsIl9nZXRUYXJnZXRJbmZvcm1hdGlvbiIsIl9nZXRDb21wb25lbnRJZCIsInNPd25lcklkIiwic0NvbXBvbmVudElkIiwic3Vic3RyIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvQ29tcG9uZW50SW5zdGFuY2UiLCJzVGFyZ2V0Q29tcG9uZW50SWQiLCJfc093bmVySWQiLCJnZXRJZCIsInNDb3JyZWN0VGFyZ2V0TmFtZSIsImlkIiwidmlld0lkIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9NYXBwaW5nIiwibmF2aWdhdGVUbyIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwiYlByZXNlcnZlSGlzdG9yeSIsInNUYXJnZXRVUkxQcm9taXNlIiwiYklzU3RpY2t5TW9kZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY1BhdGgiLCJwcmVwYXJlUGFyYW1ldGVycyIsInRoZW4iLCJtUGFyYW1ldGVycyIsImdldFVSTCIsInNUYXJnZXRVUkwiLCJuYXZUb0hhc2giLCJzVGFyZ2V0Um91dGUiLCJvUGFyYW1ldGVyc1Byb21pc2UiLCJnZXRQYXRoIiwiYUNvbnRleHRQYXRoUGFydHMiLCJzcGxpdCIsImFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwic1BhcmFtZXRlcktleSIsInNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbiIsIm9QYXJzZWRFeHByZXNzaW9uIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJhUGFydHMiLCJwYXJ0cyIsImFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzIiwib1BhdGhQYXJ0IiwiYVJlbGF0aXZlUGFydHMiLCJwYXRoIiwiYUxvY2FsUGFydHMiLCJzUHJvcGVydHlQYXRoIiwiam9pbiIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5Iiwib1ZhbHVlIiwib1Byb3BlcnR5SW5mbyIsImdldE9iamVjdCIsInNFZG1UeXBlIiwiJFR5cGUiLCJPRGF0YVV0aWxzIiwiZm9ybWF0TGl0ZXJhbCIsImFsbCIsImFSZXNvbHZlZFBhcmFtZXRlcnMiLCJ2YWx1ZSIsImZvcm1hdHRlciIsImFwcGx5Iiwia2V5IiwiYUFsbFJlc29sdmVkUGFyYW1ldGVycyIsIm9QYXJhbWV0ZXJzIiwib1Jlc29sdmVkUGFyYW1ldGVyIiwib0Vycm9yIiwiZXJyb3IiLCJfZmlyZVJvdXRlTWF0Y2hFdmVudHMiLCJFZGl0U3RhdGUiLCJjbGVhblByb2Nlc3NlZEVkaXRTdGF0ZSIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib1ZpZXdEYXRhIiwib0N1cnJlbnRUYXJnZXRJbmZvIiwib1JvdXRlUGFyYW1ldGVyc1Byb21pc2UiLCJ0YXJnZXRQYXRoIiwib1JvdXRlRGV0YWlsIiwicGFyYW1ldGVycyIsInNUYXJnZXRQYXRoIiwiX2dldFBhdGhGcm9tQ29udGV4dCIsImJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QiLCJleGl0RnJvbUFwcCIsImFzeW5jQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJzTGF5b3V0IiwiX2NhbGN1bGF0ZUxheW91dCIsIm9OYXZpZ2F0aW9uSW5mbyIsIm9Bc3luY0NvbnRleHQiLCJiVGFyZ2V0RWRpdGFibGUiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1c2VDb250ZXh0IiwidXBkYXRlRkNMTGV2ZWwiLCJiUmVjcmVhdGVDb250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsImJTaG93UGxhY2Vob2xkZXIiLCJzaG93UGxhY2Vob2xkZXIiLCJiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJjaGVja05vSGFzaENoYW5nZSIsInNDdXJyZW50SGFzaE5vQXBwU3RhdGUiLCJnZXRIYXNoIiwibUV2ZW50UGFyYW1ldGVycyIsImdldFJvdXRlSW5mb0J5SGFzaCIsIm5hdmlnYXRpb25JbmZvIiwicm91dGVJbmZvcm1hdGlvbiIsInNDdXJyZW50Um91dGVOYW1lIiwicm91dGVQYXR0ZXJuIiwic0N1cnJlbnRSb3V0ZVBhdHRlcm4iLCJ2aWV3cyIsImFDdXJyZW50Vmlld3MiLCJzZXRGb2N1c0ZvcmNlZCIsImJGb3JjZUZvY3VzIiwidHJhbnNpZW50Iiwib1JvdXRlSW5mbyIsIm9Sb3V0ZSIsInNMYXN0VGFyZ2V0TmFtZSIsIm9UYXJnZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwib1JvdXRlUGFyYW1ldGVycyIsIm5hdlRvIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImJOYXZpZ2F0ZWQiLCJwb3AiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5Iiwic1BhdGgiLCJ0ZXN0Iiwic1NlbWFudGljUGF0aCIsInRlY2huaWNhbFBhdGgiLCJzZW1hbnRpY1BhdGgiLCJfZmluZFBhdGhUb05hdmlnYXRlIiwiX2NoZWNrSWZDb250ZXh0U3VwcG9ydHNTZW1hbnRpY1BhdGgiLCJzRW50aXR5U2V0TmFtZSIsImdldFNlbWFudGljS2V5cyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0EiLCJpc1JlbGF0aXZlIiwiZ2V0SGVhZGVyQ29udGV4dCIsInN1YnN0cmluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImNhbGN1bGF0ZUxheW91dCIsImtlZXBDdXJyZW50TGF5b3V0IiwiX2JlZm9yZVJvdXRlTWF0Y2hlZCIsImJQbGFjZWhvbGRlckVuYWJsZWQiLCJQbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJFbmFibGVkIiwib1Jvb3RWaWV3IiwiZ2V0Um9vdENvbnRyb2wiLCJCdXN5TG9ja2VyIiwibG9jayIsIl9vblJvdXRlTWF0Y2hlZCIsIm9FdmVudCIsIm9BcHBTdGF0ZUhhbmRsZXIiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJpc0xvY2tlZCIsInVubG9jayIsImdldFBhcmFtZXRlcnMiLCJjaGVja0lmUm91dGVDaGFuZ2VkQnlJQXBwIiwiYlJlYXNvbklzSWFwcFN0YXRlIiwicmVzZXRSb3V0ZUNoYW5nZWRCeUlBcHAiLCJnZXRQYXJhbWV0ZXIiLCJjb25maWciLCJoaXN0b3J5Iiwic3RhdGUiLCJmZUxldmVsIiwicmVzdG9yZUhpc3RvcnkiLCJyZXNvbHZlUm91dGVNYXRjaCIsImNhdGNoIiwiYXR0YWNoUm91dGVNYXRjaGVkIiwib0RhdGEiLCJmbkZ1bmN0aW9uIiwib0xpc3RlbmVyIiwiYXR0YWNoRXZlbnQiLCJkZXRhY2hFdmVudCIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwiZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJnZXRSb3V0ZUZyb21IYXNoIiwic0hhc2giLCJnZXRIYXNoQ2hhbmdlciIsImhhc2giLCJnZXRNZXRhZGF0YSIsImZpbHRlciIsImdldFRhcmdldHNGcm9tUm91dGUiLCJhVGFyZ2V0Iiwic1RhcmdldCIsImluaXRpYWxpemVSb3V0aW5nIiwiYmluZCIsImF0dGFjaEJlZm9yZVJvdXRlTWF0Y2hlZCIsInJlc2V0RWRpdFN0YXRlIiwiYklzSWFwcFN0YXRlIiwiZ2V0U3RhcnR1cFBhcmFtZXRlcnMiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJiSGFzU3RhcnRVcFBhcmFtZXRlcnMiLCJwcmVmZXJyZWRNb2RlIiwiX21hbmFnZUNyZWF0ZVN0YXJ0dXAiLCJfbWFuYWdlRGVlcExpbmtTdGFydHVwIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJBcHBTdGFydHVwSGVscGVyIiwiZ2V0Q29udGV4dFBhdGgiLCJnZXRDcmVhdGVTdGFydHVwSGFzaCIsInNOZXdIYXNoIiwicmVwbGFjZUhhc2giLCJzZXRTdGFydHVwTW9kZUNyZWF0ZSIsImdldERlZXBMaW5rU3RhcnR1cEhhc2giLCJnZXRNYW5pZmVzdCIsInJvdXRpbmciLCJvRGVlcExpbmsiLCJjb250ZXh0Iiwic1RlY2huaWNhbFBhdGgiLCJzZXRTdGFydHVwTW9kZURlZXBsaW5rIiwiZ2V0T3V0Ym91bmRzIiwiZ2V0SW50ZXJmYWNlIiwiU2VydmljZSIsIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0Iiwib1JvdXRpbmdTZXJ2aWNlIiwiU2VydmljZUZhY3RvcnkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlJvdXRpbmdTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IEFwcFN0YXJ0dXBIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQXBwU3RhcnR1cEhlbHBlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV2ZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBFdmVudFByb3ZpZGVyIGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFByb3ZpZGVyXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhVXRpbHMgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG50eXBlIFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3MgPSB7fTtcbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLnNlcnZpY2VzLlJvdXRpbmdTZXJ2aWNlRXZlbnRpbmdcIilcbmNsYXNzIFJvdXRpbmdTZXJ2aWNlRXZlbnRpbmcgZXh0ZW5kcyBFdmVudFByb3ZpZGVyIHtcblx0QGV2ZW50KClcblx0cm91dGVNYXRjaGVkITogRnVuY3Rpb247XG5cdEBldmVudCgpXG5cdGFmdGVyUm91dGVNYXRjaGVkITogRnVuY3Rpb247XG59XG5cbmV4cG9ydCB0eXBlIFNlbWFudGljTWFwcGluZyA9IHtcblx0c2VtYW50aWNQYXRoOiBzdHJpbmc7XG5cdHRlY2huaWNhbFBhdGg6IHN0cmluZztcbn07XG5leHBvcnQgY2xhc3MgUm91dGluZ1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFJvdXRpbmdTZXJ2aWNlU2V0dGluZ3M+IHtcblx0b0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0b01vZGVsITogT0RhdGFNb2RlbDtcblx0b01ldGFNb2RlbCE6IE9EYXRhTWV0YU1vZGVsO1xuXHRvUm91dGVyITogUm91dGVyO1xuXHRvUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblx0ZXZlbnRQcm92aWRlciE6IEV2ZW50UHJvdmlkZXI7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRvdXRib3VuZHM6IGFueTtcblx0X21UYXJnZXRzOiBhbnk7XG5cdF9tUm91dGVzOiBhbnk7XG5cdG9MYXN0U2VtYW50aWNNYXBwaW5nPzogU2VtYW50aWNNYXBwaW5nO1xuXHRiRXhpdE9uTmF2aWdhdGVCYWNrVG9Sb290PzogYm9vbGVhbjtcblx0c0N1cnJlbnRSb3V0ZU5hbWU/OiBzdHJpbmc7XG5cdHNDdXJyZW50Um91dGVQYXR0ZXJuPzogc3RyaW5nO1xuXHRhQ3VycmVudFZpZXdzPzogYW55W107XG5cdG5hdmlnYXRpb25JbmZvUXVldWU6IGFueVtdID0gW107XG5cdHNDb250ZXh0UGF0aCE6IHN0cmluZztcblx0X2ZuT25Sb3V0ZU1hdGNoZWQhOiBGdW5jdGlvbjtcblx0aW5pdCgpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGlmIChvQ29udGV4dC5zY29wZVR5cGUgPT09IFwiY29tcG9uZW50XCIpIHtcblx0XHRcdHRoaXMub0FwcENvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdFx0dGhpcy5vTW9kZWwgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdFx0dGhpcy5vTWV0YU1vZGVsID0gdGhpcy5vTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eSA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0dGhpcy5ldmVudFByb3ZpZGVyID0gbmV3IChSb3V0aW5nU2VydmljZUV2ZW50aW5nIGFzIGFueSkoKTtcblxuXHRcdFx0Y29uc3Qgb1JvdXRpbmdDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmdcIik7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb25maWcgPSB0aGlzLm9BcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3Jvb3RWaWV3XCIpO1xuXHRcdFx0dGhpcy5fcGFyc2VSb3V0aW5nQ29uZmlndXJhdGlvbihvUm91dGluZ0NvbmZpZywgb1Jvb3RWaWV3Q29uZmlnKTtcblxuXHRcdFx0Y29uc3Qgb0FwcENvbmZpZyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwiL3NhcC5hcHBcIik7XG5cdFx0XHR0aGlzLm91dGJvdW5kcyA9IG9BcHBDb25maWcgJiYgb0FwcENvbmZpZy5jcm9zc05hdmlnYXRpb24gJiYgb0FwcENvbmZpZy5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cblx0YmVmb3JlRXhpdCgpIHtcblx0XHR0aGlzLm9Sb3V0ZXIuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuT25Sb3V0ZU1hdGNoZWQsIHRoaXMpO1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwge30pO1xuXHR9XG5cdGV4aXQoKSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmRlc3Ryb3koKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBhIG1hbmlmZXN0IHJvdXRpbmcgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgdXNhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBvUm91dGluZ0NvbmZpZyBUaGUgcm91dGluZyBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvUm9vdFZpZXdDb25maWcgVGhlIHJvb3QgdmlldyBjb25maWd1cmF0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcGFyc2VSb3V0aW5nQ29uZmlndXJhdGlvbihvUm91dGluZ0NvbmZpZzogYW55LCBvUm9vdFZpZXdDb25maWc6IGFueSkge1xuXHRcdGNvbnN0IGlzRkNMID0gb1Jvb3RWaWV3Q29uZmlnICYmIG9Sb290Vmlld0NvbmZpZy52aWV3TmFtZSA9PT0gXCJzYXAuZmUudGVtcGxhdGVzLlJvb3RDb250YWluZXIudmlldy5GY2xcIjtcblxuXHRcdC8vIEluZm9ybWF0aW9uIG9mIHRhcmdldHNcblx0XHR0aGlzLl9tVGFyZ2V0cyA9IHt9O1xuXHRcdE9iamVjdC5rZXlzKG9Sb3V0aW5nQ29uZmlnLnRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXSA9IE9iamVjdC5hc3NpZ24oeyB0YXJnZXROYW1lOiBzVGFyZ2V0TmFtZSB9LCBvUm91dGluZ0NvbmZpZy50YXJnZXRzW3NUYXJnZXROYW1lXSk7XG5cblx0XHRcdC8vIFZpZXcgbGV2ZWwgZm9yIEZDTCBjYXNlcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnZpZXdMZXZlbCA9IHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250ZXh0UGF0dGVybiwgMCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbmZvcm1hdGlvbiBvZiByb3V0ZXNcblx0XHR0aGlzLl9tUm91dGVzID0ge307XG5cdFx0Zm9yIChjb25zdCBzUm91dGVLZXkgaW4gb1JvdXRpbmdDb25maWcucm91dGVzKSB7XG5cdFx0XHRjb25zdCBvUm91dGVNYW5pZmVzdEluZm8gPSBvUm91dGluZ0NvbmZpZy5yb3V0ZXNbc1JvdXRlS2V5XSxcblx0XHRcdFx0YVJvdXRlVGFyZ2V0cyA9IEFycmF5LmlzQXJyYXkob1JvdXRlTWFuaWZlc3RJbmZvLnRhcmdldCkgPyBvUm91dGVNYW5pZmVzdEluZm8udGFyZ2V0IDogW29Sb3V0ZU1hbmlmZXN0SW5mby50YXJnZXRdLFxuXHRcdFx0XHRzUm91dGVOYW1lID0gQXJyYXkuaXNBcnJheShvUm91dGluZ0NvbmZpZy5yb3V0ZXMpID8gb1JvdXRlTWFuaWZlc3RJbmZvLm5hbWUgOiBzUm91dGVLZXksXG5cdFx0XHRcdHNSb3V0ZVBhdHRlcm4gPSBvUm91dGVNYW5pZmVzdEluZm8ucGF0dGVybjtcblxuXHRcdFx0Ly8gQ2hlY2sgcm91dGUgcGF0dGVybjogYWxsIHBhdHRlcm5zIG5lZWQgdG8gZW5kIHdpdGggJzo/cXVlcnk6JywgdGhhdCB3ZSB1c2UgZm9yIHBhcmFtZXRlcnNcblx0XHRcdGlmIChzUm91dGVQYXR0ZXJuLmxlbmd0aCA8IDggfHwgc1JvdXRlUGF0dGVybi5pbmRleE9mKFwiOj9xdWVyeTpcIikgIT09IHNSb3V0ZVBhdHRlcm4ubGVuZ3RoIC0gOCkge1xuXHRcdFx0XHRMb2cud2FybmluZyhgUGF0dGVybiBmb3Igcm91dGUgJHtzUm91dGVOYW1lfSBkb2Vzbid0IGVuZCB3aXRoICc6P3F1ZXJ5OicgOiAke3NSb3V0ZVBhdHRlcm59YCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpUm91dGVMZXZlbCA9IHRoaXMuX2dldFZpZXdMZXZlbEZyb21QYXR0ZXJuKHNSb3V0ZVBhdHRlcm4sIDApO1xuXHRcdFx0dGhpcy5fbVJvdXRlc1tzUm91dGVOYW1lXSA9IHtcblx0XHRcdFx0bmFtZTogc1JvdXRlTmFtZSxcblx0XHRcdFx0cGF0dGVybjogc1JvdXRlUGF0dGVybixcblx0XHRcdFx0dGFyZ2V0czogYVJvdXRlVGFyZ2V0cyxcblx0XHRcdFx0cm91dGVMZXZlbDogaVJvdXRlTGV2ZWxcblx0XHRcdH07XG5cblx0XHRcdC8vIEFkZCB0aGUgcGFyZW50IHRhcmdldHMgaW4gdGhlIGxpc3Qgb2YgdGFyZ2V0cyBmb3IgdGhlIHJvdXRlXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFSb3V0ZVRhcmdldHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmVudFRhcmdldE5hbWUgPSB0aGlzLl9tVGFyZ2V0c1thUm91dGVUYXJnZXRzW2ldXS5wYXJlbnQ7XG5cdFx0XHRcdGlmIChzUGFyZW50VGFyZ2V0TmFtZSkge1xuXHRcdFx0XHRcdGFSb3V0ZVRhcmdldHMucHVzaChzUGFyZW50VGFyZ2V0TmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0ZDTCkge1xuXHRcdFx0XHQvLyBWaWV3IGxldmVsIGZvciBub24tRkNMIGNhc2VzIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcm91dGUgcGF0dGVyblxuXHRcdFx0XHRpZiAodGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0udmlld0xldmVsID09PSB1bmRlZmluZWQgfHwgdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0udmlld0xldmVsIDwgaVJvdXRlTGV2ZWwpIHtcblx0XHRcdFx0XHQvLyBUaGVyZSBhcmUgY2FzZXMgd2hlbiBkaWZmZXJlbnQgcm91dGVzIHBvaW50IHRvIHRoZSBzYW1lIHRhcmdldC4gV2UgdGFrZSB0aGVcblx0XHRcdFx0XHQvLyBsYXJnZXN0IHZpZXdMZXZlbCBpbiB0aGF0IGNhc2UuXG5cdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0udmlld0xldmVsID0gaVJvdXRlTGV2ZWw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGQ0wgbGV2ZWwgZm9yIG5vbi1GQ0wgY2FzZXMgaXMgZXF1YWwgdG8gLTFcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0uRkNMTGV2ZWwgPSAtMTtcblx0XHRcdH0gZWxzZSBpZiAoYVJvdXRlVGFyZ2V0cy5sZW5ndGggPT09IDEgJiYgdGhpcy5fbVRhcmdldHNbYVJvdXRlVGFyZ2V0c1swXV0uY29udHJvbEFnZ3JlZ2F0aW9uICE9PSBcImJlZ2luQ29sdW1uUGFnZXNcIikge1xuXHRcdFx0XHQvLyBXZSdyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzIG9ubHkgMSB0YXJnZXQgZm9yIHRoZSByb3V0ZSwgYW5kIGl0J3Mgbm90IGluIHRoZSBmaXJzdCBjb2x1bW5cblx0XHRcdFx0Ly8gLS0+IHRoaXMgaXMgYSBmdWxsc2NyZWVuIGNvbHVtbiBhZnRlciBhbGwgY29sdW1ucyBpbiB0aGUgRkNMIGhhdmUgYmVlbiB1c2VkXG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW2FSb3V0ZVRhcmdldHNbMF1dLkZDTExldmVsID0gMztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE90aGVyIEZDTCBjYXNlc1xuXHRcdFx0XHRhUm91dGVUYXJnZXRzLmZvckVhY2goKHNUYXJnZXROYW1lOiBhbnkpID0+IHtcblx0XHRcdFx0XHRzd2l0Y2ggKHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJiZWdpbkNvbHVtblBhZ2VzXCI6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlIFwibWlkQ29sdW1uUGFnZXNcIjpcblx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLkZDTExldmVsID0gMTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5GQ0xMZXZlbCA9IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcm9wYWdhdGUgdmlld0xldmVsLCBjb250ZXh0UGF0dGVybiwgRkNMTGV2ZWwgYW5kIGNvbnRyb2xBZ2dyZWdhdGlvbiB0byBwYXJlbnQgdGFyZ2V0c1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX21UYXJnZXRzKS5mb3JFYWNoKChzVGFyZ2V0TmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0XHR3aGlsZSAodGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnBhcmVudCkge1xuXHRcdFx0XHRjb25zdCBzUGFyZW50VGFyZ2V0TmFtZSA9IHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5wYXJlbnQ7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS52aWV3TGV2ZWwgPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS52aWV3TGV2ZWwgfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLnZpZXdMZXZlbDtcblx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1BhcmVudFRhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuID1cblx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uY29udGV4dFBhdHRlcm4gfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRleHRQYXR0ZXJuO1xuXHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzUGFyZW50VGFyZ2V0TmFtZV0uRkNMTGV2ZWwgPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5GQ0xMZXZlbCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uRkNMTGV2ZWw7XG5cdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb24gPVxuXHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NQYXJlbnRUYXJnZXROYW1lXS5jb250cm9sQWdncmVnYXRpb24gfHwgdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLmNvbnRyb2xBZ2dyZWdhdGlvbjtcblx0XHRcdFx0c1RhcmdldE5hbWUgPSBzUGFyZW50VGFyZ2V0TmFtZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIERldGVybWluZSB0aGUgcm9vdCBlbnRpdHkgZm9yIHRoZSBhcHBcblx0XHRjb25zdCBhTGV2ZWwwUm91dGVOYW1lcyA9IFtdO1xuXHRcdGNvbnN0IGFMZXZlbDFSb3V0ZU5hbWVzID0gW107XG5cdFx0bGV0IHNEZWZhdWx0Um91dGVOYW1lO1xuXG5cdFx0Zm9yIChjb25zdCBzTmFtZSBpbiB0aGlzLl9tUm91dGVzKSB7XG5cdFx0XHRjb25zdCBpTGV2ZWwgPSB0aGlzLl9tUm91dGVzW3NOYW1lXS5yb3V0ZUxldmVsO1xuXHRcdFx0aWYgKGlMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRhTGV2ZWwwUm91dGVOYW1lcy5wdXNoKHNOYW1lKTtcblx0XHRcdH0gZWxzZSBpZiAoaUxldmVsID09PSAxKSB7XG5cdFx0XHRcdGFMZXZlbDFSb3V0ZU5hbWVzLnB1c2goc05hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhTGV2ZWwwUm91dGVOYW1lcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHNEZWZhdWx0Um91dGVOYW1lID0gYUxldmVsMFJvdXRlTmFtZXNbMF07XG5cdFx0fSBlbHNlIGlmIChhTGV2ZWwxUm91dGVOYW1lcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHNEZWZhdWx0Um91dGVOYW1lID0gYUxldmVsMVJvdXRlTmFtZXNbMF07XG5cdFx0fVxuXG5cdFx0aWYgKHNEZWZhdWx0Um91dGVOYW1lKSB7XG5cdFx0XHRjb25zdCBzRGVmYXVsdFRhcmdldE5hbWUgPSB0aGlzLl9tUm91dGVzW3NEZWZhdWx0Um91dGVOYW1lXS50YXJnZXRzLnNsaWNlKC0xKVswXTtcblx0XHRcdHRoaXMuc0NvbnRleHRQYXRoID0gXCJcIjtcblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzRGVmYXVsdFRhcmdldE5hbWVdLm9wdGlvbnMgJiYgdGhpcy5fbVRhcmdldHNbc0RlZmF1bHRUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzKSB7XG5cdFx0XHRcdGNvbnN0IG9TZXR0aW5ncyA9IHRoaXMuX21UYXJnZXRzW3NEZWZhdWx0VGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncztcblx0XHRcdFx0dGhpcy5zQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY29udGV4dFBhdGggfHwgYC8ke29TZXR0aW5ncy5lbnRpdHlTZXR9YDtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5zQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0YENhbm5vdCBkZXRlcm1pbmUgZGVmYXVsdCBjb250ZXh0UGF0aDogY29udGV4dFBhdGggb3IgZW50aXR5U2V0IG1pc3NpbmcgaW4gZGVmYXVsdCB0YXJnZXQ6ICR7c0RlZmF1bHRUYXJnZXROYW1lfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJDYW5ub3QgZGV0ZXJtaW5lIGRlZmF1bHQgY29udGV4dFBhdGg6IG5vIGRlZmF1bHQgcm91dGUgZm91bmQuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFdlIG5lZWQgdG8gZXN0YWJsaXNoIHRoZSBjb3JyZWN0IHBhdGggdG8gdGhlIGRpZmZlcmVudCBwYWdlcywgaW5jbHVkaW5nIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9tVGFyZ2V0cylcblx0XHRcdC5tYXAoKHNUYXJnZXRLZXk6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fbVRhcmdldHNbc1RhcmdldEtleV07XG5cdFx0XHR9KVxuXHRcdFx0LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG5cdFx0XHRcdHJldHVybiBhLnZpZXdMZXZlbCA8IGIudmlld0xldmVsID8gLTEgOiAxO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKCh0YXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBBZnRlciBzb3J0aW5nIHRoZSB0YXJnZXRzIHBlciBsZXZlbCB3ZSBjYW4gdGhlbiBnbyB0aHJvdWdoIHRoZWlyIG5hdmlnYXRpb24gb2JqZWN0IGFuZCB1cGRhdGUgdGhlIHBhdGhzIGFjY29yZGluZ2x5LlxuXHRcdFx0XHRpZiAodGFyZ2V0Lm9wdGlvbnMpIHtcblx0XHRcdFx0XHRjb25zdCBzZXR0aW5ncyA9IHRhcmdldC5vcHRpb25zLnNldHRpbmdzO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IHNldHRpbmdzLmNvbnRleHRQYXRoIHx8IChzZXR0aW5ncy5lbnRpdHlTZXQgPyBgLyR7c2V0dGluZ3MuZW50aXR5U2V0fWAgOiBcIlwiKTtcblx0XHRcdFx0XHRpZiAoIXNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCAmJiBzQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0XHRcdHNldHRpbmdzLmZ1bGxDb250ZXh0UGF0aCA9IGAke3NDb250ZXh0UGF0aH0vYDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc2V0dGluZ3MubmF2aWdhdGlvbiB8fCB7fSkuZm9yRWFjaCgoc05hdk5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFJvdXRlID0gdGhpcy5fbVJvdXRlc1tzZXR0aW5ncy5uYXZpZ2F0aW9uW3NOYXZOYW1lXS5kZXRhaWwucm91dGVdO1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldFJvdXRlICYmIHRhcmdldFJvdXRlLnRhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0Um91dGUudGFyZ2V0cy5mb3JFYWNoKChzVGFyZ2V0TmFtZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXS5vcHRpb25zLnNldHRpbmdzICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhdGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGFyZ2V0LnZpZXdMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0ub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGggPSBgJHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoc05hdk5hbWUuc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgc05hdk5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0fS9gO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbVRhcmdldHNbc1RhcmdldE5hbWVdLm9wdGlvbnMuc2V0dGluZ3MuZnVsbENvbnRleHRQYXRoID0gYCR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3MuZnVsbENvbnRleHRQYXRoICsgc05hdk5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0fS9gO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgYSB2aWV3IGxldmVsIGZyb20gYSBwYXR0ZXJuIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0dGVybiBUaGUgcGF0dGVyblxuXHQgKiBAcGFyYW0gdmlld0xldmVsIFRoZSBjdXJyZW50IGxldmVsIG9mIHZpZXdcblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqL1xuXHRfZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm46IHN0cmluZywgdmlld0xldmVsOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHNQYXR0ZXJuID0gc1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIi9bXi9dKiRcIik7XG5cdFx0aWYgKHNQYXR0ZXJuICYmIHNQYXR0ZXJuWzBdICE9PSBcIi9cIiAmJiBzUGF0dGVyblswXSAhPT0gXCI/XCIpIHtcblx0XHRcdHNQYXR0ZXJuID0gYC8ke3NQYXR0ZXJufWA7XG5cdFx0fVxuXHRcdGlmIChzUGF0dGVybi5sZW5ndGgpIHtcblx0XHRcdHNQYXR0ZXJuID0gc1BhdHRlcm4ucmVwbGFjZShyZWdleCwgXCJcIik7XG5cdFx0XHRpZiAodGhpcy5vUm91dGVyLm1hdGNoKHNQYXR0ZXJuKSB8fCBzUGF0dGVybiA9PT0gXCJcIikge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0Vmlld0xldmVsRnJvbVBhdHRlcm4oc1BhdHRlcm4sICsrdmlld0xldmVsKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9nZXRWaWV3TGV2ZWxGcm9tUGF0dGVybihzUGF0dGVybiwgdmlld0xldmVsKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHZpZXdMZXZlbDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um91dGVJbmZvcm1hdGlvbihzUm91dGVOYW1lOiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fbVJvdXRlc1tzUm91dGVOYW1lXTtcblx0fVxuXG5cdF9nZXRUYXJnZXRJbmZvcm1hdGlvbihzVGFyZ2V0TmFtZTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX21UYXJnZXRzW3NUYXJnZXROYW1lXTtcblx0fVxuXG5cdF9nZXRDb21wb25lbnRJZChzT3duZXJJZDogYW55LCBzQ29tcG9uZW50SWQ6IGFueSkge1xuXHRcdGlmIChzQ29tcG9uZW50SWQuaW5kZXhPZihgJHtzT3duZXJJZH0tLS1gKSA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHNDb21wb25lbnRJZC5zdWJzdHIoc093bmVySWQubGVuZ3RoICsgMyk7XG5cdFx0fVxuXHRcdHJldHVybiBzQ29tcG9uZW50SWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRhcmdldCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50SW5zdGFuY2UgSW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhcmdldFxuXHQgKi9cblx0Z2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudEluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBzVGFyZ2V0Q29tcG9uZW50SWQgPSB0aGlzLl9nZXRDb21wb25lbnRJZChvQ29tcG9uZW50SW5zdGFuY2UuX3NPd25lcklkLCBvQ29tcG9uZW50SW5zdGFuY2UuZ2V0SWQoKSk7XG5cdFx0bGV0IHNDb3JyZWN0VGFyZ2V0TmFtZSA9IG51bGw7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fbVRhcmdldHMpLmZvckVhY2goKHNUYXJnZXROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmICh0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0uaWQgPT09IHNUYXJnZXRDb21wb25lbnRJZCB8fCB0aGlzLl9tVGFyZ2V0c1tzVGFyZ2V0TmFtZV0udmlld0lkID09PSBzVGFyZ2V0Q29tcG9uZW50SWQpIHtcblx0XHRcdFx0c0NvcnJlY3RUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFRhcmdldEluZm9ybWF0aW9uKHNDb3JyZWN0VGFyZ2V0TmFtZSk7XG5cdH1cblxuXHRnZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmc7XG5cdH1cblxuXHRzZXRMYXN0U2VtYW50aWNNYXBwaW5nKG9NYXBwaW5nPzogU2VtYW50aWNNYXBwaW5nKSB7XG5cdFx0dGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyA9IG9NYXBwaW5nO1xuXHR9XG5cblx0bmF2aWdhdGVUbyhvQ29udGV4dDogYW55LCBzUm91dGVOYW1lOiBhbnksIG1QYXJhbWV0ZXJNYXBwaW5nOiBhbnksIGJQcmVzZXJ2ZUhpc3Rvcnk6IGFueSkge1xuXHRcdGxldCBzVGFyZ2V0VVJMUHJvbWlzZSwgYklzU3RpY2t5TW9kZTogYm9vbGVhbjtcblx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKSAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCAmJiBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSB7XG5cdFx0XHRiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0XHRpZiAoIW1QYXJhbWV0ZXJNYXBwaW5nKSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBubyBwYXJhbWV0ZXIgbWFwcGluZyBkZWZpbmUgdGhpcyBtZWFuIHdlIHJlbHkgZW50aXJlbHkgb24gdGhlIGJpbmRpbmcgY29udGV4dCBwYXRoXG5cdFx0XHRzVGFyZ2V0VVJMUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c1RhcmdldFVSTFByb21pc2UgPSB0aGlzLnByZXBhcmVQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJNYXBwaW5nLCBzUm91dGVOYW1lLCBvQ29udGV4dCkudGhlbigobVBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5vUm91dGVyLmdldFVSTChzUm91dGVOYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHNUYXJnZXRVUkxQcm9taXNlLnRoZW4oKHNUYXJnZXRVUkw6IGFueSkgPT4ge1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkubmF2VG9IYXNoKHNUYXJnZXRVUkwsIGJQcmVzZXJ2ZUhpc3RvcnksIGZhbHNlLCBmYWxzZSwgIWJJc1N0aWNreU1vZGUpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXR1cm4gYSBtYXAgb2Ygcm91dGluZyB0YXJnZXQgcGFyYW1ldGVycyB3aGVyZSB0aGUgYmluZGluZyBzeW50YXggaXMgcmVzb2x2ZWQgdG8gdGhlIGN1cnJlbnQgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQYXJhbWV0ZXJzIG1hcCBpbiB0aGUgZm9ybWF0IFtrOiBzdHJpbmddIDogQ29tcGxleEJpbmRpbmdTeW50YXhcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgcm91dGluZyB0YXJnZXQgcGFyYW1ldGVyc1xuXHQgKi9cblx0cHJlcGFyZVBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSwgc1RhcmdldFJvdXRlOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0bGV0IG9QYXJhbWV0ZXJzUHJvbWlzZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Y29uc3QgYUNvbnRleHRQYXRoUGFydHMgPSBzQ29udGV4dFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgYUFsbFJlc29sdmVkUGFyYW1ldGVyUHJvbWlzZXMgPSBPYmplY3Qua2V5cyhtUGFyYW1ldGVycykubWFwKChzUGFyYW1ldGVyS2V5OiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlck1hcHBpbmdFeHByZXNzaW9uID0gbVBhcmFtZXRlcnNbc1BhcmFtZXRlcktleV07XG5cdFx0XHRcdC8vIFdlIGFzc3VtZSB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uXG5cdFx0XHRcdGNvbnN0IG9QYXJzZWRFeHByZXNzaW9uID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNQYXJhbWV0ZXJNYXBwaW5nRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IG9QYXJzZWRFeHByZXNzaW9uLnBhcnRzIHx8IFtvUGFyc2VkRXhwcmVzc2lvbl07XG5cdFx0XHRcdGNvbnN0IGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzID0gYVBhcnRzLm1hcChmdW5jdGlvbiAob1BhdGhQYXJ0OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBhUmVsYXRpdmVQYXJ0cyA9IG9QYXRoUGFydC5wYXRoLnNwbGl0KFwiLi4vXCIpO1xuXHRcdFx0XHRcdC8vIFdlIGdvIHVwIHRoZSBjdXJyZW50IGNvbnRleHQgcGF0aCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdGNvbnN0IGFMb2NhbFBhcnRzID0gYUNvbnRleHRQYXRoUGFydHMuc2xpY2UoMCwgYUNvbnRleHRQYXRoUGFydHMubGVuZ3RoIC0gYVJlbGF0aXZlUGFydHMubGVuZ3RoICsgMSk7XG5cdFx0XHRcdFx0YUxvY2FsUGFydHMucHVzaChhUmVsYXRpdmVQYXJ0c1thUmVsYXRpdmVQYXJ0cy5sZW5ndGggLSAxXSk7XG5cblx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gYUxvY2FsUGFydHMuam9pbihcIi9cIik7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFDb250ZXh0ID0gKG9NZXRhTW9kZWwgYXMgYW55KS5nZXRNZXRhQ29udGV4dChzUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHNQcm9wZXJ0eVBhdGgpLnRoZW4oZnVuY3Rpb24gKG9WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHlJbmZvID0gb01ldGFDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VkbVR5cGUgPSBvUHJvcGVydHlJbmZvLiRUeXBlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIE9EYXRhVXRpbHMuZm9ybWF0TGl0ZXJhbChvVmFsdWUsIHNFZG1UeXBlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKChhUmVzb2x2ZWRQYXJhbWV0ZXJzOiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IG9QYXJzZWRFeHByZXNzaW9uLmZvcm1hdHRlclxuXHRcdFx0XHRcdFx0PyBvUGFyc2VkRXhwcmVzc2lvbi5mb3JtYXR0ZXIuYXBwbHkodGhpcywgYVJlc29sdmVkUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdDogYVJlc29sdmVkUGFyYW1ldGVycy5qb2luKFwiXCIpO1xuXHRcdFx0XHRcdHJldHVybiB7IGtleTogc1BhcmFtZXRlcktleSwgdmFsdWU6IHZhbHVlIH07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9QYXJhbWV0ZXJzUHJvbWlzZSA9IFByb21pc2UuYWxsKGFBbGxSZXNvbHZlZFBhcmFtZXRlclByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChcblx0XHRcdFx0YUFsbFJlc29sdmVkUGFyYW1ldGVyczogeyBrZXk6IGFueTsgdmFsdWU6IGFueSB9W11cblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0XHRcdGFBbGxSZXNvbHZlZFBhcmFtZXRlcnMuZm9yRWFjaChmdW5jdGlvbiAob1Jlc29sdmVkUGFyYW1ldGVyOiB7IGtleTogYW55OyB2YWx1ZTogYW55IH0pIHtcblx0XHRcdFx0XHRvUGFyYW1ldGVyc1tvUmVzb2x2ZWRQYXJhbWV0ZXIua2V5XSA9IG9SZXNvbHZlZFBhcmFtZXRlci52YWx1ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvUGFyYW1ldGVycztcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKGBDb3VsZCBub3QgcGFyc2UgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBuYXZpZ2F0aW9uIHRvIHJvdXRlICR7c1RhcmdldFJvdXRlfWApO1xuXHRcdFx0b1BhcmFtZXRlcnNQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXHRcdHJldHVybiBvUGFyYW1ldGVyc1Byb21pc2U7XG5cdH1cblxuXHRfZmlyZVJvdXRlTWF0Y2hFdmVudHMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgbVBhcmFtZXRlcnMpO1xuXHRcdHRoaXMuZXZlbnRQcm92aWRlci5maXJlRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBtUGFyYW1ldGVycyk7XG5cblx0XHRFZGl0U3RhdGUuY2xlYW5Qcm9jZXNzZWRFZGl0U3RhdGUoKTsgLy8gUmVzZXQgVUkgc3RhdGUgd2hlbiBhbGwgYmluZGluZ3MgaGF2ZSBiZWVuIHJlZnJlc2hlZFxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwsIG1hcCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZV0gTmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgd2l0aG91dCBjaGFuZ2luZyB0aGUgVVJMXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0XSBUaGUgY29udGV4dCBpcyBjcmVhdGVkIGFzeW5jLCBuYXZpZ2F0ZSB0byAoLi4uKSBhbmRcblx0ICogICAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIFByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYW5kIHRoZW4gbmF2aWdhdGUgaW50byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHRdIFRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgZGVmZXJyZWQgYXQgdGhlIHRhcmdldCBwYWdlXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZWRpdGFibGVdIFRoZSB0YXJnZXQgcGFnZSBzaGFsbCBiZSBpbW1lZGlhdGVseSBpbiB0aGUgZWRpdCBtb2RlIHRvIGF2b2lkIGZsaWNrZXJpbmdcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsXSBUaGUgYlBlcnNpc3RPUFNjcm9sbCB3aWxsIGJlIHVzZWQgZm9yIHNjcm9sbGluZyB0byBmaXJzdCB0YWJcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbF0gYCsxYCBpZiB3ZSBhZGQgYSBjb2x1bW4gaW4gRkNMLCBgLTFgIHRvIHJlbW92ZSBhIGNvbHVtbiwgMCB0byBzdGF5IG9uIHRoZSBzYW1lIGNvbHVtblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm5vUHJlc2VydmF0aW9uQ2FjaGVdIERvIG5hdmlnYXRpb24gd2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwcmVzZXJ2ZWQgY2FjaGUgbWVjaGFuaXNtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYlJlY3JlYXRlQ29udGV4dF0gRm9yY2UgcmUtY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lIHBhc3NlZCBhcyBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5iRm9yY2VGb2N1c10gRm9yY2VzIGZvY3VzIHNlbGVjdGlvbiBhZnRlciBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBbb1ZpZXdEYXRhXSBWaWV3IGRhdGFcblx0ICogQHBhcmFtIFtvQ3VycmVudFRhcmdldEluZm9dIFRoZSB0YXJnZXQgaW5mb3JtYXRpb24gZnJvbSB3aGljaCB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRuYXZpZ2F0ZVRvQ29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdG1QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U/OiBib29sZWFuO1xuXHRcdFx0XHRcdGFzeW5jQ29udGV4dD86IFByb21pc2U8YW55Pjtcblx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0PzogYm9vbGVhbjtcblx0XHRcdFx0XHRlZGl0YWJsZT86IGJvb2xlYW47XG5cdFx0XHRcdFx0dHJhbnNpZW50PzogYm9vbGVhbjtcblx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbD86IG51bWJlcjtcblx0XHRcdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlPzogYm9vbGVhbjtcblx0XHRcdFx0XHRiUmVjcmVhdGVDb250ZXh0PzogYm9vbGVhbjtcblx0XHRcdFx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW47XG5cdFx0XHRcdFx0dGFyZ2V0UGF0aD86IHN0cmluZztcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJEcmFmdE5hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eT86IGJvb2xlYW47XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkLFxuXHRcdG9WaWV3RGF0YTogYW55IHwgdW5kZWZpbmVkLFxuXHRcdG9DdXJyZW50VGFyZ2V0SW5mbzogYW55IHwgdW5kZWZpbmVkXG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGxldCBzVGFyZ2V0Um91dGU6IHN0cmluZyA9IFwiXCIsXG5cdFx0XHRvUm91dGVQYXJhbWV0ZXJzUHJvbWlzZSxcblx0XHRcdGJJc1N0aWNreU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpICYmIG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKSB7XG5cdFx0XHRiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0XHQvLyBNYW5hZ2UgcGFyYW1ldGVyIG1hcHBpbmdcblx0XHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMudGFyZ2V0UGF0aCAmJiBvVmlld0RhdGEgJiYgb1ZpZXdEYXRhLm5hdmlnYXRpb24pIHtcblx0XHRcdGNvbnN0IG9Sb3V0ZURldGFpbCA9IG9WaWV3RGF0YS5uYXZpZ2F0aW9uW21QYXJhbWV0ZXJzLnRhcmdldFBhdGhdLmRldGFpbDtcblx0XHRcdHNUYXJnZXRSb3V0ZSA9IG9Sb3V0ZURldGFpbC5yb3V0ZTtcblxuXHRcdFx0aWYgKG9Sb3V0ZURldGFpbC5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlID0gdGhpcy5wcmVwYXJlUGFyYW1ldGVycyhvUm91dGVEZXRhaWwucGFyYW1ldGVycywgc1RhcmdldFJvdXRlLCBvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNUYXJnZXRQYXRoID0gdGhpcy5fZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gSWYgdGhlIHBhdGggaXMgZW1wdHksIHdlJ3JlIHN1cHBvc2VkIHRvIG5hdmlnYXRlIHRvIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBhcHBcblx0XHQvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGV4aXQgZnJvbSB0aGUgYXBwIGluc3RlYWRcblx0XHRpZiAoc1RhcmdldFBhdGgubGVuZ3RoID09PSAwICYmIHRoaXMuYkV4aXRPbk5hdmlnYXRlQmFja1RvUm9vdCkge1xuXHRcdFx0dGhpcy5vUm91dGVyUHJveHkuZXhpdEZyb21BcHAoKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGNvbnRleHQgaXMgZGVmZXJyZWQgb3IgYXN5bmMsIHdlIGFkZCAoLi4uKSB0byB0aGUgcGF0aFxuXHRcdGlmIChtUGFyYW1ldGVycz8uYXN5bmNDb250ZXh0IHx8IG1QYXJhbWV0ZXJzPy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBcIiguLi4pXCI7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGxheW91dCBwYXJhbWV0ZXIgaWYgbmVlZGVkXG5cdFx0Y29uc3Qgc0xheW91dCA9IHRoaXMuX2NhbGN1bGF0ZUxheW91dChzVGFyZ2V0UGF0aCwgbVBhcmFtZXRlcnMpO1xuXHRcdGlmIChzTGF5b3V0KSB7XG5cdFx0XHRzVGFyZ2V0UGF0aCArPSBgP2xheW91dD0ke3NMYXlvdXR9YDtcblx0XHR9XG5cblx0XHQvLyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgZm9yIGxhdGVyIHVzYWdlXG5cdFx0Y29uc3Qgb05hdmlnYXRpb25JbmZvID0ge1xuXHRcdFx0b0FzeW5jQ29udGV4dDogbVBhcmFtZXRlcnM/LmFzeW5jQ29udGV4dCxcblx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IG1QYXJhbWV0ZXJzPy5iRGVmZXJyZWRDb250ZXh0LFxuXHRcdFx0YlRhcmdldEVkaXRhYmxlOiBtUGFyYW1ldGVycz8uZWRpdGFibGUsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBtUGFyYW1ldGVycz8uYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdHVzZUNvbnRleHQ6IG1QYXJhbWV0ZXJzPy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEgfHwgbVBhcmFtZXRlcnM/LmJSZWNyZWF0ZUNvbnRleHQgPyB1bmRlZmluZWQgOiBvQ29udGV4dCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG1QYXJhbWV0ZXJzPy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0YlNob3dQbGFjZWhvbGRlcjogbVBhcmFtZXRlcnM/LnNob3dQbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkID8gbVBhcmFtZXRlcnM/LnNob3dQbGFjZWhvbGRlciA6IHRydWUsXG5cdFx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk6IG1QYXJhbWV0ZXJzPy5iTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHlcblx0XHR9O1xuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzPy5jaGVja05vSGFzaENoYW5nZSkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIG5ldyBoYXNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0Y29uc3Qgc0N1cnJlbnRIYXNoTm9BcHBTdGF0ZSA9IHRoaXMub1JvdXRlclByb3h5LmdldEhhc2goKS5yZXBsYWNlKC9bJj9dezF9c2FwLWlhcHAtc3RhdGU9W0EtWjAtOV0rLywgXCJcIik7XG5cdFx0XHRpZiAoc1RhcmdldFBhdGggPT09IHNDdXJyZW50SGFzaE5vQXBwU3RhdGUpIHtcblx0XHRcdFx0Ly8gVGhlIGhhc2ggZG9lc24ndCBjaGFuZ2UsIGJ1dCB3ZSBmaXJlIHRoZSByb3V0ZU1hdGNoIGV2ZW50IHRvIHRyaWdnZXIgcGFnZSByZWZyZXNoIC8gYmluZGluZ1xuXHRcdFx0XHRjb25zdCBtRXZlbnRQYXJhbWV0ZXJzOiBhbnkgPSB0aGlzLm9Sb3V0ZXIuZ2V0Um91dGVJbmZvQnlIYXNoKHRoaXMub1JvdXRlclByb3h5LmdldEhhc2goKSk7XG5cdFx0XHRcdGlmIChtRXZlbnRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0bUV2ZW50UGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IG9OYXZpZ2F0aW9uSW5mbztcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLnJvdXRlSW5mb3JtYXRpb24gPSB0aGlzLl9nZXRSb3V0ZUluZm9ybWF0aW9uKHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUpO1xuXHRcdFx0XHRcdG1FdmVudFBhcmFtZXRlcnMucm91dGVQYXR0ZXJuID0gdGhpcy5zQ3VycmVudFJvdXRlUGF0dGVybjtcblx0XHRcdFx0XHRtRXZlbnRQYXJhbWV0ZXJzLnZpZXdzID0gdGhpcy5hQ3VycmVudFZpZXdzO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5vUm91dGVyUHJveHkuc2V0Rm9jdXNGb3JjZWQoISFtUGFyYW1ldGVycy5iRm9yY2VGb2N1cyk7XG5cblx0XHRcdFx0dGhpcy5fZmlyZVJvdXRlTWF0Y2hFdmVudHMobUV2ZW50UGFyYW1ldGVycyk7XG5cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnM/LnRyYW5zaWVudCAmJiBtUGFyYW1ldGVycy5lZGl0YWJsZSA9PSB0cnVlICYmIHNUYXJnZXRQYXRoLmluZGV4T2YoXCIoLi4uKVwiKSA9PT0gLTEpIHtcblx0XHRcdGlmIChzVGFyZ2V0UGF0aC5pbmRleE9mKFwiP1wiKSA+IC0xKSB7XG5cdFx0XHRcdHNUYXJnZXRQYXRoICs9IFwiJmktYWN0aW9uPWNyZWF0ZVwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1RhcmdldFBhdGggKz0gXCI/aS1hY3Rpb249Y3JlYXRlXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2xlYXIgdW5ib3VuZCBtZXNzYWdlcyB1cG9uIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUFxuXHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHN0YWxlIGVycm9yIG1lc3NhZ2VzIGZyb20gTFIgYXJlIG5vdCBzaG93biB0byB0aGUgdXNlciBhZnRlciBuYXZpZ2F0aW9uIHRvIE9QLlxuXHRcdGlmIChvQ3VycmVudFRhcmdldEluZm8gJiYgb0N1cnJlbnRUYXJnZXRJbmZvLm5hbWUgPT09IFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0XCIpIHtcblx0XHRcdGNvbnN0IG9Sb3V0ZUluZm8gPSB0aGlzLm9Sb3V0ZXIuZ2V0Um91dGVJbmZvQnlIYXNoKHNUYXJnZXRQYXRoKTtcblx0XHRcdGlmIChvUm91dGVJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb3V0ZSA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24ob1JvdXRlSW5mby5uYW1lKTtcblx0XHRcdFx0aWYgKG9Sb3V0ZSAmJiBvUm91dGUudGFyZ2V0cyAmJiBvUm91dGUudGFyZ2V0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc0xhc3RUYXJnZXROYW1lID0gb1JvdXRlLnRhcmdldHNbb1JvdXRlLnRhcmdldHMubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IHRoaXMuX2dldFRhcmdldEluZm9ybWF0aW9uKHNMYXN0VGFyZ2V0TmFtZSk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgb1RhcmdldC5uYW1lID09PSBcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZVwiKSB7XG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGluIHRoZSBxdWV1ZVxuXHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5wdXNoKG9OYXZpZ2F0aW9uSW5mbyk7XG5cblx0XHRpZiAoc1RhcmdldFJvdXRlICYmIG9Sb3V0ZVBhcmFtZXRlcnNQcm9taXNlKSB7XG5cdFx0XHRyZXR1cm4gb1JvdXRlUGFyYW1ldGVyc1Byb21pc2UudGhlbigob1JvdXRlUGFyYW1ldGVyczogYW55KSA9PiB7XG5cdFx0XHRcdG9Sb3V0ZVBhcmFtZXRlcnMuYklzU3RpY2t5TW9kZSA9IGJJc1N0aWNreU1vZGU7XG5cdFx0XHRcdHRoaXMub1JvdXRlci5uYXZUbyhzVGFyZ2V0Um91dGUsIG9Sb3V0ZVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm9Sb3V0ZXJQcm94eVxuXHRcdFx0Lm5hdlRvSGFzaChzVGFyZ2V0UGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzPy5ub1ByZXNlcnZhdGlvbkNhY2hlLCBtUGFyYW1ldGVycz8uYkZvcmNlRm9jdXMsICFiSXNTdGlja3lNb2RlKVxuXHRcdFx0LnRoZW4oKGJOYXZpZ2F0ZWQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoIWJOYXZpZ2F0ZWQpIHtcblx0XHRcdFx0XHQvLyBUaGUgbmF2aWdhdGlvbiBkaWQgbm90IGhhcHBlbiAtLT4gcmVtb3ZlIHRoZSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgcXVldWUgYXMgdGhleSBzaG91bGRuJ3QgYmUgdXNlZFxuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5wb3AoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRlZDtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHJvdXRlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuUm91dGluZyNuYXZpZ2F0ZVRvUm91dGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlJvdXRpbmdcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUm91dGVQYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUm91dGVQYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0Y29uc3Qgc1RhcmdldFVSTCA9IHRoaXMub1JvdXRlci5nZXRVUkwoc1RhcmdldFJvdXRlTmFtZSwgb1JvdXRlUGFyYW1ldGVycyk7XG5cdFx0cmV0dXJuIHRoaXMub1JvdXRlclByb3h5Lm5hdlRvSGFzaChzVGFyZ2V0VVJMLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAhb1JvdXRlUGFyYW1ldGVycy5iSXNTdGlja3lNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIG9yIGBmYWxzZWAgaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW1wYWN0ZWQgb3Igbm90XG5cdCAqL1xuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIHdpdGggdGhlIHRlY2huaWNhbCBwYXRoLiBXZSBoYXZlIHRvIHRyeSBpdCwgYmVjYXVzZSBmb3IgbGV2ZWwgPiAxLCB3ZVxuXHRcdC8vIHVzZXMgdGVjaG5pY2FsIGtleXMgZXZlbiBpZiBTZW1hbnRpYyBrZXlzIGFyZSBlbmFibGVkXG5cdFx0aWYgKHRoaXMub1JvdXRlclByb3h5LmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShzUGF0aCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoL15bXlxcKFxcKV0rXFwoW15cXChcXCldK1xcKSQvLnRlc3Qoc1BhdGgpKSB7XG5cdFx0XHQvLyBJZiB0aGUgY3VycmVudCBwYXRoIGNhbiBiZSBzZW1hbnRpYyAoaS5lLiBpcyBsaWtlIHh4eCh5eXkpKVxuXHRcdFx0Ly8gY2hlY2sgd2l0aCB0aGUgc2VtYW50aWMgcGF0aCBpZiB3ZSBjYW4gZmluZCBpdFxuXHRcdFx0bGV0IHNTZW1hbnRpY1BhdGg7XG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIGhhdmUgYWxyZWFkeSByZXNvbHZlZCB0aGlzIHNlbWFudGljIHBhdGhcblx0XHRcdFx0c1NlbWFudGljUGF0aCA9IHRoaXMub0xhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzU2VtYW50aWNQYXRoICE9IHNQYXRoID8gdGhpcy5vUm91dGVyUHJveHkuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KHNTZW1hbnRpY1BhdGgpIDogZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRfZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoOiBhbnkpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIi9bXi9dKiRcIik7XG5cdFx0c1BhdGggPSBzUGF0aC5yZXBsYWNlKHJlZ2V4LCBcIlwiKTtcblx0XHRpZiAodGhpcy5vUm91dGVyLm1hdGNoKHNQYXRoKSB8fCBzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblx0XHR9XG5cdH1cblxuXHRfY2hlY2tJZkNvbnRleHRTdXBwb3J0c1NlbWFudGljUGF0aChvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly8gRmlyc3QsIGNoZWNrIGlmIHRoaXMgaXMgYSBsZXZlbC0xIG9iamVjdCAocGF0aCA9IC9hYWEoYmJiKSlcblx0XHRpZiAoIS9eXFwvW15cXChdK1xcKFteXFwpXStcXCkkLy50ZXN0KHNQYXRoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIFRoZW4gY2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgc2VtYW50aWMga2V5c1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpIGFzIGFueSBhcyBzdHJpbmc7XG5cdFx0aWYgKCFTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlbiBjaGVjayB0aGUgZW50aXR5IGlzIGRyYWZ0LWVuYWJsZWRcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBzUGF0aCk7XG5cdH1cblxuXHRfZ2V0UGF0aEZyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRsZXQgc1BhdGg7XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiYgb0NvbnRleHQuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRzUGF0aCA9IG9Db250ZXh0LmdldEhlYWRlckNvbnRleHQoKS5nZXRQYXRoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEpIHtcblx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBiYWNrIGZyb20gYSBjb250ZXh0LCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhcblx0XHRcdHNQYXRoID0gdGhpcy5fZmluZFBhdGhUb05hdmlnYXRlKHNQYXRoKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UncmUgbmF2aWdhdGluZyBiYWNrIHRvIGEgc2VtYW50aWMgcGF0aCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlc29sdmVkXG5cdFx0XHRpZiAodGhpcy5vTGFzdFNlbWFudGljTWFwcGluZyAmJiB0aGlzLm9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPT09IHNQYXRoKSB7XG5cdFx0XHRcdHNQYXRoID0gdGhpcy5vTGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9jaGVja0lmQ29udGV4dFN1cHBvcnRzU2VtYW50aWNQYXRoKG9Db250ZXh0KSkge1xuXHRcdFx0Ly8gV2UgY2hlY2sgaWYgd2UgaGF2ZSB0byB1c2UgYSBzZW1hbnRpYyBwYXRoXG5cdFx0XHRjb25zdCBzU2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9Db250ZXh0LCB0cnVlKTtcblxuXHRcdFx0aWYgKCFzU2VtYW50aWNQYXRoKSB7XG5cdFx0XHRcdC8vIFdlIHdlcmUgbm90IGFibGUgdG8gYnVpbGQgdGhlIHNlbWFudGljIHBhdGggLS0+IFVzZSB0aGUgdGVjaG5pY2FsIHBhdGggYW5kXG5cdFx0XHRcdC8vIGNsZWFyIHRoZSBwcmV2aW91cyBtYXBwaW5nLCBvdGhlcndpc2UgdGhlIG9sZCBtYXBwaW5nIGlzIHVzZWQgaW4gRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0XHRcdFx0Ly8gYW5kIGl0IGxlYWRzIHRvIHVud2FudGVkIHBhZ2UgcmVsb2Fkc1xuXHRcdFx0XHR0aGlzLnNldExhc3RTZW1hbnRpY01hcHBpbmcodW5kZWZpbmVkKTtcblx0XHRcdH0gZWxzZSBpZiAoc1NlbWFudGljUGF0aCAhPT0gc1BhdGgpIHtcblx0XHRcdFx0Ly8gU3RvcmUgdGhlIG1hcHBpbmcgdGVjaG5pY2FsIDwtPiBzZW1hbnRpYyBwYXRoIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgaXQgbGF0ZXJcblx0XHRcdFx0Ly8gYW5kIHVzZSB0aGUgc2VtYW50aWMgcGF0aCBpbnN0ZWFkIG9mIHRoZSB0ZWNobmljYWwgb25lXG5cdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdHNQYXRoID0gc1NlbWFudGljUGF0aDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgZXh0cmEgJy8nIGF0IHRoZSBiZWdpbm5pbmcgb2YgcGF0aFxuXHRcdGlmIChzUGF0aFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHNQYXRoID0gc1BhdGguc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzUGF0aDtcblx0fVxuXG5cdF9jYWxjdWxhdGVMYXlvdXQoc1BhdGg6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBGQ0xMZXZlbCA9IG1QYXJhbWV0ZXJzLkZDTExldmVsO1xuXHRcdGlmIChtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCkge1xuXHRcdFx0RkNMTGV2ZWwgKz0gbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWw7XG5cdFx0XHRpZiAoRkNMTGV2ZWwgPCAwKSB7XG5cdFx0XHRcdEZDTExldmVsID0gMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnkpLmNhbGN1bGF0ZUxheW91dChcblx0XHRcdEZDTExldmVsLFxuXHRcdFx0c1BhdGgsXG5cdFx0XHRtUGFyYW1ldGVycy5zTGF5b3V0LFxuXHRcdFx0bVBhcmFtZXRlcnMua2VlcEN1cnJlbnRMYXlvdXRcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgYmVmb3JlIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogRGlzcGxheXMgYSBidXN5IGluZGljYXRvci5cblx0ICpcblx0ICovXG5cdF9iZWZvcmVSb3V0ZU1hdGNoZWQoLypvRXZlbnQ6IEV2ZW50Ki8pIHtcblx0XHRjb25zdCBiUGxhY2Vob2xkZXJFbmFibGVkID0gbmV3IFBsYWNlaG9sZGVyKCkuaXNQbGFjZWhvbGRlckVuYWJsZWQoKTtcblx0XHRpZiAoIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdGNvbnN0IG9Sb290VmlldyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Sb290Vmlldyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IGhhbmRsZXIgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEhpZGVzIHRoZSBidXN5IGluZGljYXRvciBhbmQgZmlyZXMgaXRzIG93biAncm91dGVtYXRjaGVkJyBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlSGFuZGxlciA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRBcHBTdGF0ZUhhbmRsZXIoKSxcblx0XHRcdG9Sb290VmlldyA9IHRoaXMub0FwcENvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGNvbnN0IGJQbGFjZWhvbGRlckVuYWJsZWQgPSBuZXcgUGxhY2Vob2xkZXIoKS5pc1BsYWNlaG9sZGVyRW5hYmxlZCgpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Sb290VmlldykgJiYgIWJQbGFjZWhvbGRlckVuYWJsZWQpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Sb290Vmlldyk7XG5cdFx0fVxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpO1xuXHRcdGlmICh0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUubGVuZ3RoKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mbyA9IHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZVswXTtcblx0XHRcdHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZSA9IHRoaXMubmF2aWdhdGlvbkluZm9RdWV1ZS5zbGljZSgxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMubmF2aWdhdGlvbkluZm8gPSB7fTtcblx0XHR9XG5cdFx0aWYgKG9BcHBTdGF0ZUhhbmRsZXIuY2hlY2tJZlJvdXRlQ2hhbmdlZEJ5SUFwcCgpKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5uYXZpZ2F0aW9uSW5mby5iUmVhc29uSXNJYXBwU3RhdGUgPSB0cnVlO1xuXHRcdFx0b0FwcFN0YXRlSGFuZGxlci5yZXNldFJvdXRlQ2hhbmdlZEJ5SUFwcCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuc0N1cnJlbnRSb3V0ZU5hbWUgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmFtZVwiKTtcblx0XHR0aGlzLnNDdXJyZW50Um91dGVQYXR0ZXJuID0gbVBhcmFtZXRlcnMuY29uZmlnLnBhdHRlcm47XG5cdFx0dGhpcy5hQ3VycmVudFZpZXdzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZpZXdzXCIpO1xuXG5cdFx0bVBhcmFtZXRlcnMucm91dGVJbmZvcm1hdGlvbiA9IHRoaXMuX2dldFJvdXRlSW5mb3JtYXRpb24odGhpcy5zQ3VycmVudFJvdXRlTmFtZSk7XG5cdFx0bVBhcmFtZXRlcnMucm91dGVQYXR0ZXJuID0gdGhpcy5zQ3VycmVudFJvdXRlUGF0dGVybjtcblxuXHRcdHRoaXMuX2ZpcmVSb3V0ZU1hdGNoRXZlbnRzKG1QYXJhbWV0ZXJzKTtcblxuXHRcdC8vIENoZWNrIGlmIGN1cnJlbnQgaGFzaCBoYXMgYmVlbiBzZXQgYnkgdGhlIHJvdXRlclByb3h5Lm5hdlRvSGFzaCBmdW5jdGlvblxuXHRcdC8vIElmIG5vdCwgcmVidWlsZCBoaXN0b3J5IHByb3Blcmx5IChib3RoIGluIHRoZSBicm93c2VyIGFuZCB0aGUgUm91dGVyUHJveHkpXG5cdFx0aWYgKCFoaXN0b3J5LnN0YXRlIHx8IGhpc3Rvcnkuc3RhdGUuZmVMZXZlbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eVxuXHRcdFx0XHQucmVzdG9yZUhpc3RvcnkoKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUm91dGVyUHJveHkucmVzb2x2ZVJvdXRlTWF0Y2goKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlc3RvcmluZyBoaXN0b3J5XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXJQcm94eS5yZXNvbHZlUm91dGVNYXRjaCgpO1xuXHRcdH1cblx0fVxuXG5cdGF0dGFjaFJvdXRlTWF0Y2hlZChvRGF0YTogYW55LCBmbkZ1bmN0aW9uPzogYW55LCBvTGlzdGVuZXI/OiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnQoXCJyb3V0ZU1hdGNoZWRcIiwgb0RhdGEsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0ZGV0YWNoUm91dGVNYXRjaGVkKGZuRnVuY3Rpb246IGFueSwgb0xpc3RlbmVyPzogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmRldGFjaEV2ZW50KFwicm91dGVNYXRjaGVkXCIsIGZuRnVuY3Rpb24sIG9MaXN0ZW5lcik7XG5cdH1cblx0YXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQob0RhdGE6IGFueSwgZm5GdW5jdGlvbjogYW55LCBvTGlzdGVuZXI/OiBhbnkpIHtcblx0XHR0aGlzLmV2ZW50UHJvdmlkZXIuYXR0YWNoRXZlbnQoXCJhZnRlclJvdXRlTWF0Y2hlZFwiLCBvRGF0YSwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXHRkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZChmbkZ1bmN0aW9uOiBhbnksIG9MaXN0ZW5lcjogYW55KSB7XG5cdFx0dGhpcy5ldmVudFByb3ZpZGVyLmRldGFjaEV2ZW50KFwiYWZ0ZXJSb3V0ZU1hdGNoZWRcIiwgZm5GdW5jdGlvbiwgb0xpc3RlbmVyKTtcblx0fVxuXG5cdGdldFJvdXRlRnJvbUhhc2gob1JvdXRlcjogYW55LCBvQXBwQ29tcG9uZW50OiBhbnkpIHtcblx0XHRjb25zdCBzSGFzaCA9IG9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5oYXNoO1xuXHRcdGNvbnN0IG9Sb3V0ZUluZm8gPSBvUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzSGFzaCk7XG5cdFx0cmV0dXJuIG9BcHBDb21wb25lbnRcblx0XHRcdC5nZXRNZXRhZGF0YSgpXG5cdFx0XHQuZ2V0TWFuaWZlc3RFbnRyeShcIi9zYXAudWk1L3JvdXRpbmcvcm91dGVzXCIpXG5cdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvUm91dGU6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1JvdXRlLm5hbWUgPT09IG9Sb3V0ZUluZm8ubmFtZTtcblx0XHRcdH0pWzBdO1xuXHR9XG5cdGdldFRhcmdldHNGcm9tUm91dGUob1JvdXRlOiBhbnkpIHtcblx0XHRjb25zdCBvVGFyZ2V0ID0gb1JvdXRlLnRhcmdldDtcblx0XHRpZiAodHlwZW9mIG9UYXJnZXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBbdGhpcy5fbVRhcmdldHNbb1RhcmdldF1dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0OiBhbnlbXSA9IFtdO1xuXHRcdFx0b1RhcmdldC5mb3JFYWNoKChzVGFyZ2V0OiBhbnkpID0+IHtcblx0XHRcdFx0YVRhcmdldC5wdXNoKHRoaXMuX21UYXJnZXRzW3NUYXJnZXRdKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGFUYXJnZXQ7XG5cdFx0fVxuXHR9XG5cblx0aW5pdGlhbGl6ZVJvdXRpbmcoKSB7XG5cdFx0Ly8gQXR0YWNoIHJvdXRlciBoYW5kbGVyc1xuXHRcdHRoaXMuX2ZuT25Sb3V0ZU1hdGNoZWQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMub1JvdXRlci5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5PblJvdXRlTWF0Y2hlZCwgdGhpcyk7XG5cdFx0Y29uc3QgYlBsYWNlaG9sZGVyRW5hYmxlZCA9IG5ldyBQbGFjZWhvbGRlcigpLmlzUGxhY2Vob2xkZXJFbmFibGVkKCk7XG5cdFx0aWYgKCFiUGxhY2Vob2xkZXJFbmFibGVkKSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIuYXR0YWNoQmVmb3JlUm91dGVNYXRjaGVkKHRoaXMuX2JlZm9yZVJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0Ly8gUmVzZXQgaW50ZXJuYWwgc3RhdGVcblx0XHR0aGlzLm5hdmlnYXRpb25JbmZvUXVldWUgPSBbXTtcblx0XHRFZGl0U3RhdGUucmVzZXRFZGl0U3RhdGUoKTtcblx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSAhdGhpcy5vUm91dGVyLm1hdGNoKFwiXCIpO1xuXG5cdFx0Y29uc3QgYklzSWFwcFN0YXRlID0gdGhpcy5vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpLmluZGV4T2YoXCJzYXAtaWFwcC1zdGF0ZVwiKSAhPT0gLTE7XG5cdFx0cmV0dXJuIHRoaXMub0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFN0YXJ0dXBQYXJhbWV0ZXJzKClcblx0XHRcdC50aGVuKChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBiSGFzU3RhcnRVcFBhcmFtZXRlcnMgPSBvU3RhcnR1cFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhvU3RhcnR1cFBhcmFtZXRlcnMpLmxlbmd0aCAhPT0gMDtcblx0XHRcdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdC8vIE1hbmFnZSBzdGFydHVwIHBhcmFtZXRlcnMgKGluIGNhc2Ugb2Ygbm8gaWFwcC1zdGF0ZSlcblx0XHRcdFx0aWYgKCFiSXNJYXBwU3RhdGUgJiYgYkhhc1N0YXJ0VXBQYXJhbWV0ZXJzICYmICFzSGFzaCkge1xuXHRcdFx0XHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXS5pbmRleE9mKFwiY3JlYXRlXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIG1vZGVcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9tYW5hZ2VDcmVhdGVTdGFydHVwKG9TdGFydHVwUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIERlZXAgbGlua1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX21hbmFnZURlZXBMaW5rU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHJvdXRpbmcgaW5pdGlhbGl6YXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0Z2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0cmV0dXJuIEFwcFN0YXJ0dXBIZWxwZXIuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCB0aGlzLmdldENvbnRleHRQYXRoKCksIHRoaXMub1JvdXRlcik7XG5cdH1cblxuXHRfbWFuYWdlQ3JlYXRlU3RhcnR1cChvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiBBcHBTdGFydHVwSGVscGVyLmdldENyZWF0ZVN0YXJ0dXBIYXNoKG9TdGFydHVwUGFyYW1ldGVycywgdGhpcy5nZXRDb250ZXh0UGF0aCgpLCB0aGlzLm9Sb3V0ZXIsIHRoaXMub01ldGFNb2RlbCkudGhlbihcblx0XHRcdChzTmV3SGFzaDogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChzTmV3SGFzaCkge1xuXHRcdFx0XHRcdCh0aGlzLm9Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5yZXBsYWNlSGFzaCBhcyBhbnkpKHNOZXdIYXNoKTtcblx0XHRcdFx0XHR0aGlzLm9BcHBDb21wb25lbnQuc2V0U3RhcnR1cE1vZGVDcmVhdGUoKTtcblx0XHRcdFx0XHR0aGlzLmJFeGl0T25OYXZpZ2F0ZUJhY2tUb1Jvb3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdF9tYW5hZ2VEZWVwTGlua1N0YXJ0dXAob1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gQXBwU3RhcnR1cEhlbHBlci5nZXREZWVwTGlua1N0YXJ0dXBIYXNoKFxuXHRcdFx0KHRoaXMub0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpIGFzIGFueSlbXCJzYXAudWk1XCJdLnJvdXRpbmcsXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHR0aGlzLm9Nb2RlbFxuXHRcdCkudGhlbigob0RlZXBMaW5rOiBhbnkpID0+IHtcblx0XHRcdGxldCBzSGFzaDtcblx0XHRcdGlmIChvRGVlcExpbmsuY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzVGVjaG5pY2FsUGF0aCA9IG9EZWVwTGluay5jb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc1NlbWFudGljUGF0aCA9IHRoaXMuX2NoZWNrSWZDb250ZXh0U3VwcG9ydHNTZW1hbnRpY1BhdGgob0RlZXBMaW5rLmNvbnRleHQpXG5cdFx0XHRcdFx0PyBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0RlZXBMaW5rLmNvbnRleHQpXG5cdFx0XHRcdFx0OiBzVGVjaG5pY2FsUGF0aDtcblxuXHRcdFx0XHRpZiAoc1NlbWFudGljUGF0aCAhPT0gc1RlY2huaWNhbFBhdGgpIHtcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgbWFwcGluZyB0ZWNobmljYWwgPC0+IHNlbWFudGljIHBhdGggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBsYXRlclxuXHRcdFx0XHRcdC8vIGFuZCB1c2UgdGhlIHNlbWFudGljIHBhdGggaW5zdGVhZCBvZiB0aGUgdGVjaG5pY2FsIG9uZVxuXHRcdFx0XHRcdHRoaXMuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7IHRlY2huaWNhbFBhdGg6IHNUZWNobmljYWxQYXRoLCBzZW1hbnRpY1BhdGg6IHNTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzSGFzaCA9IHNTZW1hbnRpY1BhdGguc3Vic3RyaW5nKDEpOyAvLyBUbyByZW1vdmUgdGhlIGxlYWRpbmcgJy8nXG5cdFx0XHR9IGVsc2UgaWYgKG9EZWVwTGluay5oYXNoKSB7XG5cdFx0XHRcdHNIYXNoID0gb0RlZXBMaW5rLmhhc2g7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzSGFzaCkge1xuXHRcdFx0XHQvL1JlcGxhY2UgdGhlIGhhc2ggd2l0aCBuZXdseSBjcmVhdGVkIGhhc2hcblx0XHRcdFx0KHRoaXMub1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLnJlcGxhY2VIYXNoIGFzIGFueSkoc0hhc2gpO1xuXHRcdFx0XHR0aGlzLm9BcHBDb21wb25lbnQuc2V0U3RhcnR1cE1vZGVEZWVwbGluaygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Z2V0T3V0Ym91bmRzKCkge1xuXHRcdHJldHVybiB0aGlzLm91dGJvdW5kcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEcmFmdCByb290IGVudGl0eSBzZXQgb3IgdGhlIHN0aWNreS1lbmFibGVkIGVudGl0eSBzZXQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSByb290IEVudGl0eVNldFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGdldENvbnRleHRQYXRoKCkge1xuXHRcdHJldHVybiB0aGlzLnNDb250ZXh0UGF0aDtcblx0fVxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBSb3V0aW5nU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxSb3V0aW5nU2VydmljZVNldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8Um91dGluZ1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBvUm91dGluZ1NlcnZpY2UgPSBuZXcgUm91dGluZ1NlcnZpY2Uob1NlcnZpY2VDb250ZXh0KTtcblx0XHRyZXR1cm4gb1JvdXRpbmdTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5c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
|