@worktile/theia 18.0.16 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/constants/node-types.d.ts +1 -0
  2. package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
  3. package/fesm2022/worktile-theia.mjs +262 -281
  4. package/fesm2022/worktile-theia.mjs.map +1 -1
  5. package/package.json +4 -6
  6. package/plugins/code/code.component.scss +1 -2
  7. package/plugins/image/image.component.d.ts +1 -1
  8. package/plugins/mention/suggestion.component.d.ts +1 -1
  9. package/esm2022/components/action/prevent-default.mjs +0 -21
  10. package/esm2022/components/column-resize/column-resize-notifier.mjs +0 -31
  11. package/esm2022/components/column-resize/column-resize.directive.mjs +0 -124
  12. package/esm2022/components/column-resize/event-dispatcher.mjs +0 -56
  13. package/esm2022/components/column-resize/overlay-handle.component.mjs +0 -144
  14. package/esm2022/components/column-resize/resize-ref.mjs +0 -26
  15. package/esm2022/components/column-resize/resizing.store.mjs +0 -92
  16. package/esm2022/components/column-resize/selectors.mjs +0 -4
  17. package/esm2022/components/contextmenu/contextmenu.component.mjs +0 -99
  18. package/esm2022/components/conversion-hint/conversion-hint.component.mjs +0 -56
  19. package/esm2022/components/element/element.component.mjs +0 -23
  20. package/esm2022/components/index.mjs +0 -24
  21. package/esm2022/components/inline-toolbar/inline-toolbar.component.mjs +0 -131
  22. package/esm2022/components/listbox/listbox.mjs +0 -380
  23. package/esm2022/components/listbox/listbox.type.mjs +0 -5
  24. package/esm2022/components/plugin-menu/plugin-menu.component.mjs +0 -272
  25. package/esm2022/components/table-select/table-select.component.mjs +0 -49
  26. package/esm2022/components/template/template.component.mjs +0 -62
  27. package/esm2022/components/text/text.component.mjs +0 -57
  28. package/esm2022/components/toolbar/toolbar.component.mjs +0 -262
  29. package/esm2022/components/toolbar-dropdown/toolbar-dropdown.component.mjs +0 -137
  30. package/esm2022/components/toolbar-group/toolbar-group.component.mjs +0 -125
  31. package/esm2022/components/toolbar-item/toolbar-item.component.mjs +0 -80
  32. package/esm2022/constants/auto-format-rules.mjs +0 -167
  33. package/esm2022/constants/code.mjs +0 -85
  34. package/esm2022/constants/color-select.mjs +0 -3
  35. package/esm2022/constants/default.mjs +0 -11
  36. package/esm2022/constants/error.mjs +0 -7
  37. package/esm2022/constants/index.mjs +0 -9
  38. package/esm2022/constants/node-types.mjs +0 -136
  39. package/esm2022/constants/plugin-menu.mjs +0 -311
  40. package/esm2022/constants/selector.mjs +0 -3
  41. package/esm2022/constants/toolbar.mjs +0 -53
  42. package/esm2022/core/create-plugin.mjs +0 -5
  43. package/esm2022/core/create-toolbar.mjs +0 -55
  44. package/esm2022/core/index.mjs +0 -6
  45. package/esm2022/core/toolbar-item/base-toolbar-item.mjs +0 -95
  46. package/esm2022/core/utils/combine-plugins.mjs +0 -10
  47. package/esm2022/core/utils/flatten-deep-plugins.mjs +0 -19
  48. package/esm2022/core/utils/get-plugin-options.mjs +0 -3
  49. package/esm2022/core/utils/get-plugin.mjs +0 -2
  50. package/esm2022/core/utils/get-plugins.mjs +0 -4
  51. package/esm2022/core/utils/index.mjs +0 -12
  52. package/esm2022/core/utils/merge-array.mjs +0 -18
  53. package/esm2022/core/utils/merge-deep-plugins.mjs +0 -14
  54. package/esm2022/core/utils/merge-options.mjs +0 -25
  55. package/esm2022/core/utils/nested-structure-by-key.mjs +0 -11
  56. package/esm2022/core/utils/plugin-menu.mjs +0 -63
  57. package/esm2022/core/utils/plugins-by-key.mjs +0 -10
  58. package/esm2022/core/with-theia.mjs +0 -25
  59. package/esm2022/custom-types.mjs +0 -2
  60. package/esm2022/editor.component.mjs +0 -488
  61. package/esm2022/editor.module.mjs +0 -18
  62. package/esm2022/i18n/i18n.mjs +0 -10
  63. package/esm2022/i18n/i18n.service.mjs +0 -46
  64. package/esm2022/i18n/i18n.token.mjs +0 -9
  65. package/esm2022/i18n/index.mjs +0 -10
  66. package/esm2022/i18n/locales/de-de.mjs +0 -102
  67. package/esm2022/i18n/locales/en-us.mjs +0 -102
  68. package/esm2022/i18n/locales/ja-jp.mjs +0 -102
  69. package/esm2022/i18n/locales/ru-ru.mjs +0 -102
  70. package/esm2022/i18n/locales/zh-hans.mjs +0 -102
  71. package/esm2022/i18n/locales/zh-hant.mjs +0 -102
  72. package/esm2022/interfaces/auto-format.mjs +0 -2
  73. package/esm2022/interfaces/editor.mjs +0 -26
  74. package/esm2022/interfaces/element.mjs +0 -2
  75. package/esm2022/interfaces/image.mjs +0 -3
  76. package/esm2022/interfaces/index.mjs +0 -11
  77. package/esm2022/interfaces/plugins/index.mjs +0 -6
  78. package/esm2022/interfaces/plugins/no-infer.mjs +0 -2
  79. package/esm2022/interfaces/plugins/plugin-key.mjs +0 -42
  80. package/esm2022/interfaces/plugins/plugin-menu.mjs +0 -19
  81. package/esm2022/interfaces/plugins/plugins.mjs +0 -2
  82. package/esm2022/interfaces/plugins/with-override.mjs +0 -2
  83. package/esm2022/interfaces/preset.mjs +0 -3
  84. package/esm2022/interfaces/reset-block-type-plugin-options.mjs +0 -2
  85. package/esm2022/interfaces/toolbar.mjs +0 -12
  86. package/esm2022/interfaces/upload.mjs +0 -2
  87. package/esm2022/interfaces/utility/index.mjs +0 -4
  88. package/esm2022/interfaces/utility/nested-structure-by-key.mjs +0 -2
  89. package/esm2022/interfaces/utility/override-by-key.mjs +0 -2
  90. package/esm2022/interfaces/utility/types.mjs +0 -2
  91. package/esm2022/interfaces/valid-children-types.mjs +0 -36
  92. package/esm2022/interfaces/view-base.mjs +0 -38
  93. package/esm2022/pipes.mjs +0 -61
  94. package/esm2022/plugins/align/align.editor.mjs +0 -41
  95. package/esm2022/plugins/align/align.plugin.mjs +0 -64
  96. package/esm2022/plugins/autoformat/autoformat.plugin.mjs +0 -109
  97. package/esm2022/plugins/autoformat/transforms/auto-format-block.mjs +0 -14
  98. package/esm2022/plugins/autoformat/transforms/auto-format-inline.mjs +0 -78
  99. package/esm2022/plugins/blockquote/blockquote.component.mjs +0 -16
  100. package/esm2022/plugins/blockquote/blockquote.editor.mjs +0 -20
  101. package/esm2022/plugins/blockquote/blockquote.plugin.mjs +0 -84
  102. package/esm2022/plugins/code/code.component.mjs +0 -255
  103. package/esm2022/plugins/code/code.editor.mjs +0 -59
  104. package/esm2022/plugins/code/code.plugin.mjs +0 -67
  105. package/esm2022/plugins/color/color.editor.mjs +0 -27
  106. package/esm2022/plugins/color/color.plugin.mjs +0 -32
  107. package/esm2022/plugins/color/toolbar-item.component.mjs +0 -99
  108. package/esm2022/plugins/common/block-card.plugin.mjs +0 -330
  109. package/esm2022/plugins/common/common.plugin.mjs +0 -49
  110. package/esm2022/plugins/common/get-fragment.plugin.mjs +0 -24
  111. package/esm2022/plugins/common/history.plugin.mjs +0 -31
  112. package/esm2022/plugins/common/insert-data-by-invalid-type.mjs +0 -23
  113. package/esm2022/plugins/common/move-selection.plugin.mjs +0 -105
  114. package/esm2022/plugins/common/remove-empty.plugin.mjs +0 -61
  115. package/esm2022/plugins/common/remove-void.plugin.mjs +0 -60
  116. package/esm2022/plugins/common/reset-type.plugin.mjs +0 -35
  117. package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +0 -61
  118. package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +0 -142
  119. package/esm2022/plugins/font-size/font-size.editor.mjs +0 -98
  120. package/esm2022/plugins/heading/heading.editor.mjs +0 -54
  121. package/esm2022/plugins/heading/heading.plugin.mjs +0 -136
  122. package/esm2022/plugins/hr/hr.component.mjs +0 -37
  123. package/esm2022/plugins/hr/hr.editor.mjs +0 -16
  124. package/esm2022/plugins/hr/hr.plugin.mjs +0 -56
  125. package/esm2022/plugins/image/image.component.mjs +0 -474
  126. package/esm2022/plugins/image/image.editor.mjs +0 -116
  127. package/esm2022/plugins/image/image.plugin.mjs +0 -90
  128. package/esm2022/plugins/indent/indent.editor.mjs +0 -78
  129. package/esm2022/plugins/indent/indent.plugin.mjs +0 -59
  130. package/esm2022/plugins/indent/on-keydown-indent.mjs +0 -59
  131. package/esm2022/plugins/index.mjs +0 -73
  132. package/esm2022/plugins/inline-code/inline-code.component.mjs +0 -28
  133. package/esm2022/plugins/inline-code/inline-code.editor.mjs +0 -49
  134. package/esm2022/plugins/inline-code/inline-code.plugin.mjs +0 -67
  135. package/esm2022/plugins/link/edit/link-edit.component.mjs +0 -104
  136. package/esm2022/plugins/link/hover/link-hover.component.mjs +0 -38
  137. package/esm2022/plugins/link/link.component.mjs +0 -170
  138. package/esm2022/plugins/link/link.editor.mjs +0 -87
  139. package/esm2022/plugins/link/link.plugin.mjs +0 -89
  140. package/esm2022/plugins/link/link.types.mjs +0 -12
  141. package/esm2022/plugins/list/components/bulleted-list.component.mjs +0 -28
  142. package/esm2022/plugins/list/components/list-item.component.mjs +0 -88
  143. package/esm2022/plugins/list/components/numbered-list.component.mjs +0 -37
  144. package/esm2022/plugins/list/list.editor.mjs +0 -128
  145. package/esm2022/plugins/list/list.plugin.mjs +0 -302
  146. package/esm2022/plugins/list/normalizers/get-list-normalizer.mjs +0 -39
  147. package/esm2022/plugins/list/normalizers/normalize-list-item.mjs +0 -18
  148. package/esm2022/plugins/list/normalizers/normalize-no.mjs +0 -43
  149. package/esm2022/plugins/list/on-key-down-list.mjs +0 -33
  150. package/esm2022/plugins/list/queries/get-list-item-entry.mjs +0 -28
  151. package/esm2022/plugins/list/queries/get-list-item-sublist.mjs +0 -12
  152. package/esm2022/plugins/list/queries/get-list-types.mjs +0 -5
  153. package/esm2022/plugins/list/queries/get-start-list-item.mjs +0 -27
  154. package/esm2022/plugins/list/queries/has-list-in-list-item.mjs +0 -27
  155. package/esm2022/plugins/list/queries/is-in-list.mjs +0 -6
  156. package/esm2022/plugins/list/queries/is-list-nested.mjs +0 -10
  157. package/esm2022/plugins/list/queries/is-list.mjs +0 -5
  158. package/esm2022/plugins/list/queries/is-node-type-list.mjs +0 -5
  159. package/esm2022/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -13
  160. package/esm2022/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -17
  161. package/esm2022/plugins/list/queries/is-single-list-item.mjs +0 -9
  162. package/esm2022/plugins/list/transforms/insert-list-data.mjs +0 -72
  163. package/esm2022/plugins/list/transforms/insert-list-item.mjs +0 -73
  164. package/esm2022/plugins/list/transforms/move-list-item-down.mjs +0 -41
  165. package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -43
  166. package/esm2022/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -30
  167. package/esm2022/plugins/list/transforms/move-list-item-up.mjs +0 -78
  168. package/esm2022/plugins/list/transforms/unwrap-list.mjs +0 -10
  169. package/esm2022/plugins/list/types.mjs +0 -2
  170. package/esm2022/plugins/mark/mark.editor.mjs +0 -28
  171. package/esm2022/plugins/mark/mark.plugin.mjs +0 -105
  172. package/esm2022/plugins/mention/index.mjs +0 -5
  173. package/esm2022/plugins/mention/mention.editor.mjs +0 -179
  174. package/esm2022/plugins/mention/mention.plugin.mjs +0 -92
  175. package/esm2022/plugins/mention/mention.type.mjs +0 -2
  176. package/esm2022/plugins/mention/suggestion.component.mjs +0 -22
  177. package/esm2022/plugins/node-id/node-id.plugin.mjs +0 -78
  178. package/esm2022/plugins/normalizers/insert-paragraph-nodes.mjs +0 -28
  179. package/esm2022/plugins/normalizers/remove-empty-nodes.mjs +0 -18
  180. package/esm2022/plugins/normalizers/trailing-node.plugin.mjs +0 -33
  181. package/esm2022/plugins/paint-format/paint-format.editor.mjs +0 -126
  182. package/esm2022/plugins/public-api.mjs +0 -20
  183. package/esm2022/plugins/quick-insert/components/quick-insert.component.mjs +0 -126
  184. package/esm2022/plugins/quick-insert/index.mjs +0 -4
  185. package/esm2022/plugins/quick-insert/quick-insert.editor.mjs +0 -70
  186. package/esm2022/plugins/quick-insert/quick-insert.plugin.mjs +0 -109
  187. package/esm2022/plugins/soft-break/soft-break.plugin.mjs +0 -36
  188. package/esm2022/plugins/soft-break/soft-break.types.mjs +0 -2
  189. package/esm2022/plugins/table/components/insert-mark/insert-mark.component.mjs +0 -132
  190. package/esm2022/plugins/table/components/row/row.component.mjs +0 -93
  191. package/esm2022/plugins/table/components/table.component.mjs +0 -887
  192. package/esm2022/plugins/table/components/td/td.component.mjs +0 -610
  193. package/esm2022/plugins/table/components/toolbar/table-options.component.mjs +0 -102
  194. package/esm2022/plugins/table/components/toolbar/table-toolbar.component.mjs +0 -179
  195. package/esm2022/plugins/table/table.editor.mjs +0 -301
  196. package/esm2022/plugins/table/table.pipe.mjs +0 -66
  197. package/esm2022/plugins/table/table.plugin.mjs +0 -556
  198. package/esm2022/plugins/table/table.service.mjs +0 -122
  199. package/esm2022/plugins/table/table.store.mjs +0 -417
  200. package/esm2022/plugins/table/table.types.mjs +0 -68
  201. package/esm2022/plugins/table/toolbar-item.component.mjs +0 -95
  202. package/esm2022/plugins/table/transforms/clear-cell.mjs +0 -14
  203. package/esm2022/plugins/table/transforms/clear-table-node.mjs +0 -27
  204. package/esm2022/plugins/table/transforms/index.mjs +0 -8
  205. package/esm2022/plugins/table/transforms/insert-column.mjs +0 -69
  206. package/esm2022/plugins/table/transforms/insert-row.mjs +0 -50
  207. package/esm2022/plugins/table/transforms/insert-table.mjs +0 -15
  208. package/esm2022/plugins/table/transforms/move-selection-from-cell.mjs +0 -91
  209. package/esm2022/plugins/table/transforms/remove-column.mjs +0 -51
  210. package/esm2022/plugins/table/transforms/remove-row.mjs +0 -48
  211. package/esm2022/plugins/table/transforms/remove-table.mjs +0 -49
  212. package/esm2022/plugins/table/utils/add-columns.mjs +0 -38
  213. package/esm2022/plugins/table/utils/calc-anchor-position.mjs +0 -26
  214. package/esm2022/plugins/table/utils/calc-span.mjs +0 -73
  215. package/esm2022/plugins/table/utils/calculate-table.mjs +0 -116
  216. package/esm2022/plugins/table/utils/cell-position.mjs +0 -57
  217. package/esm2022/plugins/table/utils/create-cell.mjs +0 -19
  218. package/esm2022/plugins/table/utils/create-row.mjs +0 -12
  219. package/esm2022/plugins/table/utils/create-table-position.mjs +0 -10
  220. package/esm2022/plugins/table/utils/create-table.mjs +0 -15
  221. package/esm2022/plugins/table/utils/get-grid-columns.mjs +0 -79
  222. package/esm2022/plugins/table/utils/get-min-max-cell-index.mjs +0 -69
  223. package/esm2022/plugins/table/utils/get-next-cell.mjs +0 -44
  224. package/esm2022/plugins/table/utils/get-select-cell-node.mjs +0 -16
  225. package/esm2022/plugins/table/utils/handle-cell.mjs +0 -25
  226. package/esm2022/plugins/table/utils/index.mjs +0 -16
  227. package/esm2022/plugins/table/utils/is-header-row.mjs +0 -15
  228. package/esm2022/plugins/table/utils/is-legal-table.mjs +0 -26
  229. package/esm2022/plugins/table/utils/is-range-in-table.mjs +0 -16
  230. package/esm2022/plugins/table/utils/is-selection-in-table.mjs +0 -51
  231. package/esm2022/plugins/table/utils/is-virtual-key.mjs +0 -13
  232. package/esm2022/plugins/table/utils/merge-cell.mjs +0 -110
  233. package/esm2022/plugins/table/utils/next-path.mjs +0 -5
  234. package/esm2022/plugins/table/utils/normalize-table.mjs +0 -31
  235. package/esm2022/plugins/table/utils/remove-columns.mjs +0 -23
  236. package/esm2022/plugins/table/utils/remove-row-column.mjs +0 -45
  237. package/esm2022/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -45
  238. package/esm2022/plugins/table/utils/split-cell.mjs +0 -29
  239. package/esm2022/plugins/table/utils/table-entry.mjs +0 -21
  240. package/esm2022/plugins/table/utils/table-position.mjs +0 -251
  241. package/esm2022/plugins/table/utils/table-viewport.mjs +0 -41
  242. package/esm2022/plugins/todo-item/todo-item.component.mjs +0 -65
  243. package/esm2022/plugins/todo-item/todo-item.editor.mjs +0 -32
  244. package/esm2022/plugins/todo-item/todo-item.plugin.mjs +0 -93
  245. package/esm2022/plugins/vertical-align/toolbar-item.component.mjs +0 -95
  246. package/esm2022/plugins/vertical-align/vertical-align.editor.mjs +0 -59
  247. package/esm2022/public-api.mjs +0 -22
  248. package/esm2022/queries/anchor-block-entry.mjs +0 -13
  249. package/esm2022/queries/anchor-block.mjs +0 -6
  250. package/esm2022/queries/anchor-inline-entry.mjs +0 -10
  251. package/esm2022/queries/find-descendant.mjs +0 -47
  252. package/esm2022/queries/find-node.mjs +0 -45
  253. package/esm2022/queries/find-path.mjs +0 -28
  254. package/esm2022/queries/get-above-by-type.mjs +0 -14
  255. package/esm2022/queries/get-above.mjs +0 -9
  256. package/esm2022/queries/get-anchor-block-entry.mjs +0 -8
  257. package/esm2022/queries/get-block-above.mjs +0 -10
  258. package/esm2022/queries/get-block-card-above.mjs +0 -10
  259. package/esm2022/queries/get-block-card-cursor.mjs +0 -9
  260. package/esm2022/queries/get-container-blocks.mjs +0 -12
  261. package/esm2022/queries/get-directly-parent.mjs +0 -12
  262. package/esm2022/queries/get-insert-elements-path.mjs +0 -46
  263. package/esm2022/queries/get-last-child-path.mjs +0 -9
  264. package/esm2022/queries/get-last-node.mjs +0 -17
  265. package/esm2022/queries/get-next-sibling-nodes.mjs +0 -17
  266. package/esm2022/queries/get-node.mjs +0 -10
  267. package/esm2022/queries/get-nodes-by-type.mjs +0 -15
  268. package/esm2022/queries/get-nodes.mjs +0 -7
  269. package/esm2022/queries/get-parent.mjs +0 -12
  270. package/esm2022/queries/get-plain-text.mjs +0 -16
  271. package/esm2022/queries/get-plugin-by-toolbar.mjs +0 -13
  272. package/esm2022/queries/get-point-before.mjs +0 -62
  273. package/esm2022/queries/get-point-from-location.mjs +0 -15
  274. package/esm2022/queries/get-previous-path.mjs +0 -9
  275. package/esm2022/queries/get-rang-from-block-start.mjs +0 -16
  276. package/esm2022/queries/get-range-before.mjs +0 -17
  277. package/esm2022/queries/get-selection-marks.mjs +0 -18
  278. package/esm2022/queries/get-selection-nodes-by-type.mjs +0 -30
  279. package/esm2022/queries/get-text.mjs +0 -9
  280. package/esm2022/queries/get-toolbar-disabled.mjs +0 -13
  281. package/esm2022/queries/index.mjs +0 -62
  282. package/esm2022/queries/is-across-blocks.mjs +0 -7
  283. package/esm2022/queries/is-ancestor-empty.mjs +0 -6
  284. package/esm2022/queries/is-ancestor.mjs +0 -3
  285. package/esm2022/queries/is-block-above-empty.mjs +0 -11
  286. package/esm2022/queries/is-block-active.mjs +0 -8
  287. package/esm2022/queries/is-block-card-cursor.mjs +0 -16
  288. package/esm2022/queries/is-block-text-empty-after-selection.mjs +0 -31
  289. package/esm2022/queries/is-collapsed.mjs +0 -7
  290. package/esm2022/queries/is-contain-nested-type.mjs +0 -29
  291. package/esm2022/queries/is-container-type.mjs +0 -3
  292. package/esm2022/queries/is-descendant.mjs +0 -3
  293. package/esm2022/queries/is-empty-content-filter.mjs +0 -22
  294. package/esm2022/queries/is-empty-content.mjs +0 -15
  295. package/esm2022/queries/is-empty-paragraph-by-path.mjs +0 -7
  296. package/esm2022/queries/is-empty-paragraph.mjs +0 -28
  297. package/esm2022/queries/is-first-child.mjs +0 -5
  298. package/esm2022/queries/is-global-collapsed.mjs +0 -5
  299. package/esm2022/queries/is-include-types.mjs +0 -12
  300. package/esm2022/queries/is-node-type-in.mjs +0 -9
  301. package/esm2022/queries/is-node-type.mjs +0 -15
  302. package/esm2022/queries/is-paragraph.mjs +0 -9
  303. package/esm2022/queries/is-point-at-root.mjs +0 -2
  304. package/esm2022/queries/is-range-across-blocks.mjs +0 -22
  305. package/esm2022/queries/is-range-at-root.mjs +0 -3
  306. package/esm2022/queries/is-root-path.mjs +0 -2
  307. package/esm2022/queries/is-start.mjs +0 -6
  308. package/esm2022/queries/some-node.mjs +0 -9
  309. package/esm2022/services/context.service.mjs +0 -140
  310. package/esm2022/services/table-contextmenu.service.mjs +0 -288
  311. package/esm2022/services/toolbar.service.mjs +0 -47
  312. package/esm2022/shortcuts/index.mjs +0 -5
  313. package/esm2022/shortcuts/mark.mjs +0 -25
  314. package/esm2022/test/basic/basic.component.mjs +0 -61
  315. package/esm2022/test/faker/data-transfer-faker.mjs +0 -13
  316. package/esm2022/test/faker/tethys-icon-faker.mjs +0 -22
  317. package/esm2022/test/index.mjs +0 -7
  318. package/esm2022/test/utils/mock-plugins.mjs +0 -104
  319. package/esm2022/test/utils/preset-config.mjs +0 -17
  320. package/esm2022/test/utils/with-plugin.mjs +0 -11
  321. package/esm2022/transforms/apply-deep-to-nodes.mjs +0 -22
  322. package/esm2022/transforms/clear-marks.mjs +0 -23
  323. package/esm2022/transforms/delete-element.mjs +0 -12
  324. package/esm2022/transforms/delete-node-by-type.mjs +0 -10
  325. package/esm2022/transforms/handle-continual-delete-backward.mjs +0 -18
  326. package/esm2022/transforms/handle-continual-insert-break.mjs +0 -20
  327. package/esm2022/transforms/index.mjs +0 -19
  328. package/esm2022/transforms/insert-elements.mjs +0 -55
  329. package/esm2022/transforms/insert-paragraph.mjs +0 -6
  330. package/esm2022/transforms/merge-deep-to-nodes.mjs +0 -9
  331. package/esm2022/transforms/move-children.mjs +0 -22
  332. package/esm2022/transforms/on-keydown-reset-block-type.mjs +0 -23
  333. package/esm2022/transforms/set-end-selection.mjs +0 -10
  334. package/esm2022/transforms/set-marks.mjs +0 -9
  335. package/esm2022/transforms/set-node-by-type.mjs +0 -10
  336. package/esm2022/transforms/set-node.mjs +0 -6
  337. package/esm2022/transforms/un-hang-range.mjs +0 -11
  338. package/esm2022/transforms/un-wrap.mjs +0 -12
  339. package/esm2022/transforms/unwrap-nodes-by-type.mjs +0 -14
  340. package/esm2022/utils/auto-focus.mjs +0 -24
  341. package/esm2022/utils/blob.mjs +0 -16
  342. package/esm2022/utils/cast-array.mjs +0 -7
  343. package/esm2022/utils/color-picker.mjs +0 -15
  344. package/esm2022/utils/common.mjs +0 -11
  345. package/esm2022/utils/copy-node.mjs +0 -38
  346. package/esm2022/utils/create-empty-paragraph.mjs +0 -14
  347. package/esm2022/utils/data-transform.mjs +0 -48
  348. package/esm2022/utils/dom.mjs +0 -56
  349. package/esm2022/utils/editor-uuid.mjs +0 -8
  350. package/esm2022/utils/fragment.mjs +0 -82
  351. package/esm2022/utils/get-editable-element-height.mjs +0 -6
  352. package/esm2022/utils/get-mode.mjs +0 -14
  353. package/esm2022/utils/get-toolbar-class.mjs +0 -6
  354. package/esm2022/utils/id-creator.mjs +0 -11
  355. package/esm2022/utils/index.mjs +0 -23
  356. package/esm2022/utils/insert-data-by-invalid-type.mjs +0 -70
  357. package/esm2022/utils/is-clean-empty-paragraph.mjs +0 -37
  358. package/esm2022/utils/is-inline.mjs +0 -9
  359. package/esm2022/utils/lodash.mjs +0 -3
  360. package/esm2022/utils/match.mjs +0 -32
  361. package/esm2022/utils/merge-element-options.mjs +0 -19
  362. package/esm2022/utils/normalize.mjs +0 -61
  363. package/esm2022/utils/refocus.mjs +0 -47
  364. package/esm2022/utils/scrolling.mjs +0 -43
  365. package/esm2022/utils/update-popover-position.mjs +0 -26
  366. package/esm2022/utils/weak-maps.mjs +0 -9
  367. package/esm2022/worktile-theia.mjs +0 -5
