@talrace/ngx-noder 0.0.18 → 0.0.20

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.
Files changed (288) hide show
  1. package/fesm2022/talrace-ngx-noder.mjs +181 -181
  2. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  3. package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +1 -1
  4. package/lib/editor/components/external-element/external.component.d.ts +1 -1
  5. package/lib/editor/components/shared/abstract/base.component.d.ts +1 -1
  6. package/lib/editor/components/shared/abstract/destroy.component.d.ts +1 -1
  7. package/package.json +1 -3
  8. package/src/lib/apart-components/add-link-dialog/_add-link-dialog.theme.scss +3 -6
  9. package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +4 -7
  10. package/src/lib/apart-components/confirm-dialog/_theme.scss +6 -9
  11. package/src/lib/apart-components/editor-title/_editor-title.theme.scss +6 -9
  12. package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +9 -12
  13. package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +5 -8
  14. package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +1 -3
  15. package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +1 -3
  16. package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +2 -5
  17. package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +3 -6
  18. package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +3 -6
  19. package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +15 -18
  20. package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +2 -4
  21. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +5 -8
  22. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +6 -9
  23. package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +3 -6
  24. package/src/lib/apart-components/insert-table/_insert-table.theme.scss +6 -9
  25. package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +12 -15
  26. package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +22 -25
  27. package/src/lib/editor/components/_editor.theme.scss +25 -28
  28. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +0 -73
  29. package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +0 -7
  30. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +0 -49
  31. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +0 -34
  32. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +0 -75
  33. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +0 -95
  34. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +0 -24
  35. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +0 -117
  36. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +0 -37
  37. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +0 -49
  38. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +0 -90
  39. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +0 -81
  40. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +0 -28
  41. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +0 -53
  42. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +0 -18
  43. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +0 -27
  44. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +0 -71
  45. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +0 -107
  46. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +0 -25
  47. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +0 -65
  48. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +0 -86
  49. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +0 -90
  50. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +0 -122
  51. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +0 -8
  52. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.mjs +0 -1148
  53. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +0 -157
  54. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +0 -8
  55. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +0 -11
  56. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-template-type.enum.mjs +0 -16
  57. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +0 -6
  58. package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +0 -34
  59. package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +0 -26
  60. package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +0 -60
  61. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +0 -48
  62. package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +0 -54
  63. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +0 -86
  64. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +0 -134
  65. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +0 -38
  66. package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +0 -6
  67. package/esm2022/lib/editor/components/edges/edge.component.mjs +0 -141
  68. package/esm2022/lib/editor/components/edges/edges.mjs +0 -120
  69. package/esm2022/lib/editor/components/edges/page-type.enum.mjs +0 -7
  70. package/esm2022/lib/editor/components/editor.component.mjs +0 -112
  71. package/esm2022/lib/editor/components/external-element/external-element.service.mjs +0 -6
  72. package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +0 -4
  73. package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +0 -2
  74. package/esm2022/lib/editor/components/external-element/external.component.mjs +0 -41
  75. package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +0 -9
  76. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +0 -11
  77. package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +0 -15
  78. package/esm2022/lib/editor/components/image/components/image.component.mjs +0 -88
  79. package/esm2022/lib/editor/components/image/image-api.service.mjs +0 -36
  80. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +0 -46
  81. package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +0 -2
  82. package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +0 -19
  83. package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +0 -12
  84. package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +0 -106
  85. package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +0 -2
  86. package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +0 -52
  87. package/esm2022/lib/editor/components/image/size.mjs +0 -2
  88. package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +0 -60
  89. package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +0 -18
  90. package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +0 -43
  91. package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +0 -2
  92. package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +0 -3
  93. package/esm2022/lib/editor/components/shared/custom-content.mjs +0 -2
  94. package/esm2022/lib/editor/components/shared/services/component.service.mjs +0 -52
  95. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +0 -123
  96. package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +0 -55
  97. package/esm2022/lib/editor/components/tab/tab.component.mjs +0 -44
  98. package/esm2022/lib/editor/components/tab/tab.helper.mjs +0 -6
  99. package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +0 -118
  100. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +0 -99
  101. package/esm2022/lib/editor/components/table/components/table.component.mjs +0 -412
  102. package/esm2022/lib/editor/components/table/enums/hrule.enum.mjs +0 -7
  103. package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +0 -8
  104. package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +0 -6
  105. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +0 -17
  106. package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +0 -9
  107. package/esm2022/lib/editor/components/table/models/row-data.model.mjs +0 -8
  108. package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +0 -7
  109. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +0 -84
  110. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +0 -383
  111. package/esm2022/lib/editor/content/constants/display-values.const.mjs +0 -8
  112. package/esm2022/lib/editor/content/constants/document-info.const.mjs +0 -13
  113. package/esm2022/lib/editor/content/constants/editor.const.mjs +0 -70
  114. package/esm2022/lib/editor/content/contents.interface.mjs +0 -2
  115. package/esm2022/lib/editor/content/display-data/display-data.mjs +0 -839
  116. package/esm2022/lib/editor/content/display-data/display-token.model.mjs +0 -12
  117. package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +0 -10
  118. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +0 -11
  119. package/esm2022/lib/editor/content/display-data/indent.model.mjs +0 -9
  120. package/esm2022/lib/editor/content/display-data/line-info.model.mjs +0 -9
  121. package/esm2022/lib/editor/content/display-data/lines.mjs +0 -96
  122. package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +0 -8
  123. package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +0 -2
  124. package/esm2022/lib/editor/content/display-data/paragraph.mjs +0 -56
  125. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +0 -35
  126. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +0 -2
  127. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +0 -78
  128. package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +0 -62
  129. package/esm2022/lib/editor/content/helpers/format.helper.mjs +0 -23
  130. package/esm2022/lib/editor/content/helpers/indexed-element.helper.mjs +0 -6
  131. package/esm2022/lib/editor/content/helpers/link.helper.mjs +0 -42
  132. package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +0 -9
  133. package/esm2022/lib/editor/content/margin.model.mjs +0 -16
  134. package/esm2022/lib/editor/content/page-vertical-data.model.mjs +0 -9
  135. package/esm2022/lib/editor/content/vertical-alignment.enum.mjs +0 -11
  136. package/esm2022/lib/editor/core/event-emitting.mjs +0 -56
  137. package/esm2022/lib/editor/display/cell.interface.mjs +0 -2
  138. package/esm2022/lib/editor/display/event.helper.mjs +0 -18
  139. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +0 -102
  140. package/esm2022/lib/editor/display/layers/layer.config.mjs +0 -2
  141. package/esm2022/lib/editor/display/layers/pages.layer.mjs +0 -109
  142. package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +0 -7
  143. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +0 -7
  144. package/esm2022/lib/editor/display/layers/selection.layer.mjs +0 -119
  145. package/esm2022/lib/editor/display/layers/text.layer.mjs +0 -226
  146. package/esm2022/lib/editor/display/print/print.helper.mjs +0 -40
  147. package/esm2022/lib/editor/display/print/print.renderer.mjs +0 -67
  148. package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +0 -7
  149. package/esm2022/lib/editor/display/render-changes.interface.mjs +0 -2
  150. package/esm2022/lib/editor/display/render-changes.model.mjs +0 -25
  151. package/esm2022/lib/editor/display/renderer.mjs +0 -204
  152. package/esm2022/lib/editor/display/rendering.helper.mjs +0 -185
  153. package/esm2022/lib/editor/display/renderloop.mjs +0 -26
  154. package/esm2022/lib/editor/display/virtual.renderer.mjs +0 -284
  155. package/esm2022/lib/editor/display/visible-range.interface.mjs +0 -2
  156. package/esm2022/lib/editor/editor.module.mjs +0 -91
  157. package/esm2022/lib/editor/execution/distance.model.mjs +0 -10
  158. package/esm2022/lib/editor/execution/edit.session.mjs +0 -602
  159. package/esm2022/lib/editor/execution/editor.mjs +0 -1368
  160. package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +0 -42
  161. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +0 -73
  162. package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +0 -12
  163. package/esm2022/lib/editor/execution/helpers/page.helper.mjs +0 -12
  164. package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +0 -41
  165. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +0 -177
  166. package/esm2022/lib/editor/execution/regulator.service.mjs +0 -212
  167. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +0 -18
  168. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +0 -14
  169. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +0 -8
  170. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +0 -3
  171. package/esm2022/lib/editor/execution/targeting/session.model.mjs +0 -10
  172. package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +0 -2
  173. package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +0 -2
  174. package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +0 -88
  175. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +0 -208
  176. package/esm2022/lib/editor/gadgets/history/operation.type.mjs +0 -2
  177. package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +0 -7
  178. package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +0 -9
  179. package/esm2022/lib/editor/gadgets/numbering/numbering-marker-type.enum.mjs +0 -12
  180. package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +0 -13
  181. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +0 -149
  182. package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +0 -7
  183. package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +0 -18
  184. package/esm2022/lib/editor/gadgets/scrollbar.mjs +0 -86
  185. package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +0 -2
  186. package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +0 -2
  187. package/esm2022/lib/editor/gadgets/search/search.mjs +0 -231
  188. package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +0 -5
  189. package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +0 -20
  190. package/esm2022/lib/editor/interaction/base.handler.mjs +0 -19
  191. package/esm2022/lib/editor/interaction/document.handler.mjs +0 -27
  192. package/esm2022/lib/editor/interaction/editor.service.mjs +0 -386
  193. package/esm2022/lib/editor/interaction/input.handler.mjs +0 -152
  194. package/esm2022/lib/editor/interaction/mode.enum.mjs +0 -7
  195. package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +0 -7
  196. package/esm2022/lib/editor/interaction/mouse.handler.mjs +0 -50
  197. package/esm2022/lib/editor/interaction/text-input.mjs +0 -53
  198. package/esm2022/lib/editor/operations/commands.service.mjs +0 -20
  199. package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +0 -32
  200. package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +0 -7
  201. package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +0 -9
  202. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +0 -15
  203. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +0 -85
  204. package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +0 -19
  205. package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
  206. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +0 -136
  207. package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
  208. package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +0 -114
  209. package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +0 -16
  210. package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +0 -374
  211. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +0 -438
  212. package/esm2022/lib/editor/operations/save-commands.helper.mjs +0 -128
  213. package/esm2022/lib/editor/operations/target-operations.helper.mjs +0 -23
  214. package/esm2022/lib/editor/positioning/alignments.const.mjs +0 -8
  215. package/esm2022/lib/editor/positioning/content.helper.mjs +0 -45
  216. package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +0 -13
  217. package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +0 -2
  218. package/esm2022/lib/editor/positioning/insert-index.interface.mjs +0 -2
  219. package/esm2022/lib/editor/positioning/line-width.helper.mjs +0 -13
  220. package/esm2022/lib/editor/positioning/position.helper.mjs +0 -210
  221. package/esm2022/lib/editor/positioning/range.mjs +0 -94
  222. package/esm2022/lib/editor/positioning/selection.mjs +0 -351
  223. package/esm2022/lib/editor/revision.helper.mjs +0 -94
  224. package/esm2022/lib/models/generated/add-numbering.model.mjs +0 -8
  225. package/esm2022/lib/models/generated/apply-element-style.model.mjs +0 -8
  226. package/esm2022/lib/models/generated/apply-image-style.model.mjs +0 -8
  227. package/esm2022/lib/models/generated/apply-paragraph-style.model.mjs +0 -12
  228. package/esm2022/lib/models/generated/apply-text-style.model.mjs +0 -12
  229. package/esm2022/lib/models/generated/borders-style.model.mjs +0 -8
  230. package/esm2022/lib/models/generated/break.model.mjs +0 -8
  231. package/esm2022/lib/models/generated/cell.model.mjs +0 -12
  232. package/esm2022/lib/models/generated/column-section.model.mjs +0 -8
  233. package/esm2022/lib/models/generated/column.model.mjs +0 -8
  234. package/esm2022/lib/models/generated/command.model.mjs +0 -120
  235. package/esm2022/lib/models/generated/delete.model.mjs +0 -8
  236. package/esm2022/lib/models/generated/document-name.model.mjs +0 -8
  237. package/esm2022/lib/models/generated/document.model.mjs +0 -8
  238. package/esm2022/lib/models/generated/docx.model.mjs +0 -12
  239. package/esm2022/lib/models/generated/edge-target.model.mjs +0 -8
  240. package/esm2022/lib/models/generated/edge.model.mjs +0 -8
  241. package/esm2022/lib/models/generated/element.model.mjs +0 -8
  242. package/esm2022/lib/models/generated/file-source.model.mjs +0 -8
  243. package/esm2022/lib/models/generated/format.model.mjs +0 -12
  244. package/esm2022/lib/models/generated/heading.model.mjs +0 -16
  245. package/esm2022/lib/models/generated/image-data.model.mjs +0 -8
  246. package/esm2022/lib/models/generated/image.model.mjs +0 -12
  247. package/esm2022/lib/models/generated/insert-break.model.mjs +0 -8
  248. package/esm2022/lib/models/generated/insert-element.model.mjs +0 -12
  249. package/esm2022/lib/models/generated/insert-image.model.mjs +0 -12
  250. package/esm2022/lib/models/generated/insert-link.model.mjs +0 -12
  251. package/esm2022/lib/models/generated/insert-paragraph.model.mjs +0 -20
  252. package/esm2022/lib/models/generated/insert-styled-text.model.mjs +0 -12
  253. package/esm2022/lib/models/generated/insert-tab.model.mjs +0 -8
  254. package/esm2022/lib/models/generated/insert-table-columns.model.mjs +0 -8
  255. package/esm2022/lib/models/generated/insert-table-rows.model.mjs +0 -8
  256. package/esm2022/lib/models/generated/insert-table.model.mjs +0 -8
  257. package/esm2022/lib/models/generated/insert-text.model.mjs +0 -8
  258. package/esm2022/lib/models/generated/last-document-revision.model.mjs +0 -12
  259. package/esm2022/lib/models/generated/link-data.model.mjs +0 -8
  260. package/esm2022/lib/models/generated/link.model.mjs +0 -8
  261. package/esm2022/lib/models/generated/margins.model.mjs +0 -8
  262. package/esm2022/lib/models/generated/numbering-level.model.mjs +0 -12
  263. package/esm2022/lib/models/generated/numbering.model.mjs +0 -8
  264. package/esm2022/lib/models/generated/operation.model.mjs +0 -12
  265. package/esm2022/lib/models/generated/page-numbers.model.mjs +0 -8
  266. package/esm2022/lib/models/generated/paragraph-style.model.mjs +0 -8
  267. package/esm2022/lib/models/generated/paragraph.model.mjs +0 -12
  268. package/esm2022/lib/models/generated/remove-numberings.model.mjs +0 -8
  269. package/esm2022/lib/models/generated/remove-table-columns.model.mjs +0 -8
  270. package/esm2022/lib/models/generated/remove-table-rows.model.mjs +0 -8
  271. package/esm2022/lib/models/generated/replace-by-text.model.mjs +0 -8
  272. package/esm2022/lib/models/generated/replace.model.mjs +0 -44
  273. package/esm2022/lib/models/generated/resize-table-columns.model.mjs +0 -8
  274. package/esm2022/lib/models/generated/restore-numberings.model.mjs +0 -8
  275. package/esm2022/lib/models/generated/restore-paragraph-styles.model.mjs +0 -8
  276. package/esm2022/lib/models/generated/restore-table.model.mjs +0 -12
  277. package/esm2022/lib/models/generated/restore-text-styles.model.mjs +0 -8
  278. package/esm2022/lib/models/generated/restore.model.mjs +0 -8
  279. package/esm2022/lib/models/generated/revision.model.mjs +0 -12
  280. package/esm2022/lib/models/generated/row.model.mjs +0 -8
  281. package/esm2022/lib/models/generated/tab.model.mjs +0 -8
  282. package/esm2022/lib/models/generated/table-cell.model.mjs +0 -8
  283. package/esm2022/lib/models/generated/table.model.mjs +0 -12
  284. package/esm2022/lib/models/generated/target.model.mjs +0 -16
  285. package/esm2022/lib/models/generated/text-style.model.mjs +0 -8
  286. package/esm2022/lib/translate/noder-translate.loader.mjs +0 -22
  287. package/esm2022/public-api.mjs +0 -54
  288. package/esm2022/talrace-ngx-noder.mjs +0 -5
