@talrace/ngx-noder 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -66
- package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +61 -0
- package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +7 -0
- package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +47 -0
- package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +32 -0
- package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +64 -0
- package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +89 -0
- package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +22 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +111 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +37 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +49 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +90 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +81 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +28 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +22 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +53 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +18 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +27 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +71 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +94 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +24 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +65 -0
- package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +84 -0
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +90 -0
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +117 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +8 -0
- package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/numbering-templates.const.mjs +6 -6
- package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +157 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +8 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +11 -0
- package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.mjs +1 -1
- package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +6 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +34 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +26 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +60 -0
- package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +55 -0
- package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +54 -0
- package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +84 -0
- package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +123 -0
- package/esm2022/lib/editor/components/edges/edge-element.model.mjs +9 -0
- package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +6 -0
- package/esm2022/lib/editor/components/edges/edge.component.mjs +99 -0
- package/esm2022/lib/editor/components/edges/edges.mjs +108 -0
- package/esm2022/lib/editor/components/edges/page-type.enum.mjs +7 -0
- package/esm2022/lib/editor/components/editor.component.mjs +112 -0
- package/esm2022/lib/editor/components/external-element/external-element.service.mjs +6 -0
- package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +4 -0
- package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +2 -0
- package/esm2022/lib/editor/components/external-element/external.component.mjs +41 -0
- package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +9 -0
- package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +11 -0
- package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +15 -0
- package/esm2022/lib/editor/components/image/components/image.component.mjs +88 -0
- package/esm2022/lib/editor/components/image/image-api.service.mjs +36 -0
- package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +38 -0
- package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +2 -0
- package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +19 -0
- package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +12 -0
- package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +106 -0
- package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +2 -0
- package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +52 -0
- package/esm2022/lib/editor/components/image/size.mjs +2 -0
- package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +59 -0
- package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +18 -0
- package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +43 -0
- package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +2 -0
- package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +3 -0
- package/esm2022/lib/editor/components/shared/custom-content.mjs +2 -0
- package/esm2022/lib/editor/components/shared/services/component.service.mjs +64 -0
- package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +163 -0
- package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +55 -0
- package/esm2022/lib/editor/components/tab/tab.component.mjs +44 -0
- package/esm2022/lib/editor/components/tab/tab.helper.mjs +6 -0
- package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +118 -0
- package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +97 -0
- package/esm2022/lib/editor/components/table/components/table.component.mjs +401 -0
- package/esm2022/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.mjs +1 -1
- package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +8 -0
- package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +6 -0
- package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +18 -0
- package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +9 -0
- package/esm2022/lib/editor/components/table/models/row-data.model.mjs +8 -0
- package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +7 -0
- package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +74 -0
- package/esm2022/lib/editor/components/table/selection/table-selection.mjs +366 -0
- package/esm2022/lib/editor/content/constants/display-values.const.mjs +8 -0
- package/esm2022/lib/editor/content/constants/document-info.const.mjs +13 -0
- package/esm2022/lib/editor/content/constants/editor.const.mjs +62 -0
- package/esm2022/lib/editor/content/contents.interface.mjs +2 -0
- package/esm2022/lib/editor/content/display-data/display-token.model.mjs +12 -0
- package/esm2022/lib/editor/content/display-data/document.mjs +134 -0
- package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +10 -0
- package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +11 -0
- package/esm2022/lib/editor/content/display-data/indent.model.mjs +9 -0
- package/esm2022/lib/editor/content/display-data/line-info.model.mjs +9 -0
- package/esm2022/lib/editor/content/display-data/lines.mjs +96 -0
- package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +226 -0
- package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +2 -0
- package/esm2022/lib/editor/content/display-data/paragraph.mjs +52 -0
- package/esm2022/lib/editor/content/display-data/text-line-info.mjs +34 -0
- package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +2 -0
- package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +96 -0
- package/esm2022/lib/{+shared/editor → editor/content}/helpers/format.helper.mjs +1 -1
- package/esm2022/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.mjs +1 -1
- package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +9 -0
- package/esm2022/lib/editor/content/margin.model.mjs +16 -0
- package/esm2022/lib/editor/content/page-vertical-data.model.mjs +9 -0
- package/esm2022/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.mjs +1 -1
- package/esm2022/lib/editor/core/event-emitting.mjs +56 -0
- package/esm2022/lib/editor/display/cell.interface.mjs +2 -0
- package/esm2022/lib/editor/display/event.helper.mjs +18 -0
- package/esm2022/lib/editor/display/layers/cursor.layer.mjs +101 -0
- package/esm2022/lib/editor/display/layers/layer.config.mjs +2 -0
- package/esm2022/lib/editor/display/layers/pages.layer.mjs +97 -0
- package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +7 -0
- package/esm2022/lib/editor/display/layers/print.text.layer.mjs +7 -0
- package/esm2022/lib/editor/display/layers/selection.layer.mjs +113 -0
- package/esm2022/lib/editor/display/layers/text.layer.mjs +203 -0
- package/esm2022/lib/editor/display/print/print.helper.mjs +40 -0
- package/esm2022/lib/editor/display/print/print.renderer.mjs +67 -0
- package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +7 -0
- package/esm2022/lib/editor/display/render-changes.interface.mjs +2 -0
- package/esm2022/lib/editor/display/render-changes.model.mjs +25 -0
- package/esm2022/lib/editor/display/renderer.mjs +206 -0
- package/esm2022/lib/editor/display/rendering.helper.mjs +187 -0
- package/esm2022/lib/editor/display/renderloop.mjs +26 -0
- package/esm2022/lib/editor/display/virtual.renderer.mjs +317 -0
- package/esm2022/lib/editor/display/visible-range.interface.mjs +2 -0
- package/esm2022/lib/editor/editor.module.mjs +67 -0
- package/esm2022/lib/editor/execution/distance.model.mjs +10 -0
- package/esm2022/lib/editor/execution/edit.session.mjs +1117 -0
- package/esm2022/lib/editor/execution/editor.mjs +1346 -0
- package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +18 -0
- package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +42 -0
- package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +64 -0
- package/esm2022/lib/editor/execution/helpers/page.helper.mjs +12 -0
- package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +41 -0
- package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +169 -0
- package/esm2022/lib/editor/execution/regulator.service.mjs +198 -0
- package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +19 -0
- package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +15 -0
- package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +8 -0
- package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +3 -0
- package/esm2022/lib/editor/execution/targeting/session.model.mjs +10 -0
- package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +2 -0
- package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +2 -0
- package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +88 -0
- package/esm2022/lib/editor/gadgets/history/operation-history.mjs +206 -0
- package/esm2022/lib/editor/gadgets/history/operation.type.mjs +2 -0
- package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +7 -0
- package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +9 -0
- package/esm2022/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.mjs +1 -1
- package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +82 -0
- package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +7 -0
- package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +18 -0
- package/esm2022/lib/editor/gadgets/scrollbar.mjs +81 -0
- package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +2 -0
- package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +2 -0
- package/esm2022/lib/editor/gadgets/search/search.mjs +231 -0
- package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +5 -0
- package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +20 -0
- package/esm2022/lib/editor/interaction/base.handler.mjs +19 -0
- package/esm2022/lib/editor/interaction/document.handler.mjs +27 -0
- package/esm2022/lib/editor/interaction/editor.service.mjs +325 -0
- package/esm2022/lib/editor/interaction/input.handler.mjs +149 -0
- package/esm2022/lib/{+shared/enums → editor/interaction}/mode.enum.mjs +1 -1
- package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +7 -0
- package/esm2022/lib/editor/interaction/mouse.handler.mjs +49 -0
- package/esm2022/lib/editor/interaction/text-input.mjs +53 -0
- package/esm2022/lib/editor/operations/commands.service.mjs +20 -0
- package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +32 -0
- package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +7 -0
- package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +9 -0
- package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +15 -0
- package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +55 -0
- package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +19 -0
- package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +43 -0
- package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +28 -0
- package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +55 -0
- package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +114 -0
- package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +16 -0
- package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +374 -0
- package/esm2022/lib/editor/operations/operations-helper.helper.mjs +432 -0
- package/esm2022/lib/editor/operations/save-commands.helper.mjs +127 -0
- package/esm2022/lib/editor/operations/target-operations.helper.mjs +23 -0
- package/esm2022/lib/editor/positioning/alignments.const.mjs +8 -0
- package/esm2022/lib/editor/positioning/content.helper.mjs +36 -0
- package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +13 -0
- package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +2 -0
- package/esm2022/lib/editor/positioning/insert-index.interface.mjs +2 -0
- package/esm2022/lib/editor/positioning/line-width.helper.mjs +13 -0
- package/esm2022/lib/editor/positioning/position.helper.mjs +194 -0
- package/esm2022/lib/editor/positioning/range.mjs +94 -0
- package/esm2022/lib/editor/positioning/selection.mjs +307 -0
- package/esm2022/lib/editor/revision.helper.mjs +91 -0
- package/esm2022/lib/models/generated/cell.model.mjs +1 -1
- package/esm2022/lib/models/generated/command.model.mjs +5 -1
- package/esm2022/lib/models/generated/insert-paragraph.model.mjs +20 -0
- package/esm2022/lib/models/generated/replace.model.mjs +5 -1
- package/esm2022/public-api.mjs +37 -31
- package/fesm2022/talrace-ngx-noder.mjs +3398 -2731
- package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
- package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +27 -0
- package/lib/apart-components/add-link-dialog/validation.helper.d.ts +5 -0
- package/lib/apart-components/add-link-mobile/add-link-mobile.component.d.ts +19 -0
- package/lib/{+shared → apart-components}/confirm-dialog/confirm-dialog.component.d.ts +2 -1
- package/lib/{+shared → apart-components}/editor-search/editor-search-dialog.component.d.ts +6 -7
- package/lib/apart-components/editor-title/editor-title.component.d.ts +25 -0
- package/lib/apart-components/editor-title-mobile/editor-title-mobile.component.d.ts +6 -0
- package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +49 -0
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/color-picker/color-picker.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/font.component.d.ts +2 -2
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/font-size.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/font-style.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/format.component.d.ts +2 -2
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/heading/heading.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/numbering.component.d.ts +3 -3
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/print/print.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/undo-redo.component.d.ts +1 -1
- package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/zoom/zoom.component.d.ts +1 -1
- package/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.d.ts +36 -0
- package/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.d.ts +14 -0
- package/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.d.ts +23 -0
- package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +26 -0
- package/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.d.ts +40 -0
- package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +32 -0
- package/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.d.ts +2 -0
- package/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.d.ts +6 -0
- package/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.d.ts +9 -0
- package/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.d.ts +14 -0
- package/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.d.ts +38 -0
- package/lib/{+shared/editor-toolbar/helpers → apart-components/editor-toolbar/shared}/toolbar-styles.helper.d.ts +2 -2
- package/lib/{+shared → apart-components}/insert-table/insert-table.component.d.ts +1 -1
- package/lib/apart-components/insert-table-mobile/insert-table-mobile.component.d.ts +30 -0
- package/lib/apart-components/text-format-mobile/text-format-mobile.component.d.ts +35 -0
- package/lib/{+shared/editor/core/models → editor/components/edges}/edge-element.model.d.ts +1 -1
- package/lib/editor/components/edges/edge.component.d.ts +44 -0
- package/lib/{+shared/editor/core → editor}/components/edges/edges.d.ts +7 -7
- package/lib/{+shared/editor → editor/components}/editor.component.d.ts +11 -11
- package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-sidenav.interface.d.ts +1 -1
- package/lib/{+shared/editor/custom-components → editor/components}/external-element/external.component.d.ts +4 -4
- package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-element.model.d.ts +2 -1
- package/lib/{+shared/editor/custom-components → editor/components}/image/components/image.component.d.ts +4 -4
- package/lib/editor/components/image/image-api.service.d.ts +17 -0
- package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/resizer.component.d.ts +2 -2
- package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-wrapper.d.ts +1 -1
- package/lib/{+shared/editor/custom-components → editor/components}/shared/abstract/base.component.d.ts +6 -4
- package/lib/editor/components/shared/abstract/destroy.component.d.ts +9 -0
- package/lib/{+shared/editor/custom-components/shared/helpers → editor/components/shared}/custom-component.hepler.d.ts +3 -3
- package/lib/editor/components/shared/custom-components.interface.d.ts +13 -0
- package/lib/editor/components/shared/custom-content.d.ts +5 -0
- package/lib/{+shared/editor/custom-components/shared/services/component → editor/components/shared/services}/component.service.d.ts +1 -1
- package/lib/editor/components/shared/services/custom-content.service.d.ts +33 -0
- package/lib/{+shared/editor/custom-components → editor/components}/tab/tab.component.d.ts +2 -2
- package/lib/{+shared/editor/custom-components → editor/components}/table/cell-resizer/cell-resizer.d.ts +2 -1
- package/lib/editor/components/table/components/table-cell.component.d.ts +45 -0
- package/lib/{+shared/editor/custom-components → editor/components}/table/components/table.component.d.ts +26 -11
- package/lib/{+shared/editor/custom-components → editor/components}/table/overlay-menu/overlay-menu.component.d.ts +2 -2
- package/lib/{+shared/editor/custom-components → editor/components}/table/selection/table-selection.d.ts +3 -3
- package/lib/{+shared/editor/core → editor/content}/constants/editor.const.d.ts +3 -3
- package/lib/editor/content/contents.interface.d.ts +22 -0
- package/lib/{+shared/editor/core/models → editor/content/display-data}/display-token.model.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/content/display-data}/document.d.ts +9 -9
- package/lib/{+shared/editor/core/models → editor/content/display-data}/format-ext.model.d.ts +1 -1
- package/lib/{+shared/editor/execution/models → editor/content/display-data}/general-properties.model.d.ts +2 -1
- package/lib/{+shared/editor/core/models → editor/content/display-data}/line-info.model.d.ts +1 -0
- package/lib/{+shared/editor/core/layers → editor/content/display-data}/lines.d.ts +1 -1
- package/lib/editor/content/display-data/pages.wrap.d.ts +42 -0
- package/lib/{+shared/editor/core/paging → editor/content/display-data}/paragraph.d.ts +8 -5
- package/lib/{+shared/editor/core/paging → editor/content/display-data}/text-line-info.d.ts +4 -2
- package/lib/editor/content/helpers/content-style.helper.d.ts +11 -0
- package/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.d.ts +1 -1
- package/lib/editor/content/helpers/scaling.helper.d.ts +4 -0
- package/lib/{+shared/editor/core/paging → editor/content}/page-vertical-data.model.d.ts +1 -1
- package/lib/{+shared/editor/core/base → editor/core}/event-emitting.d.ts +0 -5
- package/lib/{+shared/editor/core → editor/display}/layers/cursor.layer.d.ts +7 -8
- package/lib/{+shared/editor/core/interfaces → editor/display/layers}/layer.config.d.ts +2 -2
- package/lib/{+shared/editor/core → editor/display}/layers/pages.layer.d.ts +5 -6
- package/lib/editor/display/layers/print.text.layer.d.ts +4 -0
- package/lib/{+shared/editor/core → editor/display}/layers/selection.layer.d.ts +5 -6
- package/lib/editor/display/layers/text.layer.d.ts +34 -0
- package/lib/{+shared/helpers → editor/display/print}/print.helper.d.ts +3 -3
- package/lib/editor/display/print/print.renderer.d.ts +23 -0
- package/lib/{+shared/editor/core/helpers → editor/display/print}/print.rendering.helper.d.ts +2 -2
- package/lib/{+shared/editor/core/models → editor/display}/render-changes.model.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/display}/renderer.d.ts +10 -13
- package/lib/{+shared/editor/core/helpers → editor/display}/rendering.helper.d.ts +10 -10
- package/lib/{+shared/editor/core/layers → editor/display}/renderloop.d.ts +2 -2
- package/lib/{+shared/editor/core → editor/display}/virtual.renderer.d.ts +14 -29
- package/lib/editor/editor.module.d.ts +31 -0
- package/lib/{+shared/editor/core → editor/execution}/edit.session.d.ts +65 -63
- package/lib/{+shared/editor/core → editor/execution}/editor.d.ts +48 -42
- package/lib/editor/execution/helpers/delta.helper.d.ts +6 -0
- package/lib/{+shared/editor/core → editor/execution}/helpers/format-style.helper.d.ts +3 -5
- package/lib/{+shared/editor/core → editor/execution}/helpers/page.helper.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph-style.helper.d.ts +1 -1
- package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph.helper.d.ts +14 -8
- package/lib/{+shared/editor → editor}/execution/regulator.service.d.ts +16 -15
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/cell-session-source.model.d.ts +3 -3
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/edge-session-source.model.d.ts +3 -3
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/main-session-source.model.d.ts +1 -1
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session-source.model.d.ts +1 -1
- package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session.model.d.ts +3 -3
- package/lib/{+shared/editor/core/helpers → editor/gadgets/font-metrics}/font-metrics.helper.d.ts +1 -1
- package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation-history.d.ts +9 -7
- package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation.type.d.ts +2 -1
- package/lib/{+shared/editor/core/models → editor/gadgets/numbering}/numbering-data.model.d.ts +1 -1
- package/lib/{+shared/editor/core/helpers → editor/gadgets/numbering}/numbering.helper.d.ts +8 -8
- package/lib/{+shared/editor/helpers → editor/gadgets/page-break}/break.helper.d.ts +2 -2
- package/lib/{+shared/editor/core/layers → editor/gadgets}/scrollbar.d.ts +9 -18
- package/lib/{+shared/editor/core → editor/gadgets/search}/search.d.ts +4 -4
- package/lib/editor/interaction/base.handler.d.ts +9 -0
- package/lib/editor/interaction/document.handler.d.ts +10 -0
- package/lib/{+shared/editor → editor}/interaction/editor.service.d.ts +24 -18
- package/lib/{+shared/editor → editor}/interaction/input.handler.d.ts +4 -5
- package/lib/{+shared/editor → editor}/interaction/mouse.handler.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/enums/command-type.enum.d.ts +11 -10
- package/lib/{+shared/editor → editor}/operations/helpers/break-operations.helper.d.ts +2 -2
- package/lib/{+shared/editor → editor}/operations/helpers/format-operations.helper.d.ts +2 -2
- package/lib/editor/operations/helpers/image-operations.helper.d.ts +7 -0
- package/lib/{+shared/editor → editor}/operations/helpers/indexed-element-operations.helper.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/helpers/link-operations.helper.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/helpers/numbering-operations.helper.d.ts +3 -3
- package/lib/{+shared/editor → editor}/operations/helpers/paragraph-operations.helper.d.ts +3 -2
- package/lib/{+shared/editor → editor}/operations/helpers/tab-operations.helper.d.ts +1 -1
- package/lib/{+shared/editor → editor}/operations/helpers/table-operations.helper.d.ts +6 -6
- package/lib/{+shared/editor/operations/helpers → editor/operations}/operations-helper.helper.d.ts +21 -19
- package/lib/{+shared/editor/operations/helpers → editor/operations}/save-commands.helper.d.ts +28 -22
- package/lib/editor/operations/target-operations.helper.d.ts +6 -0
- package/lib/{+shared/editor/helpers → editor/positioning}/content.helper.d.ts +10 -5
- package/lib/editor/positioning/cursor-paragraph.d.ts +7 -0
- package/lib/{+shared/editor/core/interfaces → editor/positioning}/cursor-position.interface.d.ts +1 -1
- package/lib/{+shared/editor/core/helpers → editor/positioning}/line-width.helper.d.ts +2 -2
- package/lib/{+shared/editor/core/helpers → editor/positioning}/position.helper.d.ts +9 -9
- package/lib/{+shared/editor/core → editor/positioning}/range.d.ts +12 -12
- package/lib/{+shared/editor → editor}/positioning/selection.d.ts +10 -10
- package/lib/editor/revision.helper.d.ts +15 -0
- package/lib/models/generated/cell.model.d.ts +1 -0
- package/lib/models/generated/command.model.d.ts +2 -0
- package/lib/models/generated/insert-paragraph.model.d.ts +10 -0
- package/lib/models/generated/replace.model.d.ts +2 -0
- package/package.json +1 -1
- package/public-api.d.ts +36 -30
- package/src/_ngx-noder.theme.scss +20 -13
- package/src/assets/fonts/nc-iconfont.css +112 -106
- package/src/assets/fonts/nc-iconfont.eot +0 -0
- package/src/assets/fonts/nc-iconfont.svg +4 -1
- package/src/assets/fonts/nc-iconfont.ttf +0 -0
- package/src/assets/fonts/nc-iconfont.woff +0 -0
- package/src/lib/{+shared → apart-components}/add-link-dialog/_add-link-dialog.theme.scss +4 -4
- package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +25 -0
- package/src/lib/apart-components/confirm-dialog/_theme.scss +30 -0
- package/src/lib/apart-components/editor-title/_editor-title.theme.scss +28 -0
- package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +42 -0
- package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +27 -0
- package/src/lib/apart-components/editor-toolbar/_theme.scss +25 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +12 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +12 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +14 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +21 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +21 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +70 -0
- package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +16 -0
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +26 -0
- package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +33 -0
- package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +22 -0
- package/src/lib/{+shared → apart-components}/insert-table/_insert-table.theme.scss +10 -7
- package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +54 -0
- package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +86 -0
- package/src/lib/editor/_theme.scss +5 -0
- package/src/lib/editor/components/_editor.theme.scss +112 -0
- package/src/scss/_fonts.scss +3 -0
- package/src/scss/base-editor.scss +329 -0
- package/src/styles.scss +3 -58
- package/esm2022/lib/+shared/abstract/base-api.service.mjs +0 -99
- package/esm2022/lib/+shared/abstract/observer.component.mjs +0 -24
- package/esm2022/lib/+shared/confirm-dialog/confirm-dialog.component.mjs +0 -28
- package/esm2022/lib/+shared/constants/default-file-name.const.mjs +0 -2
- package/esm2022/lib/+shared/constants/paginator-sizes.const.mjs +0 -3
- package/esm2022/lib/+shared/editor/core/base/event-emitting.mjs +0 -71
- package/esm2022/lib/+shared/editor/core/components/edges/edge-type.enum.mjs +0 -6
- package/esm2022/lib/+shared/editor/core/components/edges/edge.component.mjs +0 -100
- package/esm2022/lib/+shared/editor/core/components/edges/edges.mjs +0 -104
- package/esm2022/lib/+shared/editor/core/constants/alignments.const.mjs +0 -8
- package/esm2022/lib/+shared/editor/core/constants/clipboardEventTypes.const.mjs +0 -6
- package/esm2022/lib/+shared/editor/core/constants/content-style-change.const.mjs +0 -15
- package/esm2022/lib/+shared/editor/core/constants/display-values.const.mjs +0 -8
- package/esm2022/lib/+shared/editor/core/constants/document-info.const.mjs +0 -13
- package/esm2022/lib/+shared/editor/core/constants/editor-version.const.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/constants/editor.const.mjs +0 -62
- package/esm2022/lib/+shared/editor/core/constants/unicode-chars.const.mjs +0 -5
- package/esm2022/lib/+shared/editor/core/document.mjs +0 -134
- package/esm2022/lib/+shared/editor/core/edit.session.mjs +0 -1102
- package/esm2022/lib/+shared/editor/core/editor.mjs +0 -1279
- package/esm2022/lib/+shared/editor/core/enums/break-types.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/enums/mouse-button.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/enums/page-type.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/helpers/content-style.helper.mjs +0 -156
- package/esm2022/lib/+shared/editor/core/helpers/delta.helper.mjs +0 -18
- package/esm2022/lib/+shared/editor/core/helpers/dom.helper.mjs +0 -42
- package/esm2022/lib/+shared/editor/core/helpers/event.helper.mjs +0 -18
- package/esm2022/lib/+shared/editor/core/helpers/font-metrics.helper.mjs +0 -88
- package/esm2022/lib/+shared/editor/core/helpers/format-style.helper.mjs +0 -72
- package/esm2022/lib/+shared/editor/core/helpers/line-width.helper.mjs +0 -13
- package/esm2022/lib/+shared/editor/core/helpers/numbering.helper.mjs +0 -83
- package/esm2022/lib/+shared/editor/core/helpers/page.helper.mjs +0 -12
- package/esm2022/lib/+shared/editor/core/helpers/paragraph-style.helper.mjs +0 -41
- package/esm2022/lib/+shared/editor/core/helpers/paragraph.helper.mjs +0 -132
- package/esm2022/lib/+shared/editor/core/helpers/position.helper.mjs +0 -191
- package/esm2022/lib/+shared/editor/core/helpers/print.rendering.helper.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/helpers/rendering.helper.mjs +0 -186
- package/esm2022/lib/+shared/editor/core/helpers/unicode.helper.mjs +0 -20
- package/esm2022/lib/+shared/editor/core/interfaces/cell.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/cursor-position.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/font-metric-size.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/layer.config.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/paragraph-info.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/render-changes.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/replace.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/search-iteration.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/toolbar-styles.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/visible-line-info.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/interfaces/visible-range.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/core/keyboard/text-input.mjs +0 -53
- package/esm2022/lib/+shared/editor/core/layers/cursor.layer.mjs +0 -103
- package/esm2022/lib/+shared/editor/core/layers/edges.layer.mjs +0 -99
- package/esm2022/lib/+shared/editor/core/layers/lines.mjs +0 -96
- package/esm2022/lib/+shared/editor/core/layers/pages.layer.mjs +0 -106
- package/esm2022/lib/+shared/editor/core/layers/print.edges.layer.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/layers/print.pages.layer.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/layers/print.text.layer.mjs +0 -7
- package/esm2022/lib/+shared/editor/core/layers/renderloop.mjs +0 -26
- package/esm2022/lib/+shared/editor/core/layers/scrollbar.mjs +0 -100
- package/esm2022/lib/+shared/editor/core/layers/selection.layer.mjs +0 -115
- package/esm2022/lib/+shared/editor/core/layers/text.layer.mjs +0 -124
- package/esm2022/lib/+shared/editor/core/models/display-token.model.mjs +0 -12
- package/esm2022/lib/+shared/editor/core/models/distance.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/core/models/edge-element.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/format-ext.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/core/models/indent.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/line-info.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/margin.model.mjs +0 -16
- package/esm2022/lib/+shared/editor/core/models/numbering-data.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/models/render-changes.model.mjs +0 -25
- package/esm2022/lib/+shared/editor/core/paging/page-vertical-data.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/core/paging/pages.wrap.mjs +0 -219
- package/esm2022/lib/+shared/editor/core/paging/paragraph.mjs +0 -52
- package/esm2022/lib/+shared/editor/core/paging/text-line-info.mjs +0 -34
- package/esm2022/lib/+shared/editor/core/point.mjs +0 -13
- package/esm2022/lib/+shared/editor/core/print.renderer.mjs +0 -72
- package/esm2022/lib/+shared/editor/core/range.mjs +0 -94
- package/esm2022/lib/+shared/editor/core/renderer.mjs +0 -217
- package/esm2022/lib/+shared/editor/core/search.mjs +0 -231
- package/esm2022/lib/+shared/editor/core/virtual.renderer.mjs +0 -356
- package/esm2022/lib/+shared/editor/custom-components/external-element/element-toolbar/element-toolbar.component.mjs +0 -35
- package/esm2022/lib/+shared/editor/custom-components/external-element/external-element.service.mjs +0 -6
- package/esm2022/lib/+shared/editor/custom-components/external-element/external-elements.const.mjs +0 -4
- package/esm2022/lib/+shared/editor/custom-components/external-element/external-sidenav.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/external-element/external.component.mjs +0 -41
- package/esm2022/lib/+shared/editor/custom-components/external-element/models/element-data.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-element.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-sidenav.model.mjs +0 -15
- package/esm2022/lib/+shared/editor/custom-components/image/components/image.component.mjs +0 -87
- package/esm2022/lib/+shared/editor/custom-components/image/input-handler/image-input.handler.mjs +0 -38
- package/esm2022/lib/+shared/editor/custom-components/image/interfaces/size.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/coordinate.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction-wrapper.mjs +0 -19
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction.enum.mjs +0 -12
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/resizer.component.mjs +0 -106
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-delta.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-wrapper.mjs +0 -52
- package/esm2022/lib/+shared/editor/custom-components/image/services/image-api.service.mjs +0 -14
- package/esm2022/lib/+shared/editor/custom-components/shared/abstract/base.component.mjs +0 -57
- package/esm2022/lib/+shared/editor/custom-components/shared/constants/custom-content-markers.const.mjs +0 -3
- package/esm2022/lib/+shared/editor/custom-components/shared/helpers/custom-component.hepler.mjs +0 -43
- package/esm2022/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/shared/services/component/component.service.mjs +0 -64
- package/esm2022/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.mjs +0 -120
- package/esm2022/lib/+shared/editor/custom-components/shared/services/overlay/overlay.service.mjs +0 -55
- package/esm2022/lib/+shared/editor/custom-components/shared/types/custom-content.mjs +0 -2
- package/esm2022/lib/+shared/editor/custom-components/tab/tab.component.mjs +0 -43
- package/esm2022/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.mjs +0 -118
- package/esm2022/lib/+shared/editor/custom-components/table/components/table-cell.component.mjs +0 -95
- package/esm2022/lib/+shared/editor/custom-components/table/components/table.component.mjs +0 -293
- package/esm2022/lib/+shared/editor/custom-components/table/enums/reisizer-side.enum.mjs +0 -8
- package/esm2022/lib/+shared/editor/custom-components/table/enums/vertical-merge.enum.mjs +0 -6
- package/esm2022/lib/+shared/editor/custom-components/table/models/cell-data.model.mjs +0 -18
- package/esm2022/lib/+shared/editor/custom-components/table/models/cell-resizer-parameters.model.mjs +0 -9
- package/esm2022/lib/+shared/editor/custom-components/table/models/row-data.model.mjs +0 -8
- package/esm2022/lib/+shared/editor/custom-components/table/models/selection-range.model.mjs +0 -7
- package/esm2022/lib/+shared/editor/custom-components/table/overlay-menu/overlay-menu.component.mjs +0 -74
- package/esm2022/lib/+shared/editor/custom-components/table/selection/table-selection.mjs +0 -358
- package/esm2022/lib/+shared/editor/editor.component.mjs +0 -103
- package/esm2022/lib/+shared/editor/editor.module.mjs +0 -85
- package/esm2022/lib/+shared/editor/execution/models/cell-session-source.model.mjs +0 -19
- package/esm2022/lib/+shared/editor/execution/models/edge-session-source.model.mjs +0 -15
- package/esm2022/lib/+shared/editor/execution/models/general-properties.model.mjs +0 -11
- package/esm2022/lib/+shared/editor/execution/models/main-session-source.model.mjs +0 -8
- package/esm2022/lib/+shared/editor/execution/models/session-source.model.mjs +0 -3
- package/esm2022/lib/+shared/editor/execution/models/session.model.mjs +0 -10
- package/esm2022/lib/+shared/editor/execution/regulator.service.mjs +0 -193
- package/esm2022/lib/+shared/editor/helpers/break.helper.mjs +0 -18
- package/esm2022/lib/+shared/editor/helpers/content.helper.mjs +0 -30
- package/esm2022/lib/+shared/editor/helpers/tab.helper.mjs +0 -6
- package/esm2022/lib/+shared/editor/interaction/editor.service.mjs +0 -309
- package/esm2022/lib/+shared/editor/interaction/input.handler.mjs +0 -160
- package/esm2022/lib/+shared/editor/interaction/mouse.handler.mjs +0 -49
- package/esm2022/lib/+shared/editor/interfaces/contents.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/interfaces/insert-index.interface.mjs +0 -2
- package/esm2022/lib/+shared/editor/operation-history/operation-history.mjs +0 -184
- package/esm2022/lib/+shared/editor/operation-history/operation.type.mjs +0 -2
- package/esm2022/lib/+shared/editor/operation-history/operations-history-info.model.mjs +0 -7
- package/esm2022/lib/+shared/editor/operations/enums/command-type.enum.mjs +0 -31
- package/esm2022/lib/+shared/editor/operations/enums/target-type.enum.mjs +0 -7
- package/esm2022/lib/+shared/editor/operations/helpers/break-operations.helper.mjs +0 -9
- package/esm2022/lib/+shared/editor/operations/helpers/content-operations.helper.mjs +0 -15
- package/esm2022/lib/+shared/editor/operations/helpers/format-operations.helper.mjs +0 -56
- package/esm2022/lib/+shared/editor/operations/helpers/image-operations.helper.mjs +0 -19
- package/esm2022/lib/+shared/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
- package/esm2022/lib/+shared/editor/operations/helpers/link-operations.helper.mjs +0 -28
- package/esm2022/lib/+shared/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
- package/esm2022/lib/+shared/editor/operations/helpers/operations-helper.helper.mjs +0 -394
- package/esm2022/lib/+shared/editor/operations/helpers/paragraph-operations.helper.mjs +0 -83
- package/esm2022/lib/+shared/editor/operations/helpers/save-commands.helper.mjs +0 -118
- package/esm2022/lib/+shared/editor/operations/helpers/tab-operations.helper.mjs +0 -16
- package/esm2022/lib/+shared/editor/operations/helpers/table-operations.helper.mjs +0 -371
- package/esm2022/lib/+shared/editor/operations/helpers/target-operations.helper.mjs +0 -23
- package/esm2022/lib/+shared/editor/positioning/selection.mjs +0 -307
- package/esm2022/lib/+shared/editor/store/editor.actions.mjs +0 -13
- package/esm2022/lib/+shared/editor-header/editor-header.component.mjs +0 -314
- package/esm2022/lib/+shared/editor-search/editor-search-dialog.component.mjs +0 -71
- package/esm2022/lib/+shared/editor-toolbar/color-picker/color-picker.component.mjs +0 -32
- package/esm2022/lib/+shared/editor-toolbar/constants/svg-icons.const.mjs +0 -157
- package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.component.mjs +0 -115
- package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.module.mjs +0 -107
- package/esm2022/lib/+shared/editor-toolbar/enums/alignment.enum.mjs +0 -8
- package/esm2022/lib/+shared/editor-toolbar/enums/numbering-type.enum.mjs +0 -6
- package/esm2022/lib/+shared/editor-toolbar/font/font.component.mjs +0 -45
- package/esm2022/lib/+shared/editor-toolbar/font-size/font-size.component.mjs +0 -85
- package/esm2022/lib/+shared/editor-toolbar/font-style/font-style.component.mjs +0 -80
- package/esm2022/lib/+shared/editor-toolbar/format/format.component.mjs +0 -28
- package/esm2022/lib/+shared/editor-toolbar/heading/heading.component.mjs +0 -23
- package/esm2022/lib/+shared/editor-toolbar/helpers/toolbar-styles.helper.mjs +0 -55
- package/esm2022/lib/+shared/editor-toolbar/numbering/numbering.component.mjs +0 -53
- package/esm2022/lib/+shared/editor-toolbar/print/print.component.mjs +0 -18
- package/esm2022/lib/+shared/editor-toolbar/undo-redo/undo-redo.component.mjs +0 -27
- package/esm2022/lib/+shared/editor-toolbar/zoom/zoom.component.mjs +0 -74
- package/esm2022/lib/+shared/helpers/print.helper.mjs +0 -40
- package/esm2022/lib/+shared/insert-table/insert-table.component.mjs +0 -54
- package/esm2022/lib/+shared/services/commands.service.mjs +0 -20
- package/esm2022/lib/+shared/services/custom-icon.service.mjs +0 -34
- package/lib/+shared/abstract/base-api.service.d.ts +0 -23
- package/lib/+shared/abstract/observer.component.d.ts +0 -10
- package/lib/+shared/constants/default-file-name.const.d.ts +0 -1
- package/lib/+shared/constants/paginator-sizes.const.d.ts +0 -2
- package/lib/+shared/editor/core/components/edges/edge.component.d.ts +0 -45
- package/lib/+shared/editor/core/constants/clipboardEventTypes.const.d.ts +0 -5
- package/lib/+shared/editor/core/constants/content-style-change.const.d.ts +0 -14
- package/lib/+shared/editor/core/helpers/content-style.helper.d.ts +0 -16
- package/lib/+shared/editor/core/helpers/delta.helper.d.ts +0 -6
- package/lib/+shared/editor/core/interfaces/visible-line-info.interface.d.ts +0 -5
- package/lib/+shared/editor/core/layers/edges.layer.d.ts +0 -24
- package/lib/+shared/editor/core/layers/print.edges.layer.d.ts +0 -4
- package/lib/+shared/editor/core/layers/print.text.layer.d.ts +0 -5
- package/lib/+shared/editor/core/layers/text.layer.d.ts +0 -22
- package/lib/+shared/editor/core/paging/pages.wrap.d.ts +0 -41
- package/lib/+shared/editor/core/point.d.ts +0 -7
- package/lib/+shared/editor/core/print.renderer.d.ts +0 -25
- package/lib/+shared/editor/custom-components/external-element/element-toolbar/element-toolbar.component.d.ts +0 -14
- package/lib/+shared/editor/custom-components/image/services/image-api.service.d.ts +0 -8
- package/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.d.ts +0 -13
- package/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.d.ts +0 -30
- package/lib/+shared/editor/custom-components/shared/types/custom-content.d.ts +0 -5
- package/lib/+shared/editor/custom-components/table/components/table-cell.component.d.ts +0 -45
- package/lib/+shared/editor/editor.module.d.ts +0 -30
- package/lib/+shared/editor/interfaces/contents.interface.d.ts +0 -22
- package/lib/+shared/editor/operations/helpers/image-operations.helper.d.ts +0 -7
- package/lib/+shared/editor/operations/helpers/target-operations.helper.d.ts +0 -6
- package/lib/+shared/editor/store/editor.actions.d.ts +0 -11
- package/lib/+shared/editor-header/editor-header.component.d.ts +0 -101
- package/lib/+shared/editor-toolbar/constants/numbering-templates.const.d.ts +0 -6
- package/lib/+shared/editor-toolbar/editor-toolbar.component.d.ts +0 -44
- package/lib/+shared/editor-toolbar/editor-toolbar.module.d.ts +0 -28
- package/src/lib/+shared/editor/_editor.theme.scss +0 -35
- package/src/lib/+shared/editor/custom-components/external-element/element-toolbar/_element-toolbar.theme.scss +0 -10
- package/src/lib/+shared/editor-header/_editor-header.theme.scss +0 -106
- package/src/lib/+shared/editor-toolbar/_editor-toolbar.theme.scss +0 -33
- package/src/lib/+shared/editor-toolbar/numbering/_numbering.theme.scss +0 -29
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/svg-icons.const.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/alignment.enum.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-type.enum.d.ts +0 -0
- /package/lib/{+shared → apart-components/editor-toolbar/shared}/services/custom-icon.service.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor}/components/edges/edge-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/components/edges}/page-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-element.service.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-elements.const.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/element-data.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-sidenav.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/input-handler/image-input.handler.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/coordinate.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction-wrapper.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-delta.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components/image/interfaces → editor/components/image}/size.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components/shared/constants → editor/components/shared}/custom-content-markers.const.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components/shared/services/overlay → editor/components/shared/services}/overlay.service.d.ts +0 -0
- /package/lib/{+shared/editor/helpers → editor/components/tab}/tab.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/reisizer-side.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/vertical-merge.enum.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-data.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-resizer-parameters.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/row-data.model.d.ts +0 -0
- /package/lib/{+shared/editor/custom-components → editor/components}/table/models/selection-range.model.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/content}/constants/display-values.const.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/content}/constants/document-info.const.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/content/display-data}/indent.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/paragraph-info.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/toolbar-styles.interface.d.ts +0 -0
- /package/lib/{+shared/editor → editor/content}/helpers/format.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/content}/margin.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/display}/cell.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/helpers → editor/display}/event.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/display}/layers/print.pages.layer.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/display}/render-changes.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/display}/visible-range.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/models → editor/execution}/distance.model.d.ts +0 -0
- /package/lib/{+shared/editor/core → editor/execution}/helpers/dom.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core/constants → editor/gadgets/font-metrics}/editor-version.const.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/gadgets/font-metrics}/font-metric-size.interface.d.ts +0 -0
- /package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operations-history-info.model.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/gadgets/page-break}/break-types.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/replace.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/search-iteration.interface.d.ts +0 -0
- /package/lib/{+shared/editor/core/constants → editor/gadgets/unicode}/unicode-chars.const.d.ts +0 -0
- /package/lib/{+shared/editor/core/helpers → editor/gadgets/unicode}/unicode.helper.d.ts +0 -0
- /package/lib/{+shared/enums → editor/interaction}/mode.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/enums → editor/interaction}/mouse-button.enum.d.ts +0 -0
- /package/lib/{+shared/editor/core/keyboard → editor/interaction}/text-input.d.ts +0 -0
- /package/lib/{+shared/services → editor/operations}/commands.service.d.ts +0 -0
- /package/lib/{+shared/editor → editor}/operations/enums/target-type.enum.d.ts +0 -0
- /package/lib/{+shared/editor → editor}/operations/helpers/content-operations.helper.d.ts +0 -0
- /package/lib/{+shared/editor/core/constants → editor/positioning}/alignments.const.d.ts +0 -0
- /package/lib/{+shared/editor/interfaces → editor/positioning}/insert-index.interface.d.ts +0 -0
|
@@ -1,1102 +0,0 @@
|
|
|
1
|
-
import { Alignment } from './constants/alignments.const';
|
|
2
|
-
import { BreakHelper } from '../helpers/break.helper';
|
|
3
|
-
import { BreakTypes } from './enums/break-types.enum';
|
|
4
|
-
import { ContentHelper } from '../helpers/content.helper';
|
|
5
|
-
import { ContentStyleHelper } from './helpers/content-style.helper';
|
|
6
|
-
import { CUSTOM_ELEMENT_MARKER } from '../custom-components/shared/constants/custom-content-markers.const';
|
|
7
|
-
import { CustomComponentHelper } from '../custom-components/shared/helpers/custom-component.hepler';
|
|
8
|
-
import { DEFAULT_BACKGROUND_COLOR, DEFAULT_FONT_COLOR, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_PARAGRAPH_STYLE, HYPERLINK_HEADING_STYLE_ID, NEW_LINE_MARKUP } from './constants/editor.const';
|
|
9
|
-
import { DisplayToken } from './models/display-token.model';
|
|
10
|
-
import { DisplayValue } from './constants/display-values.const';
|
|
11
|
-
import { ElementModel } from '../../../models/generated/element.model';
|
|
12
|
-
import { EventEmitting } from './base/event-emitting';
|
|
13
|
-
import { FontMetrics } from './helpers/font-metrics.helper';
|
|
14
|
-
import { FormatStyleHelper } from './helpers/format-style.helper';
|
|
15
|
-
import { ImageDataModel } from '../../../models/generated/image-data.model';
|
|
16
|
-
import { IndentModel } from './models/indent.model';
|
|
17
|
-
import { InsertElementModel } from '../../../models/generated/insert-element.model';
|
|
18
|
-
import { LineInfoModel } from './models/line-info.model';
|
|
19
|
-
import { NoderImageComponent } from '../custom-components/image/components/image.component';
|
|
20
|
-
import { NoderTabComponent } from '../custom-components/tab/tab.component';
|
|
21
|
-
import { NoderTableComponent } from '../custom-components/table/components/table.component';
|
|
22
|
-
import { NumberingHelper } from './helpers/numbering.helper';
|
|
23
|
-
import { NumberingMarkerType } from './enums/numbering-marker-type.enum';
|
|
24
|
-
import { OperationsHelper } from '../operations/helpers/operations-helper.helper';
|
|
25
|
-
import { PagesWrap } from './paging/pages.wrap';
|
|
26
|
-
import { ParagraphHelper } from './helpers/paragraph.helper';
|
|
27
|
-
import { ParagraphStyleHelper } from './helpers/paragraph-style.helper';
|
|
28
|
-
import { Point } from './point';
|
|
29
|
-
import { Range } from './range';
|
|
30
|
-
import { TabHelper } from '../helpers/tab.helper';
|
|
31
|
-
import { TextStyleModel } from '../../../models/generated/text-style.model';
|
|
32
|
-
import { UnicodeHelper } from './helpers/unicode.helper';
|
|
33
|
-
export class EditSession extends EventEmitting {
|
|
34
|
-
set styles(styles) {
|
|
35
|
-
for (let key of Object.keys(styles)) {
|
|
36
|
-
if (styles[key].length === 0) {
|
|
37
|
-
this._stylesMap[key] = ContentStyleHelper.getDefaultStyleValueByKey(key);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
else if (styles[key].length > 1 && !styles[key].every(x => x === styles[key][0])) {
|
|
41
|
-
this._stylesMap[key] = typeof styles[key][0] === 'boolean' && key !== 'isBulletMarker' ? false : null;
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
this._stylesMap[key] = styles[key][0];
|
|
45
|
-
}
|
|
46
|
-
this.signal('setStyles', this._stylesMap);
|
|
47
|
-
}
|
|
48
|
-
get stylesMap() {
|
|
49
|
-
return this._stylesMap;
|
|
50
|
-
}
|
|
51
|
-
set contentWidth(value) {
|
|
52
|
-
if (!value) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
this._contentWidth = value;
|
|
56
|
-
this.updateWrapData(0, this.document.lines.length - 1);
|
|
57
|
-
}
|
|
58
|
-
get contentWidth() {
|
|
59
|
-
return this._contentWidth;
|
|
60
|
-
}
|
|
61
|
-
set cursorStyle(model) {
|
|
62
|
-
if (!model) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (!this._cursorStyle) {
|
|
66
|
-
this._cursorStyle = model;
|
|
67
|
-
this.emit('cursorStylesChanged', this._cursorStyle);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const changes = ContentStyleHelper.getTextStyleChanges(this._cursorStyle, model);
|
|
71
|
-
if (!changes) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
ContentStyleHelper.applyTextStyleChanges(this._cursorStyle, model, changes);
|
|
75
|
-
this.emit('cursorStylesChanged', this._cursorStyle);
|
|
76
|
-
}
|
|
77
|
-
get cursorStyle() {
|
|
78
|
-
return this._cursorStyle;
|
|
79
|
-
}
|
|
80
|
-
constructor(document, sessionId, customContentService, model, selection, properties) {
|
|
81
|
-
super();
|
|
82
|
-
this.document = document;
|
|
83
|
-
this.sessionId = sessionId;
|
|
84
|
-
this.customContentService = customContentService;
|
|
85
|
-
this.model = model;
|
|
86
|
-
this.selection = selection;
|
|
87
|
-
this.properties = properties;
|
|
88
|
-
this.tokenRe = new RegExp('^[' + UnicodeHelper.wordChars + '\\$_]+', 'g');
|
|
89
|
-
this.nonTokenRe = new RegExp('^(?:[^' + UnicodeHelper.wordChars + '\\$_]|\\s])+', 'g');
|
|
90
|
-
this.wrapData = [[]]; // Wrap indexes for document rows
|
|
91
|
-
this.wrapParagraphLine = []; // line numbers that begin the paragraphs
|
|
92
|
-
this.wrapParagraphIndex = []; // symbol indexes that begin the paragraphs
|
|
93
|
-
this.scrollTop = 0;
|
|
94
|
-
this._stylesMap = {
|
|
95
|
-
fontFamily: DEFAULT_FONT_FAMILY,
|
|
96
|
-
fontSize: DEFAULT_FONT_SIZE,
|
|
97
|
-
fontColor: DEFAULT_FONT_COLOR,
|
|
98
|
-
alignment: Alignment.left,
|
|
99
|
-
backgroundColor: DEFAULT_BACKGROUND_COLOR,
|
|
100
|
-
highlightColor: DEFAULT_BACKGROUND_COLOR
|
|
101
|
-
};
|
|
102
|
-
const maxWidth = document.pageWidth - (document.pageMargin.left + document.pageMargin.right);
|
|
103
|
-
this.customComponents = this.customContentService.generateComponents(this.model, this.sessionId, this.properties, maxWidth);
|
|
104
|
-
this.setDocument();
|
|
105
|
-
}
|
|
106
|
-
destroy() {
|
|
107
|
-
this.pagesWrap.destroy();
|
|
108
|
-
}
|
|
109
|
-
setScrollTop(value) {
|
|
110
|
-
if (this.scrollTop === value || isNaN(value)) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
this.scrollTop = value;
|
|
114
|
-
this.signal('changeScrollTop', value);
|
|
115
|
-
}
|
|
116
|
-
getRowLength(row) {
|
|
117
|
-
if (!this.wrapData[row]) {
|
|
118
|
-
return 1;
|
|
119
|
-
}
|
|
120
|
-
return this.wrapData[row].length + 1;
|
|
121
|
-
}
|
|
122
|
-
updateWrapParagraphIndex(first) {
|
|
123
|
-
const count = this.document.lines.length;
|
|
124
|
-
if (first === 0) {
|
|
125
|
-
this.wrapParagraphIndex[first] = 0;
|
|
126
|
-
first++;
|
|
127
|
-
}
|
|
128
|
-
for (let i = first; i < count; i++) {
|
|
129
|
-
this.wrapParagraphIndex[i] = this.wrapParagraphIndex[i - 1] + this.document.lines[i - 1].length + 1;
|
|
130
|
-
}
|
|
131
|
-
this.wrapParagraphIndex.splice(count);
|
|
132
|
-
}
|
|
133
|
-
updateWrapParagraphLine(first) {
|
|
134
|
-
const count = this.document.lines.length;
|
|
135
|
-
if (first === 0) {
|
|
136
|
-
this.wrapParagraphLine[first] = 0;
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
this.wrapParagraphLine[first] = this.wrapParagraphLine[first - 1] + this.wrapData[first - 1].length + 1;
|
|
140
|
-
}
|
|
141
|
-
for (let i = first + 1; i < count; i++) {
|
|
142
|
-
this.wrapParagraphLine[i] = this.wrapParagraphLine[i - 1] + this.wrapData[i - 1].length + 1;
|
|
143
|
-
}
|
|
144
|
-
this.wrapParagraphLine.splice(count);
|
|
145
|
-
}
|
|
146
|
-
updateParagraphNumberingData(index) {
|
|
147
|
-
if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== this.model.paragraphs[index].paragraphStyle.numberingId) {
|
|
148
|
-
this.pagesWrap.paragraphs[index].numberingData = NumberingHelper.createDataModel(this.properties.numberings, this.model.paragraphs, index);
|
|
149
|
-
}
|
|
150
|
-
if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== null) {
|
|
151
|
-
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
|
|
152
|
-
NumberingHelper.updateMarkerData(this.properties, this.pagesWrap.paragraphs[index], paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
updateWrapData(firstParagraph, lastParagraph) {
|
|
156
|
-
this.updateWrapParagraphIndex(firstParagraph);
|
|
157
|
-
let indexOfParagraphAfterPageBreak = this.pagesWrap.paragraphs[firstParagraph - 1]?.isEndedByPageBreak ? firstParagraph : -1;
|
|
158
|
-
let firstUsedTabIndex = this.customComponents.tabs.findIndex(x => x.instance.insertIndex >= this.wrapParagraphIndex[firstParagraph]);
|
|
159
|
-
for (let i = firstParagraph; i <= lastParagraph; i++) {
|
|
160
|
-
this.pagesWrap.tabTokens = [];
|
|
161
|
-
const currentLine = this.document.getLine(this.document.lines, i);
|
|
162
|
-
const isNextLineExists = this.document.lines.length > i + 1;
|
|
163
|
-
const { splits, rowInfos } = this.getSplits(this.model, currentLine, this.wrapParagraphIndex[i], this.customComponents, i, isNextLineExists);
|
|
164
|
-
this.wrapData[i] = splits;
|
|
165
|
-
if (indexOfParagraphAfterPageBreak === i) {
|
|
166
|
-
rowInfos[0].isAfterPageBreak = true;
|
|
167
|
-
}
|
|
168
|
-
indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
|
|
169
|
-
this.pagesWrap.set(i, rowInfos, this.properties.numberings, this.model.paragraphs);
|
|
170
|
-
this.updateParagraphNumberingData(i);
|
|
171
|
-
firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i, currentLine.length);
|
|
172
|
-
}
|
|
173
|
-
this.pagesWrap.paragraphs[lastParagraph + 1]?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
|
|
174
|
-
const count = this.document.lines.length;
|
|
175
|
-
this.pagesWrap.paragraphs.splice(count);
|
|
176
|
-
this.wrapData.splice(count);
|
|
177
|
-
this.updateWrapParagraphLine(firstParagraph);
|
|
178
|
-
this.pagesWrap.processParagraphsProperties(firstParagraph);
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Given a string, returns an array of the display characters, including tabs and spaces.
|
|
182
|
-
*/
|
|
183
|
-
getDisplayTokens(model, str, startIndex, customComponents) {
|
|
184
|
-
if (!str.length) {
|
|
185
|
-
return this.getEmptyLineTokens(startIndex);
|
|
186
|
-
}
|
|
187
|
-
return this.getFilledLineTokens(startIndex, str, model, customComponents);
|
|
188
|
-
}
|
|
189
|
-
getRowCacheIndex(cacheArray, value) {
|
|
190
|
-
let start = 0;
|
|
191
|
-
let end = cacheArray.length - 1;
|
|
192
|
-
while (start <= end) {
|
|
193
|
-
const mid = (start + end) >> 1;
|
|
194
|
-
const center = cacheArray[mid];
|
|
195
|
-
if (value > center) {
|
|
196
|
-
start = mid + 1;
|
|
197
|
-
}
|
|
198
|
-
else if (value < center) {
|
|
199
|
-
end = mid - 1;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
return mid;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return start - 1;
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Calculates the width of the string `str` on the screen while assuming that the string starts at the first column on the screen.
|
|
209
|
-
* The first position indicates the number of columns for `str` on screen.
|
|
210
|
-
* The second value contains the position of the document column that this function read until.
|
|
211
|
-
*/
|
|
212
|
-
getStringScreenWidth(str, maxScreenColumn) {
|
|
213
|
-
let screenColumn = 0;
|
|
214
|
-
let column;
|
|
215
|
-
for (column = 0; column < str.length; column++) {
|
|
216
|
-
screenColumn += 1;
|
|
217
|
-
if (screenColumn > maxScreenColumn) {
|
|
218
|
-
break;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
return [screenColumn, column];
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Given a starting row and column, this method returns the `Range` of the first word boundary it finds.
|
|
225
|
-
*/
|
|
226
|
-
getWordRange(row, column) {
|
|
227
|
-
const line = this.document.getLine(this.document.lines, row);
|
|
228
|
-
let inToken = false;
|
|
229
|
-
if (column > 0) {
|
|
230
|
-
inToken = !!line.charAt(column - 1).match(this.tokenRe);
|
|
231
|
-
}
|
|
232
|
-
if (!inToken) {
|
|
233
|
-
inToken = !!line.charAt(column).match(this.tokenRe);
|
|
234
|
-
}
|
|
235
|
-
let regexp;
|
|
236
|
-
if (inToken) {
|
|
237
|
-
regexp = this.tokenRe;
|
|
238
|
-
}
|
|
239
|
-
else if (/^\s+$/.test(line.slice(column - 1, column + 1))) {
|
|
240
|
-
regexp = /\s/;
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
regexp = this.nonTokenRe;
|
|
244
|
-
}
|
|
245
|
-
let start = column;
|
|
246
|
-
if (start > 0) {
|
|
247
|
-
do {
|
|
248
|
-
start--;
|
|
249
|
-
} while (start >= 0 && line.charAt(start).match(regexp));
|
|
250
|
-
start++;
|
|
251
|
-
}
|
|
252
|
-
let end = column;
|
|
253
|
-
while (end < line.length && line.charAt(end).match(regexp)) {
|
|
254
|
-
end++;
|
|
255
|
-
}
|
|
256
|
-
return new Range(new Point(row, start), new Point(row, end));
|
|
257
|
-
}
|
|
258
|
-
getDisplayLine(row, endColumn, startColumn) {
|
|
259
|
-
const line = this.document.getLine(this.document.lines, row);
|
|
260
|
-
return line.substring(startColumn || 0, endColumn || line.length);
|
|
261
|
-
}
|
|
262
|
-
removeByDocumentIndexes(startIndex, endIndex) {
|
|
263
|
-
const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex);
|
|
264
|
-
const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex);
|
|
265
|
-
this.remove(new Range(startParagraphPosition, endParagraphPosition));
|
|
266
|
-
}
|
|
267
|
-
insertTextByDocumentIndex(index, text, style) {
|
|
268
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, index);
|
|
269
|
-
return this.insertText(paragraphPosition, text, style);
|
|
270
|
-
}
|
|
271
|
-
insertElementByDocumentIndex(insertElement) {
|
|
272
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.element.insertIndex);
|
|
273
|
-
return this.insertElement(elementPosition, insertElement.element);
|
|
274
|
-
}
|
|
275
|
-
insertBreakByDocumentIndex(insertElement) {
|
|
276
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
277
|
-
return this.insertBreak(elementPosition, insertElement.breakType);
|
|
278
|
-
}
|
|
279
|
-
insertTabByDocumentIndex(insertElement) {
|
|
280
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
281
|
-
return this.insertTab(elementPosition);
|
|
282
|
-
}
|
|
283
|
-
insertImageByDocumentIndex(insertElement) {
|
|
284
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
285
|
-
return this.insertImage(elementPosition, insertElement.imageData);
|
|
286
|
-
}
|
|
287
|
-
insertTableByDocumentIndex(insertElement) {
|
|
288
|
-
const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
|
|
289
|
-
return this.insertTable(elementPosition, insertElement);
|
|
290
|
-
}
|
|
291
|
-
applyTextStyle(startIndex, endIndex, textStyle) {
|
|
292
|
-
this.cursorStyle = new TextStyleModel(textStyle);
|
|
293
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
294
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
295
|
-
OperationsHelper.applyTextStyle(this.model, startIndex, endIndex, textStyle);
|
|
296
|
-
this.updateWrapData(startParagraph, endParagraph);
|
|
297
|
-
this.setStyle(textStyle);
|
|
298
|
-
}
|
|
299
|
-
applyParagraphStyle(startIndex, endIndex, paragraphStyle) {
|
|
300
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
301
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
302
|
-
OperationsHelper.applyParagraphStyle(this.model, startIndex, endIndex, paragraphStyle);
|
|
303
|
-
this.updateWrapData(startParagraph, endParagraph);
|
|
304
|
-
this.setStyle(paragraphStyle);
|
|
305
|
-
}
|
|
306
|
-
applyElementStyle(model) {
|
|
307
|
-
OperationsHelper.applyElementStyle(this.model, model);
|
|
308
|
-
const imageComponentRef = this.customComponents.customElements.find(x => x.instance.insertIndex === model.insertIndex);
|
|
309
|
-
imageComponentRef.instance.initialize();
|
|
310
|
-
const paragraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.insertIndex).row;
|
|
311
|
-
this.updateWrapData(paragraph, paragraph);
|
|
312
|
-
}
|
|
313
|
-
addNumbering(levels, startIndex, endIndex) {
|
|
314
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
315
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
316
|
-
OperationsHelper.addNumbering(this.model, this.properties.numberings, startIndex, endIndex, levels);
|
|
317
|
-
for (let i = startParagraph; i <= endParagraph; i++) {
|
|
318
|
-
if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
|
|
319
|
-
this.updateNumberingsDataOnChange(endParagraph);
|
|
320
|
-
break;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
this.updateWrapData(startParagraph, endParagraph);
|
|
324
|
-
this.setNumberingStyle(startIndex, endIndex);
|
|
325
|
-
}
|
|
326
|
-
removeNumberings(startIndex, endIndex) {
|
|
327
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
328
|
-
const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
|
|
329
|
-
OperationsHelper.removeNumberings(this.model, this.properties.numberings, startIndex, endIndex);
|
|
330
|
-
for (let i = startParagraph; i <= endParagraph; i++) {
|
|
331
|
-
if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
|
|
332
|
-
this.updateNumberingsDataOnChange(endParagraph);
|
|
333
|
-
break;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
this.updateWrapData(startParagraph, endParagraph);
|
|
337
|
-
this.setNumberingStyle(startIndex, endIndex);
|
|
338
|
-
}
|
|
339
|
-
restoreNumberings(paragraphs, numberings) {
|
|
340
|
-
const startIndex = paragraphs[0].insertIndex;
|
|
341
|
-
const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
|
|
342
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
343
|
-
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
|
|
344
|
-
OperationsHelper.restoreNumberings(this.model, this.properties.numberings, paragraphs, numberings);
|
|
345
|
-
for (const paragraph of paragraphs) {
|
|
346
|
-
if (paragraph.paragraphStyle.numberingId !== null) {
|
|
347
|
-
this.updateNumberingsDataOnChange(endPosition.row);
|
|
348
|
-
break;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
this.updateWrapData(startParagraph, endPosition.row);
|
|
352
|
-
this.selection.placeCursor(endPosition);
|
|
353
|
-
this.setNumberingStyle(startIndex, endIndex);
|
|
354
|
-
}
|
|
355
|
-
applyImageStyle(applyImage) {
|
|
356
|
-
const imageComponentRef = this.customComponents.images.find(x => x.instance.insertIndex === applyImage.insertIndex);
|
|
357
|
-
imageComponentRef.instance.resize({ width: applyImage.width, height: applyImage.height });
|
|
358
|
-
OperationsHelper.applyImageStyle(this.model, applyImage);
|
|
359
|
-
const start = this.document.indexToPosition(applyImage.insertIndex, 0);
|
|
360
|
-
this.updateWrapData(start.row, this.document.lines.length - 1);
|
|
361
|
-
}
|
|
362
|
-
restoreTextStyles(formats) {
|
|
363
|
-
const startIndex = formats[0].startIndex;
|
|
364
|
-
const endIndex = formats[formats.length - 1].endIndex;
|
|
365
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
366
|
-
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
|
|
367
|
-
OperationsHelper.restoreTextStyles(this.model, formats);
|
|
368
|
-
this.updateWrapData(startParagraph, endPosition.row);
|
|
369
|
-
this.selection.placeCursor(endPosition);
|
|
370
|
-
this.processSelectionStyles();
|
|
371
|
-
}
|
|
372
|
-
restoreParagraphStyles(paragraphs) {
|
|
373
|
-
const startIndex = paragraphs[0].insertIndex;
|
|
374
|
-
const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
|
|
375
|
-
const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
|
|
376
|
-
const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
|
|
377
|
-
OperationsHelper.restoreParagraphStyles(this.model, paragraphs);
|
|
378
|
-
this.updateWrapData(startParagraph, endPosition.row);
|
|
379
|
-
this.selection.placeCursor(endPosition);
|
|
380
|
-
this.processSelectionStyles();
|
|
381
|
-
}
|
|
382
|
-
setTextStyle(textStyle) {
|
|
383
|
-
this.cursorStyle = new TextStyleModel(textStyle);
|
|
384
|
-
this.setStyle(textStyle);
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Removes the `range` from the document.
|
|
388
|
-
* If `range` is empty, this function returns the unmodified value of `range.start`.
|
|
389
|
-
*/
|
|
390
|
-
remove(range) {
|
|
391
|
-
const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.start);
|
|
392
|
-
const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.end) - 1;
|
|
393
|
-
this.document.removeRange(range);
|
|
394
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.tables, startIndex, endIndex);
|
|
395
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.images, startIndex, endIndex);
|
|
396
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.customElements, startIndex, endIndex);
|
|
397
|
-
CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, startIndex, endIndex);
|
|
398
|
-
OperationsHelper.delete(this.model, startIndex, endIndex);
|
|
399
|
-
this.selection.placeCursor(range.start);
|
|
400
|
-
this.updateInternalDataOnDeleteText(range.start.row, range.end.row);
|
|
401
|
-
this.processSelectionStyles();
|
|
402
|
-
}
|
|
403
|
-
replace(model) {
|
|
404
|
-
this.removeByDocumentIndexes(model.delete.startIndex, model.delete.endIndex + 1);
|
|
405
|
-
let endPoint;
|
|
406
|
-
if (model.insertText) {
|
|
407
|
-
endPoint = this.insertTextByDocumentIndex(model.insertText.insertIndex, model.insertText.text);
|
|
408
|
-
}
|
|
409
|
-
else if (model.insertElement) {
|
|
410
|
-
endPoint = this.insertElementByDocumentIndex(model.insertElement);
|
|
411
|
-
}
|
|
412
|
-
else if (model.insertBreak) {
|
|
413
|
-
endPoint = this.insertBreakByDocumentIndex(model.insertBreak);
|
|
414
|
-
}
|
|
415
|
-
else if (model.insertTab) {
|
|
416
|
-
endPoint = this.insertTabByDocumentIndex(model.insertTab);
|
|
417
|
-
}
|
|
418
|
-
else if (model.insertImage) {
|
|
419
|
-
endPoint = this.insertImageByDocumentIndex(model.insertImage);
|
|
420
|
-
}
|
|
421
|
-
else if (model.insertTable) {
|
|
422
|
-
endPoint = this.insertTableByDocumentIndex(model.insertTable);
|
|
423
|
-
}
|
|
424
|
-
return endPoint;
|
|
425
|
-
}
|
|
426
|
-
insertText(position, text, cursorStyle) {
|
|
427
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
428
|
-
if (cursorStyle) {
|
|
429
|
-
OperationsHelper.insertStyledText(this.model, text, insertIndex, cursorStyle);
|
|
430
|
-
}
|
|
431
|
-
else {
|
|
432
|
-
OperationsHelper.insertText(this.model, text, insertIndex);
|
|
433
|
-
}
|
|
434
|
-
const endPoint = this.document.insertText(position, text);
|
|
435
|
-
this.updateInternalDataOnInsertText(position.row, endPoint.row);
|
|
436
|
-
this.selection.placeCursor(endPoint);
|
|
437
|
-
return endPoint;
|
|
438
|
-
}
|
|
439
|
-
insertElement(position, element) {
|
|
440
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
441
|
-
const insertElement = new InsertElementModel({ element: new ElementModel({ insertIndex, ...element }) });
|
|
442
|
-
OperationsHelper.insertElement(this.model, insertElement);
|
|
443
|
-
const model = this.model.elements.find(x => x.insertIndex === insertIndex);
|
|
444
|
-
const type = this.customContentService.findComponentType(model.type);
|
|
445
|
-
this.addComponent(this.customComponents.customElements, model, type);
|
|
446
|
-
const endPoint = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
447
|
-
this.updateWrapData(position.row, endPoint.row);
|
|
448
|
-
this.selection.placeCursor(endPoint);
|
|
449
|
-
return endPoint;
|
|
450
|
-
}
|
|
451
|
-
insertBreak(position, breakType) {
|
|
452
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
453
|
-
const isOnNewParagraph = breakType === BreakTypes.Page &&
|
|
454
|
-
BreakHelper.getBreakType(this.model, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
|
|
455
|
-
const text = isOnNewParagraph ? `${NEW_LINE_MARKUP}${CUSTOM_ELEMENT_MARKER}` : CUSTOM_ELEMENT_MARKER;
|
|
456
|
-
OperationsHelper.insertBreak(this.model, text, insertIndex, breakType);
|
|
457
|
-
const endPoint = this.document.insertText(position, text);
|
|
458
|
-
if (isOnNewParagraph) {
|
|
459
|
-
this.updateInternalDataOnInsertText(position.row, endPoint.row);
|
|
460
|
-
}
|
|
461
|
-
this.updateWrapData(position.row, endPoint.row);
|
|
462
|
-
const point = this.document.getPositionAfterBreak(endPoint, breakType);
|
|
463
|
-
this.selection.placeCursor(point);
|
|
464
|
-
return endPoint;
|
|
465
|
-
}
|
|
466
|
-
insertTab(position) {
|
|
467
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
468
|
-
OperationsHelper.insertTab(this.model, insertIndex);
|
|
469
|
-
const model = this.model.tabs.find(x => x.insertIndex === insertIndex);
|
|
470
|
-
this.addComponent(this.customComponents.tabs, model, NoderTabComponent);
|
|
471
|
-
const endPoint = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
472
|
-
this.updateWrapData(position.row, position.row);
|
|
473
|
-
this.selection.placeCursor(endPoint);
|
|
474
|
-
return endPoint;
|
|
475
|
-
}
|
|
476
|
-
insertImage(position, imageData) {
|
|
477
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
478
|
-
const adjustedImage = this.getImageWithAllowedSize(imageData, this.contentWidth);
|
|
479
|
-
OperationsHelper.insertImage(this.model, insertIndex, adjustedImage);
|
|
480
|
-
const model = this.model.images.find(x => x.insertIndex === insertIndex);
|
|
481
|
-
this.addComponent(this.customComponents.images, model, NoderImageComponent);
|
|
482
|
-
const endPoint = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
|
|
483
|
-
this.updateWrapData(position.row, position.row);
|
|
484
|
-
this.selection.placeCursor(endPoint);
|
|
485
|
-
return endPoint;
|
|
486
|
-
}
|
|
487
|
-
insertLink(position, linkData) {
|
|
488
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
489
|
-
const linkStyle = new TextStyleModel({ headingStyleId: HYPERLINK_HEADING_STYLE_ID, underline: true });
|
|
490
|
-
OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex, linkStyle);
|
|
491
|
-
const endPoint = this.document.insertText(position, linkData.text);
|
|
492
|
-
this.updateWrapData(position.row, position.row);
|
|
493
|
-
this.selection.placeCursor(endPoint);
|
|
494
|
-
return endPoint;
|
|
495
|
-
}
|
|
496
|
-
insertTable(position, tableModel) {
|
|
497
|
-
const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
|
|
498
|
-
OperationsHelper.insertTable(this.model, insertIndex, tableModel, this.pagesWrap.contentWidth);
|
|
499
|
-
const model = this.model.tables.find(x => x.insertIndex === tableModel.insertTableIndex);
|
|
500
|
-
this.addComponent(this.customComponents.tables, model, NoderTableComponent);
|
|
501
|
-
const endPoint = this.document.insertText(position, tableModel.content);
|
|
502
|
-
this.updateInternalDataOnInsertText(position.row, endPoint.row);
|
|
503
|
-
this.selection.placeCursor(endPoint);
|
|
504
|
-
return endPoint;
|
|
505
|
-
}
|
|
506
|
-
addComponent(customElements, model, componentType) {
|
|
507
|
-
const customElement = this.customContentService.componentService.generateComponent(componentType, {
|
|
508
|
-
content: model,
|
|
509
|
-
sessionId: this.sessionId,
|
|
510
|
-
properties: this.properties,
|
|
511
|
-
contentWidth: this.contentWidth
|
|
512
|
-
});
|
|
513
|
-
const newElementPosition = customElements.findIndex(x => x.instance.insertIndex > model.insertIndex);
|
|
514
|
-
if (newElementPosition >= 0) {
|
|
515
|
-
customElements.splice(newElementPosition, 0, customElement);
|
|
516
|
-
}
|
|
517
|
-
else {
|
|
518
|
-
customElements.push(customElement);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
setStyle(style) {
|
|
522
|
-
for (const key of Object.keys(style)) {
|
|
523
|
-
this._stylesMap[key] = style[key];
|
|
524
|
-
}
|
|
525
|
-
this.signal('setStyles', this._stylesMap);
|
|
526
|
-
}
|
|
527
|
-
setNumberingStyle(startIndex, endIndex) {
|
|
528
|
-
const styles = {
|
|
529
|
-
alignment: [this._stylesMap.alignment],
|
|
530
|
-
backgroundColor: [this._stylesMap.backgroundColor],
|
|
531
|
-
highlightColor: [this._stylesMap.highlightColor],
|
|
532
|
-
fontColor: [this._stylesMap.fontColor],
|
|
533
|
-
fontFamily: [this._stylesMap.fontFamily],
|
|
534
|
-
fontSize: [this._stylesMap.fontSize],
|
|
535
|
-
italic: [this._stylesMap.italic],
|
|
536
|
-
bold: [this._stylesMap.bold],
|
|
537
|
-
strikethrough: [this._stylesMap.strikethrough],
|
|
538
|
-
underline: [this._stylesMap.underline],
|
|
539
|
-
spaceBefore: [this._stylesMap.spaceBefore],
|
|
540
|
-
spaceAfter: [this._stylesMap.spaceAfter],
|
|
541
|
-
indentLeft: [this._stylesMap.indentLeft],
|
|
542
|
-
indentRight: [this._stylesMap.indentRight],
|
|
543
|
-
isBulletMarker: [],
|
|
544
|
-
numberingLevelsStyles: []
|
|
545
|
-
};
|
|
546
|
-
this.updateNumberingStyles(styles, startIndex, endIndex);
|
|
547
|
-
this.styles = styles;
|
|
548
|
-
}
|
|
549
|
-
restore(model) {
|
|
550
|
-
const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.startIndex);
|
|
551
|
-
if (model.startIndex !== model.endIndex) {
|
|
552
|
-
this.removeByDocumentIndexes(model.startIndex, model.endIndex);
|
|
553
|
-
}
|
|
554
|
-
OperationsHelper.restore(this.model, model);
|
|
555
|
-
const restoreEndIndex = model.startIndex + model.text.length;
|
|
556
|
-
this.restoreComponents(this.model.tables, this.customComponents.tables, NoderTableComponent, model.startIndex, restoreEndIndex);
|
|
557
|
-
this.restoreComponents(this.model.images, this.customComponents.images, NoderImageComponent, model.startIndex, restoreEndIndex);
|
|
558
|
-
this.restoreComponents(this.model.tabs, this.customComponents.tabs, NoderTabComponent, model.startIndex, restoreEndIndex);
|
|
559
|
-
this.restoreElementComponents(this.model.elements, model.startIndex, restoreEndIndex);
|
|
560
|
-
const endPoint = this.document.insertText(paragraphPosition, model.text);
|
|
561
|
-
this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
|
|
562
|
-
this.selection.placeCursor(endPoint);
|
|
563
|
-
this.processSelectionStyles();
|
|
564
|
-
}
|
|
565
|
-
restoreComponents(models, components, componentType, restoreIndex, restoreEndIndex) {
|
|
566
|
-
for (const model of models) {
|
|
567
|
-
if (model.insertIndex < restoreIndex) {
|
|
568
|
-
continue;
|
|
569
|
-
}
|
|
570
|
-
else if (model.insertIndex >= restoreEndIndex) {
|
|
571
|
-
break;
|
|
572
|
-
}
|
|
573
|
-
this.addComponent(components, model, componentType);
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
restoreElementComponents(elements, restoreIndex, restoreEndIndex) {
|
|
577
|
-
for (const model of elements) {
|
|
578
|
-
if (model.insertIndex < restoreIndex) {
|
|
579
|
-
continue;
|
|
580
|
-
}
|
|
581
|
-
else if (model.insertIndex >= restoreEndIndex) {
|
|
582
|
-
break;
|
|
583
|
-
}
|
|
584
|
-
const type = this.customContentService.findComponentType(model.type);
|
|
585
|
-
this.addComponent(this.customComponents.customElements, model, type);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
processSelectionStyles() {
|
|
589
|
-
const { startIndex, endIndex } = this.getRangeIndexes(this.selection.range);
|
|
590
|
-
const styles = {
|
|
591
|
-
alignment: [],
|
|
592
|
-
backgroundColor: [],
|
|
593
|
-
highlightColor: [],
|
|
594
|
-
fontColor: [],
|
|
595
|
-
fontFamily: [],
|
|
596
|
-
fontSize: [],
|
|
597
|
-
italic: [],
|
|
598
|
-
bold: [],
|
|
599
|
-
strikethrough: [],
|
|
600
|
-
underline: [],
|
|
601
|
-
spaceBefore: [],
|
|
602
|
-
spaceAfter: [],
|
|
603
|
-
indentLeft: [],
|
|
604
|
-
indentRight: [],
|
|
605
|
-
isBulletMarker: [],
|
|
606
|
-
numberingLevelsStyles: []
|
|
607
|
-
};
|
|
608
|
-
this.updateParagraphStyles(styles, startIndex, endIndex);
|
|
609
|
-
this.updateNumberingStyles(styles, startIndex, endIndex);
|
|
610
|
-
const format = this.updateTextStyles(styles, startIndex, endIndex);
|
|
611
|
-
this.styles = styles;
|
|
612
|
-
if (format) {
|
|
613
|
-
const newTextStyle = Object.assign({}, format.textStyle, this.cursorStyle);
|
|
614
|
-
this.cursorStyle = new TextStyleModel(newTextStyle);
|
|
615
|
-
this.setStyle(this.cursorStyle);
|
|
616
|
-
}
|
|
617
|
-
else {
|
|
618
|
-
this.clearCursorStyle();
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
getLinkModel(cursor) {
|
|
622
|
-
const { startIndex, endIndex } = this.getRangeIndexes(new Range(cursor, cursor));
|
|
623
|
-
return this.model.links.find(x => x.insertIndex <= startIndex + 1 && x.endIndex > endIndex);
|
|
624
|
-
}
|
|
625
|
-
insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
|
|
626
|
-
OperationsHelper.insertTableRows(this.model, insertIndex, rowsCount, targetIndex, inheritIndex);
|
|
627
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
628
|
-
tableComponent.instance.updateTable();
|
|
629
|
-
}
|
|
630
|
-
insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex) {
|
|
631
|
-
OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, this.pagesWrap.contentWidth);
|
|
632
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
633
|
-
tableComponent.instance.updateTable();
|
|
634
|
-
}
|
|
635
|
-
removeTableRows(insertIndex, startIndex, endIndex) {
|
|
636
|
-
OperationsHelper.removeTableRows(this.model, insertIndex, startIndex, endIndex);
|
|
637
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
638
|
-
tableComponent.instance.updateTable();
|
|
639
|
-
}
|
|
640
|
-
removeTableColumns(insertIndex, startIndex, endIndex) {
|
|
641
|
-
OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, this.pagesWrap.contentWidth);
|
|
642
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
643
|
-
tableComponent.instance.updateTable();
|
|
644
|
-
}
|
|
645
|
-
resizeTableColumns(resizeTableColumns) {
|
|
646
|
-
OperationsHelper.resizeTableColumns(this.model, resizeTableColumns);
|
|
647
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
|
|
648
|
-
tableComponent.instance.updateTable();
|
|
649
|
-
}
|
|
650
|
-
restoreTable(insertIndex, table) {
|
|
651
|
-
const oldTable = JSON.parse(JSON.stringify(table));
|
|
652
|
-
OperationsHelper.restoreTable(this.model, insertIndex, oldTable);
|
|
653
|
-
const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
|
|
654
|
-
tableComponent.instance.updateTable();
|
|
655
|
-
}
|
|
656
|
-
updateParagraphTabs(tabIndex, paragraphIndex, length) {
|
|
657
|
-
const paragraphLastIndex = this.wrapParagraphIndex[paragraphIndex] + length;
|
|
658
|
-
if (tabIndex === -1 ||
|
|
659
|
-
tabIndex >= this.customComponents.tabs.length ||
|
|
660
|
-
this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
|
|
661
|
-
return tabIndex;
|
|
662
|
-
}
|
|
663
|
-
const startIndex = tabIndex;
|
|
664
|
-
while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
|
|
665
|
-
this.customComponents.tabs[tabIndex].instance.width = this.pagesWrap.tabTokens[tabIndex - startIndex].width;
|
|
666
|
-
this.customComponents.tabs[tabIndex].instance.height = this.pagesWrap.tabTokens[tabIndex - startIndex].font;
|
|
667
|
-
tabIndex++;
|
|
668
|
-
}
|
|
669
|
-
return tabIndex;
|
|
670
|
-
}
|
|
671
|
-
getRangeIndexes(range) {
|
|
672
|
-
let startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.start);
|
|
673
|
-
let endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.end);
|
|
674
|
-
const prevNewLineSymbol = this.document.isNewLineSymbol(endIndex - 1);
|
|
675
|
-
if (!prevNewLineSymbol) {
|
|
676
|
-
if (endIndex > startIndex) {
|
|
677
|
-
endIndex--;
|
|
678
|
-
}
|
|
679
|
-
else if (startIndex === endIndex && startIndex > 0) {
|
|
680
|
-
startIndex--;
|
|
681
|
-
endIndex--;
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
return { startIndex, endIndex };
|
|
685
|
-
}
|
|
686
|
-
updateInternalDataOnInsertText(startRow, endRow) {
|
|
687
|
-
const length = endRow - startRow;
|
|
688
|
-
const newParagraphs = Array(length);
|
|
689
|
-
const newWrapData = Array(length);
|
|
690
|
-
for (let i = 0; i < length; i++) {
|
|
691
|
-
newWrapData[i] = [];
|
|
692
|
-
}
|
|
693
|
-
this.wrapData.splice(startRow, 0, ...newWrapData);
|
|
694
|
-
this.pagesWrap.paragraphs.splice(startRow, 0, ...newParagraphs);
|
|
695
|
-
if (length) {
|
|
696
|
-
this.updateNumberingsDataOnChange(endRow);
|
|
697
|
-
}
|
|
698
|
-
this.updateWrapData(startRow, endRow);
|
|
699
|
-
}
|
|
700
|
-
updateInternalDataOnDeleteText(startRow, endRow) {
|
|
701
|
-
const length = endRow - startRow;
|
|
702
|
-
this.wrapData.splice(startRow, length);
|
|
703
|
-
this.pagesWrap.remove(startRow, length);
|
|
704
|
-
if (length) {
|
|
705
|
-
this.updateNumberingsDataOnChange(startRow);
|
|
706
|
-
}
|
|
707
|
-
this.updateWrapData(startRow, startRow);
|
|
708
|
-
}
|
|
709
|
-
updateNumberingsDataOnChange(index) {
|
|
710
|
-
for (let i = index; i < this.pagesWrap.paragraphs.length; i++) {
|
|
711
|
-
if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
|
|
712
|
-
this.pagesWrap.paragraphs[i].numberingData = NumberingHelper.createDataModel(this.properties.numberings, this.model.paragraphs, i);
|
|
713
|
-
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
|
|
714
|
-
NumberingHelper.updateMarkerData(this.properties, this.pagesWrap.paragraphs[i], paragraphFormat.textStyle, this.model.paragraphs[i].paragraphStyle);
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
/**
|
|
719
|
-
* Computes wrap index based on max row width
|
|
720
|
-
*/
|
|
721
|
-
computeWrapIndex(displayTokens) {
|
|
722
|
-
if (!displayTokens[0]) {
|
|
723
|
-
return 0;
|
|
724
|
-
}
|
|
725
|
-
if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
|
|
726
|
-
return 1;
|
|
727
|
-
}
|
|
728
|
-
const indent = displayTokens[0].indentLeft +
|
|
729
|
-
displayTokens[0].indentRight +
|
|
730
|
-
displayTokens[0].indentFirstLine -
|
|
731
|
-
displayTokens[0].indentHanging || 0;
|
|
732
|
-
const maxRowWidth = (this.pagesWrap.contentWidth || this.contentWidth) - indent;
|
|
733
|
-
let sum = 0;
|
|
734
|
-
for (let i = 0; i < displayTokens.length; i++) {
|
|
735
|
-
if (displayTokens[i].isTab) {
|
|
736
|
-
displayTokens[i].width = TabHelper.calculateTabWidth(sum, this.properties.defaultTabWidth);
|
|
737
|
-
}
|
|
738
|
-
sum += displayTokens[i].width;
|
|
739
|
-
if (i > 0 && (sum >= maxRowWidth || displayTokens[i - 1].breaksLine)) {
|
|
740
|
-
return i;
|
|
741
|
-
}
|
|
742
|
-
if (displayTokens[i].isLineBreak) {
|
|
743
|
-
return i + 1;
|
|
744
|
-
}
|
|
745
|
-
if (i === displayTokens.length - 1 && displayTokens[i].isPageBreak) {
|
|
746
|
-
return i + 1;
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
return 0;
|
|
750
|
-
}
|
|
751
|
-
computeWrapSplit(tokens, wrapLimit) {
|
|
752
|
-
if (!tokens.length || tokens.length <= wrapLimit) {
|
|
753
|
-
return null;
|
|
754
|
-
}
|
|
755
|
-
// If there is a space or tab at this split position, then making
|
|
756
|
-
// a split is simple.
|
|
757
|
-
if (wrapLimit === 0 ||
|
|
758
|
-
tokens[wrapLimit].displayValue === DisplayValue.customContent ||
|
|
759
|
-
(this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
|
|
760
|
-
return wrapLimit;
|
|
761
|
-
}
|
|
762
|
-
return this.calculateSplit(wrapLimit, tokens);
|
|
763
|
-
}
|
|
764
|
-
getSplits(model, line, startIndex, customComponents, paragraphIndex, isNextLineExists) {
|
|
765
|
-
const strTokens = this.getDisplayTokens(model, line, startIndex, customComponents);
|
|
766
|
-
if (!strTokens.length) {
|
|
767
|
-
const defaultRowInfo = new LineInfoModel({
|
|
768
|
-
height: (this.stylesMap.fontSize * 4) / 3,
|
|
769
|
-
width: 0,
|
|
770
|
-
align: DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
771
|
-
indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
772
|
-
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
773
|
-
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
774
|
-
lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
|
|
775
|
-
isAfterPageBreak: false,
|
|
776
|
-
isEndedByPageBreak: false,
|
|
777
|
-
backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
|
|
778
|
-
});
|
|
779
|
-
return { splits: [], rowInfos: [defaultRowInfo] };
|
|
780
|
-
}
|
|
781
|
-
const splits = [];
|
|
782
|
-
const rowInfos = [];
|
|
783
|
-
let prevToken;
|
|
784
|
-
let index = -1;
|
|
785
|
-
let initial = line;
|
|
786
|
-
while (index) {
|
|
787
|
-
initial = initial.slice(index > 0 ? index : 0);
|
|
788
|
-
const tokens = strTokens.slice(line.length - initial.length);
|
|
789
|
-
if (!tokens.length) {
|
|
790
|
-
tokens.push(...this.getEmptyLineTokens(startIndex + index));
|
|
791
|
-
}
|
|
792
|
-
let wrapLimit = this.computeWrapIndex(tokens);
|
|
793
|
-
if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && isNextLineExists) {
|
|
794
|
-
wrapLimit = 0;
|
|
795
|
-
}
|
|
796
|
-
const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
|
|
797
|
-
const wrapTokens = tokens.slice(0, wrapSplit || undefined);
|
|
798
|
-
if (wrapTokens.length) {
|
|
799
|
-
prevToken = wrapTokens[wrapTokens.length - 1];
|
|
800
|
-
}
|
|
801
|
-
const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
|
|
802
|
-
const lineInfo = this.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
|
|
803
|
-
lineInfo.backgroundColor = model.paragraphs[paragraphIndex].paragraphStyle.backgroundColor;
|
|
804
|
-
rowInfos.push(lineInfo);
|
|
805
|
-
if (!wrapLimit) {
|
|
806
|
-
break;
|
|
807
|
-
}
|
|
808
|
-
index = wrapSplit;
|
|
809
|
-
const splitsLength = splits.length;
|
|
810
|
-
const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
|
|
811
|
-
splits.push(splitIndex);
|
|
812
|
-
}
|
|
813
|
-
this.pagesWrap.tabTokens.push(...strTokens.filter(x => x.isTab));
|
|
814
|
-
ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
|
|
815
|
-
return { splits, rowInfos };
|
|
816
|
-
}
|
|
817
|
-
setDocument() {
|
|
818
|
-
const pageMargin = this.document.pageMargin;
|
|
819
|
-
this.pagesWrap = new PagesWrap(this.document.pagesSpace, pageMargin, this.document.pageWidth, this.document.pageHeight, this.customComponents.edges);
|
|
820
|
-
}
|
|
821
|
-
clearCursorStyle() {
|
|
822
|
-
this._cursorStyle = null;
|
|
823
|
-
}
|
|
824
|
-
getEmptyLineTokens(startIndex) {
|
|
825
|
-
const storedFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, startIndex);
|
|
826
|
-
if (!storedFormat) {
|
|
827
|
-
return [];
|
|
828
|
-
}
|
|
829
|
-
const lineInfo = this.getLineInfoByBreakModifier(startIndex);
|
|
830
|
-
const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
|
|
831
|
-
size.width = 3;
|
|
832
|
-
return [
|
|
833
|
-
new DisplayToken({
|
|
834
|
-
...size,
|
|
835
|
-
displayValue: DisplayValue.emptyLine,
|
|
836
|
-
align: lineInfo.align,
|
|
837
|
-
indentFirstLine: lineInfo.indent.firstLine,
|
|
838
|
-
indentHanging: lineInfo.indent.hanging,
|
|
839
|
-
indentLeft: lineInfo.indent.left,
|
|
840
|
-
indentRight: lineInfo.indent.right,
|
|
841
|
-
indentBefore: lineInfo.offsetBefore,
|
|
842
|
-
indentAfter: lineInfo.offsetAfter,
|
|
843
|
-
isPageBreak: false,
|
|
844
|
-
isLineBreak: false,
|
|
845
|
-
isTab: false,
|
|
846
|
-
lineSpacing: lineInfo.lineSpacing
|
|
847
|
-
})
|
|
848
|
-
];
|
|
849
|
-
}
|
|
850
|
-
getFilledLineTokens(startIndex, line, model, customComponents) {
|
|
851
|
-
const lineInfo = this.getLineInfoByBreakModifier(startIndex + line.length);
|
|
852
|
-
const tokens = [];
|
|
853
|
-
let characters = [];
|
|
854
|
-
let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
855
|
-
let prevFormat = null;
|
|
856
|
-
let prevCharCode = null;
|
|
857
|
-
let prevFontString = null;
|
|
858
|
-
let prevChar = null;
|
|
859
|
-
let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
860
|
-
let symbolChange = false;
|
|
861
|
-
for (let i = 0; i < line.length; i++) {
|
|
862
|
-
const char = line[i];
|
|
863
|
-
const size = FontMetrics.measureCharSize(char, fontString);
|
|
864
|
-
const customComponent = this.customContentService.getComponent(customComponents, char, startIndex);
|
|
865
|
-
const breakType = BreakHelper.getBreakType(model, char, startIndex);
|
|
866
|
-
if (customComponent && !breakType) {
|
|
867
|
-
const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
|
|
868
|
-
tokens.push(token);
|
|
869
|
-
prevCharCode = -1;
|
|
870
|
-
prevChar = '';
|
|
871
|
-
characters = [];
|
|
872
|
-
}
|
|
873
|
-
else {
|
|
874
|
-
const charCode = char.charCodeAt(0);
|
|
875
|
-
const displayValue = this.getDisplayValue(charCode);
|
|
876
|
-
const isFirstCharacter = i === 0;
|
|
877
|
-
const token = new DisplayToken({
|
|
878
|
-
...size,
|
|
879
|
-
displayValue,
|
|
880
|
-
align: lineInfo.align,
|
|
881
|
-
indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
|
|
882
|
-
indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
|
|
883
|
-
indentLeft: lineInfo.indent.left,
|
|
884
|
-
indentRight: lineInfo.indent.right,
|
|
885
|
-
indentBefore: lineInfo.offsetBefore,
|
|
886
|
-
indentAfter: lineInfo.offsetAfter,
|
|
887
|
-
lineSpacing: lineInfo.lineSpacing,
|
|
888
|
-
isPageBreak: breakType === BreakTypes.Page,
|
|
889
|
-
isLineBreak: breakType === BreakTypes.TextWrapping,
|
|
890
|
-
isTab: false
|
|
891
|
-
});
|
|
892
|
-
tokens.push(token);
|
|
893
|
-
if (charCode !== prevCharCode ||
|
|
894
|
-
!prevFormat ||
|
|
895
|
-
!FormatStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
|
|
896
|
-
symbolChange = true;
|
|
897
|
-
}
|
|
898
|
-
else if (i === line.length - 1) {
|
|
899
|
-
characters.push(token);
|
|
900
|
-
symbolChange = true;
|
|
901
|
-
}
|
|
902
|
-
else {
|
|
903
|
-
characters.push(token);
|
|
904
|
-
}
|
|
905
|
-
if (characters.length > 1 && symbolChange) {
|
|
906
|
-
this.processCharSizes(prevChar, prevFontString, characters);
|
|
907
|
-
characters = [token];
|
|
908
|
-
symbolChange = false;
|
|
909
|
-
}
|
|
910
|
-
else if (symbolChange) {
|
|
911
|
-
characters = [token];
|
|
912
|
-
}
|
|
913
|
-
prevCharCode = charCode;
|
|
914
|
-
prevChar = char;
|
|
915
|
-
}
|
|
916
|
-
prevFormat = format;
|
|
917
|
-
prevFontString = fontString;
|
|
918
|
-
startIndex++;
|
|
919
|
-
if (startIndex > format?.endIndex) {
|
|
920
|
-
format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
|
|
921
|
-
fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
return tokens;
|
|
925
|
-
}
|
|
926
|
-
processCharSizes(prevChar, prevFontString, characters) {
|
|
927
|
-
const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
|
|
928
|
-
for (let item of characters) {
|
|
929
|
-
Object.assign(item, newSize);
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
calculateSplit(index, tokens) {
|
|
933
|
-
for (let i = index; i >= 0; i--) {
|
|
934
|
-
if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
|
|
935
|
-
return i + 1;
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
return index;
|
|
939
|
-
}
|
|
940
|
-
isWhiteSpace(token) {
|
|
941
|
-
return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
|
|
942
|
-
}
|
|
943
|
-
getLineInfoFromToken(prevToken, firstWrapToken, wrapTokens, isAfterPageBreak) {
|
|
944
|
-
const info = new LineInfoModel({
|
|
945
|
-
width: 0,
|
|
946
|
-
height: 0,
|
|
947
|
-
align: prevToken.align,
|
|
948
|
-
indent: new IndentModel(prevToken.indentFirstLine, prevToken.indentHanging, prevToken.indentLeft, prevToken.indentRight),
|
|
949
|
-
offsetBefore: prevToken.indentBefore,
|
|
950
|
-
offsetAfter: prevToken.indentAfter,
|
|
951
|
-
lineSpacing: prevToken.lineSpacing,
|
|
952
|
-
isAfterPageBreak,
|
|
953
|
-
isEndedByPageBreak: prevToken.isPageBreak
|
|
954
|
-
});
|
|
955
|
-
if (firstWrapToken) {
|
|
956
|
-
info.align = firstWrapToken.align;
|
|
957
|
-
info.indent.firstLine = firstWrapToken.indentFirstLine;
|
|
958
|
-
info.indent.hanging = firstWrapToken.indentHanging;
|
|
959
|
-
info.indent.left = firstWrapToken.indentLeft;
|
|
960
|
-
info.indent.right = firstWrapToken.indentRight;
|
|
961
|
-
info.offsetBefore = firstWrapToken.indentBefore;
|
|
962
|
-
info.offsetAfter = firstWrapToken.indentAfter;
|
|
963
|
-
info.lineSpacing = firstWrapToken.lineSpacing;
|
|
964
|
-
}
|
|
965
|
-
let fontSize = 0;
|
|
966
|
-
let ascent = 0;
|
|
967
|
-
let descent = 0;
|
|
968
|
-
const tokens = isAfterPageBreak && !wrapTokens.length ? [prevToken] : wrapTokens;
|
|
969
|
-
for (const wrapToken of tokens) {
|
|
970
|
-
if (info.height < wrapToken.height) {
|
|
971
|
-
info.height = wrapToken.height;
|
|
972
|
-
}
|
|
973
|
-
if (fontSize < wrapToken.font && wrapToken.displayValue !== DisplayValue.customContent) {
|
|
974
|
-
fontSize = wrapToken.font;
|
|
975
|
-
ascent = wrapToken.ascent;
|
|
976
|
-
descent = wrapToken.descent;
|
|
977
|
-
}
|
|
978
|
-
info.width += wrapToken.width;
|
|
979
|
-
}
|
|
980
|
-
info.height = info.height || 18;
|
|
981
|
-
if (info.lineSpacing > 1) {
|
|
982
|
-
info.offsetAfter = (ascent + descent) * (info.lineSpacing - 1);
|
|
983
|
-
}
|
|
984
|
-
else if (ascent + descent === info.height) {
|
|
985
|
-
info.height = info.height * info.lineSpacing;
|
|
986
|
-
}
|
|
987
|
-
return info;
|
|
988
|
-
}
|
|
989
|
-
getDisplayValue(charCode) {
|
|
990
|
-
if (charCode === 32) {
|
|
991
|
-
return DisplayValue.space;
|
|
992
|
-
}
|
|
993
|
-
if ((charCode > 39 && charCode < 48) || (charCode > 57 && charCode < 64)) {
|
|
994
|
-
return DisplayValue.punctuation;
|
|
995
|
-
}
|
|
996
|
-
return DisplayValue.char;
|
|
997
|
-
}
|
|
998
|
-
getLineInfoByBreakModifier(index) {
|
|
999
|
-
const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
|
|
1000
|
-
if (!paragraph) {
|
|
1001
|
-
return new LineInfoModel({
|
|
1002
|
-
align: DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
1003
|
-
indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
1004
|
-
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
1005
|
-
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
1006
|
-
lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
|
|
1007
|
-
});
|
|
1008
|
-
}
|
|
1009
|
-
const indentLeft = this.getParagraphIndentLeft(paragraph);
|
|
1010
|
-
const indentHanging = paragraph.paragraphStyle.numberingId === null ? paragraph.paragraphStyle.indentHanging : 0;
|
|
1011
|
-
return new LineInfoModel({
|
|
1012
|
-
align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
|
|
1013
|
-
indent: new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight),
|
|
1014
|
-
offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
|
|
1015
|
-
offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
|
|
1016
|
-
lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing
|
|
1017
|
-
});
|
|
1018
|
-
}
|
|
1019
|
-
getParagraphIndentLeft(paragraph) {
|
|
1020
|
-
let paragraphIndent = paragraph.paragraphStyle.indentLeft;
|
|
1021
|
-
const numberingId = paragraph.paragraphStyle.numberingId;
|
|
1022
|
-
if (numberingId !== null) {
|
|
1023
|
-
const level = paragraph.paragraphStyle.numberingLevel;
|
|
1024
|
-
const paragraphIndex = this.model.paragraphs.indexOf(paragraph);
|
|
1025
|
-
const levelModel = NumberingHelper.find(this.properties.numberings, numberingId, level);
|
|
1026
|
-
const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, paragraph.insertIndex);
|
|
1027
|
-
const markerTextStyle = FormatStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
|
|
1028
|
-
let markerWidth = this.pagesWrap.paragraphs[paragraphIndex]?.numberingData?.width;
|
|
1029
|
-
if (!this.pagesWrap.paragraphs[paragraphIndex]?.numberingData.markerTextStyle ||
|
|
1030
|
-
!FormatStyleHelper.areSameTextStyles(markerTextStyle, this.pagesWrap.paragraphs[paragraphIndex].numberingData.markerTextStyle) ||
|
|
1031
|
-
this.pagesWrap.paragraphs[paragraphIndex].numberingData.numberingId !== numberingId) {
|
|
1032
|
-
const marker = NumberingHelper.getMarker(levelModel, numberingId, this.model.paragraphs, paragraphIndex);
|
|
1033
|
-
const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
|
|
1034
|
-
markerWidth = markerSizes.width;
|
|
1035
|
-
}
|
|
1036
|
-
const hangingIndent = paragraph.paragraphStyle.indentHanging
|
|
1037
|
-
? paragraph.paragraphStyle.indentHanging
|
|
1038
|
-
: levelModel.indentHanging;
|
|
1039
|
-
paragraphIndent = levelModel.indentLeft;
|
|
1040
|
-
if (markerWidth >= hangingIndent) {
|
|
1041
|
-
const markerOverflow = markerWidth - hangingIndent;
|
|
1042
|
-
const additionalMarkerIndent = TabHelper.calculateTabWidth(levelModel.indentLeft + markerOverflow, this.properties.defaultTabWidth);
|
|
1043
|
-
paragraphIndent += markerOverflow + additionalMarkerIndent;
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
return paragraphIndent;
|
|
1047
|
-
}
|
|
1048
|
-
updateTextStyles(styles, startIndex, endIndex) {
|
|
1049
|
-
let textStyles = FormatStyleHelper.getFormatsAtRange(this.model.formats, startIndex, endIndex).map(format => format.textStyle);
|
|
1050
|
-
let prevFormat;
|
|
1051
|
-
if (!textStyles.length) {
|
|
1052
|
-
prevFormat = FormatStyleHelper.getPrevFormatAtIndex(this.model.formats, startIndex);
|
|
1053
|
-
if (prevFormat) {
|
|
1054
|
-
textStyles = [prevFormat.textStyle];
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
for (const textStyle of textStyles) {
|
|
1058
|
-
for (const key of Object.keys(textStyle)) {
|
|
1059
|
-
if (styles[key]) {
|
|
1060
|
-
styles[key].push(textStyle[key]);
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
return prevFormat;
|
|
1065
|
-
}
|
|
1066
|
-
updateParagraphStyles(styles, startIndex, endIndex) {
|
|
1067
|
-
const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
|
|
1068
|
-
for (const paragraphStyle of paragraphStyles) {
|
|
1069
|
-
for (const key of Object.keys(paragraphStyle)) {
|
|
1070
|
-
if (styles[key]) {
|
|
1071
|
-
styles[key].push(paragraphStyle[key]);
|
|
1072
|
-
}
|
|
1073
|
-
}
|
|
1074
|
-
}
|
|
1075
|
-
}
|
|
1076
|
-
updateNumberingStyles(styles, startIndex, endIndex) {
|
|
1077
|
-
const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
|
|
1078
|
-
for (const paragraphStyle of paragraphStyles) {
|
|
1079
|
-
if (paragraphStyle.numberingId !== null) {
|
|
1080
|
-
const numberingLevels = this.properties.numberings.find(x => x.numberingId === paragraphStyle.numberingId).levels;
|
|
1081
|
-
const levelsMarkerStyles = numberingLevels.reduce((prev, next) => `${prev}${next.marker}${next.markerType}`, '');
|
|
1082
|
-
const level = numberingLevels.find(x => x.level === paragraphStyle.numberingLevel);
|
|
1083
|
-
const isBulletMarker = level.markerType === NumberingMarkerType.Bullet;
|
|
1084
|
-
styles['isBulletMarker'].push(isBulletMarker);
|
|
1085
|
-
styles['numberingLevelsStyles'].push(levelsMarkerStyles);
|
|
1086
|
-
}
|
|
1087
|
-
else {
|
|
1088
|
-
styles['isBulletMarker'].push(null);
|
|
1089
|
-
styles['numberingLevelsStyles'].push('');
|
|
1090
|
-
}
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
getImageWithAllowedSize(imageData, maxWidth) {
|
|
1094
|
-
if (imageData.width <= maxWidth) {
|
|
1095
|
-
return imageData;
|
|
1096
|
-
}
|
|
1097
|
-
const aspectRatio = imageData.width / imageData.height;
|
|
1098
|
-
const height = maxWidth / aspectRatio;
|
|
1099
|
-
return new ImageDataModel({ width: Math.round(maxWidth), height: Math.round(height), content: imageData.content });
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvK3NoYXJlZC9lZGl0b3IvY29yZS9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSXpELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBR3BHLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQixlQUFlLEVBQ2xCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRD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QUF1QixDQUFDLFNBQXlCLEVBQUUsUUFBZ0I7UUFDdkUsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTtZQUM3QixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkgsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFsaWdubWVudCB9IGZyb20gJy4vY29uc3RhbnRzL2FsaWdubWVudHMuY29uc3QnO1xuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY3VzdG9tLWNvbXBvbmVudHMvc2hhcmVkL2Fic3RyYWN0L2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJyZWFrSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9icmVhay5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtUeXBlcyB9IGZyb20gJy4vZW51bXMvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb250ZW50SGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb250ZW50LmhlbHBlcic7XG5pbXBvcnQgeyBDb250ZW50c0ludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29udGVudHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbnRlbnRTdHlsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9jb250ZW50LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBDVVNUT01fRUxFTUVOVF9NQVJLRVIgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9zaGFyZWQvY29uc3RhbnRzL2N1c3RvbS1jb250ZW50LW1hcmtlcnMuY29uc3QnO1xuaW1wb3J0IHsgQ3VzdG9tQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vY3VzdG9tLWNvbXBvbmVudHMvc2hhcmVkL2hlbHBlcnMvY3VzdG9tLWNvbXBvbmVudC5oZXBsZXInO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL3NoYXJlZC90eXBlcy9jdXN0b20tY29udGVudCc7XG5pbXBvcnQgeyBDdXN0b21Db250ZW50U2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL3NoYXJlZC9zZXJ2aWNlcy9jdXN0b20tY29udGVudC9jdXN0b20tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICAgIERFRkFVTFRfRk9OVF9DT0xPUixcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLFxuICAgIEhZUEVSTElOS19IRUFESU5HX1NUWUxFX0lELFxuICAgIE5FV19MSU5FX01BUktVUFxufSBmcm9tICcuL2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgRGlzcGxheVRva2VuIH0gZnJvbSAnLi9tb2RlbHMvZGlzcGxheS10b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBEaXNwbGF5VmFsdWUgfSBmcm9tICcuL2NvbnN0YW50cy9kaXNwbGF5LXZhbHVlcy5jb25zdCc7XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jdW1lbnQnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL2V4dGVybmFsLWVsZW1lbnQvbW9kZWxzL2VsZW1lbnQtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBFbGVtZW50TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2VsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGluZyB9IGZyb20gJy4vYmFzZS9ldmVudC1lbWl0dGluZyc7XG5pbXBvcnQgeyBGb250TWV0cmljcyB9IGZyb20gJy4vaGVscGVycy9mb250LW1ldHJpY3MuaGVscGVyJztcbmltcG9ydCB7IEZvcm1hdE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9mb3JtYXQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybWF0U3R5bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvZm9ybWF0LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBHZW5lcmFsUHJvcGVydGllc01vZGVsIH0gZnJvbSAnLi4vZXhlY3V0aW9uL21vZGVscy9nZW5lcmFsLXByb3BlcnRpZXMubW9kZWwnO1xuaW1wb3J0IHsgSUN1c3RvbUNvbXBvbmVudHMgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9zaGFyZWQvaW50ZXJmYWNlcy9jdXN0b20tY29tcG9uZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2ltYWdlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgSW5kZW50TW9kZWwgfSBmcm9tICcuL21vZGVscy9pbmRlbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYi5tb2RlbCc7XG5pbXBvcnQgeyBJVG9vbGJhclN0eWxlcyB9IGZyb20gJy4vaW50ZXJmYWNlcy90b29sYmFyLXN0eWxlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGluZUluZm9Nb2RlbCB9IGZyb20gJy4vbW9kZWxzL2xpbmUtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgTGlua01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLm1vZGVsJztcbmltcG9ydCB7IE5vZGVySW1hZ2VDb21wb25lbnQgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9pbWFnZS9jb21wb25lbnRzL2ltYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlclRhYkNvbXBvbmVudCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvbnVtYmVyaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBOdW1iZXJpbmdMZXZlbE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9udW1iZXJpbmctbGV2ZWwubW9kZWwnO1xuaW1wb3J0IHsgTnVtYmVyaW5nTWFya2VyVHlwZSB9IGZyb20gJy4vZW51bXMvbnVtYmVyaW5nLW1hcmtlci10eXBlLmVudW0nO1xuaW1wb3J0IHsgTnVtYmVyaW5nTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL251bWJlcmluZy5tb2RlbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25zSGVscGVyIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9oZWxwZXJzL29wZXJhdGlvbnMtaGVscGVyLmhlbHBlcic7XG5pbXBvcnQgeyBQYWdlc1dyYXAgfSBmcm9tICcuL3BhZ2luZy9wYWdlcy53cmFwJztcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gJy4vcGFnaW5nL3BhcmFncmFwaCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvcGFyYWdyYXBoLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3BhcmFncmFwaC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi9wb2ludCc7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4vcmFuZ2UnO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvc2VsZWN0aW9uJztcbmltcG9ydCB7IFRhYkhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvdGFiLmhlbHBlcic7XG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUZXh0U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGV4dC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBVbmljb2RlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3VuaWNvZGUuaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIEVkaXRTZXNzaW9uIGV4dGVuZHMgRXZlbnRFbWl0dGluZyB7XG4gICAgcmVhZG9ubHkgY3VzdG9tQ29tcG9uZW50czogSUN1c3RvbUNvbXBvbmVudHM7XG5cbiAgICB0b2tlblJlID0gbmV3IFJlZ0V4cCgnXlsnICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXSsnLCAnZycpO1xuXG4gICAgbm9uVG9rZW5SZSA9IG5ldyBSZWdFeHAoJ14oPzpbXicgKyBVbmljb2RlSGVscGVyLndvcmRDaGFycyArICdcXFxcJF9dfFxcXFxzXSkrJywgJ2cnKTtcblxuICAgIHBhZ2VzV3JhcDogUGFnZXNXcmFwO1xuXG4gICAgd3JhcERhdGE6IG51bWJlcltdW10gPSBbW11dOyAvLyBXcmFwIGluZGV4ZXMgZm9yIGRvY3VtZW50IHJvd3NcblxuICAgIHdyYXBQYXJhZ3JhcGhMaW5lOiBudW1iZXJbXSA9IFtdOyAvLyBsaW5lIG51bWJlcnMgdGhhdCBiZWdpbiB0aGUgcGFyYWdyYXBoc1xuXG4gICAgd3JhcFBhcmFncmFwaEluZGV4OiBudW1iZXJbXSA9IFtdOyAvLyBzeW1ib2wgaW5kZXhlcyB0aGF0IGJlZ2luIHRoZSBwYXJhZ3JhcGhzXG5cbiAgICBzY3JvbGxUb3AgPSAwO1xuXG4gICAgc2V0IHN0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSkge1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc3R5bGVzKSkge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1trZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gQ29udGVudFN0eWxlSGVscGVyLmdldERlZmF1bHRTdHlsZVZhbHVlQnlLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVzW2tleV0ubGVuZ3RoID4gMSAmJiAhc3R5bGVzW2tleV0uZXZlcnkoeCA9PiB4ID09PSBzdHlsZXNba2V5XVswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZXNNYXBba2V5XSA9IHR5cGVvZiBzdHlsZXNba2V5XVswXSA9PT0gJ2Jvb2xlYW4nICYmIGtleSAhPT0gJ2lzQnVsbGV0TWFya2VyJyA/IGZhbHNlIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc3R5bGVzTWFwW2tleV0gPSBzdHlsZXNba2V5XVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIGdldCBzdHlsZXNNYXAoKTogSVRvb2xiYXJTdHlsZXMge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVzTWFwO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdHlsZXNNYXA6IElUb29sYmFyU3R5bGVzID0ge1xuICAgICAgICBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgIGZvbnRDb2xvcjogREVGQVVMVF9GT05UX0NPTE9SLFxuICAgICAgICBhbGlnbm1lbnQ6IEFsaWdubWVudC5sZWZ0LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUlxuICAgIH07XG5cbiAgICBzZXQgY29udGVudFdpZHRoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udGVudFdpZHRoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoMCwgdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFdpZHRoO1xuICAgIH1cbiAgICBwcml2YXRlIF9jb250ZW50V2lkdGg6IG51bWJlcjtcblxuICAgIHNldCBjdXJzb3JTdHlsZShtb2RlbDogVGV4dFN0eWxlTW9kZWwpIHtcbiAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jdXJzb3JTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGUgPSBtb2RlbDtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY3Vyc29yU3R5bGVzQ2hhbmdlZCcsIHRoaXMuX2N1cnNvclN0eWxlKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRUZXh0U3R5bGVDaGFuZ2VzKHRoaXMuX2N1cnNvclN0eWxlLCBtb2RlbCk7XG4gICAgICAgIGlmICghY2hhbmdlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgQ29udGVudFN0eWxlSGVscGVyLmFwcGx5VGV4dFN0eWxlQ2hhbmdlcyh0aGlzLl9jdXJzb3JTdHlsZSwgbW9kZWwsIGNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVtaXQoJ2N1cnNvclN0eWxlc0NoYW5nZWQnLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgfVxuICAgIGdldCBjdXJzb3JTdHlsZSgpOiBUZXh0U3R5bGVNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJzb3JTdHlsZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfY3Vyc29yU3R5bGU6IFRleHRTdHlsZU1vZGVsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgICAgIHB1YmxpYyBzZXNzaW9uSWQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbnRlbnRTZXJ2aWNlOiBDdXN0b21Db250ZW50U2VydmljZSxcbiAgICAgICAgcHVibGljIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSxcbiAgICAgICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICBwdWJsaWMgcHJvcGVydGllczogR2VuZXJhbFByb3BlcnRpZXNNb2RlbFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gZG9jdW1lbnQucGFnZVdpZHRoIC0gKGRvY3VtZW50LnBhZ2VNYXJnaW4ubGVmdCArIGRvY3VtZW50LnBhZ2VNYXJnaW4ucmlnaHQpO1xuICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdlbmVyYXRlQ29tcG9uZW50cyh0aGlzLm1vZGVsLCB0aGlzLnNlc3Npb25JZCwgdGhpcy5wcm9wZXJ0aWVzLCBtYXhXaWR0aCk7XG4gICAgICAgIHRoaXMuc2V0RG9jdW1lbnQoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgc2V0U2Nyb2xsVG9wKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wID09PSB2YWx1ZSB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2lnbmFsKCdjaGFuZ2VTY3JvbGxUb3AnLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Um93TGVuZ3RoKHJvdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLndyYXBEYXRhW3Jvd10pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcERhdGFbcm93XS5sZW5ndGggKyAxO1xuICAgIH1cblxuICAgIHVwZGF0ZVdyYXBQYXJhZ3JhcGhJbmRleChmaXJzdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGg7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbZmlyc3RdID0gMDtcbiAgICAgICAgICAgIGZpcnN0Kys7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0OyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbaV0gPSB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtpIC0gMV0gKyB0aGlzLmRvY3VtZW50LmxpbmVzW2kgLSAxXS5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3JhcFBhcmFncmFwaEluZGV4LnNwbGljZShjb3VudCk7XG4gICAgfVxuXG4gICAgdXBkYXRlV3JhcFBhcmFncmFwaExpbmUoZmlyc3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuZG9jdW1lbnQubGluZXMubGVuZ3RoO1xuICAgICAgICBpZiAoZmlyc3QgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMud3JhcFBhcmFncmFwaExpbmVbZmlyc3RdID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JhcFBhcmFncmFwaExpbmVbZmlyc3RdID0gdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdCAtIDFdICsgdGhpcy53cmFwRGF0YVtmaXJzdCAtIDFdLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0ICsgMTsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMud3JhcFBhcmFncmFwaExpbmVbaV0gPSB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lW2kgLSAxXSArIHRoaXMud3JhcERhdGFbaSAtIDFdLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZS5zcGxpY2UoY291bnQpO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhcmFncmFwaE51bWJlcmluZ0RhdGEoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpbmRleF0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2luZGV4XS5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCkge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpbmRleF0ubnVtYmVyaW5nRGF0YSA9IE51bWJlcmluZ0hlbHBlci5jcmVhdGVEYXRhTW9kZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaW5kZXhdLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XSxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhGb3JtYXQudGV4dFN0eWxlLFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpbmRleF0ucGFyYWdyYXBoU3R5bGVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVXcmFwRGF0YShmaXJzdFBhcmFncmFwaDogbnVtYmVyLCBsYXN0UGFyYWdyYXBoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwUGFyYWdyYXBoSW5kZXgoZmlyc3RQYXJhZ3JhcGgpO1xuICAgICAgICBsZXQgaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID0gdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tmaXJzdFBhcmFncmFwaCAtIDFdPy5pc0VuZGVkQnlQYWdlQnJlYWsgPyBmaXJzdFBhcmFncmFwaCA6IC0xO1xuICAgICAgICBsZXQgZmlyc3RVc2VkVGFiSW5kZXggPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicy5maW5kSW5kZXgoXG4gICAgICAgICAgICB4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPj0gdGhpcy53cmFwUGFyYWdyYXBoSW5kZXhbZmlyc3RQYXJhZ3JhcGhdXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSBmaXJzdFBhcmFncmFwaDsgaSA8PSBsYXN0UGFyYWdyYXBoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnRhYlRva2VucyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudExpbmUgPSB0aGlzLmRvY3VtZW50LmdldExpbmUodGhpcy5kb2N1bWVudC5saW5lcywgaSk7XG4gICAgICAgICAgICBjb25zdCBpc05leHRMaW5lRXhpc3RzID0gdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggPiBpICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3BsaXRzLCByb3dJbmZvcyB9ID0gdGhpcy5nZXRTcGxpdHMoXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSxcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtpXSxcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBpc05leHRMaW5lRXhpc3RzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy53cmFwRGF0YVtpXSA9IHNwbGl0cztcbiAgICAgICAgICAgIGlmIChpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPT09IGkpIHtcbiAgICAgICAgICAgICAgICByb3dJbmZvc1swXS5pc0FmdGVyUGFnZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9IHJvd0luZm9zW3Jvd0luZm9zLmxlbmd0aCAtIDFdLmlzRW5kZWRCeVBhZ2VCcmVhayA/IGkgKyAxIDogLTE7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5zZXQoaSwgcm93SW5mb3MsIHRoaXMucHJvcGVydGllcy5udW1iZXJpbmdzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJhZ3JhcGhOdW1iZXJpbmdEYXRhKGkpO1xuICAgICAgICAgICAgZmlyc3RVc2VkVGFiSW5kZXggPSB0aGlzLnVwZGF0ZVBhcmFncmFwaFRhYnMoZmlyc3RVc2VkVGFiSW5kZXgsIGksIGN1cnJlbnRMaW5lLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2xhc3RQYXJhZ3JhcGggKyAxXT8uc2V0SXNBZnRlclBhZ2VCcmVhayhpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPiAtMSk7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHMuc3BsaWNlKGNvdW50KTtcbiAgICAgICAgdGhpcy53cmFwRGF0YS5zcGxpY2UoY291bnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBQYXJhZ3JhcGhMaW5lKGZpcnN0UGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5wYWdlc1dyYXAucHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKGZpcnN0UGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHN0cmluZywgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZGlzcGxheSBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGFicyBhbmQgc3BhY2VzLlxuICAgICAqL1xuICAgIGdldERpc3BsYXlUb2tlbnMobW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLCBzdHI6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyLCBjdXN0b21Db21wb25lbnRzOiBJQ3VzdG9tQ29tcG9uZW50cyk6IERpc3BsYXlUb2tlbltdIHtcbiAgICAgICAgaWYgKCFzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMoc3RhcnRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWxsZWRMaW5lVG9rZW5zKHN0YXJ0SW5kZXgsIHN0ciwgbW9kZWwsIGN1c3RvbUNvbXBvbmVudHMpO1xuICAgIH1cblxuICAgIGdldFJvd0NhY2hlSW5kZXgoY2FjaGVBcnJheTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gY2FjaGVBcnJheS5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+IDE7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBjYWNoZUFycmF5W21pZF07XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IGNlbnRlcikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCBjZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXJ0IC0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgc3RyaW5nIGBzdHJgIG9uIHRoZSBzY3JlZW4gd2hpbGUgYXNzdW1pbmcgdGhhdCB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgZmlyc3QgY29sdW1uIG9uIHRoZSBzY3JlZW4uXG4gICAgICogVGhlIGZpcnN0IHBvc2l0aW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIGBzdHJgIG9uIHNjcmVlbi5cbiAgICAgKiBUaGUgc2Vjb25kIHZhbHVlIGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZG9jdW1lbnQgY29sdW1uIHRoYXQgdGhpcyBmdW5jdGlvbiByZWFkIHVudGlsLlxuICAgICAqL1xuICAgIGdldFN0cmluZ1NjcmVlbldpZHRoKHN0cjogc3RyaW5nLCBtYXhTY3JlZW5Db2x1bW4/OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCBzY3JlZW5Db2x1bW4gPSAwO1xuICAgICAgICBsZXQgY29sdW1uOiBudW1iZXI7XG4gICAgICAgIGZvciAoY29sdW1uID0gMDsgY29sdW1uIDwgc3RyLmxlbmd0aDsgY29sdW1uKyspIHtcbiAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAxO1xuXG4gICAgICAgICAgICBpZiAoc2NyZWVuQ29sdW1uID4gbWF4U2NyZWVuQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3NjcmVlbkNvbHVtbiwgY29sdW1uXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHN0YXJ0aW5nIHJvdyBhbmQgY29sdW1uLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBgUmFuZ2VgIG9mIHRoZSBmaXJzdCB3b3JkIGJvdW5kYXJ5IGl0IGZpbmRzLlxuICAgICAqL1xuICAgIGdldFdvcmRSYW5nZShyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIpOiBSYW5nZSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmRvY3VtZW50LmdldExpbmUodGhpcy5kb2N1bWVudC5saW5lcywgcm93KTtcbiAgICAgICAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbiAtIDEpLm1hdGNoKHRoaXMudG9rZW5SZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWluVG9rZW4pIHtcbiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbikubWF0Y2godGhpcy50b2tlblJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWdleHA6IFJlZ0V4cDtcbiAgICAgICAgaWYgKGluVG9rZW4pIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IHRoaXMudG9rZW5SZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXlxccyskLy50ZXN0KGxpbmUuc2xpY2UoY29sdW1uIC0gMSwgY29sdW1uICsgMSkpKSB7XG4gICAgICAgICAgICByZWdleHAgPSAvXFxzLztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IHRoaXMubm9uVG9rZW5SZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGFydCA9IGNvbHVtbjtcbiAgICAgICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgICAgICB9IHdoaWxlIChzdGFydCA+PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KS5tYXRjaChyZWdleHApKTtcblxuICAgICAgICAgICAgc3RhcnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmQgPSBjb2x1bW47XG4gICAgICAgIHdoaWxlIChlbmQgPCBsaW5lLmxlbmd0aCAmJiBsaW5lLmNoYXJBdChlbmQpLm1hdGNoKHJlZ2V4cCkpIHtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShuZXcgUG9pbnQocm93LCBzdGFydCksIG5ldyBQb2ludChyb3csIGVuZCkpO1xuICAgIH1cblxuICAgIGdldERpc3BsYXlMaW5lKHJvdzogbnVtYmVyLCBlbmRDb2x1bW46IG51bWJlciwgc3RhcnRDb2x1bW4/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHRoaXMuZG9jdW1lbnQubGluZXMsIHJvdyk7XG5cbiAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uIHx8IDAsIGVuZENvbHVtbiB8fCBsaW5lLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZShzdGFydFBhcmFncmFwaFBvc2l0aW9uLCBlbmRQYXJhZ3JhcGhQb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGluc2VydFRleHRCeURvY3VtZW50SW5kZXgoaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZT86IFRleHRTdHlsZU1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgdGV4dCwgc3R5bGUpO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnRCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0RWxlbWVudE1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50LmVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRFbGVtZW50KGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVha0J5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRCcmVha01vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnJlYWsoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmJyZWFrVHlwZSBhcyBCcmVha1R5cGVzKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFiTW9kZWwpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUYWIoZWxlbWVudFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRJbWFnZU1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0SW1hZ2UoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmltYWdlRGF0YSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFibGVNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRhYmxlKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgYXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCB0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwodGV4dFN0eWxlKTtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlUZXh0U3R5bGUodGhpcy5tb2RlbCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGV4dFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseVBhcmFncmFwaFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgcGFyYWdyYXBoU3R5bGU6IFBhcmFncmFwaFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlQYXJhZ3JhcGhTdHlsZSh0aGlzLm1vZGVsLCBzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHBhcmFncmFwaFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseUVsZW1lbnRTdHlsZShtb2RlbDogQXBwbHlFbGVtZW50U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5RWxlbWVudFN0eWxlKHRoaXMubW9kZWwsIG1vZGVsKTtcbiAgICAgICAgY29uc3QgaW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IG1vZGVsLmluc2VydEluZGV4KTtcbiAgICAgICAgaW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2UuaW5pdGlhbGl6ZSgpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBtb2RlbC5pbnNlcnRJbmRleCkucm93O1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBhcmFncmFwaCwgcGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICBhZGROdW1iZXJpbmcobGV2ZWxzOiBOdW1iZXJpbmdMZXZlbE1vZGVsW10sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hZGROdW1iZXJpbmcodGhpcy5tb2RlbCwgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBsZXZlbHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQYXJhZ3JhcGg7IGkgPD0gZW5kUGFyYWdyYXBoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2ldLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nU3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIHJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlbW92ZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFyYWdyYXBoOyBpIDw9IGVuZFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpXS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICByZXN0b3JlTnVtYmVyaW5ncyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdLCBudW1iZXJpbmdzOiBOdW1iZXJpbmdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCB0aGlzLmRvY3VtZW50LmxpbmVzLCBlbmRJbmRleCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHBhcmFncmFwaHMsIG51bWJlcmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nU3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIGFwcGx5SW1hZ2VTdHlsZShhcHBseUltYWdlOiBBcHBseUltYWdlU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5yZXNpemUoeyB3aWR0aDogYXBwbHlJbWFnZS53aWR0aCwgaGVpZ2h0OiBhcHBseUltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUltYWdlU3R5bGUodGhpcy5tb2RlbCwgYXBwbHlJbWFnZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5kb2N1bWVudC5pbmRleFRvUG9zaXRpb24oYXBwbHlJbWFnZS5pbnNlcnRJbmRleCwgMCk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnQucm93LCB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHJlc3RvcmVUZXh0U3R5bGVzKGZvcm1hdHM6IEZvcm1hdE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGZvcm1hdHNbMF0uc3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBmb3JtYXRzW2Zvcm1hdHMubGVuZ3RoIC0gMV0uZW5kSW5kZXg7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgdGhpcy5kb2N1bWVudC5saW5lcywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVUZXh0U3R5bGVzKHRoaXMubW9kZWwsIGZvcm1hdHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVQYXJhZ3JhcGhTdHlsZXMocGFyYWdyYXBoczogUGFyYWdyYXBoTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gcGFyYWdyYXBoc1swXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwYXJhZ3JhcGhzW3BhcmFncmFwaHMubGVuZ3RoIC0gMV0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgdGhpcy5kb2N1bWVudC5saW5lcywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVQYXJhZ3JhcGhTdHlsZXModGhpcy5tb2RlbCwgcGFyYWdyYXBocyk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnRQYXJhZ3JhcGgsIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgc2V0VGV4dFN0eWxlKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJzb3JTdHlsZSA9IG5ldyBUZXh0U3R5bGVNb2RlbCh0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHRleHRTdHlsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYHJhbmdlYCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBJZiBgcmFuZ2VgIGlzIGVtcHR5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVubW9kaWZpZWQgdmFsdWUgb2YgYHJhbmdlLnN0YXJ0YC5cbiAgICAgKi9cbiAgICByZW1vdmUocmFuZ2U6IFJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCByYW5nZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcmFuZ2UuZW5kKSAtIDE7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcblxuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmRlbGV0ZSh0aGlzLm1vZGVsLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uRGVsZXRlVGV4dChyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlcGxhY2UobW9kZWw6IFJlcGxhY2VNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgdGhpcy5yZW1vdmVCeURvY3VtZW50SW5kZXhlcyhtb2RlbC5kZWxldGUuc3RhcnRJbmRleCwgbW9kZWwuZGVsZXRlLmVuZEluZGV4ICsgMSk7XG4gICAgICAgIGxldCBlbmRQb2ludDogUG9pbnQ7XG4gICAgICAgIGlmIChtb2RlbC5pbnNlcnRUZXh0KSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGV4dEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4LCBtb2RlbC5pbnNlcnRUZXh0LnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEJyZWFrKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0QnJlYWspO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYikge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUYWIpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0SW1hZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydFRleHQocG9zaXRpb246IFBvaW50LCB0ZXh0OiBzdHJpbmcsIGN1cnNvclN0eWxlPzogVGV4dFN0eWxlTW9kZWwpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBpZiAoY3Vyc29yU3R5bGUpIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0U3R5bGVkVGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCwgY3Vyc29yU3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUZXh0KHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50KHBvc2l0aW9uOiBQb2ludCwgZWxlbWVudDogRWxlbWVudERhdGFNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGluc2VydEVsZW1lbnQgPSBuZXcgSW5zZXJ0RWxlbWVudE1vZGVsKHsgZWxlbWVudDogbmV3IEVsZW1lbnRNb2RlbCh7IGluc2VydEluZGV4LCAuLi5lbGVtZW50IH0pIH0pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEVsZW1lbnQodGhpcy5tb2RlbCwgaW5zZXJ0RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmZpbmRDb21wb25lbnRUeXBlKG1vZGVsLnR5cGUpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcblxuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrKHBvc2l0aW9uOiBQb2ludCwgYnJlYWtUeXBlOiBCcmVha1R5cGVzKTogUG9pbnQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXNPbk5ld1BhcmFncmFwaCA/IGAke05FV19MSU5FX01BUktVUH0ke0NVU1RPTV9FTEVNRU5UX01BUktFUn1gIDogQ1VTVE9NX0VMRU1FTlRfTUFSS0VSO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEJyZWFrKHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4LCBicmVha1R5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgaWYgKGlzT25OZXdQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLmRvY3VtZW50LmdldFBvc2l0aW9uQWZ0ZXJCcmVhayhlbmRQb2ludCwgYnJlYWtUeXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9pbnQpO1xuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIocG9zaXRpb246IFBvaW50KTogUG9pbnQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWIodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC50YWJzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBtb2RlbCwgTm9kZXJUYWJDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2UocG9zaXRpb246IFBvaW50LCBpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRJbWFnZSA9IHRoaXMuZ2V0SW1hZ2VXaXRoQWxsb3dlZFNpemUoaW1hZ2VEYXRhLCB0aGlzLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0SW1hZ2UodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIGFkanVzdGVkSW1hZ2UpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5pbWFnZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgbW9kZWwsIE5vZGVySW1hZ2VDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRMaW5rKHBvc2l0aW9uOiBQb2ludCwgbGlua0RhdGE6IExpbmtEYXRhTW9kZWwpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCBsaW5rU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwoeyBoZWFkaW5nU3R5bGVJZDogSFlQRVJMSU5LX0hFQURJTkdfU1RZTEVfSUQsIHVuZGVybGluZTogdHJ1ZSB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRMaW5rKHRoaXMubW9kZWwsIGxpbmtEYXRhLnRleHQsIGxpbmtEYXRhLmxpbmssIGluc2VydEluZGV4LCBsaW5rU3R5bGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBsaW5rRGF0YS50ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlKHBvc2l0aW9uOiBQb2ludCwgdGFibGVNb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbCwgdGhpcy5wYWdlc1dyYXAuY29udGVudFdpZHRoKTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSB0YWJsZU1vZGVsLmluc2VydFRhYmxlSW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBtb2RlbCwgTm9kZXJUYWJsZUNvbXBvbmVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIHRhYmxlTW9kZWwuY29udGVudCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBhZGRDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VOb2RlckNvbXBvbmVudD4oY3VzdG9tRWxlbWVudHM6IENvbXBvbmVudFJlZjxUPltdLCBtb2RlbDogQ3VzdG9tQ29udGVudCwgY29tcG9uZW50VHlwZTogVHlwZTxUPikge1xuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50ID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5jb21wb25lbnRTZXJ2aWNlLmdlbmVyYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1vZGVsLFxuICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgIGNvbnRlbnRXaWR0aDogdGhpcy5jb250ZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3NpdGlvbiA9IGN1c3RvbUVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPiBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChuZXdFbGVtZW50UG9zaXRpb24gPj0gMCkge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuc3BsaWNlKG5ld0VsZW1lbnRQb3NpdGlvbiwgMCwgY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5wdXNoKGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFRleHRTdHlsZU1vZGVsIHwgUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzdHlsZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gc3R5bGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIHNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFt0aGlzLl9zdHlsZXNNYXAuYWxpZ25tZW50XSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogW3RoaXMuX3N0eWxlc01hcC5iYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFt0aGlzLl9zdHlsZXNNYXAuaGlnaGxpZ2h0Q29sb3JdLFxuICAgICAgICAgICAgZm9udENvbG9yOiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRDb2xvcl0sXG4gICAgICAgICAgICBmb250RmFtaWx5OiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRGYW1pbHldLFxuICAgICAgICAgICAgZm9udFNpemU6IFt0aGlzLl9zdHlsZXNNYXAuZm9udFNpemVdLFxuICAgICAgICAgICAgaXRhbGljOiBbdGhpcy5fc3R5bGVzTWFwLml0YWxpY10sXG4gICAgICAgICAgICBib2xkOiBbdGhpcy5fc3R5bGVzTWFwLmJvbGRdLFxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaDogW3RoaXMuX3N0eWxlc01hcC5zdHJpa2V0aHJvdWdoXSxcbiAgICAgICAgICAgIHVuZGVybGluZTogW3RoaXMuX3N0eWxlc01hcC51bmRlcmxpbmVdLFxuICAgICAgICAgICAgc3BhY2VCZWZvcmU6IFt0aGlzLl9zdHlsZXNNYXAuc3BhY2VCZWZvcmVdLFxuICAgICAgICAgICAgc3BhY2VBZnRlcjogW3RoaXMuX3N0eWxlc01hcC5zcGFjZUFmdGVyXSxcbiAgICAgICAgICAgIGluZGVudExlZnQ6IFt0aGlzLl9zdHlsZXNNYXAuaW5kZW50TGVmdF0sXG4gICAgICAgICAgICBpbmRlbnRSaWdodDogW3RoaXMuX3N0eWxlc01hcC5pbmRlbnRSaWdodF0sXG4gICAgICAgICAgICBpc0J1bGxldE1hcmtlcjogW10sXG4gICAgICAgICAgICBudW1iZXJpbmdMZXZlbHNTdHlsZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcbiAgICB9XG5cbiAgICByZXN0b3JlKG1vZGVsOiBSZXN0b3JlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBtb2RlbC5zdGFydEluZGV4KTtcbiAgICAgICAgaWYgKG1vZGVsLnN0YXJ0SW5kZXggIT09IG1vZGVsLmVuZEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUJ5RG9jdW1lbnRJbmRleGVzKG1vZGVsLnN0YXJ0SW5kZXgsIG1vZGVsLmVuZEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZSh0aGlzLm1vZGVsLCBtb2RlbCk7XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZUVuZEluZGV4ID0gbW9kZWwuc3RhcnRJbmRleCArIG1vZGVsLnRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwudGFibGVzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBOb2RlclRhYmxlQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwuaW1hZ2VzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBOb2RlckltYWdlQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwudGFicywgdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIE5vZGVyVGFiQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVFbGVtZW50Q29tcG9uZW50cyh0aGlzLm1vZGVsLmVsZW1lbnRzLCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBtb2RlbC50ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVDb21wb25lbnRzPFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KFxuICAgICAgICBtb2RlbHM6IEN1c3RvbUNvbnRlbnRbXSxcbiAgICAgICAgY29tcG9uZW50czogQ29tcG9uZW50UmVmPEJhc2VOb2RlckNvbXBvbmVudD5bXSxcbiAgICAgICAgY29tcG9uZW50VHlwZTogVHlwZTxUPixcbiAgICAgICAgcmVzdG9yZUluZGV4OiBudW1iZXIsXG4gICAgICAgIHJlc3RvcmVFbmRJbmRleDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPCByZXN0b3JlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPj0gcmVzdG9yZUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudChjb21wb25lbnRzLCBtb2RlbCwgY29tcG9uZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXN0b3JlRWxlbWVudENvbXBvbmVudHMoZWxlbWVudHM6IEVsZW1lbnRNb2RlbFtdLCByZXN0b3JlSW5kZXg6IG51bWJlciwgcmVzdG9yZUVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluc2VydEluZGV4IDwgcmVzdG9yZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEluZGV4ID49IHJlc3RvcmVFbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudFR5cGUobW9kZWwudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NTZWxlY3Rpb25TdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHRoaXMuZ2V0UmFuZ2VJbmRleGVzKHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcblxuICAgICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFtdLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBbXSxcbiAgICAgICAgICAgIGhpZ2hsaWdodENvbG9yOiBbXSxcbiAgICAgICAgICAgIGZvbnRDb2xvcjogW10sXG4gICAgICAgICAgICBmb250RmFtaWx5OiBbXSxcbiAgICAgICAgICAgIGZvbnRTaXplOiBbXSxcbiAgICAgICAgICAgIGl0YWxpYzogW10sXG4gICAgICAgICAgICBib2xkOiBbXSxcbiAgICAgICAgICAgIHN0cmlrZXRocm91Z2g6IFtdLFxuICAgICAgICAgICAgdW5kZXJsaW5lOiBbXSxcbiAgICAgICAgICAgIHNwYWNlQmVmb3JlOiBbXSxcbiAgICAgICAgICAgIHNwYWNlQWZ0ZXI6IFtdLFxuICAgICAgICAgICAgaW5kZW50TGVmdDogW10sXG4gICAgICAgICAgICBpbmRlbnRSaWdodDogW10sXG4gICAgICAgICAgICBpc0J1bGxldE1hcmtlcjogW10sXG4gICAgICAgICAgICBudW1iZXJpbmdMZXZlbHNTdHlsZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlUGFyYWdyYXBoU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnVwZGF0ZU51bWJlcmluZ1N0eWxlcyhzdHlsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy51cGRhdGVUZXh0U3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcblxuICAgICAgICBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0U3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCBmb3JtYXQudGV4dFN0eWxlLCB0aGlzLmN1cnNvclN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwobmV3VGV4dFN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJzb3JTdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ3Vyc29yU3R5bGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExpbmtNb2RlbChjdXJzb3I6IFBvaW50KTogTGlua01vZGVsIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gdGhpcy5nZXRSYW5nZUluZGV4ZXMobmV3IFJhbmdlKGN1cnNvciwgY3Vyc29yKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4IDw9IHN0YXJ0SW5kZXggKyAxICYmIHguZW5kSW5kZXggPiBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlUm93cyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlVGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zOiBSZXNpemVUYWJsZUNvbHVtbnNNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc2l6ZVRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCByZXNpemVUYWJsZUNvbHVtbnMpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVRhYmxlKGluc2VydEluZGV4OiBudW1iZXIsIHRhYmxlOiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFRhYmxlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0YWJsZSkpIGFzIFRhYmxlTW9kZWw7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZVRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBvbGRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoVGFicyh0YWJJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhJbmRleDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaExhc3RJbmRleCA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W3BhcmFncmFwaEluZGV4XSArIGxlbmd0aDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFiSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgICB0YWJJbmRleCA+PSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5pbnNlcnRJbmRleCA+IHBhcmFncmFwaExhc3RJbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XSAmJiB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2UuaW5zZXJ0SW5kZXggPD0gcGFyYWdyYXBoTGFzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2Uud2lkdGggPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5oZWlnaHQgPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS5mb250O1xuICAgICAgICAgICAgdGFiSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhbmdlSW5kZXhlcyhyYW5nZTogUmFuZ2UpOiB7IHN0YXJ0SW5kZXg6IG51bWJlcjsgZW5kSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCByYW5nZS5zdGFydCk7XG4gICAgICAgIGxldCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHJhbmdlLmVuZCk7XG4gICAgICAgIGNvbnN0IHByZXZOZXdMaW5lU3ltYm9sID0gdGhpcy5kb2N1bWVudC5pc05ld0xpbmVTeW1ib2woZW5kSW5kZXggLSAxKTtcbiAgICAgICAgaWYgKCFwcmV2TmV3TGluZVN5bWJvbCkge1xuICAgICAgICAgICAgaWYgKGVuZEluZGV4ID4gc3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5kZXggPT09IGVuZEluZGV4ICYmIHN0YXJ0SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleC0tO1xuICAgICAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBzdGFydEluZGV4LCBlbmRJbmRleCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGVuZFJvdyAtIHN0YXJ0Um93O1xuICAgICAgICBjb25zdCBuZXdQYXJhZ3JhcGhzOiBQYXJhZ3JhcGhbXSA9IEFycmF5KGxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG5ld1dyYXBEYXRhOiBudW1iZXJbXVtdID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3V3JhcERhdGFbaV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JhcERhdGEuc3BsaWNlKHN0YXJ0Um93LCAwLCAuLi5uZXdXcmFwRGF0YSk7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHMuc3BsaWNlKHN0YXJ0Um93LCAwLCAuLi5uZXdQYXJhZ3JhcGhzKTtcbiAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0Um93LCBlbmRSb3cpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW50ZXJuYWxEYXRhT25EZWxldGVUZXh0KHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGVuZFJvdyAtIHN0YXJ0Um93O1xuXG4gICAgICAgIHRoaXMud3JhcERhdGEuc3BsaWNlKHN0YXJ0Um93LCBsZW5ndGgpO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5yZW1vdmUoc3RhcnRSb3csIGxlbmd0aCk7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShzdGFydFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0Um93LCBzdGFydFJvdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0ubnVtYmVyaW5nRGF0YSA9IE51bWJlcmluZ0hlbHBlci5jcmVhdGVEYXRhTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcy5udW1iZXJpbmdzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaV0uaW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaEZvcm1hdC50ZXh0U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB3cmFwIGluZGV4IGJhc2VkIG9uIG1heCByb3cgd2lkdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwSW5kZXgoZGlzcGxheVRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBpZiAoIWRpc3BsYXlUb2tlbnNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3BsYXlUb2tlbnNbMF0uaXNUYWJsZSB8fCAoZGlzcGxheVRva2Vuc1swXS5icmVha3NMaW5lICYmIGRpc3BsYXlUb2tlbnMubGVuZ3RoID09PSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnQgPVxuICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRMZWZ0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudFJpZ2h0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudEZpcnN0TGluZSAtXG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRIYW5naW5nIHx8IDA7XG4gICAgICAgIGNvbnN0IG1heFJvd1dpZHRoID0gKHRoaXMucGFnZXNXcmFwLmNvbnRlbnRXaWR0aCB8fCB0aGlzLmNvbnRlbnRXaWR0aCkgLSBpbmRlbnQ7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXlUb2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzVGFiKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1tpXS53aWR0aCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChzdW0sIHRoaXMucHJvcGVydGllcy5kZWZhdWx0VGFiV2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdW0gKz0gZGlzcGxheVRva2Vuc1tpXS53aWR0aDtcbiAgICAgICAgICAgIGlmIChpID4gMCAmJiAoc3VtID49IG1heFJvd1dpZHRoIHx8IGRpc3BsYXlUb2tlbnNbaSAtIDFdLmJyZWFrc0xpbmUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzTGluZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gZGlzcGxheVRva2Vucy5sZW5ndGggLSAxICYmIGRpc3BsYXlUb2tlbnNbaV0uaXNQYWdlQnJlYWspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwU3BsaXQodG9rZW5zOiBEaXNwbGF5VG9rZW5bXSwgd3JhcExpbWl0OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoIHx8IHRva2Vucy5sZW5ndGggPD0gd3JhcExpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc3BhY2Ugb3IgdGFiIGF0IHRoaXMgc3BsaXQgcG9zaXRpb24sIHRoZW4gbWFraW5nXG4gICAgICAgIC8vIGEgc3BsaXQgaXMgc2ltcGxlLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3cmFwTGltaXQgPT09IDAgfHxcbiAgICAgICAgICAgIHRva2Vuc1t3cmFwTGltaXRdLmRpc3BsYXlWYWx1ZSA9PT0gRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQgfHxcbiAgICAgICAgICAgICh0aGlzLmlzV2hpdGVTcGFjZSh0b2tlbnNbd3JhcExpbWl0IC0gMV0pICYmIHRoaXMuaXNXaGl0ZVNwYWNlKHRva2Vuc1t3cmFwTGltaXRdKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcExpbWl0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlU3BsaXQod3JhcExpbWl0LCB0b2tlbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3BsaXRzKFxuICAgICAgICBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIGxpbmU6IHN0cmluZyxcbiAgICAgICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICBjdXN0b21Db21wb25lbnRzOiBJQ3VzdG9tQ29tcG9uZW50cyxcbiAgICAgICAgcGFyYWdyYXBoSW5kZXg6IG51bWJlcixcbiAgICAgICAgaXNOZXh0TGluZUV4aXN0czogYm9vbGVhblxuICAgICk6IHsgc3BsaXRzOiBudW1iZXJbXTsgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSB9IHtcbiAgICAgICAgY29uc3Qgc3RyVG9rZW5zID0gdGhpcy5nZXREaXNwbGF5VG9rZW5zKG1vZGVsLCBsaW5lLCBzdGFydEluZGV4LCBjdXN0b21Db21wb25lbnRzKTtcbiAgICAgICAgaWYgKCFzdHJUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Um93SW5mbyA9IG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICh0aGlzLnN0eWxlc01hcC5mb250U2l6ZSAqIDQpIC8gMyxcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZyxcbiAgICAgICAgICAgICAgICBpc0FmdGVyUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0VuZGVkQnlQYWdlQnJlYWs6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRzOiBbXSwgcm93SW5mb3M6IFtkZWZhdWx0Um93SW5mb10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0czogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGxldCBwcmV2VG9rZW46IERpc3BsYXlUb2tlbjtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGxldCBpbml0aWFsID0gbGluZTtcbiAgICAgICAgd2hpbGUgKGluZGV4KSB7XG4gICAgICAgICAgICBpbml0aWFsID0gaW5pdGlhbC5zbGljZShpbmRleCA+IDAgPyBpbmRleCA6IDApO1xuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gc3RyVG9rZW5zLnNsaWNlKGxpbmUubGVuZ3RoIC0gaW5pdGlhbC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goLi4udGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMoc3RhcnRJbmRleCArIGluZGV4KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3cmFwTGltaXQgPSB0aGlzLmNvbXB1dGVXcmFwSW5kZXgodG9rZW5zKTtcbiAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmlzUGFnZUJyZWFrICYmIHdyYXBMaW1pdCA9PT0gdG9rZW5zLmxlbmd0aCAmJiBpc05leHRMaW5lRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgd3JhcExpbWl0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdyYXBTcGxpdCA9XG4gICAgICAgICAgICAgICAgdG9rZW5zW3dyYXBMaW1pdCAtIDFdPy5icmVha3NMaW5lIHx8IHRva2Vuc1t3cmFwTGltaXQgLSAxXT8uaXNUYWJsZSA/IHdyYXBMaW1pdCA6IHRoaXMuY29tcHV0ZVdyYXBTcGxpdCh0b2tlbnMsIHdyYXBMaW1pdCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwVG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIHdyYXBTcGxpdCB8fCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBpZiAod3JhcFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSB3cmFwVG9rZW5zW3dyYXBUb2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQYWdlQnJlYWsgPSAhcm93SW5mb3MubGVuZ3RoID8gZmFsc2UgOiByb3dJbmZvc1tyb3dJbmZvcy5sZW5ndGggLSAxXS5pc0VuZGVkQnlQYWdlQnJlYWs7XG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mbyA9IHRoaXMuZ2V0TGluZUluZm9Gcm9tVG9rZW4ocHJldlRva2VuLCB3cmFwVG9rZW5zWzBdLCB3cmFwVG9rZW5zLCBpc0FmdGVyUGFnZUJyZWFrKTtcbiAgICAgICAgICAgIGxpbmVJbmZvLmJhY2tncm91bmRDb2xvciA9IG1vZGVsLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnBhcmFncmFwaFN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHJvd0luZm9zLnB1c2gobGluZUluZm8pO1xuXG4gICAgICAgICAgICBpZiAoIXdyYXBMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleCA9IHdyYXBTcGxpdDtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0c0xlbmd0aCA9IHNwbGl0cy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzTGVuZ3RoID8gaW5kZXggKyBzcGxpdHNbc3BsaXRzTGVuZ3RoIC0gMV0gOiBpbmRleDtcbiAgICAgICAgICAgIHNwbGl0cy5wdXNoKHNwbGl0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zLnB1c2goLi4uc3RyVG9rZW5zLmZpbHRlcih4ID0+IHguaXNUYWIpKTtcblxuICAgICAgICBQYXJhZ3JhcGhIZWxwZXIuYXBwbHlQYXJhZ3JhcGhJbmRlbnRzVG9MaW5lcyhyb3dJbmZvcywgcGFyYWdyYXBoSW5kZXgsIG1vZGVsLnBhcmFncmFwaHMpO1xuICAgICAgICByZXR1cm4geyBzcGxpdHMsIHJvd0luZm9zIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREb2N1bWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFnZU1hcmdpbiA9IHRoaXMuZG9jdW1lbnQucGFnZU1hcmdpbjtcblxuICAgICAgICB0aGlzLnBhZ2VzV3JhcCA9IG5ldyBQYWdlc1dyYXAoXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VzU3BhY2UsXG4gICAgICAgICAgICBwYWdlTWFyZ2luLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5wYWdlV2lkdGgsXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VIZWlnaHQsXG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMuZWRnZXNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyQ3Vyc29yU3R5bGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVtcHR5TGluZVRva2VucyhzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgaWYgKCFzdG9yZWRGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZSgnRU1QVFlfTElORScsIENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKHN0b3JlZEZvcm1hdC50ZXh0U3R5bGUpKTtcbiAgICAgICAgc2l6ZS53aWR0aCA9IDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogRGlzcGxheVZhbHVlLmVtcHR5TGluZSxcbiAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBsaW5lSW5mby5pbmRlbnQuZmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGxpbmVJbmZvLmluZGVudC5oYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgaW5kZW50QmVmb3JlOiBsaW5lSW5mby5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbGxlZExpbmVUb2tlbnMoXG4gICAgICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgbGluZTogc3RyaW5nLFxuICAgICAgICBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzXG4gICAgKTogRGlzcGxheVRva2VuW10ge1xuICAgICAgICBjb25zdCBsaW5lSW5mbyA9IHRoaXMuZ2V0TGluZUluZm9CeUJyZWFrTW9kaWZpZXIoc3RhcnRJbmRleCArIGxpbmUubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBEaXNwbGF5VG9rZW5bXSA9IFtdO1xuICAgICAgICBsZXQgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgIGxldCBwcmV2Rm9ybWF0OiBGb3JtYXRNb2RlbCA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhckNvZGU6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Rm9udFN0cmluZzogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IHByZXZDaGFyOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBsZXQgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgbGV0IHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBsaW5lW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShjaGFyLCBmb250U3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZ2V0Q29tcG9uZW50KGN1c3RvbUNvbXBvbmVudHMsIGNoYXIsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYnJlYWtUeXBlID0gQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKG1vZGVsLCBjaGFyLCBzdGFydEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudCAmJiAhYnJlYWtUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldFRva2VuRnJvbUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IC0xO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmdldERpc3BsYXlWYWx1ZShjaGFyQ29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdENoYXJhY3RlciA9IGkgPT09IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEZpcnN0TGluZTogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5maXJzdExpbmUgOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGlzRmlyc3RDaGFyYWN0ZXIgPyBsaW5lSW5mby5pbmRlbnQuaGFuZ2luZyA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRSaWdodDogbGluZUluZm8uaW5kZW50LnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRCZWZvcmU6IGxpbmVJbmZvLm9mZnNldEJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogbGluZUluZm8ubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSxcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzVGFiOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSAhPT0gcHJldkNoYXJDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcmV2Rm9ybWF0IHx8XG4gICAgICAgICAgICAgICAgICAgICFGb3JtYXRTdHlsZUhlbHBlci5hcmVTYW1lVGV4dFN0eWxlcyhmb3JtYXQ/LnRleHRTdHlsZSwgcHJldkZvcm1hdD8udGV4dFN0eWxlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVycy5sZW5ndGggPiAxICYmIHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXIsIHByZXZGb250U3RyaW5nLCBjaGFyYWN0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFt0b2tlbl07XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ltYm9sQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IGNoYXJDb2RlO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gY2hhcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldkZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgICAgIHByZXZGb250U3RyaW5nID0gZm9udFN0cmluZztcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcblxuICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBmb3JtYXQ/LmVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleChtb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgICBmb250U3RyaW5nID0gQ29udGVudFN0eWxlSGVscGVyLmdldEZvbnRTdHlsZXNTdHJpbmcoZm9ybWF0Py50ZXh0U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXI6IHN0cmluZywgcHJldkZvbnRTdHJpbmc6IHN0cmluZywgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3U2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShwcmV2Q2hhciwgcHJldkZvbnRTdHJpbmcpO1xuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXJhY3RlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgbmV3U2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVNwbGl0KGluZGV4OiBudW1iZXIsIHRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0uZGlzcGxheVZhbHVlID09PSBEaXNwbGF5VmFsdWUuY3VzdG9tQ29udGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlU3BhY2UodG9rZW46IERpc3BsYXlUb2tlbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0Rpc3BsYXlWYWx1ZS5zcGFjZSwgRGlzcGxheVZhbHVlLmVtcHR5TGluZV0uaW5jbHVkZXModG9rZW4uZGlzcGxheVZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvRnJvbVRva2VuKFxuICAgICAgICBwcmV2VG9rZW46IERpc3BsYXlUb2tlbixcbiAgICAgICAgZmlyc3RXcmFwVG9rZW46IERpc3BsYXlUb2tlbixcbiAgICAgICAgd3JhcFRva2VuczogRGlzcGxheVRva2VuW10sXG4gICAgICAgIGlzQWZ0ZXJQYWdlQnJlYWs6IGJvb2xlYW5cbiAgICApOiBMaW5lSW5mb01vZGVsIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgYWxpZ246IHByZXZUb2tlbi5hbGlnbixcbiAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKHByZXZUb2tlbi5pbmRlbnRGaXJzdExpbmUsIHByZXZUb2tlbi5pbmRlbnRIYW5naW5nLCBwcmV2VG9rZW4uaW5kZW50TGVmdCwgcHJldlRva2VuLmluZGVudFJpZ2h0KSxcbiAgICAgICAgICAgIG9mZnNldEJlZm9yZTogcHJldlRva2VuLmluZGVudEJlZm9yZSxcbiAgICAgICAgICAgIG9mZnNldEFmdGVyOiBwcmV2VG9rZW4uaW5kZW50QWZ0ZXIsXG4gICAgICAgICAgICBsaW5lU3BhY2luZzogcHJldlRva2VuLmxpbmVTcGFjaW5nLFxuICAgICAgICAgICAgaXNBZnRlclBhZ2VCcmVhayxcbiAgICAgICAgICAgIGlzRW5kZWRCeVBhZ2VCcmVhazogcHJldlRva2VuLmlzUGFnZUJyZWFrXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChmaXJzdFdyYXBUb2tlbikge1xuICAgICAgICAgICAgaW5mby5hbGlnbiA9IGZpcnN0V3JhcFRva2VuLmFsaWduO1xuICAgICAgICAgICAgaW5mby5pbmRlbnQuZmlyc3RMaW5lID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50Rmlyc3RMaW5lO1xuICAgICAgICAgICAgaW5mby5pbmRlbnQuaGFuZ2luZyA9IGZpcnN0V3JhcFRva2VuLmluZGVudEhhbmdpbmc7XG4gICAgICAgICAgICBpbmZvLmluZGVudC5sZWZ0ID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50TGVmdDtcbiAgICAgICAgICAgIGluZm8uaW5kZW50LnJpZ2h0ID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50UmlnaHQ7XG4gICAgICAgICAgICBpbmZvLm9mZnNldEJlZm9yZSA9IGZpcnN0V3JhcFRva2VuLmluZGVudEJlZm9yZTtcbiAgICAgICAgICAgIGluZm8ub2Zmc2V0QWZ0ZXIgPSBmaXJzdFdyYXBUb2tlbi5pbmRlbnRBZnRlcjtcbiAgICAgICAgICAgIGluZm8ubGluZVNwYWNpbmcgPSBmaXJzdFdyYXBUb2tlbi5saW5lU3BhY2luZztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb250U2l6ZSA9IDA7XG4gICAgICAgIGxldCBhc2NlbnQgPSAwO1xuICAgICAgICBsZXQgZGVzY2VudCA9IDA7XG4gICAgICAgIGNvbnN0IHRva2VucyA9IGlzQWZ0ZXJQYWdlQnJlYWsgJiYgIXdyYXBUb2tlbnMubGVuZ3RoID8gW3ByZXZUb2tlbl0gOiB3cmFwVG9rZW5zO1xuICAgICAgICBmb3IgKGNvbnN0IHdyYXBUb2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmhlaWdodCA8IHdyYXBUb2tlbi5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpbmZvLmhlaWdodCA9IHdyYXBUb2tlbi5oZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb250U2l6ZSA8IHdyYXBUb2tlbi5mb250ICYmIHdyYXBUb2tlbi5kaXNwbGF5VmFsdWUgIT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgZm9udFNpemUgPSB3cmFwVG9rZW4uZm9udDtcbiAgICAgICAgICAgICAgICBhc2NlbnQgPSB3cmFwVG9rZW4uYXNjZW50O1xuICAgICAgICAgICAgICAgIGRlc2NlbnQgPSB3cmFwVG9rZW4uZGVzY2VudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5mby53aWR0aCArPSB3cmFwVG9rZW4ud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvLmhlaWdodCA9IGluZm8uaGVpZ2h0IHx8IDE4O1xuICAgICAgICBpZiAoaW5mby5saW5lU3BhY2luZyA+IDEpIHtcbiAgICAgICAgICAgIGluZm8ub2Zmc2V0QWZ0ZXIgPSAoYXNjZW50ICsgZGVzY2VudCkgKiAoaW5mby5saW5lU3BhY2luZyAtIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGFzY2VudCArIGRlc2NlbnQgPT09IGluZm8uaGVpZ2h0KSB7XG4gICAgICAgICAgICBpbmZvLmhlaWdodCA9IGluZm8uaGVpZ2h0ICogaW5mby5saW5lU3BhY2luZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlKGNoYXJDb2RlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoY2hhckNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLnNwYWNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChjaGFyQ29kZSA+IDM5ICYmIGNoYXJDb2RlIDwgNDgpIHx8IChjaGFyQ29kZSA+IDU3ICYmIGNoYXJDb2RlIDwgNjQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLnB1bmN0dWF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIERpc3BsYXlWYWx1ZS5jaGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TGluZUluZm9CeUJyZWFrTW9kaWZpZXIoaW5kZXg6IG51bWJlcik6IExpbmVJbmZvTW9kZWwge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhBdEluZGV4KHRoaXMubW9kZWwucGFyYWdyYXBocywgaW5kZXgpO1xuICAgICAgICBpZiAoIXBhcmFncmFwaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIG9mZnNldEFmdGVyOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUFmdGVyLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnRMZWZ0ID0gdGhpcy5nZXRQYXJhZ3JhcGhJbmRlbnRMZWZ0KHBhcmFncmFwaCk7XG4gICAgICAgIGNvbnN0IGluZGVudEhhbmdpbmcgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgPT09IG51bGwgPyBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50SGFuZ2luZyA6IDA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgIGFsaWduOiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuYWxpZ25tZW50ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRGaXJzdExpbmUgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmcgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50SGFuZ2luZyxcbiAgICAgICAgICAgICAgICBpbmRlbnRMZWZ0ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudFJpZ2h0ID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgIG9mZnNldEFmdGVyOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUFmdGVyLFxuICAgICAgICAgICAgbGluZVNwYWNpbmc6IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5saW5lU3BhY2luZyA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmFncmFwaEluZGVudExlZnQocGFyYWdyYXBoOiBQYXJhZ3JhcGhNb2RlbCk6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXJhZ3JhcGhJbmRlbnQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50TGVmdDtcbiAgICAgICAgY29uc3QgbnVtYmVyaW5nSWQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQ7XG4gICAgICAgIGlmIChudW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbGV2ZWwgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nTGV2ZWw7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhJbmRleCA9IHRoaXMubW9kZWwucGFyYWdyYXBocy5pbmRleE9mKHBhcmFncmFwaCk7XG4gICAgICAgICAgICBjb25zdCBsZXZlbE1vZGVsID0gTnVtYmVyaW5nSGVscGVyLmZpbmQodGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIG51bWJlcmluZ0lkLCBsZXZlbCk7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhGb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KHRoaXMubW9kZWwuZm9ybWF0cywgcGFyYWdyYXBoLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlclRleHRTdHlsZSA9IEZvcm1hdFN0eWxlSGVscGVyLmNvbWJpbmVUZXh0U3R5bGVzKGxldmVsTW9kZWwubWFya2VyU3R5bGUsIHBhcmFncmFwaEZvcm1hdC50ZXh0U3R5bGUpO1xuICAgICAgICAgICAgbGV0IG1hcmtlcldpZHRoID0gdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0/Lm51bWJlcmluZ0RhdGE/LndpZHRoO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW3BhcmFncmFwaEluZGV4XT8ubnVtYmVyaW5nRGF0YS5tYXJrZXJUZXh0U3R5bGUgfHxcbiAgICAgICAgICAgICAgICAhRm9ybWF0U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlclRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ubnVtYmVyaW5nRGF0YS5tYXJrZXJUZXh0U3R5bGVcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVtYmVyaW5nSWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IE51bWJlcmluZ0hlbHBlci5nZXRNYXJrZXIobGV2ZWxNb2RlbCwgbnVtYmVyaW5nSWQsIHRoaXMubW9kZWwucGFyYWdyYXBocywgcGFyYWdyYXBoSW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlclNpemVzID0gTnVtYmVyaW5nSGVscGVyLmdldE1hcmtlclNpemVzKG1hcmtlciwgbWFya2VyVGV4dFN0eWxlKTtcbiAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aCA9IG1hcmtlclNpemVzLndpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBoYW5naW5nSW5kZW50ID0gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEhhbmdpbmdcbiAgICAgICAgICAgICAgICA/IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRIYW5naW5nXG4gICAgICAgICAgICAgICAgOiBsZXZlbE1vZGVsLmluZGVudEhhbmdpbmc7XG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRlbnQgPSBsZXZlbE1vZGVsLmluZGVudExlZnQ7XG4gICAgICAgICAgICBpZiAobWFya2VyV2lkdGggPj0gaGFuZ2luZ0luZGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlck92ZXJmbG93ID0gbWFya2VyV2lkdGggLSBoYW5naW5nSW5kZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxNYXJrZXJJbmRlbnQgPSBUYWJIZWxwZXIuY2FsY3VsYXRlVGFiV2lkdGgoXG4gICAgICAgICAgICAgICAgICAgIGxldmVsTW9kZWwuaW5kZW50TGVmdCArIG1hcmtlck92ZXJmbG93LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMuZGVmYXVsdFRhYldpZHRoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhJbmRlbnQgKz0gbWFya2VyT3ZlcmZsb3cgKyBhZGRpdGlvbmFsTWFya2VySW5kZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFncmFwaEluZGVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRleHRTdHlsZXMoc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueVtdIH0sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IEZvcm1hdE1vZGVsIHtcbiAgICAgICAgbGV0IHRleHRTdHlsZXMgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRzQXRSYW5nZSh0aGlzLm1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoZm9ybWF0ID0+IGZvcm1hdC50ZXh0U3R5bGUpO1xuICAgICAgICBsZXQgcHJldkZvcm1hdDogRm9ybWF0TW9kZWw7XG4gICAgICAgIGlmICghdGV4dFN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZXZGb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRQcmV2Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAocHJldkZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHRleHRTdHlsZXMgPSBbcHJldkZvcm1hdC50ZXh0U3R5bGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB0ZXh0U3R5bGUgb2YgdGV4dFN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGV4dFN0eWxlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXNba2V5XS5wdXNoKHRleHRTdHlsZVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldkZvcm1hdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBhcmFncmFwaFN0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFN0eWxlcyA9IFBhcmFncmFwaFN0eWxlSGVscGVyLmdldFBhcmFncmFwaHNBdFJhbmdlKHRoaXMubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcChcbiAgICAgICAgICAgIHBhcmFncmFwaCA9PiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGVcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhZ3JhcGhTdHlsZSBvZiBwYXJhZ3JhcGhTdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFncmFwaFN0eWxlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXNba2V5XS5wdXNoKHBhcmFncmFwaFN0eWxlW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU3R5bGVzID0gUGFyYWdyYXBoU3R5bGVIZWxwZXIuZ2V0UGFyYWdyYXBoc0F0UmFuZ2UodGhpcy5tb2RlbC5wYXJhZ3JhcGhzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKFxuICAgICAgICAgICAgcGFyYWdyYXBoID0+IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFncmFwaFN0eWxlIG9mIHBhcmFncmFwaFN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyaW5nTGV2ZWxzID0gdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MuZmluZCh4ID0+IHgubnVtYmVyaW5nSWQgPT09IHBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkKS5sZXZlbHM7XG4gICAgICAgICAgICAgICAgY29uc3QgbGV2ZWxzTWFya2VyU3R5bGVzID0gbnVtYmVyaW5nTGV2ZWxzLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gYCR7cHJldn0ke25leHQubWFya2VyfSR7bmV4dC5tYXJrZXJUeXBlfWAsICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbCA9IG51bWJlcmluZ0xldmVscy5maW5kKHggPT4geC5sZXZlbCA9PT0gcGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nTGV2ZWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQnVsbGV0TWFya2VyID0gbGV2ZWwubWFya2VyVHlwZSA9PT0gTnVtYmVyaW5nTWFya2VyVHlwZS5CdWxsZXQ7XG4gICAgICAgICAgICAgICAgc3R5bGVzWydpc0J1bGxldE1hcmtlciddLnB1c2goaXNCdWxsZXRNYXJrZXIpO1xuICAgICAgICAgICAgICAgIHN0eWxlc1snbnVtYmVyaW5nTGV2ZWxzU3R5bGVzJ10ucHVzaChsZXZlbHNNYXJrZXJTdHlsZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZXNbJ2lzQnVsbGV0TWFya2VyJ10ucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICBzdHlsZXNbJ251bWJlcmluZ0xldmVsc1N0eWxlcyddLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbWFnZVdpdGhBbGxvd2VkU2l6ZShpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsLCBtYXhXaWR0aDogbnVtYmVyKTogSW1hZ2VEYXRhTW9kZWwge1xuICAgICAgICBpZiAoaW1hZ2VEYXRhLndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1hZ2VEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSBpbWFnZURhdGEud2lkdGggLyBpbWFnZURhdGEuaGVpZ2h0O1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBtYXhXaWR0aCAvIGFzcGVjdFJhdGlvO1xuICAgICAgICByZXR1cm4gbmV3IEltYWdlRGF0YU1vZGVsKHsgd2lkdGg6IE1hdGgucm91bmQobWF4V2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQoaGVpZ2h0KSwgY29udGVudDogaW1hZ2VEYXRhLmNvbnRlbnQgfSk7XG4gICAgfVxufVxuIl19
|