@@ -1,556 +0,0 @@
1
- import { timer } from 'rxjs';
2
- import { Editor, Element, Node, Operation, Path, Range, Transforms } from 'slate';
3
- import { AngularEditor, ELEMENT_TO_COMPONENT, hotkeys } from 'slate-angular';
4
- import { DropdownMode } from '../../constants';
5
- import { ElementKinds } from '../../constants/node-types';
6
- import { PluginMenuIcons, ThePluginMenuItemType } from '../../constants/plugin-menu';
7
- import { PluginKeys, TheEditor, ToolbarItemType } from '../../interfaces';
8
- import * as TheQueries from '../../queries';
9
- import { createEmptyParagraph } from '../../utils/create-empty-paragraph';
10
- import { extractFragment } from '../../utils/fragment';
11
- import { cloneDeep } from '../../utils/lodash';
12
- import { TheTableRow } from './components/row/row.component';
13
- import { TheTable } from './components/table.component';
14
- import { TheTd } from './components/td/td.component';
15
- import { TableEditor } from './table.editor';
16
- import { TableOptions } from './table.types';
17
- import { TheTableToolbarItem } from './toolbar-item.component';
18
- import { clearTableNode } from './transforms/clear-table-node';
19
- import { insertColumnAtRow } from './transforms/insert-column';
20
- import { TablePosition, isRangeInTable, isSelectionInTable, isVirtualKey } from './utils';
21
- import { addColumns } from './utils/add-columns';
22
- import { calculateAnchorPositionInCell } from './utils/calc-anchor-position';
23
- import { getOriginCell } from './utils/calc-span';
24
- import { createTablePosition } from './utils/create-table-position';
25
- import { isInTable, isInTableRow, isLegalTable } from './utils/is-legal-table';
26
- import { isSelectedCellMerged } from './utils/merge-cell';
27
- import { normalizeTable } from './utils/normalize-table';
28
- import { removeColumns } from './utils/remove-columns';
29
- import { resetTableCell } from './utils/split-cell';
30
- import { createPluginFactory } from '../../core';
31
- import { setClipboardDataByDom } from '../../utils';
32
- export const withTable = (editor) => {
33
- const { deleteBackward, deleteForward, onKeydown, setFragmentData, insertFragmentData, normalizeNode, isBlockCard, renderElement, deleteCutData, isContainer, onChange, onClick, mousedown } = editor;
34
- editor.deleteBackward = unit => {
35
- const opts = new TableOptions();
36
- if (!isSelectionInTable(opts, editor)) {
37
- deleteBackward(unit);
38
- return;
39
- }
40
- const { selection } = editor;
41
- const [, startBlockPath] = Editor.above(editor, {
42
- match: n => Element.isElement(n) && Editor.isBlock(editor, n)
43
- });
44
- const startPosition = createTablePosition(editor);
45
- if (startBlockPath.length <= startPosition.cellEntry[1].length + 1 &&
46
- startBlockPath.pop() === 0 &&
47
- selection.anchor.offset === 0 &&
48
- TheQueries.isStart(editor, selection.anchor, startBlockPath) &&
49
- !Editor.isVoid(editor, TheQueries.anchorBlock(editor))) {
50
- return;
51
- }
52
- deleteBackward(unit);
53
- };
54
- editor.deleteForward = unit => {
55
- const opts = new TableOptions();
56
- const afterPoint = Editor.after(editor, editor.selection);
57
- if (afterPoint && isRangeInTable(opts, editor, { anchor: afterPoint, focus: afterPoint })) {
58
- const beforePosition = createTablePosition(editor);
59
- const afterPosition = createTablePosition(editor, afterPoint.path);
60
- if (beforePosition.cell && beforePosition.cell !== afterPosition.cell) {
61
- return;
62
- }
63
- }
64
- deleteForward(unit);
65
- };
66
- editor.onClick = (event) => {
67
- if (event.detail === 3) {
68
- const isMergedCell = isSelectedCellMerged(editor);
69
- const domSelection = window.getSelection();
70
- if (domSelection && !domSelection.isCollapsed && editor.selection) {
71
- const slateSelection = AngularEditor.toSlateRange(editor, domSelection);
72
- const opts = new TableOptions();
73
- const startPosition = TablePosition.create(opts, editor, slateSelection.anchor.path);
74
- const endPosition = TablePosition.create(opts, editor, slateSelection.focus.path);
75
- if (isMergedCell && startPosition.cell !== endPosition.cell) {
76
- timer(81).subscribe(() => {
77
- Transforms.select(editor, slateSelection.anchor.path);
78
- });
79
- }
80
- }
81
- }
82
- onClick(event);
83
- };
84
- editor.mousedown = (event) => {
85
- const hitElement = event.target;
86
- if (hitElement.classList.contains('the-table-wrapper')) {
87
- if (!TheEditor.isFocused(editor)) {
88
- TheEditor.focus(editor);
89
- }
90
- event.preventDefault();
91
- }
92
- mousedown(event);
93
- };
94
- editor.onKeydown = (event) => {
95
- const opts = new TableOptions();
96
- const isMoveUp = hotkeys.isMoveUp(event);
97
- const isMoveDown = hotkeys.isMoveDown(event);
98
- const isMoveBackward = hotkeys.isMoveBackward(event);
99
- const isMoveForward = hotkeys.isMoveForward(event);
100
- const { selection } = editor;
101
- if (!selection || !selection.anchor || !selection.focus) {
102
- onKeydown(event);
103
- return;
104
- }
105
- const startPosition = createTablePosition(editor);
106
- const endPosition = createTablePosition(editor, selection.focus.path);
107
- const isCollapsed = Range.isCollapsed(selection);
108
- if (startPosition && endPosition && endPosition.isInTable()) {
109
- // for keyboard up and down key in the table
110
- if (isMoveUp || isMoveDown) {
111
- const cellPath = endPosition.cellEntry[1];
112
- const startPath = Editor.start(editor, cellPath).path;
113
- const endPath = Editor.end(editor, cellPath).path;
114
- const { isFirstLine, isLastLine } = calculateAnchorPositionInCell(editor);
115
- startPath.pop();
116
- endPath.pop();
117
- if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== startPath.toString() || !isFirstLine) && isMoveUp) {
118
- onKeydown(event);
119
- return;
120
- }
121
- if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== endPath.toString() || !isLastLine) && isMoveDown) {
122
- onKeydown(event);
123
- return;
124
- }
125
- event.preventDefault();
126
- let at;
127
- if (isMoveUp) {
128
- const aboveRow = startPosition.table.children[startPosition.getRowIndex() - 1];
129
- const aboveCell = aboveRow && aboveRow.children[startPosition.getColumnIndex()];
130
- if (aboveCell) {
131
- if (aboveCell.hidden) {
132
- TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() - 1, startPosition.getColumnIndex(), false);
133
- return;
134
- }
135
- else {
136
- at = Editor.end(editor, TheEditor.findPath(editor, aboveCell));
137
- }
138
- }
139
- else {
140
- const previousNodeEntry = Editor.previous(editor, { at: startPosition.tableEntry[1] });
141
- const beforePoint = Editor.before(editor, startPosition.tableEntry[1]);
142
- Editor.next(editor, { at: startPosition.tableEntry[1] });
143
- if (previousNodeEntry) {
144
- at = Editor.end(editor, previousNodeEntry[1]);
145
- }
146
- if (!previousNodeEntry && beforePoint) {
147
- at = Editor.end(editor, beforePoint.path);
148
- }
149
- if (!previousNodeEntry && !beforePoint) {
150
- AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'left' });
151
- return;
152
- }
153
- }
154
- Transforms.select(editor, at);
155
- }
156
- else {
157
- let belowRowIndex = startPosition.getRowIndex() + 1;
158
- if (startPosition.cell.rowspan > 1) {
159
- belowRowIndex = startPosition.getRowIndex() + startPosition.cell.rowspan;
160
- }
161
- const belowRow = startPosition.table.children[belowRowIndex];
162
- const belowCell = belowRow && belowRow.children[startPosition.getColumnIndex()];
163
- if (belowCell) {
164
- if (belowCell.hidden) {
165
- TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() + 1, startPosition.getColumnIndex(), true);
166
- return;
167
- }
168
- else {
169
- at = Editor.start(editor, TheEditor.findPath(editor, belowCell));
170
- }
171
- }
172
- else {
173
- const nextNodeEntry = Editor.next(editor, { at: startPosition.tableEntry[1] });
174
- const movePath = nextNodeEntry ? nextNodeEntry[1] : Editor.after(editor, startPosition.tableEntry[1]).path;
175
- at = Editor.start(editor, movePath);
176
- }
177
- Transforms.select(editor, at);
178
- }
179
- return;
180
- }
181
- if (isMoveBackward) {
182
- const beforePoint = Editor.before(editor, editor.selection);
183
- const beforePosition = beforePoint && createTablePosition(editor, beforePoint.path);
184
- if (beforePosition && beforePosition.cell && beforePosition.cell.hidden) {
185
- event.preventDefault();
186
- const at = Editor.end(editor, TheEditor.findPath(editor, beforePosition.findPrevious()));
187
- Transforms.select(editor, at);
188
- }
189
- }
190
- if (isMoveForward) {
191
- const afterPoint = Editor.after(editor, editor.selection);
192
- const afterPosition = afterPoint && createTablePosition(editor, afterPoint.path);
193
- if (afterPosition.cell && afterPosition.cell.hidden) {
194
- event.preventDefault();
195
- const nextCell = afterPosition.findNext();
196
- if (nextCell) {
197
- const at = Editor.start(editor, TheEditor.findPath(editor, afterPosition.findNext()));
198
- Transforms.select(editor, at);
199
- event.preventDefault();
200
- }
201
- else {
202
- AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'right' });
203
- event.preventDefault();
204
- }
205
- return;
206
- }
207
- }
208
- // Prevent deleting cells in the table
209
- if (!isCollapsed && !startPosition.isInTable() && !isVirtualKey(event)) {
210
- event.preventDefault();
211
- let tableOutPath;
212
- Editor.withoutNormalizing(editor, () => {
213
- if (Range.isForward(selection)) {
214
- tableOutPath = Editor.end(editor, [selection.focus.path[0] - 1]);
215
- clearTableNode(opts, editor, true);
216
- }
217
- else {
218
- tableOutPath = Editor.start(editor, [selection.focus.path[0] + 1]);
219
- clearTableNode(opts, editor);
220
- }
221
- const tableOutRange = Editor.range(editor, selection.anchor, tableOutPath);
222
- Transforms.delete(editor, { at: tableOutRange });
223
- });
224
- // new range
225
- const cellRange = Editor.range(editor, editor.selection.focus.path.slice(0, 3));
226
- const focusRange = Range.intersection(editor.selection, cellRange);
227
- Transforms.select(editor, focusRange);
228
- Editor.deleteFragment(editor);
229
- return;
230
- }
231
- }
232
- onKeydown(event);
233
- return;
234
- };
235
- editor.setFragmentData = (data, originEvent) => {
236
- const opts = new TableOptions();
237
- if (isSelectionInTable(opts, editor)) {
238
- const tablePosition = createTablePosition(editor);
239
- const tableComponent = ELEMENT_TO_COMPONENT.get(tablePosition.table);
240
- const selectedCellPositions = tableComponent.tableStore.getSelectedCellPositions();
241
- let tableFragment = null;
242
- if (tableComponent.tableStore.selectedRowsIndex.length > 0) {
243
- const rows = tablePosition.table.children.slice(tableComponent.tableStore.selectedRowsIndex[0], tableComponent.tableStore.selectedRowsIndex[tableComponent.tableStore.selectedRowsIndex.length - 1] + 1);
244
- tableFragment = {
245
- ...tablePosition.table,
246
- children: rows
247
- };
248
- }
249
- else if (selectedCellPositions.length > 0) {
250
- const tempRows = {};
251
- for (const cell of selectedCellPositions) {
252
- const { row, col } = cell;
253
- const cellPath = [...tablePosition.tableEntry[1], row, col];
254
- const cellNode = Node.get(editor, cellPath);
255
- if (!tempRows[row]) {
256
- tempRows[row] = [];
257
- }
258
- tempRows[row].push(cellNode);
259
- }
260
- const rows = Object.values(tempRows).map((item) => {
261
- return {
262
- type: ElementKinds.tableRow,
263
- children: item
264
- };
265
- });
266
- tableFragment = {
267
- type: ElementKinds.table,
268
- children: rows
269
- };
270
- }
271
- else {
272
- const fragment = editor.getFragment();
273
- const isAcrossBlocks = TheQueries.isAcrossBlocks(editor, fragment);
274
- if (isAcrossBlocks && fragment.length === 1 && fragment[0].type === ElementKinds.table) {
275
- tableFragment = fragment[0];
276
- }
277
- }
278
- if (tableFragment) {
279
- tableFragment = normalizeTable(cloneDeep(tableFragment));
280
- setClipboardDataByDom(editor, tableFragment, data);
281
- return;
282
- }
283
- }
284
- setFragmentData(data, originEvent);
285
- };
286
- editor.insertFragmentData = async (data) => {
287
- const fragment = await extractFragment(data);
288
- if (fragment) {
289
- const opts = new TableOptions();
290
- if (isSelectionInTable(opts, editor) &&
291
- fragment.length === 1 &&
292
- Element.isElement(fragment[0]) &&
293
- fragment[0].type === ElementKinds.table) {
294
- const tablePosition = createTablePosition(editor);
295
- const clipboardTable = fragment[0].children;
296
- const clipboardRow = clipboardTable[0].children;
297
- const selectRowIndex = tablePosition.getRowIndex();
298
- const selectColIndex = tablePosition.getColumnIndex();
299
- const lastRowIndex = selectRowIndex + clipboardTable.length - 1;
300
- const lastColIndex = selectColIndex + clipboardRow.length - 1;
301
- for (let i = selectRowIndex; i <= lastRowIndex; i++) {
302
- for (let j = selectColIndex; j <= lastColIndex; j++) {
303
- const row = tablePosition.table.children[i];
304
- if (row && row.children[j]) {
305
- const originCell = getOriginCell(tablePosition.table, i, j);
306
- if (originCell && (originCell.colspan || originCell.rowspan)) {
307
- const path = TheEditor.findPath(editor, originCell).slice(-2);
308
- resetTableCell(editor, tablePosition.table, originCell, path[0], path[1]);
309
- }
310
- }
311
- }
312
- }
313
- Editor.withoutNormalizing(editor, () => {
314
- if (lastColIndex > tablePosition.getWidth() - 1) {
315
- const addColCount = lastColIndex - (tablePosition.getWidth() - 1);
316
- TableEditor.insertColumn(editor, addColCount, tablePosition.getWidth());
317
- }
318
- if (lastRowIndex > tablePosition.getHeight() - 1) {
319
- const addRowCount = lastRowIndex - (tablePosition.getHeight() - 1);
320
- TableEditor.insertRow(editor, addRowCount, tablePosition.getHeight());
321
- }
322
- clipboardTable.forEach((row, i) => {
323
- row.children.forEach((col, j) => {
324
- const at = [...tablePosition.tableEntry[1], selectRowIndex + i, selectColIndex + j];
325
- Transforms.removeNodes(editor, { at });
326
- Transforms.insertNodes(editor, col, { at });
327
- });
328
- });
329
- });
330
- const target = Editor.start(editor, [...tablePosition.tableEntry[1], selectRowIndex, selectColIndex]);
331
- Transforms.select(editor, target);
332
- return true;
333
- }
334
- // when pasting data, the last one is a table, and the focus position is specially handled
335
- // * this is to focus after withTrailingNode.normalizeNode() to avoid incorrect focus element.
336
- // * if there is a node below, the focus will be on the left side of the node below.
337
- // * if there is no node below, the focus will be on the right side of the current table.
338
- const lastInsertNode = fragment[fragment.length - 1];
339
- const isTable = lastInsertNode.type === ElementKinds.table;
340
- if (isTable) {
341
- setTimeout(() => {
342
- Editor.withoutNormalizing(editor, () => {
343
- const [, currentPath] = TheQueries.findNode(editor, {
344
- match: n => Element.isElement(n) && n.type === ElementKinds.table
345
- });
346
- const nextPath = Path.next(currentPath);
347
- const hasNextNode = Node.has(editor, nextPath);
348
- const focusPath = hasNextNode ? nextPath : currentPath;
349
- const focusNode = Node.get(editor, focusPath);
350
- const isBlockCard = editor.isBlockCard(focusNode);
351
- const cursorPath = {
352
- path: focusPath,
353
- offset: isBlockCard ? (hasNextNode ? -1 : -2) : 0
354
- };
355
- Transforms.select(editor, cursorPath);
356
- });
357
- });
358
- }
359
- return insertFragmentData(data);
360
- }
361
- return insertFragmentData(data);
362
- };
363
- editor.normalizeNode = ([node, path]) => {
364
- if (Element.isElement(node) && node.type === ElementKinds.table) {
365
- const table = node;
366
- const maxWidth = Math.max(...table.children.map(row => row.children.length));
367
- const invalidRows = table.children.filter(row => row.children.length < maxWidth);
368
- if (invalidRows.length > 0) {
369
- const opts = new TableOptions();
370
- Editor.withoutNormalizing(editor, () => {
371
- table.children.map((row, rowIndex) => {
372
- row.children.map((cell, cellIndex) => {
373
- if (cell.hidden || cell.colspan || cell.rowspan) {
374
- Transforms.setNodes(editor, { hidden: null, colspan: null, rowspan: null }, { at: [...path, rowIndex, cellIndex] });
375
- }
376
- });
377
- });
378
- invalidRows.forEach(row => {
379
- const count = maxWidth - row.children.length;
380
- insertColumnAtRow(opts, editor, count, [node, path], table.children.indexOf(row), row.children.length);
381
- });
382
- });
383
- }
384
- if (table.columns && table.columns.length !== maxWidth) {
385
- const columns = table.columns.length > maxWidth ? removeColumns(table, maxWidth) : addColumns(table, maxWidth);
386
- Transforms.setNodes(editor, { columns }, { at: path });
387
- }
388
- }
389
- // noramlize illegal cell and row to be paragraph
390
- if (Element.isElement(node) && [ElementKinds.tableCell, ElementKinds.tableRow].includes(node.type)) {
391
- if (!isLegalTable(editor, node, path)) {
392
- try {
393
- const rootPath = [path[0]];
394
- const offset = editor.selection.focus.offset;
395
- // find all tableCell and tableRow
396
- const nodes = Editor.nodes(editor, {
397
- at: rootPath,
398
- mode: 'lowest',
399
- match: (node) => {
400
- return node.type === ElementKinds.tableCell;
401
- }
402
- });
403
- let cursorPath = path[0];
404
- if (nodes) {
405
- let index = 0;
406
- // noramlize to be paragraph
407
- for (const [targetNode, targetPath] of nodes) {
408
- index++;
409
- const paragraph = createEmptyParagraph();
410
- const text = Node.string(targetNode);
411
- paragraph.children[0].text = text;
412
- if (targetNode.key === node.key) {
413
- cursorPath = rootPath[0] + index;
414
- }
415
- Transforms.insertNodes(editor, paragraph, { at: [rootPath[0] + index] });
416
- }
417
- }
418
- const cursor = { path: [cursorPath, 0], offset: offset };
419
- Transforms.select(editor, { anchor: cursor, focus: cursor });
420
- // remove root node
421
- Transforms.removeNodes(editor, {
422
- at: rootPath
423
- });
424
- }
425
- catch (error) { }
426
- return;
427
- }
428
- }
429
- // adjust selection when selection is in hidden cell
430
- if (Element.isElement(node) && node.type === ElementKinds.tableCell) {
431
- if (editor.selection &&
432
- Range.isCollapsed(editor.selection) &&
433
- Path.isAncestor(path, editor.selection.anchor.path) &&
434
- node.hidden) {
435
- setTimeout(() => {
436
- const opts = new TableOptions();
437
- const tablePosition = createTablePosition(editor);
438
- const origin = getOriginCell(tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex());
439
- if (origin) {
440
- const path = AngularEditor.findPath(editor, origin);
441
- Transforms.select(editor, Editor.end(editor, path));
442
- }
443
- }, 0);
444
- return;
445
- }
446
- }
447
- normalizeNode([node, path]);
448
- };
449
- editor.isBlockCard = (element) => {
450
- if (element && element.type === ElementKinds.table) {
451
- return true;
452
- }
453
- return isBlockCard(element);
454
- };
455
- editor.renderElement = (element) => {
456
- if (element.type === ElementKinds.table) {
457
- return TheTable;
458
- }
459
- if (element.type === ElementKinds.tableRow && isInTable(editor, element)) {
460
- return TheTableRow;
461
- }
462
- if (element.type === ElementKinds.tableCell && isInTableRow(editor, element)) {
463
- return TheTd;
464
- }
465
- return renderElement(element);
466
- };
467
- editor.deleteCutData = () => {
468
- const opts = new TableOptions();
469
- if (!isSelectionInTable(opts, editor)) {
470
- deleteCutData();
471
- return;
472
- }
473
- const element = createTablePosition(editor);
474
- const tableComponent = ELEMENT_TO_COMPONENT.get(element.table);
475
- const selectedCellPositions = tableComponent.tableStore.getSelectedCellPositions();
476
- if (selectedCellPositions.length > 0) {
477
- Editor.withoutNormalizing(editor, () => {
478
- if (tableComponent.tableStore.isSelectedTable) {
479
- if (tableComponent.tableStore.isFullscreen) {
480
- return;
481
- }
482
- TableEditor.removeTable(editor);
483
- }
484
- else {
485
- TableEditor.clearCellsContent(editor);
486
- }
487
- tableComponent.tableService.closeToolbar();
488
- });
489
- return;
490
- }
491
- deleteCutData();
492
- };
493
- editor.isContainer = (element) => {
494
- return element.type === ElementKinds.tableCell ? true : isContainer(element);
495
- };
496
- editor.onChange = () => {
497
- onChange();
498
- // adujst selection when selection is in hidden cell
499
- // just hook set_selection
500
- try {
501
- const isCollapsed = editor.selection && Range.isCollapsed(editor.selection);
502
- const isSelectionOperation = editor.operations.every(op => Operation.isSelectionOperation(op));
503
- if (isCollapsed && isSelectionOperation) {
504
- const opts = new TableOptions();
505
- const tablePosition = createTablePosition(editor);
506
- if (tablePosition.isInTable() && tablePosition.cell.hidden) {
507
- TableEditor.selectOriginCell(editor, tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex(), false);
508
- }
509
- }
510
- }
511
- catch (error) { }
512
- };
513
- return editor;
514
- };
515
- export const createTablePlugin = (locale) => createPluginFactory({
516
- key: PluginKeys.table,
517
- withOverrides: withTable,
518
- nestedStructureByKey: {
519
- [ElementKinds.table]: ElementKinds.tableRow,
520
- [ElementKinds.tableRow]: ElementKinds.tableCell
521
- },
522
- toolbarItems: [
523
- {
524
- key: ElementKinds.table,
525
- icon: 'table-border-all',
526
- name: locale().table,
527
- type: ToolbarItemType.dropdown,
528
- dropdownMode: DropdownMode.icon,
529
- iconComponent: TheTableToolbarItem,
530
- execute: editor => TableEditor.insertTable(editor),
531
- active: editor => TableEditor.isActive(editor)
532
- }
533
- ],
534
- menuItems: [
535
- {
536
- key: ElementKinds.table,
537
- keywords: `biaoge,bg,table,${locale().table}`,
538
- execute: editor => TableEditor.insertTable(editor),
539
- active: editor => TableEditor.isActive(editor),
540
- name: locale().table,
541
- type: ThePluginMenuItemType.group,
542
- menuIcon: PluginMenuIcons.table,
543
- description: locale().tableDesc,
544
- displayKey: '/bg'
545
- }
546
- ],
547
- options: {
548
- showFullscreen: false,
549
- freezeColumnHeader: false,
550
- freezeRowHeader: false,
551
- setFullscreen: (editor, event, element) => {
552
- event.preventDefault();
553
- }
554
- }
555
- })();
556
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvdGFibGUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFhLFNBQVMsRUFBRSxJQUFJLEVBQVMsS0FBSyxFQUFRLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMxRyxPQUFPLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRSxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3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QixDQUFDO0tBQ0o7Q0FDSixDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFZGl0b3IsIEVsZW1lbnQsIE5vZGUsIE5vZGVFbnRyeSwgT3BlcmF0aW9uLCBQYXRoLCBQb2ludCwgUmFuZ2UsIFRleHQsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yLCBFTEVNRU5UX1RPX0NPTVBPTkVOVCwgaG90a2V5cywgT3JpZ2luRXZlbnQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERyb3Bkb3duTW9kZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFbGVtZW50S2luZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5NZW51SWNvbnMsIFRoZVBsdWdpbk1lbnVJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9wbHVnaW4tbWVudSc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50LCBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5LZXlzLCBUaGVFZGl0b3IsIFRvb2xiYXJJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0ICogYXMgVGhlUXVlcmllcyBmcm9tICcuLi8uLi9xdWVyaWVzJztcbmltcG9ydCB7IGNyZWF0ZUVtcHR5UGFyYWdyYXBoIH0gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlLWVtcHR5LXBhcmFncmFwaCc7XG5pbXBvcnQgeyBleHRyYWN0RnJhZ21lbnQgfSBmcm9tICcuLi8uLi91dGlscy9mcmFnbWVudCc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICcuLi8uLi91dGlscy9sb2Rhc2gnO1xuaW1wb3J0IHsgVGhlVGFibGVSb3cgfSBmcm9tICcuL2NvbXBvbmVudHMvcm93L3Jvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGhlVGFibGUgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZVRkIH0gZnJvbSAnLi9jb21wb25lbnRzL3RkL3RkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUVkaXRvciB9IGZyb20gJy4vdGFibGUuZWRpdG9yJztcbmltcG9ydCB7IFRhYmxlT3B0aW9ucywgVGhlUGx1Z2luVGFibGVPcHRpb24gfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IFRoZVRhYmxlVG9vbGJhckl0ZW0gfSBmcm9tICcuL3Rvb2xiYXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY2xlYXJUYWJsZU5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybXMvY2xlYXItdGFibGUtbm9kZSc7XG5pbXBvcnQgeyBpbnNlcnRDb2x1bW5BdFJvdyB9IGZyb20gJy4vdHJhbnNmb3Jtcy9pbnNlcnQtY29sdW1uJztcbmltcG9ydCB7IFRhYmxlUG9zaXRpb24sIGlzUmFuZ2VJblRhYmxlLCBpc1NlbGVjdGlvbkluVGFibGUsIGlzVmlydHVhbEtleSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgYWRkQ29sdW1ucyB9IGZyb20gJy4vdXRpbHMvYWRkLWNvbHVtbnMnO1xuaW1wb3J0IHsgY2FsY3VsYXRlQW5jaG9yUG9zaXRpb25JbkNlbGwgfSBmcm9tICcuL3V0aWxzL2NhbGMtYW5jaG9yLXBvc2l0aW9uJztcbmltcG9ydCB7IGdldE9yaWdpbkNlbGwgfSBmcm9tICcuL3V0aWxzL2NhbGMtc3Bhbic7XG5pbXBvcnQgeyBjcmVhdGVUYWJsZVBvc2l0aW9uIH0gZnJvbSAnLi91dGlscy9jcmVhdGUtdGFibGUtcG9zaXRpb24nO1xuaW1wb3J0IHsgaXNJblRhYmxlLCBpc0luVGFibGVSb3csIGlzTGVnYWxUYWJsZSB9IGZyb20gJy4vdXRpbHMvaXMtbGVnYWwtdGFibGUnO1xuaW1wb3J0IHsgaXNTZWxlY3RlZENlbGxNZXJnZWQgfSBmcm9tICcuL3V0aWxzL21lcmdlLWNlbGwnO1xuaW1wb3J0IHsgbm9ybWFsaXplVGFibGUgfSBmcm9tICcuL3V0aWxzL25vcm1hbGl6ZS10YWJsZSc7XG5pbXBvcnQgeyByZW1vdmVDb2x1bW5zIH0gZnJvbSAnLi91dGlscy9yZW1vdmUtY29sdW1ucyc7XG5pbXBvcnQgeyByZXNldFRhYmxlQ2VsbCB9IGZyb20gJy4vdXRpbHMvc3BsaXQtY2VsbCc7XG5pbXBvcnQgeyBjcmVhdGVQbHVnaW5GYWN0b3J5IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBzZXRDbGlwYm9hcmREYXRhQnlEb20gfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRoZUkxOG5UcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uL2kxOG4nO1xuXG5leHBvcnQgY29uc3Qgd2l0aFRhYmxlID0gPFQgZXh0ZW5kcyBUaGVFZGl0b3I+KGVkaXRvcjogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZGVsZXRlQmFja3dhcmQsXG4gICAgICAgIGRlbGV0ZUZvcndhcmQsXG4gICAgICAgIG9uS2V5ZG93bixcbiAgICAgICAgc2V0RnJhZ21lbnREYXRhLFxuICAgICAgICBpbnNlcnRGcmFnbWVudERhdGEsXG4gICAgICAgIG5vcm1hbGl6ZU5vZGUsXG4gICAgICAgIGlzQmxvY2tDYXJkLFxuICAgICAgICByZW5kZXJFbGVtZW50LFxuICAgICAgICBkZWxldGVDdXREYXRhLFxuICAgICAgICBpc0NvbnRhaW5lcixcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQ2xpY2ssXG4gICAgICAgIG1vdXNlZG93blxuICAgIH0gPSBlZGl0b3I7XG5cbiAgICBlZGl0b3IuZGVsZXRlQmFja3dhcmQgPSB1bml0ID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgaWYgKCFpc1NlbGVjdGlvbkluVGFibGUob3B0cywgZWRpdG9yKSkge1xuICAgICAgICAgICAgZGVsZXRlQmFja3dhcmQodW5pdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcblxuICAgICAgICBjb25zdCBbLCBzdGFydEJsb2NrUGF0aF0gPSBFZGl0b3IuYWJvdmU8RWxlbWVudD4oZWRpdG9yLCB7XG4gICAgICAgICAgICBtYXRjaDogbiA9PiBFbGVtZW50LmlzRWxlbWVudChuKSAmJiBFZGl0b3IuaXNCbG9jayhlZGl0b3IsIG4pXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGFydEJsb2NrUGF0aC5sZW5ndGggPD0gc3RhcnRQb3NpdGlvbi5jZWxsRW50cnlbMV0ubGVuZ3RoICsgMSAmJlxuICAgICAgICAgICAgc3RhcnRCbG9ja1BhdGgucG9wKCkgPT09IDAgJiZcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hbmNob3Iub2Zmc2V0ID09PSAwICYmXG4gICAgICAgICAgICBUaGVRdWVyaWVzLmlzU3RhcnQoZWRpdG9yLCBzZWxlY3Rpb24uYW5jaG9yLCBzdGFydEJsb2NrUGF0aCkgJiZcbiAgICAgICAgICAgICFFZGl0b3IuaXNWb2lkKGVkaXRvciwgVGhlUXVlcmllcy5hbmNob3JCbG9jayhlZGl0b3IpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVCYWNrd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmRlbGV0ZUZvcndhcmQgPSB1bml0ID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgYWZ0ZXJQb2ludCA9IEVkaXRvci5hZnRlcihlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICBpZiAoYWZ0ZXJQb2ludCAmJiBpc1JhbmdlSW5UYWJsZShvcHRzLCBlZGl0b3IsIHsgYW5jaG9yOiBhZnRlclBvaW50LCBmb2N1czogYWZ0ZXJQb2ludCB9KSkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgICAgICBjb25zdCBhZnRlclBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IsIGFmdGVyUG9pbnQucGF0aCk7XG4gICAgICAgICAgICBpZiAoYmVmb3JlUG9zaXRpb24uY2VsbCAmJiBiZWZvcmVQb3NpdGlvbi5jZWxsICE9PSBhZnRlclBvc2l0aW9uLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlRm9yd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm9uQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PT0gMykge1xuICAgICAgICAgICAgY29uc3QgaXNNZXJnZWRDZWxsID0gaXNTZWxlY3RlZENlbGxNZXJnZWQoZWRpdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbVNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChkb21TZWxlY3Rpb24gJiYgIWRvbVNlbGVjdGlvbi5pc0NvbGxhcHNlZCAmJiBlZGl0b3Iuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xhdGVTZWxlY3Rpb24gPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVSYW5nZShlZGl0b3IsIGRvbVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBzbGF0ZVNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCBlZGl0b3IsIHNsYXRlU2VsZWN0aW9uLmZvY3VzLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChpc01lcmdlZENlbGwgJiYgc3RhcnRQb3NpdGlvbi5jZWxsICE9PSBlbmRQb3NpdGlvbi5jZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyKDgxKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBzbGF0ZVNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbkNsaWNrKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm1vdXNlZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoaGl0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3RoZS10YWJsZS13cmFwcGVyJykpIHtcbiAgICAgICAgICAgIGlmICghVGhlRWRpdG9yLmlzRm9jdXNlZChlZGl0b3IpKSB7XG4gICAgICAgICAgICAgICAgVGhlRWRpdG9yLmZvY3VzKGVkaXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIG1vdXNlZG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbktleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgaXNNb3ZlVXAgPSBob3RrZXlzLmlzTW92ZVVwKGV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlRG93biA9IGhvdGtleXMuaXNNb3ZlRG93bihldmVudCk7XG4gICAgICAgIGNvbnN0IGlzTW92ZUJhY2t3YXJkID0gaG90a2V5cy5pc01vdmVCYWNrd2FyZChldmVudCk7XG4gICAgICAgIGNvbnN0IGlzTW92ZUZvcndhcmQgPSBob3RrZXlzLmlzTW92ZUZvcndhcmQoZXZlbnQpO1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLmFuY2hvciB8fCAhc2VsZWN0aW9uLmZvY3VzKSB7XG4gICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBSYW5nZS5pc0NvbGxhcHNlZChzZWxlY3Rpb24pO1xuICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKSkge1xuICAgICAgICAgICAgLy8gZm9yIGtleWJvYXJkIHVwIGFuZCBkb3duIGtleSBpbiB0aGUgdGFibGVcbiAgICAgICAgICAgIGlmIChpc01vdmVVcCB8fCBpc01vdmVEb3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBlbmRQb3NpdGlvbi5jZWxsRW50cnlbMV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgY2VsbFBhdGgpLnBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBjZWxsUGF0aCkucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGlzRmlyc3RMaW5lLCBpc0xhc3RMaW5lIH0gPSBjYWxjdWxhdGVBbmNob3JQb3NpdGlvbkluQ2VsbChlZGl0b3IpO1xuICAgICAgICAgICAgICAgIHN0YXJ0UGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbmRQYXRoLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChUaGVRdWVyaWVzLmFuY2hvckJsb2NrRW50cnkoZWRpdG9yKVsxXS50b1N0cmluZygpICE9PSBzdGFydFBhdGgudG9TdHJpbmcoKSB8fCAhaXNGaXJzdExpbmUpICYmIGlzTW92ZVVwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2tFbnRyeShlZGl0b3IpWzFdLnRvU3RyaW5nKCkgIT09IGVuZFBhdGgudG9TdHJpbmcoKSB8fCAhaXNMYXN0TGluZSkgJiYgaXNNb3ZlRG93bikge1xuICAgICAgICAgICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXQ6IFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChpc01vdmVVcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhYm92ZVJvdyA9IHN0YXJ0UG9zaXRpb24udGFibGUuY2hpbGRyZW5bc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFib3ZlQ2VsbCA9IGFib3ZlUm93ICYmIGFib3ZlUm93LmNoaWxkcmVuW3N0YXJ0UG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3Iuc2VsZWN0T3JpZ2luQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIGFib3ZlQ2VsbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlRW50cnkgPSBFZGl0b3IucHJldmlvdXMoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c05vZGVFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIHByZXZpb3VzTm9kZUVudHJ5WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c05vZGVFbnRyeSAmJiBiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIGJlZm9yZVBvaW50LnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzTm9kZUVudHJ5ICYmICFiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlbG93Um93SW5kZXggPSBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd0luZGV4ID0gc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVsb3dSb3cgPSBzdGFydFBvc2l0aW9uLnRhYmxlLmNoaWxkcmVuW2JlbG93Um93SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWxvd0NlbGwgPSBiZWxvd1JvdyAmJiBiZWxvd1Jvdy5jaGlsZHJlbltzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnNlbGVjdE9yaWdpbkNlbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi50YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVsb3dDZWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZUVudHJ5ID0gRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb3ZlUGF0aCA9IG5leHROb2RlRW50cnkgPyBuZXh0Tm9kZUVudHJ5WzFdIDogRWRpdG9yLmFmdGVyKGVkaXRvciwgc3RhcnRQb3NpdGlvbi50YWJsZUVudHJ5WzFdKS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBtb3ZlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTW92ZUJhY2t3YXJkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBFZGl0b3IuYmVmb3JlKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9zaXRpb24gPSBiZWZvcmVQb2ludCAmJiBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvciwgYmVmb3JlUG9pbnQucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZVBvc2l0aW9uICYmIGJlZm9yZVBvc2l0aW9uLmNlbGwgJiYgYmVmb3JlUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBFZGl0b3IuZW5kKGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVmb3JlUG9zaXRpb24uZmluZFByZXZpb3VzKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNNb3ZlRm9yd2FyZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBFZGl0b3IuYWZ0ZXIoZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclBvc2l0aW9uID0gYWZ0ZXJQb2ludCAmJiBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvciwgYWZ0ZXJQb2ludC5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJQb3NpdGlvbi5jZWxsICYmIGFmdGVyUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dENlbGwgPSBhZnRlclBvc2l0aW9uLmZpbmROZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBUaGVFZGl0b3IuZmluZFBhdGgoZWRpdG9yLCBhZnRlclBvc2l0aW9uLmZpbmROZXh0KCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdyaWdodCcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZXZlbnQgZGVsZXRpbmcgY2VsbHMgaW4gdGhlIHRhYmxlXG4gICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2VkICYmICFzdGFydFBvc2l0aW9uLmlzSW5UYWJsZSgpICYmICFpc1ZpcnR1YWxLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgdGFibGVPdXRQYXRoOiBQb2ludDtcbiAgICAgICAgICAgICAgICBFZGl0b3Iud2l0aG91dE5vcm1hbGl6aW5nKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmFuZ2UuaXNGb3J3YXJkKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlT3V0UGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBbc2VsZWN0aW9uLmZvY3VzLnBhdGhbMF0gLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRhYmxlTm9kZShvcHRzLCBlZGl0b3IsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVPdXRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgW3NlbGVjdGlvbi5mb2N1cy5wYXRoWzBdICsgMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUYWJsZU5vZGUob3B0cywgZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZU91dFJhbmdlID0gRWRpdG9yLnJhbmdlKGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvciwgdGFibGVPdXRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiB0YWJsZU91dFJhbmdlIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIG5ldyByYW5nZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxSYW5nZSA9IEVkaXRvci5yYW5nZShlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24uZm9jdXMucGF0aC5zbGljZSgwLCAzKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9jdXNSYW5nZSA9IFJhbmdlLmludGVyc2VjdGlvbihlZGl0b3Iuc2VsZWN0aW9uLCBjZWxsUmFuZ2UpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgZm9jdXNSYW5nZSk7XG4gICAgICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUZyYWdtZW50KGVkaXRvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuXG4gICAgZWRpdG9yLnNldEZyYWdtZW50RGF0YSA9IChkYXRhOiBEYXRhVHJhbnNmZXIsIG9yaWdpbkV2ZW50PzogT3JpZ2luRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoaXNTZWxlY3Rpb25JblRhYmxlKG9wdHMsIGVkaXRvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKGVkaXRvcik7XG4gICAgICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IEVMRU1FTlRfVE9fQ09NUE9ORU5ULmdldCh0YWJsZVBvc2l0aW9uLnRhYmxlKSBhcyBUaGVUYWJsZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbFBvc2l0aW9ucyA9IHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgICAgICBsZXQgdGFibGVGcmFnbWVudCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRhYmxlUG9zaXRpb24udGFibGUuY2hpbGRyZW4uc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXhbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXhbdGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleC5sZW5ndGggLSAxXSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRhYmxlUG9zaXRpb24udGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDZWxsUG9zaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUm93cyA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBzZWxlY3RlZENlbGxQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByb3csIGNvbCB9ID0gY2VsbDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBbLi4udGFibGVQb3NpdGlvbi50YWJsZUVudHJ5WzFdLCByb3csIGNvbF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxOb2RlID0gTm9kZS5nZXQoZWRpdG9yLCBjZWxsUGF0aCkgYXMgVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wUm93c1tyb3ddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUm93c1tyb3ddID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGVtcFJvd3Nbcm93XS5wdXNoKGNlbGxOb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93czogVGFibGVSb3dFbGVtZW50W10gPSBPYmplY3QudmFsdWVzKHRlbXBSb3dzKS5tYXAoKGl0ZW06IFRhYmxlQ2VsbEVsZW1lbnRbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLnRhYmxlUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0YWJsZUZyYWdtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBFbGVtZW50S2luZHMudGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBlZGl0b3IuZ2V0RnJhZ21lbnQoKSBhcyBDdXN0b21FbGVtZW50W107XG4gICAgICAgICAgICAgICAgY29uc3QgaXNBY3Jvc3NCbG9ja3MgPSBUaGVRdWVyaWVzLmlzQWNyb3NzQmxvY2tzKGVkaXRvciwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Fjcm9zc0Jsb2NrcyAmJiBmcmFnbWVudC5sZW5ndGggPT09IDEgJiYgZnJhZ21lbnRbMF0udHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSBmcmFnbWVudFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGVGcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHRhYmxlRnJhZ21lbnQgPSBub3JtYWxpemVUYWJsZShjbG9uZURlZXAodGFibGVGcmFnbWVudCkpO1xuICAgICAgICAgICAgICAgIHNldENsaXBib2FyZERhdGFCeURvbShlZGl0b3IsIHRhYmxlRnJhZ21lbnQsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRGcmFnbWVudERhdGEoZGF0YSwgb3JpZ2luRXZlbnQpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuaW5zZXJ0RnJhZ21lbnREYXRhID0gYXN5bmMgKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4ge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGF3YWl0IGV4dHJhY3RGcmFnbWVudChkYXRhKTtcbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpICYmXG4gICAgICAgICAgICAgICAgZnJhZ21lbnQubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgRWxlbWVudC5pc0VsZW1lbnQoZnJhZ21lbnRbMF0pICYmXG4gICAgICAgICAgICAgICAgZnJhZ21lbnRbMF0udHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZVBvc2l0aW9uID0gY3JlYXRlVGFibGVQb3NpdGlvbihlZGl0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZFRhYmxlID0gZnJhZ21lbnRbMF0uY2hpbGRyZW4gYXMgTm9kZVtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZFJvdyA9IChjbGlwYm9hcmRUYWJsZVswXSBhcyBFbGVtZW50KS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RSb3dJbmRleCA9IHRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RDb2xJbmRleCA9IHRhYmxlUG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Um93SW5kZXggPSBzZWxlY3RSb3dJbmRleCArIGNsaXBib2FyZFRhYmxlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENvbEluZGV4ID0gc2VsZWN0Q29sSW5kZXggKyBjbGlwYm9hcmRSb3cubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3RSb3dJbmRleDsgaSA8PSBsYXN0Um93SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gc2VsZWN0Q29sSW5kZXg7IGogPD0gbGFzdENvbEluZGV4OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlUG9zaXRpb24udGFibGUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ICYmIHJvdy5jaGlsZHJlbltqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbkNlbGwgPSBnZXRPcmlnaW5DZWxsKHRhYmxlUG9zaXRpb24udGFibGUsIGksIGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5DZWxsICYmIChvcmlnaW5DZWxsLmNvbHNwYW4gfHwgb3JpZ2luQ2VsbC5yb3dzcGFuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgb3JpZ2luQ2VsbCkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFRhYmxlQ2VsbChlZGl0b3IsIHRhYmxlUG9zaXRpb24udGFibGUsIG9yaWdpbkNlbGwsIHBhdGhbMF0sIHBhdGhbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q29sSW5kZXggPiB0YWJsZVBvc2l0aW9uLmdldFdpZHRoKCkgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRDb2xDb3VudCA9IGxhc3RDb2xJbmRleCAtICh0YWJsZVBvc2l0aW9uLmdldFdpZHRoKCkgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLmluc2VydENvbHVtbihlZGl0b3IsIGFkZENvbENvdW50LCB0YWJsZVBvc2l0aW9uLmdldFdpZHRoKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Um93SW5kZXggPiB0YWJsZVBvc2l0aW9uLmdldEhlaWdodCgpIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkUm93Q291bnQgPSBsYXN0Um93SW5kZXggLSAodGFibGVQb3NpdGlvbi5nZXRIZWlnaHQoKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IuaW5zZXJ0Um93KGVkaXRvciwgYWRkUm93Q291bnQsIHRhYmxlUG9zaXRpb24uZ2V0SGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZFRhYmxlLmZvckVhY2goKHJvdzogVGFibGVFbGVtZW50LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5jaGlsZHJlbi5mb3JFYWNoKChjb2w6IE5vZGUsIGo6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0ID0gWy4uLnRhYmxlUG9zaXRpb24udGFibGVFbnRyeVsxXSwgc2VsZWN0Um93SW5kZXggKyBpLCBzZWxlY3RDb2xJbmRleCArIGpdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMucmVtb3ZlTm9kZXMoZWRpdG9yLCB7IGF0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZXMoZWRpdG9yLCBjb2wsIHsgYXQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgWy4uLnRhYmxlUG9zaXRpb24udGFibGVFbnRyeVsxXSwgc2VsZWN0Um93SW5kZXgsIHNlbGVjdENvbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3aGVuIHBhc3RpbmcgZGF0YSwgdGhlIGxhc3Qgb25lIGlzIGEgdGFibGUsIGFuZCB0aGUgZm9jdXMgcG9zaXRpb24gaXMgc3BlY2lhbGx5IGhhbmRsZWRcbiAgICAgICAgICAgIC8vICogdGhpcyBpcyB0byBmb2N1cyBhZnRlciB3aXRoVHJhaWxpbmdOb2RlLm5vcm1hbGl6ZU5vZGUoKSB0byBhdm9pZCBpbmNvcnJlY3QgZm9jdXMgZWxlbWVudC5cbiAgICAgICAgICAgIC8vICogaWYgdGhlcmUgaXMgYSBub2RlIGJlbG93LCB0aGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBub2RlIGJlbG93LlxuICAgICAgICAgICAgLy8gKiBpZiB0aGVyZSBpcyBubyBub2RlIGJlbG93LCB0aGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCB0YWJsZS5cbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbnNlcnROb2RlID0gZnJhZ21lbnRbZnJhZ21lbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBpc1RhYmxlID0gKGxhc3RJbnNlcnROb2RlIGFzIEVsZW1lbnQpLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZTtcbiAgICAgICAgICAgIGlmIChpc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBjdXJyZW50UGF0aF0gPSBUaGVRdWVyaWVzLmZpbmROb2RlKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBuID0+IEVsZW1lbnQuaXNFbGVtZW50KG4pICYmIG4udHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gUGF0aC5uZXh0KGN1cnJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc05leHROb2RlID0gTm9kZS5oYXMoZWRpdG9yLCBuZXh0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c1BhdGggPSBoYXNOZXh0Tm9kZSA/IG5leHRQYXRoIDogY3VycmVudFBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c05vZGUgPSBOb2RlLmdldChlZGl0b3IsIGZvY3VzUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0Jsb2NrQ2FyZCA9IGVkaXRvci5pc0Jsb2NrQ2FyZChmb2N1c05vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUGF0aCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmb2N1c1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBpc0Jsb2NrQ2FyZCA/IChoYXNOZXh0Tm9kZSA/IC0xIDogLTIpIDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgY3Vyc29yUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc2VydEZyYWdtZW50RGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zZXJ0RnJhZ21lbnREYXRhKGRhdGEpO1xuICAgIH07XG5cbiAgICBlZGl0b3Iubm9ybWFsaXplTm9kZSA9IChbbm9kZSwgcGF0aF06IE5vZGVFbnRyeTxOb2RlPikgPT4ge1xuICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQobm9kZSkgJiYgbm9kZS50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gbm9kZSBhcyBUYWJsZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KC4uLnRhYmxlLmNoaWxkcmVuLm1hcChyb3cgPT4gcm93LmNoaWxkcmVuLmxlbmd0aCkpO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZFJvd3MgPSB0YWJsZS5jaGlsZHJlbi5maWx0ZXIocm93ID0+IHJvdy5jaGlsZHJlbi5sZW5ndGggPCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGUuY2hpbGRyZW4ubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3cuY2hpbGRyZW4ubWFwKChjZWxsLCBjZWxsSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5oaWRkZW4gfHwgY2VsbC5jb2xzcGFuIHx8IGNlbGwucm93c3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBoaWRkZW46IG51bGwsIGNvbHNwYW46IG51bGwsIHJvd3NwYW46IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXQ6IFsuLi5wYXRoLCByb3dJbmRleCwgY2VsbEluZGV4XSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IG1heFdpZHRoIC0gcm93LmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydENvbHVtbkF0Um93KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlLCBwYXRoXSBhcyBOb2RlRW50cnk8VGFibGVFbGVtZW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5jaGlsZHJlbi5pbmRleE9mKHJvdyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGUuY29sdW1ucyAmJiB0YWJsZS5jb2x1bW5zLmxlbmd0aCAhPT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGFibGUuY29sdW1ucy5sZW5ndGggPiBtYXhXaWR0aCA/IHJlbW92ZUNvbHVtbnModGFibGUsIG1heFdpZHRoKSA6IGFkZENvbHVtbnModGFibGUsIG1heFdpZHRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKGVkaXRvciwgeyBjb2x1bW5zIH0sIHsgYXQ6IHBhdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub3JhbWxpemUgaWxsZWdhbCBjZWxsIGFuZCByb3cgdG8gYmUgcGFyYWdyYXBoXG4gICAgICAgIGlmIChFbGVtZW50LmlzRWxlbWVudChub2RlKSAmJiBbRWxlbWVudEtpbmRzLnRhYmxlQ2VsbCwgRWxlbWVudEtpbmRzLnRhYmxlUm93XS5pbmNsdWRlcyhub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTGVnYWxUYWJsZShlZGl0b3IsIG5vZGUgYXMgVGFibGVSb3dFbGVtZW50IHwgVGFibGVDZWxsRWxlbWVudCwgcGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb290UGF0aCA9IFtwYXRoWzBdXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZWRpdG9yLnNlbGVjdGlvbi5mb2N1cy5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgYWxsIHRhYmxlQ2VsbCBhbmQgdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBFZGl0b3Iubm9kZXMoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdDogcm9vdFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbG93ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiAobm9kZTogQ3VzdG9tRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZUNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vyc29yUGF0aCA9IHBhdGhbMF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcmFtbGl6ZSB0byBiZSBwYXJhZ3JhcGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RhcmdldE5vZGUsIHRhcmdldFBhdGhdIG9mIG5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBjcmVhdGVFbXB0eVBhcmFncmFwaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBOb2RlLnN0cmluZyh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYWdyYXBoLmNoaWxkcmVuWzBdIGFzIFRleHQpLnRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0Tm9kZSBhcyBDdXN0b21FbGVtZW50KS5rZXkgPT09IG5vZGUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvclBhdGggPSByb290UGF0aFswXSArIGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLmluc2VydE5vZGVzKGVkaXRvciwgcGFyYWdyYXBoLCB7IGF0OiBbcm9vdFBhdGhbMF0gKyBpbmRleF0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yID0geyBwYXRoOiBbY3Vyc29yUGF0aCwgMF0sIG9mZnNldDogb2Zmc2V0IH07XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgeyBhbmNob3I6IGN1cnNvciwgZm9jdXM6IGN1cnNvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQ6IHJvb3RQYXRoXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkanVzdCBzZWxlY3Rpb24gd2hlbiBzZWxlY3Rpb24gaXMgaW4gaGlkZGVuIGNlbGxcbiAgICAgICAgaWYgKEVsZW1lbnQuaXNFbGVtZW50KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gRWxlbWVudEtpbmRzLnRhYmxlQ2VsbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb24gJiZcbiAgICAgICAgICAgICAgICBSYW5nZS5pc0NvbGxhcHNlZChlZGl0b3Iuc2VsZWN0aW9uKSAmJlxuICAgICAgICAgICAgICAgIFBhdGguaXNBbmNlc3RvcihwYXRoLCBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUuaGlkZGVuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gZ2V0T3JpZ2luQ2VsbCh0YWJsZVBvc2l0aW9uLnRhYmxlLCB0YWJsZVBvc2l0aW9uLmdldFJvd0luZGV4KCksIHRhYmxlUG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgb3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgRWRpdG9yLmVuZChlZGl0b3IsIHBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1hbGl6ZU5vZGUoW25vZGUsIHBhdGhdKTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmlzQmxvY2tDYXJkID0gKGVsZW1lbnQ6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Jsb2NrQ2FyZChlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLnJlbmRlckVsZW1lbnQgPSAoZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUYWJsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVSb3cgJiYgaXNJblRhYmxlKGVkaXRvciwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUYWJsZVJvdztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVDZWxsICYmIGlzSW5UYWJsZVJvdyhlZGl0b3IsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhlVGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5kZWxldGVDdXREYXRhID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpKSB7XG4gICAgICAgICAgICBkZWxldGVDdXREYXRhKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoZWxlbWVudC50YWJsZSkgYXMgVGhlVGFibGU7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbFBvc2l0aW9ucyA9IHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENlbGxQb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVDb21wb25lbnQudGFibGVTdG9yZS5pc1NlbGVjdGVkVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuaXNGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IucmVtb3ZlVGFibGUoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBUYWJsZUVkaXRvci5jbGVhckNlbGxzQ29udGVudChlZGl0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YWJsZUNvbXBvbmVudC50YWJsZVNlcnZpY2UuY2xvc2VUb29sYmFyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVDdXREYXRhKCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5pc0NvbnRhaW5lciA9IChlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZUNlbGwgPyB0cnVlIDogaXNDb250YWluZXIoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgb25DaGFuZ2UoKTtcbiAgICAgICAgLy8gYWR1anN0IHNlbGVjdGlvbiB3aGVuIHNlbGVjdGlvbiBpcyBpbiBoaWRkZW4gY2VsbFxuICAgICAgICAvLyBqdXN0IGhvb2sgc2V0X3NlbGVjdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBlZGl0b3Iuc2VsZWN0aW9uICYmIFJhbmdlLmlzQ29sbGFwc2VkKGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3Rpb25PcGVyYXRpb24gPSBlZGl0b3Iub3BlcmF0aW9ucy5ldmVyeShvcCA9PiBPcGVyYXRpb24uaXNTZWxlY3Rpb25PcGVyYXRpb24ob3ApKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxhcHNlZCAmJiBpc1NlbGVjdGlvbk9wZXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVQb3NpdGlvbi5pc0luVGFibGUoKSAmJiB0YWJsZVBvc2l0aW9uLmNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnNlbGVjdE9yaWdpbkNlbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgIH07XG5cbiAgICByZXR1cm4gZWRpdG9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRhYmxlUGx1Z2luID0gKGxvY2FsZTogU2lnbmFsPFRoZUkxOG5UcmFuc2xhdGlvbj4pID0+XG4gICAgY3JlYXRlUGx1Z2luRmFjdG9yeTxUaGVQbHVnaW5UYWJsZU9wdGlvbj4oe1xuICAgICAgICBrZXk6IFBsdWdpbktleXMudGFibGUsXG4gICAgICAgIHdpdGhPdmVycmlkZXM6IHdpdGhUYWJsZSxcbiAgICAgICAgbmVzdGVkU3RydWN0dXJlQnlLZXk6IHtcbiAgICAgICAgICAgIFtFbGVtZW50S2luZHMudGFibGVdOiBFbGVtZW50S2luZHMudGFibGVSb3csXG4gICAgICAgICAgICBbRWxlbWVudEtpbmRzLnRhYmxlUm93XTogRWxlbWVudEtpbmRzLnRhYmxlQ2VsbFxuICAgICAgICB9LFxuICAgICAgICB0b29sYmFySXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IEVsZW1lbnRLaW5kcy50YWJsZSxcbiAgICAgICAgICAgICAgICBpY29uOiAndGFibGUtYm9yZGVyLWFsbCcsXG4gICAgICAgICAgICAgICAgbmFtZTogbG9jYWxlKCkudGFibGUsXG4gICAgICAgICAgICAgICAgdHlwZTogVG9vbGJhckl0ZW1UeXBlLmRyb3Bkb3duLFxuICAgICAgICAgICAgICAgIGRyb3Bkb3duTW9kZTogRHJvcGRvd25Nb2RlLmljb24sXG4gICAgICAgICAgICAgICAgaWNvbkNvbXBvbmVudDogVGhlVGFibGVUb29sYmFySXRlbSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBlZGl0b3IgPT4gVGFibGVFZGl0b3IuaW5zZXJ0VGFibGUoZWRpdG9yKSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGVkaXRvciA9PiBUYWJsZUVkaXRvci5pc0FjdGl2ZShlZGl0b3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIG1lbnVJdGVtczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogRWxlbWVudEtpbmRzLnRhYmxlLFxuICAgICAgICAgICAgICAgIGtleXdvcmRzOiBgYmlhb2dlLGJnLHRhYmxlLCR7bG9jYWxlKCkudGFibGV9YCxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBlZGl0b3IgPT4gVGFibGVFZGl0b3IuaW5zZXJ0VGFibGUoZWRpdG9yKSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGVkaXRvciA9PiBUYWJsZUVkaXRvci5pc0FjdGl2ZShlZGl0b3IpLFxuICAgICAgICAgICAgICAgIG5hbWU6IGxvY2FsZSgpLnRhYmxlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5ncm91cCxcbiAgICAgICAgICAgICAgICBtZW51SWNvbjogUGx1Z2luTWVudUljb25zLnRhYmxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBsb2NhbGUoKS50YWJsZURlc2MsXG4gICAgICAgICAgICAgICAgZGlzcGxheUtleTogJy9iZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgc2hvd0Z1bGxzY3JlZW46IGZhbHNlLFxuICAgICAgICAgICAgZnJlZXplQ29sdW1uSGVhZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGZyZWV6ZVJvd0hlYWRlcjogZmFsc2UsXG4gICAgICAgICAgICBzZXRGdWxsc2NyZWVuOiAoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKCk7XG4iXX0=