@@ -1,374 +0,0 @@
1
- import { CellModel } from '../../../models/generated/cell.model';
2
- import { ColumnModel } from '../../../models/generated/column.model';
3
- import { DEFAULT_PARAGRAPH_STYLE, DEFAULT_TEXT_STYLE } from '../../content/constants/editor.const';
4
- import { FormatModel } from '../../../models/generated/format.model';
5
- import { IndexedElementOperationsHelper } from './indexed-element-operations.helper';
6
- import { ParagraphModel } from '../../../models/generated/paragraph.model';
7
- import { ParagraphStyleModel } from '../../../models/generated/paragraph-style.model';
8
- import { ResizerSide } from '../../components/table/enums/reisizer-side.enum';
9
- import { RowModel } from '../../../models/generated/row.model';
10
- import { TableModel } from '../../../models/generated/table.model';
11
- import { TextStyleModel } from '../../../models/generated/text-style.model';
12
- import { VerticalMerge } from '../../components/table/enums/vertical-merge.enum';
13
- export class TableOperationsHelper {
14
- static insertContent(tables, insertIndex, tableModel, contentWidth) {
15
- let rows = [];
16
- for (let i = 0; i < tableModel.rowsCount; i++) {
17
- let cells = [];
18
- for (let j = 0; j < tableModel.columnsCount; j++) {
19
- const cell = new CellModel({
20
- breaks: [],
21
- content: '',
22
- contentLength: 0,
23
- elements: [],
24
- formats: [new FormatModel({ startIndex: 0, endIndex: 0, textStyle: DEFAULT_TEXT_STYLE })],
25
- images: [],
26
- paragraphs: [new ParagraphModel({ insertIndex: 0, paragraphStyle: DEFAULT_PARAGRAPH_STYLE })],
27
- tables: [],
28
- tabs: [],
29
- links: [],
30
- widthType: 'dxa'
31
- });
32
- cells.push(cell);
33
- }
34
- rows.push(new RowModel({ cells: cells }));
35
- }
36
- const columnWidth = Math.round(contentWidth / tableModel.columnsCount);
37
- const columns = [];
38
- for (let i = 0; i < tableModel.columnsCount; i++) {
39
- const column = new ColumnModel({
40
- width: columnWidth
41
- });
42
- columns.push(column);
43
- }
44
- const table = new TableModel({ insertIndex: tableModel.insertTableIndex, alignment: 0, rows, columns });
45
- IndexedElementOperationsHelper.insertContent(tables, insertIndex, tableModel.content.length);
46
- const index = tables.findIndex(x => x.insertIndex > table.insertIndex);
47
- if (index < 0) {
48
- tables.push(table);
49
- }
50
- else {
51
- tables.splice(index, 0, table);
52
- }
53
- }
54
- static insertTableRows(tables, insertIndex, rowsCount, targetIndex, inheritIndex) {
55
- const table = tables.find(x => x.insertIndex === insertIndex);
56
- const matrix = this.getMatrix(table);
57
- const newCells = this.getNewRowCells(matrix, targetIndex, inheritIndex);
58
- this.insertNewRowCells(table, newCells, rowsCount, targetIndex, inheritIndex);
59
- }
60
- static insertTableColumns(tables, insertIndex, columnsCount, targetIndex, inheritIndex, contentWidth) {
61
- const table = tables.find(x => x.insertIndex === insertIndex);
62
- const matrix = this.getMatrix(table);
63
- const targetIndexes = this.getTargetIndexes(matrix, targetIndex);
64
- const newCells = this.getNewColumnCells(matrix, columnsCount, targetIndex, inheritIndex);
65
- this.insertNewColumnCells(table, targetIndexes, newCells);
66
- this.insertNewColumns(table, columnsCount, targetIndex, inheritIndex);
67
- this.calculateColumnsWidth(table, contentWidth);
68
- }
69
- static removeTableRows(tables, insertIndex, startIndex, endIndex) {
70
- const table = tables.find(x => x.insertIndex === insertIndex);
71
- const matrix = this.getMatrix(table);
72
- this.removeMatrixRows(matrix, startIndex, endIndex);
73
- table.rows.splice(startIndex, endIndex - startIndex + 1);
74
- }
75
- static removeTableColumns(tables, insertIndex, startIndex, endIndex, contentWidth) {
76
- const table = tables.find(x => x.insertIndex === insertIndex);
77
- const matrix = this.getMatrix(table);
78
- table.columns.splice(startIndex, endIndex - startIndex + 1);
79
- this.removeMatrixRowCells(matrix, table, startIndex, endIndex);
80
- for (let i = 0; i < table.rows.length; i++) {
81
- table.rows[i].cells = table.rows[i].cells.filter(x => matrix[i].cells.includes(x));
82
- }
83
- this.calculateColumnsWidth(table, contentWidth);
84
- }
85
- static resizeTableColumns(tables, resizeTableColumns) {
86
- const table = tables.find(x => x.insertIndex === resizeTableColumns.insertIndex);
87
- this.resizeColumns(table, resizeTableColumns);
88
- this.calculateCellsWidth(table);
89
- }
90
- static restoreTable(tables, insertIndex, oldTable) {
91
- const table = tables.find(x => x.insertIndex === insertIndex);
92
- table.alignment = oldTable.alignment;
93
- table.borders = oldTable.borders;
94
- table.callSpacing = oldTable.callSpacing;
95
- table.columns = oldTable.columns;
96
- table.headingStyleId = oldTable.headingStyleId;
97
- table.indentLeft = oldTable.indentLeft;
98
- table.indentLeftFromText = oldTable.indentLeftFromText;
99
- table.indentRightFromText = oldTable.indentRightFromText;
100
- table.margins = oldTable.margins;
101
- table.rows = oldTable.rows;
102
- }
103
- static getMatrix(table) {
104
- const matrix = [];
105
- table.rows.forEach((row, rowIndex) => {
106
- matrix.push(new RowModel({ ...row, cells: [] }));
107
- row.cells.forEach(cell => {
108
- for (let i = 0; i < (cell.horizontalMerge ?? 1); i++) {
109
- matrix[rowIndex].cells.push(cell);
110
- }
111
- });
112
- });
113
- return matrix;
114
- }
115
- static getNewRowCells(matrix, targetIndex, inheritIndex) {
116
- const newCells = [];
117
- for (let i = 0; i < matrix[inheritIndex].cells.length; i++) {
118
- if (matrix[inheritIndex].cells[i] === matrix[inheritIndex].cells[i - 1]) {
119
- continue;
120
- }
121
- const newCell = new CellModel({
122
- ...matrix[inheritIndex].cells[i],
123
- breaks: [],
124
- content: '',
125
- contentLength: 0,
126
- elements: [],
127
- images: [],
128
- formats: [
129
- new FormatModel({
130
- startIndex: 0,
131
- endIndex: 0,
132
- textStyle: new TextStyleModel(matrix[inheritIndex].cells[i].formats[0].textStyle)
133
- })
134
- ],
135
- paragraphs: [
136
- new ParagraphModel({
137
- insertIndex: 0,
138
- paragraphStyle: new ParagraphStyleModel(matrix[inheritIndex].cells[i].paragraphs[0].paragraphStyle)
139
- })
140
- ],
141
- verticalMerge: this.getCellVerticalMerge(matrix[inheritIndex].cells[i].verticalMerge, targetIndex, inheritIndex),
142
- tables: [],
143
- tabs: [],
144
- links: []
145
- });
146
- newCells.push(newCell);
147
- }
148
- return newCells;
149
- }
150
- static getCellVerticalMerge(currentVerticalMerge, targetIndex, inheritIndex) {
151
- if (currentVerticalMerge !== VerticalMerge.Restart) {
152
- return currentVerticalMerge;
153
- }
154
- return targetIndex > inheritIndex ? VerticalMerge.Merge : null;
155
- }
156
- static insertNewRowCells(table, newCells, rowsCount, targetIndex, inheritIndex) {
157
- for (let i = 0; i < rowsCount; i++) {
158
- const newRowCells = newCells.map(x => new CellModel({
159
- ...x,
160
- breaks: [],
161
- content: '',
162
- contentLength: 0,
163
- elements: [],
164
- formats: [new FormatModel({ startIndex: 0, endIndex: 0, textStyle: new TextStyleModel(x.formats[0].textStyle) })],
165
- images: [],
166
- paragraphs: [
167
- new ParagraphModel({ insertIndex: 0, paragraphStyle: new ParagraphStyleModel(x.paragraphs[0].paragraphStyle) })
168
- ],
169
- tables: [],
170
- tabs: []
171
- }));
172
- const newRow = new RowModel({ ...table.rows[inheritIndex], cells: newRowCells });
173
- table.rows.splice(targetIndex, 0, newRow);
174
- }
175
- }
176
- static getTargetIndexes(matrix, targetIndex) {
177
- const targetIndexes = [];
178
- for (const row of matrix) {
179
- let absoluteCellIndex = 0;
180
- let currentTargetIndex = 0;
181
- let cellMatrixIndex = 0;
182
- while (absoluteCellIndex < targetIndex) {
183
- if (row.cells[cellMatrixIndex] === row.cells[cellMatrixIndex - 1]) {
184
- cellMatrixIndex++;
185
- continue;
186
- }
187
- if (!row.cells[cellMatrixIndex]) {
188
- break;
189
- }
190
- absoluteCellIndex += row.cells[cellMatrixIndex].horizontalMerge ?? 1;
191
- cellMatrixIndex++;
192
- currentTargetIndex++;
193
- }
194
- targetIndexes.push(currentTargetIndex);
195
- }
196
- return targetIndexes;
197
- }
198
- static getNewColumnCells(matrix, columnsCount, targetIndex, inheritIndex) {
199
- return matrix.map(row => {
200
- const newRowCells = [];
201
- const isContinuousCell = inheritIndex === targetIndex
202
- ? row.cells[inheritIndex] === row.cells[targetIndex - 1] && row.cells[inheritIndex].horizontalMerge
203
- : row.cells[inheritIndex] === row.cells[targetIndex] && row.cells[inheritIndex].horizontalMerge;
204
- if (isContinuousCell) {
205
- row.cells[inheritIndex].horizontalMerge += columnsCount;
206
- return newRowCells;
207
- }
208
- for (let i = 0; i < columnsCount; i++) {
209
- const newCell = new CellModel({
210
- ...row.cells[inheritIndex],
211
- breaks: [],
212
- content: '',
213
- contentLength: 0,
214
- elements: [],
215
- formats: [new FormatModel({ startIndex: 0, endIndex: 0, textStyle: row.cells[inheritIndex].formats[0].textStyle })],
216
- horizontalMerge: null,
217
- images: [],
218
- paragraphs: [
219
- new ParagraphModel({ insertIndex: 0, paragraphStyle: row.cells[inheritIndex].paragraphs[0].paragraphStyle })
220
- ],
221
- tables: [],
222
- tabs: [],
223
- verticalMerge: null,
224
- width: row.cells[inheritIndex].width
225
- });
226
- newRowCells.push(newCell);
227
- }
228
- return newRowCells;
229
- });
230
- }
231
- static insertNewColumnCells(table, targetIndexes, newCells) {
232
- for (let i = 0; i < targetIndexes.length; i++) {
233
- if (!newCells[i].length) {
234
- continue;
235
- }
236
- table.rows[i].cells.splice(targetIndexes[i], 0, ...newCells[i]);
237
- }
238
- }
239
- static insertNewColumns(table, columnsCount, targetIndex, inheritIndex) {
240
- const newColumn = table.columns[inheritIndex];
241
- for (let i = 0; i < columnsCount; i++) {
242
- table.columns.splice(targetIndex, 0, new ColumnModel(newColumn));
243
- }
244
- }
245
- static calculateColumnsWidth(table, contentWidth) {
246
- let currentTableWidth = table.columns.reduce((prev, next) => prev + next.width, 0);
247
- table.columns.forEach(x => (x.width = Math.round((x.width / currentTableWidth) * contentWidth)));
248
- table.rows.forEach(row => {
249
- for (let i = 0; i < row.cells.length; i++) {
250
- if (row.cells[i].horizontalMerge) {
251
- let width = table.columns[i].width;
252
- for (let j = 1; j < row.cells[i].horizontalMerge; j++) {
253
- width += table.columns[i + j].width;
254
- }
255
- row.cells[i].width = width;
256
- }
257
- else {
258
- row.cells[i].width = table.columns[i].width;
259
- }
260
- }
261
- });
262
- }
263
- static removeMatrixRows(matrix, startIndex, endIndex) {
264
- const removedRows = matrix.slice(startIndex, endIndex + 1);
265
- matrix.splice(startIndex, endIndex - startIndex + 1);
266
- let i = 0;
267
- while (i < matrix.length) {
268
- let j = 0;
269
- while (j < matrix[i].cells.length) {
270
- if (matrix[i].cells[j].verticalMerge === VerticalMerge.Restart &&
271
- (!matrix[i + 1] || matrix[i + 1].cells[j].verticalMerge !== VerticalMerge.Merge)) {
272
- matrix[i].cells[j].verticalMerge = null;
273
- }
274
- if (matrix[i].cells[j].verticalMerge === VerticalMerge.Merge &&
275
- ![VerticalMerge.Restart, VerticalMerge.Merge].includes(matrix[i - 1]?.cells[j].verticalMerge)) {
276
- this.fillMergedCellAfterRemove(matrix, removedRows, i, j);
277
- }
278
- j++;
279
- }
280
- i++;
281
- }
282
- }
283
- static fillMergedCellAfterRemove(matrix, removedRows, rowIndex, cellIndex) {
284
- let i = removedRows.length - 1;
285
- let removedCell;
286
- while (!removedCell) {
287
- if (removedRows[i].cells[cellIndex].verticalMerge === VerticalMerge.Restart) {
288
- removedCell = removedRows[i].cells[cellIndex];
289
- }
290
- i--;
291
- }
292
- matrix[rowIndex].cells[cellIndex].backgroundColor = removedCell.backgroundColor;
293
- matrix[rowIndex].cells[cellIndex].borders = removedCell.borders;
294
- matrix[rowIndex].cells[cellIndex].breaks = removedCell.breaks;
295
- matrix[rowIndex].cells[cellIndex].columnSections = removedCell.columnSections;
296
- matrix[rowIndex].cells[cellIndex].content = removedCell.content;
297
- matrix[rowIndex].cells[cellIndex].contentLength = removedCell.contentLength;
298
- matrix[rowIndex].cells[cellIndex].elements = removedCell.elements;
299
- matrix[rowIndex].cells[cellIndex].formats = removedCell.formats;
300
- matrix[rowIndex].cells[cellIndex].horizontalMerge = removedCell.horizontalMerge;
301
- matrix[rowIndex].cells[cellIndex].images = removedCell.images;
302
- matrix[rowIndex].cells[cellIndex].margins = removedCell.margins;
303
- matrix[rowIndex].cells[cellIndex].paragraphs = removedCell.paragraphs;
304
- matrix[rowIndex].cells[cellIndex].tables = removedCell.tables;
305
- matrix[rowIndex].cells[cellIndex].verticalAlign = removedCell.verticalAlign;
306
- matrix[rowIndex].cells[cellIndex].verticalMerge = removedCell.verticalMerge;
307
- matrix[rowIndex].cells[cellIndex].width = removedCell.width;
308
- }
309
- static removeMatrixRowCells(matrix, table, startIndex, endIndex) {
310
- let i = 0;
311
- while (i < matrix.length) {
312
- let j = 0;
313
- matrix[i].cells.splice(startIndex, endIndex - startIndex + 1);
314
- while (j < matrix[i].cells.length) {
315
- if (matrix[i].cells[j].horizontalMerge > 1) {
316
- const mergedCellsCount = this.fillDataForHorizontalMergedCell(matrix, table, i, j);
317
- j += mergedCellsCount;
318
- }
319
- else {
320
- j++;
321
- }
322
- }
323
- i++;
324
- }
325
- }
326
- static fillDataForHorizontalMergedCell(matrix, table, rowIndex, cellIndex) {
327
- const mergedCells = matrix[rowIndex].cells.filter(x => x === matrix[rowIndex].cells[cellIndex]);
328
- if (mergedCells.length > 1) {
329
- matrix[rowIndex].cells[cellIndex].horizontalMerge = mergedCells.length;
330
- matrix[rowIndex].cells[cellIndex].width = 0;
331
- for (let i = 0; i < matrix[rowIndex].cells[cellIndex].horizontalMerge; i++) {
332
- matrix[rowIndex].cells[cellIndex].width += table.columns[cellIndex + i].width;
333
- }
334
- }
335
- else {
336
- matrix[rowIndex].cells[cellIndex].horizontalMerge = null;
337
- matrix[rowIndex].cells[cellIndex].width = table.columns[cellIndex].width;
338
- }
339
- matrix[rowIndex].cells[cellIndex].horizontalMerge = mergedCells.length > 1 ? mergedCells.length : null;
340
- return mergedCells.length;
341
- }
342
- static resizeColumns(table, resizeTableColumns) {
343
- if (resizeTableColumns.resizerSide === ResizerSide.Left) {
344
- table.columns[resizeTableColumns.columnIndex].width += resizeTableColumns.distance;
345
- return;
346
- }
347
- const cellHorizontalMerge = table.rows[resizeTableColumns.rowIndex].cells[resizeTableColumns.cellIndex].horizontalMerge ?? 1;
348
- const resizerColumnIndex = resizeTableColumns.columnIndex + cellHorizontalMerge - 1;
349
- table.columns[resizerColumnIndex].width += resizeTableColumns.distance;
350
- if (table.rows[resizeTableColumns.rowIndex].cells[resizeTableColumns.cellIndex + 1]) {
351
- table.columns[resizerColumnIndex + 1].width -= resizeTableColumns.distance;
352
- }
353
- }
354
- static calculateCellsWidth(table) {
355
- table.rows.forEach(row => {
356
- let columnIndex = 0;
357
- for (let i = 0; i < row.cells.length; i++) {
358
- if (row.cells[i].horizontalMerge) {
359
- let width = table.columns[columnIndex].width;
360
- for (let j = 1; j < row.cells[i].horizontalMerge; j++) {
361
- width += table.columns[columnIndex + j].width;
362
- }
363
- row.cells[i].width = width;
364
- columnIndex += row.cells[i].horizontalMerge;
365
- }
366
- else {
367
- row.cells[i].width = table.columns[columnIndex].width;
368
- columnIndex++;
369
- }
370
- }
371
- });
372
- }
373
- }
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtb3BlcmF0aW9ucy5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9lZGl0b3Ivb3BlcmF0aW9ucy9oZWxwZXJzL3RhYmxlLW9wZXJhdGlvbnMuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUV0RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRWpGLE1BQU0sT0FBTyxxQkFBcUI7SUFDOUIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFvQixFQUFFLFdBQW1CLEVBQUUsVUFBNEIsRUFBRSxZQUFvQjtRQUM5RyxJQUFJLElBQUksR0FBZSxFQUFFLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFH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TUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQzlELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7UUFDOUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDbEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQ2hGLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDOUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMs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Li8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2NlbGwubW9kZWwnO1xuaW1wb3J0IHsgQ29sdW1uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2NvbHVtbi5tb2RlbCc7XG5pbXBvcnQgeyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRSwgREVGQVVMVF9URVhUX1NUWUxFIH0gZnJvbSAnLi4vLi4vY29udGVudC9jb25zdGFudHMvZWRpdG9yLmNvbnN0JztcbmltcG9ydCB7IEZvcm1hdE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9mb3JtYXQubW9kZWwnO1xuaW1wb3J0IHsgSW5kZXhlZEVsZW1lbnRPcGVyYXRpb25zSGVscGVyIH0gZnJvbSAnLi9pbmRleGVkLWVsZW1lbnQtb3BlcmF0aW9ucy5oZWxwZXInO1xuaW1wb3J0IHsgSW5zZXJ0VGFibGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXNpemVyU2lkZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFibGUvZW51bXMvcmVpc2l6ZXItc2lkZS5lbnVtJztcbmltcG9ydCB7IFJvd01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yb3cubW9kZWwnO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgVGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgVmVydGljYWxNZXJnZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFibGUvZW51bXMvdmVydGljYWwtbWVyZ2UuZW51bSc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZU9wZXJhdGlvbnNIZWxwZXIge1xuICAgIHN0YXRpYyBpbnNlcnRDb250ZW50KHRhYmxlczogVGFibGVNb2RlbFtdLCBpbnNlcnRJbmRleDogbnVtYmVyLCB0YWJsZU1vZGVsOiBJbnNlcnRUYWJsZU1vZGVsLCBjb250ZW50V2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm93czogUm93TW9kZWxbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTW9kZWwucm93c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjZWxsczogQ2VsbE1vZGVsW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGFibGVNb2RlbC5jb2x1bW5zQ291bnQ7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBuZXcgQ2VsbE1vZGVsKHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogJycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0czogW25ldyBGb3JtYXRNb2RlbCh7IHN0YXJ0SW5kZXg6IDAsIGVuZEluZGV4OiAwLCB0ZXh0U3R5bGU6IERFRkFVTFRfVEVYVF9TVFlMRSB9KV0sXG4gICAgICAgICAgICAgICAgICAgIGltYWdlczogW10sXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaHM6IFtuZXcgUGFyYWdyYXBoTW9kZWwoeyBpbnNlcnRJbmRleDogMCwgcGFyYWdyYXBoU3R5bGU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFIH0pXSxcbiAgICAgICAgICAgICAgICAgICAgdGFibGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgdGFiczogW10sXG4gICAgICAgICAgICAgICAgICAgIGxpbmtzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhUeXBlOiAnZHhhJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJvd3MucHVzaChuZXcgUm93TW9kZWwoeyBjZWxsczogY2VsbHMgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBNYXRoLnJvdW5kKGNvbnRlbnRXaWR0aCAvIHRhYmxlTW9kZWwuY29sdW1uc0NvdW50KTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTW9kZWwuY29sdW1uc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IG5ldyBDb2x1bW5Nb2RlbCh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGNvbHVtbldpZHRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlTW9kZWwoeyBpbnNlcnRJbmRleDogdGFibGVNb2RlbC5pbnNlcnRUYWJsZUluZGV4LCBhbGlnbm1lbnQ6IDAsIHJvd3MsIGNvbHVtbnMgfSk7XG5cbiAgICAgICAgSW5kZXhlZEVsZW1lbnRPcGVyYXRpb25zSGVscGVyLmluc2VydENvbnRlbnQodGFibGVzLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbC5jb250ZW50Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVzLmZpbmRJbmRleCh4ID0+IHguaW5zZXJ0SW5kZXggPiB0YWJsZS5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRhYmxlcy5wdXNoKHRhYmxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhYmxlcy5zcGxpY2UoaW5kZXgsIDAsIHRhYmxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgaW5zZXJ0VGFibGVSb3dzKHRhYmxlczogVGFibGVNb2RlbFtdLCBpbnNlcnRJbmRleDogbnVtYmVyLCByb3dzQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5nZXRNYXRyaXgodGFibGUpO1xuICAgICAgICBjb25zdCBuZXdDZWxscyA9IHRoaXMuZ2V0TmV3Um93Q2VsbHMobWF0cml4LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgdGhpcy5pbnNlcnROZXdSb3dDZWxscyh0YWJsZSwgbmV3Q2VsbHMsIHJvd3NDb3VudCwgdGFyZ2V0SW5kZXgsIGluaGVyaXRJbmRleCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGluc2VydFRhYmxlQ29sdW1ucyhcbiAgICAgICAgdGFibGVzOiBUYWJsZU1vZGVsW10sXG4gICAgICAgIGluc2VydEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNvbHVtbnNDb3VudDogbnVtYmVyLFxuICAgICAgICB0YXJnZXRJbmRleDogbnVtYmVyLFxuICAgICAgICBpbmhlcml0SW5kZXg6IG51bWJlcixcbiAgICAgICAgY29udGVudFdpZHRoOiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5nZXRNYXRyaXgodGFibGUpO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleGVzID0gdGhpcy5nZXRUYXJnZXRJbmRleGVzKG1hdHJpeCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICBjb25zdCBuZXdDZWxscyA9IHRoaXMuZ2V0TmV3Q29sdW1uQ2VsbHMobWF0cml4LCBjb2x1bW5zQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0aGlzLmluc2VydE5ld0NvbHVtbkNlbGxzKHRhYmxlLCB0YXJnZXRJbmRleGVzLCBuZXdDZWxscyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0TmV3Q29sdW1ucyh0YWJsZSwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5zV2lkdGgodGFibGUsIGNvbnRlbnRXaWR0aCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZVRhYmxlUm93cyh0YWJsZXM6IFRhYmxlTW9kZWxbXSwgaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IHRoaXMuZ2V0TWF0cml4KHRhYmxlKTtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXRyaXhSb3dzKG1hdHJpeCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0YWJsZS5yb3dzLnNwbGljZShzdGFydEluZGV4LCBlbmRJbmRleCAtIHN0YXJ0SW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlVGFibGVDb2x1bW5zKHRhYmxlczogVGFibGVNb2RlbFtdLCBpbnNlcnRJbmRleDogbnVtYmVyLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIGNvbnRlbnRXaWR0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IHRoaXMuZ2V0TWF0cml4KHRhYmxlKTtcbiAgICAgICAgdGFibGUuY29sdW1ucy5zcGxpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXggLSBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgIHRoaXMucmVtb3ZlTWF0cml4Um93Q2VsbHMobWF0cml4LCB0YWJsZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRhYmxlLnJvd3NbaV0uY2VsbHMgPSB0YWJsZS5yb3dzW2ldLmNlbGxzLmZpbHRlcih4ID0+IG1hdHJpeFtpXS5jZWxscy5pbmNsdWRlcyh4KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbnNXaWR0aCh0YWJsZSwgY29udGVudFdpZHRoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVzaXplVGFibGVDb2x1bW5zKHRhYmxlczogVGFibGVNb2RlbFtdLCByZXNpemVUYWJsZUNvbHVtbnM6IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSByZXNpemVUYWJsZUNvbHVtbnMuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLnJlc2l6ZUNvbHVtbnModGFibGUsIHJlc2l6ZVRhYmxlQ29sdW1ucyk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2VsbHNXaWR0aCh0YWJsZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlc3RvcmVUYWJsZSh0YWJsZXM6IFRhYmxlTW9kZWxbXSwgaW5zZXJ0SW5kZXg6IG51bWJlciwgb2xkVGFibGU6IFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGUuYWxpZ25tZW50ID0gb2xkVGFibGUuYWxpZ25tZW50O1xuICAgICAgICB0YWJsZS5ib3JkZXJzID0gb2xkVGFibGUuYm9yZGVycztcbiAgICAgICAgdGFibGUuY2FsbFNwYWNpbmcgPSBvbGRUYWJsZS5jYWxsU3BhY2luZztcbiAgICAgICAgdGFibGUuY29sdW1ucyA9IG9sZFRhYmxlLmNvbHVtbnM7XG4gICAgICAgIHRhYmxlLmhlYWRpbmdTdHlsZUlkID0gb2xkVGFibGUuaGVhZGluZ1N0eWxlSWQ7XG4gICAgICAgIHRhYmxlLmluZGVudExlZnQgPSBvbGRUYWJsZS5pbmRlbnRMZWZ0O1xuICAgICAgICB0YWJsZS5pbmRlbnRMZWZ0RnJvbVRleHQgPSBvbGRUYWJsZS5pbmRlbnRMZWZ0RnJvbVRleHQ7XG4gICAgICAgIHRhYmxlLmluZGVudFJpZ2h0RnJvbVRleHQgPSBvbGRUYWJsZS5pbmRlbnRSaWdodEZyb21UZXh0O1xuICAgICAgICB0YWJsZS5tYXJnaW5zID0gb2xkVGFibGUubWFyZ2lucztcbiAgICAgICAgdGFibGUucm93cyA9IG9sZFRhYmxlLnJvd3M7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hdHJpeCh0YWJsZTogVGFibGVNb2RlbCk6IFJvd01vZGVsW10ge1xuICAgICAgICBjb25zdCBtYXRyaXg6IFJvd01vZGVsW10gPSBbXTtcblxuICAgICAgICB0YWJsZS5yb3dzLmZvckVhY2goKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgIG1hdHJpeC5wdXNoKG5ldyBSb3dNb2RlbCh7IC4uLnJvdywgY2VsbHM6IFtdIH0pKTtcblxuICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoY2VsbC5ob3Jpem9udGFsTWVyZ2UgPz8gMSk7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE5ld1Jvd0NlbGxzKG1hdHJpeDogUm93TW9kZWxbXSwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiBDZWxsTW9kZWxbXSB7XG4gICAgICAgIGNvbnN0IG5ld0NlbGxzOiBDZWxsTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4W2luaGVyaXRJbmRleF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChtYXRyaXhbaW5oZXJpdEluZGV4XS5jZWxsc1tpXSA9PT0gbWF0cml4W2luaGVyaXRJbmRleF0uY2VsbHNbaSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0NlbGwgPSBuZXcgQ2VsbE1vZGVsKHtcbiAgICAgICAgICAgICAgICAuLi5tYXRyaXhbaW5oZXJpdEluZGV4XS5jZWxsc1tpXSxcbiAgICAgICAgICAgICAgICBicmVha3M6IFtdLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IDAsXG4gICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgICAgIGltYWdlczogW10sXG4gICAgICAgICAgICAgICAgZm9ybWF0czogW1xuICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybWF0TW9kZWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlOiBuZXcgVGV4dFN0eWxlTW9kZWwobWF0cml4W2luaGVyaXRJbmRleF0uY2VsbHNbaV0uZm9ybWF0c1swXS50ZXh0U3R5bGUpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhzOiBbXG4gICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhZ3JhcGhNb2RlbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRJbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaFN0eWxlOiBuZXcgUGFyYWdyYXBoU3R5bGVNb2RlbChtYXRyaXhbaW5oZXJpdEluZGV4XS5jZWxsc1tpXS5wYXJhZ3JhcGhzWzBdLnBhcmFncmFwaFN0eWxlKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdmVydGljYWxNZXJnZTogdGhpcy5nZXRDZWxsVmVydGljYWxNZXJnZShcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4W2luaGVyaXRJbmRleF0uY2VsbHNbaV0udmVydGljYWxNZXJnZSBhcyBWZXJ0aWNhbE1lcmdlLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgaW5oZXJpdEluZGV4XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YWJsZXM6IFtdLFxuICAgICAgICAgICAgICAgIHRhYnM6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmtzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdDZWxscy5wdXNoKG5ld0NlbGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld0NlbGxzO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDZWxsVmVydGljYWxNZXJnZShjdXJyZW50VmVydGljYWxNZXJnZTogVmVydGljYWxNZXJnZSwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKGN1cnJlbnRWZXJ0aWNhbE1lcmdlICE9PSBWZXJ0aWNhbE1lcmdlLlJlc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50VmVydGljYWxNZXJnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXRJbmRleCA+IGluaGVyaXRJbmRleCA/IFZlcnRpY2FsTWVyZ2UuTWVyZ2UgOiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnNlcnROZXdSb3dDZWxscyh0YWJsZTogVGFibGVNb2RlbCwgbmV3Q2VsbHM6IENlbGxNb2RlbFtdLCByb3dzQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbmV3Um93Q2VsbHMgPSBuZXdDZWxscy5tYXAoXG4gICAgICAgICAgICAgICAgeCA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgQ2VsbE1vZGVsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha3M6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0czogW25ldyBGb3JtYXRNb2RlbCh7IHN0YXJ0SW5kZXg6IDAsIGVuZEluZGV4OiAwLCB0ZXh0U3R5bGU6IG5ldyBUZXh0U3R5bGVNb2RlbCh4LmZvcm1hdHNbMF0udGV4dFN0eWxlKSB9KV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhZ3JhcGhNb2RlbCh7IGluc2VydEluZGV4OiAwLCBwYXJhZ3JhcGhTdHlsZTogbmV3IFBhcmFncmFwaFN0eWxlTW9kZWwoeC5wYXJhZ3JhcGhzWzBdLnBhcmFncmFwaFN0eWxlKSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JvdyA9IG5ldyBSb3dNb2RlbCh7IC4uLnRhYmxlLnJvd3NbaW5oZXJpdEluZGV4XSwgY2VsbHM6IG5ld1Jvd0NlbGxzIH0pO1xuICAgICAgICAgICAgdGFibGUucm93cy5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG5ld1Jvdyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0VGFyZ2V0SW5kZXhlcyhtYXRyaXg6IFJvd01vZGVsW10sIHRhcmdldEluZGV4OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ZXM6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgbWF0cml4KSB7XG4gICAgICAgICAgICBsZXQgYWJzb2x1dGVDZWxsSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRUYXJnZXRJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgY2VsbE1hdHJpeEluZGV4ID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKGFic29sdXRlQ2VsbEluZGV4IDwgdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzW2NlbGxNYXRyaXhJbmRleF0gPT09IHJvdy5jZWxsc1tjZWxsTWF0cml4SW5kZXggLSAxXSkge1xuICAgICAgICAgICAgICAgICAgICBjZWxsTWF0cml4SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFyb3cuY2VsbHNbY2VsbE1hdHJpeEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhYnNvbHV0ZUNlbGxJbmRleCArPSByb3cuY2VsbHNbY2VsbE1hdHJpeEluZGV4XS5ob3Jpem9udGFsTWVyZ2UgPz8gMTtcbiAgICAgICAgICAgICAgICBjZWxsTWF0cml4SW5kZXgrKztcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0SW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGN1cnJlbnRUYXJnZXRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0SW5kZXhlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TmV3Q29sdW1uQ2VsbHMobWF0cml4OiBSb3dNb2RlbFtdLCBjb2x1bW5zQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiBDZWxsTW9kZWxbXVtdIHtcbiAgICAgICAgcmV0dXJuIG1hdHJpeC5tYXAocm93ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Jvd0NlbGxzOiBDZWxsTW9kZWxbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNDb250aW51b3VzQ2VsbCA9XG4gICAgICAgICAgICAgICAgaW5oZXJpdEluZGV4ID09PSB0YXJnZXRJbmRleFxuICAgICAgICAgICAgICAgICAgICA/IHJvdy5jZWxsc1tpbmhlcml0SW5kZXhdID09PSByb3cuY2VsbHNbdGFyZ2V0SW5kZXggLSAxXSAmJiByb3cuY2VsbHNbaW5oZXJpdEluZGV4XS5ob3Jpem9udGFsTWVyZ2VcbiAgICAgICAgICAgICAgICAgICAgOiByb3cuY2VsbHNbaW5oZXJpdEluZGV4XSA9PT0gcm93LmNlbGxzW3RhcmdldEluZGV4XSAmJiByb3cuY2VsbHNbaW5oZXJpdEluZGV4XS5ob3Jpem9udGFsTWVyZ2U7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRpbnVvdXNDZWxsKSB7XG4gICAgICAgICAgICAgICAgcm93LmNlbGxzW2luaGVyaXRJbmRleF0uaG9yaXpvbnRhbE1lcmdlICs9IGNvbHVtbnNDb3VudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3Um93Q2VsbHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDZWxsID0gbmV3IENlbGxNb2RlbCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnJvdy5jZWxsc1tpbmhlcml0SW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICBicmVha3M6IFtdLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiBbbmV3IEZvcm1hdE1vZGVsKHsgc3RhcnRJbmRleDogMCwgZW5kSW5kZXg6IDAsIHRleHRTdHlsZTogcm93LmNlbGxzW2luaGVyaXRJbmRleF0uZm9ybWF0c1swXS50ZXh0U3R5bGUgfSldLFxuICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsTWVyZ2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlczogW10sXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhZ3JhcGhNb2RlbCh7IGluc2VydEluZGV4OiAwLCBwYXJhZ3JhcGhTdHlsZTogcm93LmNlbGxzW2luaGVyaXRJbmRleF0ucGFyYWdyYXBoc1swXS5wYXJhZ3JhcGhTdHlsZSB9KVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB0YWJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxNZXJnZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJvdy5jZWxsc1tpbmhlcml0SW5kZXhdLndpZHRoXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBuZXdSb3dDZWxscy5wdXNoKG5ld0NlbGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3Um93Q2VsbHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnNlcnROZXdDb2x1bW5DZWxscyh0YWJsZTogVGFibGVNb2RlbCwgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10sIG5ld0NlbGxzOiBDZWxsTW9kZWxbXVtdKTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFuZXdDZWxsc1tpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFibGUucm93c1tpXS5jZWxscy5zcGxpY2UodGFyZ2V0SW5kZXhlc1tpXSwgMCwgLi4ubmV3Q2VsbHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGluc2VydE5ld0NvbHVtbnModGFibGU6IFRhYmxlTW9kZWwsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0YWJsZS5jb2x1bW5zW2luaGVyaXRJbmRleF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbHVtbnMuc3BsaWNlKHRhcmdldEluZGV4LCAwLCBuZXcgQ29sdW1uTW9kZWwobmV3Q29sdW1uKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgY2FsY3VsYXRlQ29sdW1uc1dpZHRoKHRhYmxlOiBUYWJsZU1vZGVsLCBjb250ZW50V2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgY3VycmVudFRhYmxlV2lkdGggPSB0YWJsZS5jb2x1bW5zLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQud2lkdGgsIDApO1xuICAgICAgICB0YWJsZS5jb2x1bW5zLmZvckVhY2goeCA9PiAoeC53aWR0aCA9IE1hdGgucm91bmQoKHgud2lkdGggLyBjdXJyZW50VGFibGVXaWR0aCkgKiBjb250ZW50V2lkdGgpKSk7XG5cbiAgICAgICAgdGFibGUucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChyb3cuY2VsbHNbaV0uaG9yaXpvbnRhbE1lcmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IHRhYmxlLmNvbHVtbnNbaV0ud2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCByb3cuY2VsbHNbaV0uaG9yaXpvbnRhbE1lcmdlOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICs9IHRhYmxlLmNvbHVtbnNbaSArIGpdLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxzW2ldLndpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxzW2ldLndpZHRoID0gdGFibGUuY29sdW1uc1tpXS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByZW1vdmVNYXRyaXhSb3dzKG1hdHJpeDogUm93TW9kZWxbXSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRSb3dzID0gbWF0cml4LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk7XG4gICAgICAgIG1hdHJpeC5zcGxpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXggLSBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICB3aGlsZSAoaSA8IG1hdHJpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBqID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKGogPCBtYXRyaXhbaV0uY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobWF0cml4W2ldLmNlbGxzW2pdLnZlcnRpY2FsTWVyZ2UgYXMgVmVydGljYWxNZXJnZSkgPT09IFZlcnRpY2FsTWVyZ2UuUmVzdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAoIW1hdHJpeFtpICsgMV0gfHwgKG1hdHJpeFtpICsgMV0uY2VsbHNbal0udmVydGljYWxNZXJnZSBhcyBWZXJ0aWNhbE1lcmdlKSAhPT0gVmVydGljYWxNZXJnZS5NZXJnZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4W2ldLmNlbGxzW2pdLnZlcnRpY2FsTWVyZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKG1hdHJpeFtpXS5jZWxsc1tqXS52ZXJ0aWNhbE1lcmdlIGFzIFZlcnRpY2FsTWVyZ2UpID09PSBWZXJ0aWNhbE1lcmdlLk1lcmdlICYmXG4gICAgICAgICAgICAgICAgICAgICFbVmVydGljYWxNZXJnZS5SZXN0YXJ0LCBWZXJ0aWNhbE1lcmdlLk1lcmdlXS5pbmNsdWRlcyhtYXRyaXhbaSAtIDFdPy5jZWxsc1tqXS52ZXJ0aWNhbE1lcmdlIGFzIFZlcnRpY2FsTWVyZ2UpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsbE1lcmdlZENlbGxBZnRlclJlbW92ZShtYXRyaXgsIHJlbW92ZWRSb3dzLCBpLCBqKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWxsTWVyZ2VkQ2VsbEFmdGVyUmVtb3ZlKG1hdHJpeDogUm93TW9kZWxbXSwgcmVtb3ZlZFJvd3M6IFJvd01vZGVsW10sIHJvd0luZGV4OiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCBpID0gcmVtb3ZlZFJvd3MubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IHJlbW92ZWRDZWxsOiBDZWxsTW9kZWw7XG5cbiAgICAgICAgd2hpbGUgKCFyZW1vdmVkQ2VsbCkge1xuICAgICAgICAgICAgaWYgKChyZW1vdmVkUm93c1tpXS5jZWxsc1tjZWxsSW5kZXhdLnZlcnRpY2FsTWVyZ2UgYXMgVmVydGljYWxNZXJnZSkgPT09IFZlcnRpY2FsTWVyZ2UuUmVzdGFydCkge1xuICAgICAgICAgICAgICAgIHJlbW92ZWRDZWxsID0gcmVtb3ZlZFJvd3NbaV0uY2VsbHNbY2VsbEluZGV4XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLmJhY2tncm91bmRDb2xvciA9IHJlbW92ZWRDZWxsLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgbWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLmJvcmRlcnMgPSByZW1vdmVkQ2VsbC5ib3JkZXJzO1xuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0uYnJlYWtzID0gcmVtb3ZlZENlbGwuYnJlYWtzO1xuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0uY29sdW1uU2VjdGlvbnMgPSByZW1vdmVkQ2VsbC5jb2x1bW5TZWN0aW9ucztcbiAgICAgICAgbWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLmNvbnRlbnQgPSByZW1vdmVkQ2VsbC5jb250ZW50O1xuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0uY29udGVudExlbmd0aCA9IHJlbW92ZWRDZWxsLmNvbnRlbnRMZW5ndGg7XG4gICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS5lbGVtZW50cyA9IHJlbW92ZWRDZWxsLmVsZW1lbnRzO1xuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0uZm9ybWF0cyA9IHJlbW92ZWRDZWxsLmZvcm1hdHM7XG4gICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS5ob3Jpem9udGFsTWVyZ2UgPSByZW1vdmVkQ2VsbC5ob3Jpem9udGFsTWVyZ2U7XG4gICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS5pbWFnZXMgPSByZW1vdmVkQ2VsbC5pbWFnZXM7XG4gICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS5tYXJnaW5zID0gcmVtb3ZlZENlbGwubWFyZ2lucztcbiAgICAgICAgbWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLnBhcmFncmFwaHMgPSByZW1vdmVkQ2VsbC5wYXJhZ3JhcGhzO1xuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0udGFibGVzID0gcmVtb3ZlZENlbGwudGFibGVzO1xuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0udmVydGljYWxBbGlnbiA9IHJlbW92ZWRDZWxsLnZlcnRpY2FsQWxpZ247XG4gICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS52ZXJ0aWNhbE1lcmdlID0gcmVtb3ZlZENlbGwudmVydGljYWxNZXJnZTtcbiAgICAgICAgbWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLndpZHRoID0gcmVtb3ZlZENlbGwud2lkdGg7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZU1hdHJpeFJvd0NlbGxzKG1hdHJpeDogUm93TW9kZWxbXSwgdGFibGU6IFRhYmxlTW9kZWwsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBtYXRyaXgubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICBtYXRyaXhbaV0uY2VsbHMuc3BsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4IC0gc3RhcnRJbmRleCArIDEpO1xuXG4gICAgICAgICAgICB3aGlsZSAoaiA8IG1hdHJpeFtpXS5jZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0cml4W2ldLmNlbGxzW2pdLmhvcml6b250YWxNZXJnZSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkQ2VsbHNDb3VudCA9IHRoaXMuZmlsbERhdGFGb3JIb3Jpem9udGFsTWVyZ2VkQ2VsbChtYXRyaXgsIHRhYmxlLCBpLCBqKTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSBtZXJnZWRDZWxsc0NvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWxsRGF0YUZvckhvcml6b250YWxNZXJnZWRDZWxsKG1hdHJpeDogUm93TW9kZWxbXSwgdGFibGU6IFRhYmxlTW9kZWwsIHJvd0luZGV4OiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkQ2VsbHMgPSBtYXRyaXhbcm93SW5kZXhdLmNlbGxzLmZpbHRlcih4ID0+IHggPT09IG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XSk7XG5cbiAgICAgICAgaWYgKG1lcmdlZENlbGxzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS5ob3Jpem9udGFsTWVyZ2UgPSBtZXJnZWRDZWxscy5sZW5ndGg7XG4gICAgICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0ud2lkdGggPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS5ob3Jpem9udGFsTWVyZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgIG1hdHJpeFtyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XS53aWR0aCArPSB0YWJsZS5jb2x1bW5zW2NlbGxJbmRleCArIGldLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLmhvcml6b250YWxNZXJnZSA9IG51bGw7XG4gICAgICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0ud2lkdGggPSB0YWJsZS5jb2x1bW5zW2NlbGxJbmRleF0ud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRyaXhbcm93SW5kZXhdLmNlbGxzW2NlbGxJbmRleF0uaG9yaXpvbnRhbE1lcmdlID0gbWVyZ2VkQ2VsbHMubGVuZ3RoID4gMSA/IG1lcmdlZENlbGxzLmxlbmd0aCA6IG51bGw7XG4gICAgICAgIHJldHVybiBtZXJnZWRDZWxscy5sZW5ndGg7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlc2l6ZUNvbHVtbnModGFibGU6IFRhYmxlTW9kZWwsIHJlc2l6ZVRhYmxlQ29sdW1uczogUmVzaXplVGFibGVDb2x1bW5zTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHJlc2l6ZVRhYmxlQ29sdW1ucy5yZXNpemVyU2lkZSA9PT0gUmVzaXplclNpZGUuTGVmdCkge1xuICAgICAgICAgICAgdGFibGUuY29sdW1uc1tyZXNpemVUYWJsZUNvbHVtbnMuY29sdW1uSW5kZXhdLndpZHRoICs9IHJlc2l6ZVRhYmxlQ29sdW1ucy5kaXN0YW5jZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNlbGxIb3Jpem9udGFsTWVyZ2UgPSB0YWJsZS5yb3dzW3Jlc2l6ZVRhYmxlQ29sdW1ucy5yb3dJbmRleF0uY2VsbHNbcmVzaXplVGFibGVDb2x1bW5zLmNlbGxJbmRleF0uaG9yaXpvbnRhbE1lcmdlID8/IDE7XG4gICAgICAgIGNvbnN0IHJlc2l6ZXJDb2x1bW5JbmRleCA9IHJlc2l6ZVRhYmxlQ29sdW1ucy5jb2x1bW5JbmRleCArIGNlbGxIb3Jpem9udGFsTWVyZ2UgLSAxO1xuICAgICAgICB0YWJsZS5jb2x1bW5zW3Jlc2l6ZXJDb2x1bW5JbmRleF0ud2lkdGggKz0gcmVzaXplVGFibGVDb2x1bW5zLmRpc3RhbmNlO1xuXG4gICAgICAgIGlmICh0YWJsZS5yb3dzW3Jlc2l6ZVRhYmxlQ29sdW1ucy5yb3dJbmRleF0uY2VsbHNbcmVzaXplVGFibGVDb2x1bW5zLmNlbGxJbmRleCArIDFdKSB7XG4gICAgICAgICAgICB0YWJsZS5jb2x1bW5zW3Jlc2l6ZXJDb2x1bW5JbmRleCArIDFdLndpZHRoIC09IHJlc2l6ZVRhYmxlQ29sdW1ucy5kaXN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjYWxjdWxhdGVDZWxsc1dpZHRoKHRhYmxlOiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRhYmxlLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbHVtbkluZGV4ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5jZWxsc1tpXS5ob3Jpem9udGFsTWVyZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gdGFibGUuY29sdW1uc1tjb2x1bW5JbmRleF0ud2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCByb3cuY2VsbHNbaV0uaG9yaXpvbnRhbE1lcmdlOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICs9IHRhYmxlLmNvbHVtbnNbY29sdW1uSW5kZXggKyBqXS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJvdy5jZWxsc1tpXS53aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCArPSByb3cuY2VsbHNbaV0uaG9yaXpvbnRhbE1lcmdlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5jZWxsc1tpXS53aWR0aCA9IHRhYmxlLmNvbHVtbnNbY29sdW1uSW5kZXhdLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19