@ai-table/grid 0.0.11 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (324) hide show
  1. package/angular-konva/components/container.component.d.ts +7 -0
  2. package/angular-konva/components/container.component.d.ts.map +1 -0
  3. package/angular-konva/components/container.token.d.ts +3 -0
  4. package/angular-konva/components/container.token.d.ts.map +1 -0
  5. package/angular-konva/components/index.d.ts +4 -0
  6. package/angular-konva/components/index.d.ts.map +1 -0
  7. package/angular-konva/components/shape.component.d.ts +61 -0
  8. package/angular-konva/components/shape.component.d.ts.map +1 -0
  9. package/angular-konva/components/stage.component.d.ts +40 -0
  10. package/angular-konva/components/stage.component.d.ts.map +1 -0
  11. package/angular-konva/index.d.ts +5 -0
  12. package/angular-konva/index.d.ts.map +1 -0
  13. package/angular-konva/interfaces/component.d.ts +49 -0
  14. package/angular-konva/interfaces/component.d.ts.map +1 -0
  15. package/angular-konva/interfaces/config.d.ts +26 -0
  16. package/angular-konva/interfaces/config.d.ts.map +1 -0
  17. package/angular-konva/interfaces/event-object.d.ts +7 -0
  18. package/angular-konva/interfaces/event-object.d.ts.map +1 -0
  19. package/angular-konva/interfaces/index.d.ts +5 -0
  20. package/angular-konva/interfaces/index.d.ts.map +1 -0
  21. package/angular-konva/interfaces/shape.d.ts +42 -0
  22. package/angular-konva/interfaces/shape.d.ts.map +1 -0
  23. package/angular-konva/utils/apply-node-props.d.ts +4 -0
  24. package/angular-konva/utils/apply-node-props.d.ts.map +1 -0
  25. package/angular-konva/utils/common.d.ts +8 -0
  26. package/angular-konva/utils/common.d.ts.map +1 -0
  27. package/angular-konva/utils/index.d.ts +5 -0
  28. package/angular-konva/utils/index.d.ts.map +1 -0
  29. package/angular-konva/utils/types.d.ts +4 -0
  30. package/angular-konva/utils/types.d.ts.map +1 -0
  31. package/angular-konva/utils/update-picture.d.ts +4 -0
  32. package/angular-konva/utils/update-picture.d.ts.map +1 -0
  33. package/components/cell-editors/abstract-cell-editor.component.d.ts +7 -5
  34. package/components/cell-editors/abstract-cell-editor.component.d.ts.map +1 -1
  35. package/components/cell-editors/cell-editor.scss +38 -25
  36. package/components/cell-editors/cell-editor.variables.scss +5 -0
  37. package/components/cell-editors/date/date-editor.component.d.ts.map +1 -1
  38. package/components/cell-editors/link/edit-link/edit-link.component.d.ts +33 -0
  39. package/components/cell-editors/link/edit-link/edit-link.component.d.ts.map +1 -0
  40. package/components/cell-editors/link/link-editor.component.d.ts +36 -0
  41. package/components/cell-editors/link/link-editor.component.d.ts.map +1 -0
  42. package/components/cell-editors/link/link-editor.component.scss +21 -0
  43. package/components/cell-editors/progress/progress-editor.component.d.ts +0 -1
  44. package/components/cell-editors/progress/progress-editor.component.d.ts.map +1 -1
  45. package/components/cell-editors/progress/progress-editor.component.scss +12 -4
  46. package/components/cell-editors/rating/rating-editor.component.d.ts +0 -1
  47. package/components/cell-editors/rating/rating-editor.component.d.ts.map +1 -1
  48. package/components/cell-editors/rating/rating-editor.component.scss +10 -0
  49. package/components/cell-editors/select/select-editor.component.d.ts +1 -3
  50. package/components/cell-editors/select/select-editor.component.d.ts.map +1 -1
  51. package/components/cell-editors/text/text-editor.component.d.ts +0 -1
  52. package/components/cell-editors/text/text-editor.component.d.ts.map +1 -1
  53. package/components/cell-views/select/option.component.d.ts.map +1 -1
  54. package/components/cell-views/select/option.scss +10 -0
  55. package/components/field-menu/field-menu.component.d.ts +8 -3
  56. package/components/field-menu/field-menu.component.d.ts.map +1 -1
  57. package/components/field-property-editor/field-property-editor.component.d.ts +4 -2
  58. package/components/field-property-editor/field-property-editor.component.d.ts.map +1 -1
  59. package/components/index.d.ts +3 -1
  60. package/components/index.d.ts.map +1 -1
  61. package/constants/colors.d.ts +18 -0
  62. package/constants/colors.d.ts.map +1 -0
  63. package/constants/grid.d.ts +17 -1
  64. package/constants/grid.d.ts.map +1 -1
  65. package/constants/icon.d.ts +19 -0
  66. package/constants/icon.d.ts.map +1 -0
  67. package/constants/index.d.ts +5 -1
  68. package/constants/index.d.ts.map +1 -1
  69. package/constants/table.d.ts +60 -0
  70. package/constants/table.d.ts.map +1 -0
  71. package/constants/text.d.ts +22 -0
  72. package/constants/text.d.ts.map +1 -0
  73. package/core/context.d.ts +14 -0
  74. package/core/context.d.ts.map +1 -0
  75. package/core/coordinate.d.ts +96 -0
  76. package/core/coordinate.d.ts.map +1 -0
  77. package/core/index.d.ts +3 -2
  78. package/core/index.d.ts.map +1 -1
  79. package/core/types/ai-table.d.ts +56 -0
  80. package/core/types/ai-table.d.ts.map +1 -0
  81. package/core/types/core.d.ts +29 -23
  82. package/core/types/core.d.ts.map +1 -1
  83. package/core/types/index.d.ts +1 -1
  84. package/core/types/index.d.ts.map +1 -1
  85. package/core/utils/common.d.ts +1 -2
  86. package/core/utils/common.d.ts.map +1 -1
  87. package/core/utils/field.d.ts +1 -1
  88. package/core/utils/field.d.ts.map +1 -1
  89. package/core/utils/index.d.ts +0 -1
  90. package/core/utils/index.d.ts.map +1 -1
  91. package/core/utils/queries.d.ts +5 -5
  92. package/core/utils/queries.d.ts.map +1 -1
  93. package/dom-grid.component.d.ts +11 -0
  94. package/dom-grid.component.d.ts.map +1 -0
  95. package/esm2022/angular-konva/components/container.component.mjs +29 -0
  96. package/esm2022/angular-konva/components/container.token.mjs +3 -0
  97. package/esm2022/angular-konva/components/index.mjs +4 -0
  98. package/esm2022/angular-konva/components/shape.component.mjs +142 -0
  99. package/esm2022/angular-konva/components/stage.component.mjs +123 -0
  100. package/esm2022/angular-konva/index.mjs +5 -0
  101. package/esm2022/angular-konva/interfaces/component.mjs +4 -0
  102. package/esm2022/angular-konva/interfaces/config.mjs +2 -0
  103. package/esm2022/angular-konva/interfaces/event-object.mjs +2 -0
  104. package/esm2022/angular-konva/interfaces/index.mjs +5 -0
  105. package/esm2022/angular-konva/interfaces/shape.mjs +42 -0
  106. package/esm2022/angular-konva/utils/apply-node-props.mjs +67 -0
  107. package/esm2022/angular-konva/utils/common.mjs +48 -0
  108. package/esm2022/angular-konva/utils/index.mjs +5 -0
  109. package/esm2022/angular-konva/utils/types.mjs +2 -0
  110. package/esm2022/angular-konva/utils/update-picture.mjs +7 -0
  111. package/esm2022/components/cell-editors/abstract-cell-editor.component.mjs +12 -7
  112. package/esm2022/components/cell-editors/date/date-editor.component.mjs +6 -3
  113. package/esm2022/components/cell-editors/link/edit-link/edit-link.component.mjs +66 -0
  114. package/esm2022/components/cell-editors/link/link-editor.component.mjs +117 -0
  115. package/esm2022/components/cell-editors/number/number-editor.component.mjs +2 -2
  116. package/esm2022/components/cell-editors/progress/progress-editor.component.mjs +3 -6
  117. package/esm2022/components/cell-editors/rating/rating-editor.component.mjs +4 -7
  118. package/esm2022/components/cell-editors/select/select-editor.component.mjs +11 -16
  119. package/esm2022/components/cell-editors/text/text-editor.component.mjs +10 -11
  120. package/esm2022/components/cell-views/select/option.component.mjs +6 -5
  121. package/esm2022/components/field-menu/field-menu.component.mjs +11 -8
  122. package/esm2022/components/field-property-editor/field-property-editor.component.mjs +17 -12
  123. package/esm2022/components/index.mjs +4 -2
  124. package/esm2022/constants/colors.mjs +18 -0
  125. package/esm2022/constants/editor.mjs +2 -3
  126. package/esm2022/constants/grid.mjs +22 -4
  127. package/esm2022/constants/icon.mjs +26 -0
  128. package/esm2022/constants/index.mjs +6 -2
  129. package/esm2022/constants/table.mjs +62 -0
  130. package/esm2022/constants/text.mjs +23 -0
  131. package/esm2022/core/context.mjs +25 -0
  132. package/esm2022/core/coordinate.mjs +222 -0
  133. package/esm2022/core/index.mjs +4 -3
  134. package/esm2022/core/types/ai-table.mjs +44 -0
  135. package/esm2022/core/types/core.mjs +6 -1
  136. package/esm2022/core/types/index.mjs +2 -2
  137. package/esm2022/core/utils/common.mjs +3 -20
  138. package/esm2022/core/utils/field.mjs +9 -5
  139. package/esm2022/core/utils/index.mjs +1 -2
  140. package/esm2022/core/utils/queries.mjs +4 -4
  141. package/esm2022/dom-grid.component.mjs +82 -0
  142. package/esm2022/grid-base.component.mjs +154 -0
  143. package/esm2022/grid.component.mjs +336 -160
  144. package/esm2022/public-api.mjs +9 -5
  145. package/esm2022/renderer/components/add-field-column.component.mjs +68 -0
  146. package/esm2022/renderer/components/cells.component.mjs +35 -0
  147. package/esm2022/renderer/components/field-head.component.mjs +130 -0
  148. package/esm2022/renderer/components/field-icon.component.mjs +66 -0
  149. package/esm2022/renderer/components/frozen-cells.component.mjs +36 -0
  150. package/esm2022/renderer/components/frozen-heads.component.mjs +117 -0
  151. package/esm2022/renderer/components/frozen-placeholder-cells.component.mjs +38 -0
  152. package/esm2022/renderer/components/heads.component.mjs +38 -0
  153. package/esm2022/renderer/components/hover-row-heads.component.mjs +107 -0
  154. package/esm2022/renderer/components/icon.component.mjs +80 -0
  155. package/esm2022/renderer/components/index.mjs +14 -0
  156. package/esm2022/renderer/components/other-rows.component.mjs +68 -0
  157. package/esm2022/renderer/components/placeholder-cells.component.mjs +33 -0
  158. package/esm2022/renderer/components/text.component.mjs +45 -0
  159. package/esm2022/renderer/creations/create-active-cell-border.mjs +68 -0
  160. package/esm2022/renderer/creations/create-cells.mjs +135 -0
  161. package/esm2022/renderer/creations/create-heads.mjs +45 -0
  162. package/esm2022/renderer/drawers/add-row-layout-drawer.mjs +97 -0
  163. package/esm2022/renderer/drawers/cell-drawer.mjs +586 -0
  164. package/esm2022/renderer/drawers/drawer.mjs +936 -0
  165. package/esm2022/renderer/drawers/layout-drawer.mjs +58 -0
  166. package/esm2022/renderer/drawers/record-row-layout-drawer.mjs +101 -0
  167. package/esm2022/renderer/index.mjs +4 -0
  168. package/esm2022/renderer/renderer.component.mjs +174 -0
  169. package/esm2022/services/event.service.mjs +115 -11
  170. package/esm2022/services/field.service.mjs +28 -5
  171. package/esm2022/services/index.mjs +4 -0
  172. package/esm2022/services/selection.service.mjs +8 -1
  173. package/esm2022/types/avatar.mjs +27 -0
  174. package/esm2022/types/canvas.mjs +2 -0
  175. package/esm2022/types/cell.mjs +2 -0
  176. package/esm2022/types/component-config.mjs +7 -0
  177. package/esm2022/types/field.mjs +1 -1
  178. package/esm2022/types/grid.mjs +16 -2
  179. package/esm2022/types/index.mjs +8 -2
  180. package/esm2022/types/layout.mjs +2 -0
  181. package/esm2022/types/row.mjs +6 -0
  182. package/esm2022/utils/build.mjs +39 -0
  183. package/esm2022/utils/cell.mjs +71 -0
  184. package/esm2022/utils/common.mjs +49 -0
  185. package/esm2022/utils/get-placeholder-cells.mjs +66 -0
  186. package/esm2022/utils/get-text-width.mjs +30 -0
  187. package/esm2022/utils/image-cache.mjs +57 -0
  188. package/esm2022/utils/index.mjs +12 -0
  189. package/esm2022/utils/os.mjs +16 -0
  190. package/esm2022/utils/position.mjs +48 -0
  191. package/esm2022/utils/style.mjs +25 -0
  192. package/esm2022/utils/text-measure.mjs +122 -0
  193. package/esm2022/utils/visible-range.mjs +38 -0
  194. package/fesm2022/ai-table-grid.mjs +5526 -693
  195. package/fesm2022/ai-table-grid.mjs.map +1 -1
  196. package/grid-base.component.d.ts +52 -0
  197. package/grid-base.component.d.ts.map +1 -0
  198. package/grid.component.d.ts +43 -40
  199. package/grid.component.d.ts.map +1 -1
  200. package/package.json +5 -2
  201. package/public-api.d.ts +8 -4
  202. package/public-api.d.ts.map +1 -1
  203. package/renderer/components/add-field-column.component.d.ts +16 -0
  204. package/renderer/components/add-field-column.component.d.ts.map +1 -0
  205. package/renderer/components/cells.component.d.ts +14 -0
  206. package/renderer/components/cells.component.d.ts.map +1 -0
  207. package/renderer/components/field-head.component.d.ts +73 -0
  208. package/renderer/components/field-head.component.d.ts.map +1 -0
  209. package/renderer/components/field-icon.component.d.ts +17 -0
  210. package/renderer/components/field-icon.component.d.ts.map +1 -0
  211. package/renderer/components/frozen-cells.component.d.ts +14 -0
  212. package/renderer/components/frozen-cells.component.d.ts.map +1 -0
  213. package/renderer/components/frozen-heads.component.d.ts +47 -0
  214. package/renderer/components/frozen-heads.component.d.ts.map +1 -0
  215. package/renderer/components/frozen-placeholder-cells.component.d.ts +22 -0
  216. package/renderer/components/frozen-placeholder-cells.component.d.ts.map +1 -0
  217. package/renderer/components/heads.component.d.ts +9 -0
  218. package/renderer/components/heads.component.d.ts.map +1 -0
  219. package/renderer/components/hover-row-heads.component.d.ts +11 -0
  220. package/renderer/components/hover-row-heads.component.d.ts.map +1 -0
  221. package/renderer/components/icon.component.d.ts +37 -0
  222. package/renderer/components/icon.component.d.ts.map +1 -0
  223. package/renderer/components/index.d.ts +14 -0
  224. package/renderer/components/index.d.ts.map +1 -0
  225. package/renderer/components/other-rows.component.d.ts +31 -0
  226. package/renderer/components/other-rows.component.d.ts.map +1 -0
  227. package/renderer/components/placeholder-cells.component.d.ts +22 -0
  228. package/renderer/components/placeholder-cells.component.d.ts.map +1 -0
  229. package/renderer/components/text.component.d.ts +99 -0
  230. package/renderer/components/text.component.d.ts.map +1 -0
  231. package/renderer/creations/create-active-cell-border.d.ts +7 -0
  232. package/renderer/creations/create-active-cell-border.d.ts.map +1 -0
  233. package/renderer/creations/create-cells.d.ts +8 -0
  234. package/renderer/creations/create-cells.d.ts.map +1 -0
  235. package/renderer/creations/create-heads.d.ts +3 -0
  236. package/renderer/creations/create-heads.d.ts.map +1 -0
  237. package/renderer/drawers/add-row-layout-drawer.d.ts +12 -0
  238. package/renderer/drawers/add-row-layout-drawer.d.ts.map +1 -0
  239. package/renderer/drawers/cell-drawer.d.ts +22 -0
  240. package/renderer/drawers/cell-drawer.d.ts.map +1 -0
  241. package/renderer/drawers/drawer.d.ts +136 -0
  242. package/renderer/drawers/drawer.d.ts.map +1 -0
  243. package/renderer/drawers/layout-drawer.d.ts +22 -0
  244. package/renderer/drawers/layout-drawer.d.ts.map +1 -0
  245. package/renderer/drawers/record-row-layout-drawer.d.ts +14 -0
  246. package/renderer/drawers/record-row-layout-drawer.d.ts.map +1 -0
  247. package/renderer/index.d.ts +4 -0
  248. package/renderer/index.d.ts.map +1 -0
  249. package/renderer/renderer.component.d.ts +64 -0
  250. package/renderer/renderer.component.d.ts.map +1 -0
  251. package/services/event.service.d.ts +17 -3
  252. package/services/event.service.d.ts.map +1 -1
  253. package/services/field.service.d.ts +5 -4
  254. package/services/field.service.d.ts.map +1 -1
  255. package/services/index.d.ts +4 -0
  256. package/services/index.d.ts.map +1 -0
  257. package/services/selection.service.d.ts.map +1 -1
  258. package/styles/styles.scss +71 -11
  259. package/types/avatar.d.ts +24 -0
  260. package/types/avatar.d.ts.map +1 -0
  261. package/types/canvas.d.ts +83 -0
  262. package/types/canvas.d.ts.map +1 -0
  263. package/types/cell.d.ts +43 -0
  264. package/types/cell.d.ts.map +1 -0
  265. package/types/component-config.d.ts +50 -0
  266. package/types/component-config.d.ts.map +1 -0
  267. package/types/field.d.ts +27 -1
  268. package/types/field.d.ts.map +1 -1
  269. package/types/grid.d.ts +80 -2
  270. package/types/grid.d.ts.map +1 -1
  271. package/types/index.d.ts +7 -1
  272. package/types/index.d.ts.map +1 -1
  273. package/types/layout.d.ts +11 -0
  274. package/types/layout.d.ts.map +1 -0
  275. package/types/row.d.ts +27 -0
  276. package/types/row.d.ts.map +1 -0
  277. package/utils/build.d.ts +5 -0
  278. package/utils/build.d.ts.map +1 -0
  279. package/utils/cell.d.ts +19 -0
  280. package/utils/cell.d.ts.map +1 -0
  281. package/utils/common.d.ts +20 -0
  282. package/utils/common.d.ts.map +1 -0
  283. package/utils/get-placeholder-cells.d.ts +16 -0
  284. package/utils/get-placeholder-cells.d.ts.map +1 -0
  285. package/utils/get-text-width.d.ts +9 -0
  286. package/utils/get-text-width.d.ts.map +1 -0
  287. package/utils/image-cache.d.ts +16 -0
  288. package/utils/image-cache.d.ts.map +1 -0
  289. package/utils/index.d.ts +12 -0
  290. package/utils/index.d.ts.map +1 -0
  291. package/utils/os.d.ts +4 -0
  292. package/utils/os.d.ts.map +1 -0
  293. package/utils/position.d.ts +20 -0
  294. package/utils/position.d.ts.map +1 -0
  295. package/utils/style.d.ts +4 -0
  296. package/utils/style.d.ts.map +1 -0
  297. package/utils/text-measure.d.ts +32 -0
  298. package/utils/text-measure.d.ts.map +1 -0
  299. package/utils/visible-range.d.ts +13 -0
  300. package/utils/visible-range.d.ts.map +1 -0
  301. package/components/cell-editors/link/number-editor.component.d.ts +0 -8
  302. package/components/cell-editors/link/number-editor.component.d.ts.map +0 -1
  303. package/constants/field.d.ts +0 -20
  304. package/constants/field.d.ts.map +0 -1
  305. package/core/action/field.d.ts +0 -12
  306. package/core/action/field.d.ts.map +0 -1
  307. package/core/action/general.d.ts +0 -5
  308. package/core/action/general.d.ts.map +0 -1
  309. package/core/action/index.d.ts +0 -12
  310. package/core/action/index.d.ts.map +0 -1
  311. package/core/action/record.d.ts +0 -12
  312. package/core/action/record.d.ts.map +0 -1
  313. package/core/types/action.d.ts +0 -64
  314. package/core/types/action.d.ts.map +0 -1
  315. package/core/utils/weak-map.d.ts +0 -3
  316. package/core/utils/weak-map.d.ts.map +0 -1
  317. package/esm2022/components/cell-editors/link/number-editor.component.mjs +0 -25
  318. package/esm2022/constants/field.mjs +0 -25
  319. package/esm2022/core/action/field.mjs +0 -57
  320. package/esm2022/core/action/general.mjs +0 -116
  321. package/esm2022/core/action/index.mjs +0 -9
  322. package/esm2022/core/action/record.mjs +0 -44
  323. package/esm2022/core/types/action.mjs +0 -18
  324. package/esm2022/core/utils/weak-map.mjs +0 -2
@@ -0,0 +1,936 @@
1
+ import GraphemeSplitter from 'grapheme-splitter';
2
+ import { AI_TABLE_OFFSET, AI_TABLE_TAG_FONT_SIZE, AI_TABLE_TAG_PADDING, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_FONT_WEIGHT, DEFAULT_TEXT_ALIGN_CENTER, DEFAULT_TEXT_ALIGN_LEFT, DEFAULT_TEXT_DECORATION, DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE, DEFAULT_TEXT_VERTICAL_ALIGN_TOP, DEFAULT_WRAP_TEXT_MAX_ROW, FONT_SIZE_SM, WebOutlinedPath } from '../../constants';
3
+ import { AITable } from '../../core';
4
+ import { AITableAvatarSize, AITableAvatarType } from '../../types';
5
+ import { getTextWidth, imageCache, textDataCache, TextMeasure } from '../../utils';
6
+ // 用于正确地分割字符串,包括表情符号
7
+ export const graphemeSplitter = new GraphemeSplitter();
8
+ /**
9
+ * 用于在 Canvas 上进行的各种绘图操作,包含了文本绘制、矩形绘制、路径绘制以及一些几何计算等功能
10
+ */
11
+ export class Drawer {
12
+ constructor() {
13
+ this.ctx = TextMeasure().context;
14
+ this.needDraw = false;
15
+ this.colors = AITable.getColors();
16
+ }
17
+ initCtx(ctx) {
18
+ this.needDraw = Boolean(ctx);
19
+ this.ctx = ctx || TextMeasure().context;
20
+ /**
21
+ * textBaseline 指定为 middle,兼容浏览器差异
22
+ */
23
+ this.ctx.textBaseline = DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE;
24
+ }
25
+ // 设置样式
26
+ setStyle(options) {
27
+ const { fontSize, fontWeight, fillStyle, strokeStyle } = options;
28
+ if (fontSize || fontWeight) {
29
+ this.ctx.font = `${fontWeight || DEFAULT_FONT_WEIGHT} ${fontSize || DEFAULT_FONT_SIZE}px ${DEFAULT_FONT_FAMILY}`;
30
+ }
31
+ if (fillStyle) {
32
+ this.ctx.fillStyle = fillStyle;
33
+ }
34
+ if (strokeStyle) {
35
+ this.ctx.strokeStyle = strokeStyle;
36
+ }
37
+ }
38
+ // 文本省略
39
+ textEllipsis(options) {
40
+ const { text, maxWidth, fontSize = DEFAULT_FONT_SIZE, fontWeight = DEFAULT_FONT_WEIGHT } = options;
41
+ if (text == null)
42
+ return {
43
+ text: '',
44
+ textWidth: 0,
45
+ isEllipsis: false
46
+ };
47
+ const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
48
+ if (!maxWidth) {
49
+ return {
50
+ text,
51
+ textWidth: getTextWidth(this.ctx, text, fontStyle),
52
+ isEllipsis: false
53
+ };
54
+ }
55
+ const ellipsis = '…';
56
+ const textSize = text.length;
57
+ // 预先确定传入文本的阈值宽度
58
+ let guessSize = Math.ceil(maxWidth / fontSize);
59
+ let guessText = text.substr(0, guessSize);
60
+ let guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
61
+ while (guessWidth <= maxWidth) {
62
+ if (textSize <= guessSize) {
63
+ return {
64
+ text,
65
+ textWidth: guessWidth,
66
+ isEllipsis: false
67
+ };
68
+ }
69
+ guessSize++;
70
+ guessText = text.substr(0, guessSize);
71
+ guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
72
+ }
73
+ const ellipsisWidth = getTextWidth(this.ctx, ellipsis, fontStyle);
74
+ while (guessSize >= 0 && guessWidth + ellipsisWidth > maxWidth) {
75
+ guessSize--;
76
+ guessText = text.substr(0, guessSize);
77
+ guessWidth = getTextWidth(this.ctx, guessText, fontStyle);
78
+ }
79
+ return {
80
+ text: `${guessText || text[0]}${ellipsis}`,
81
+ textWidth: maxWidth,
82
+ isEllipsis: true
83
+ };
84
+ }
85
+ // 绘制线段
86
+ line(options) {
87
+ const { x, y, points, stroke, closed = false } = options;
88
+ const length = points.length;
89
+ this.ctx.save();
90
+ this.ctx.beginPath();
91
+ if (stroke)
92
+ this.ctx.strokeStyle = stroke;
93
+ this.ctx.lineWidth = 1;
94
+ this.ctx.translate(x, y);
95
+ this.ctx.moveTo(points[0], points[1]);
96
+ for (let n = 2; n < length; n += 2) {
97
+ this.ctx.lineTo(points[n], points[n + 1]);
98
+ }
99
+ if (closed) {
100
+ this.ctx.closePath();
101
+ }
102
+ this.ctx.stroke();
103
+ this.ctx.restore();
104
+ }
105
+ // 绘制圆
106
+ arc(options) {
107
+ const { x, y, stroke, fill, radius } = options;
108
+ this.ctx.beginPath();
109
+ if (fill)
110
+ this.setStyle({ fillStyle: fill });
111
+ if (stroke)
112
+ this.setStyle({ strokeStyle: stroke });
113
+ this.ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
114
+ if (fill) {
115
+ this.ctx.fill();
116
+ }
117
+ if (stroke) {
118
+ this.ctx.stroke();
119
+ }
120
+ }
121
+ // 绘制矩形
122
+ rect(options) {
123
+ const { x, y, width, height, radius, fill, stroke } = options;
124
+ this.ctx.beginPath();
125
+ if (fill)
126
+ this.setStyle({ fillStyle: fill });
127
+ if (stroke)
128
+ this.setStyle({ strokeStyle: stroke });
129
+ if (!radius) {
130
+ this.ctx.rect(x, y, width, height);
131
+ }
132
+ else {
133
+ let topLeft = 0;
134
+ let topRight = 0;
135
+ let bottomLeft = 0;
136
+ let bottomRight = 0;
137
+ if (typeof radius === 'number') {
138
+ topLeft = topRight = bottomLeft = bottomRight = Math.min(radius, width / 2, height / 2);
139
+ }
140
+ else {
141
+ topLeft = Math.min(radius[0] || 0, width / 2, height / 2);
142
+ topRight = Math.min(radius[1] || 0, width / 2, height / 2);
143
+ bottomRight = Math.min(radius[2] || 0, width / 2, height / 2);
144
+ bottomLeft = Math.min(radius[3] || 0, width / 2, height / 2);
145
+ }
146
+ this.ctx.moveTo(x + topLeft, y);
147
+ this.ctx.lineTo(x + width - topRight, y);
148
+ this.ctx.arc(x + width - topRight, y + topRight, topRight, (Math.PI * 3) / 2, 0, false);
149
+ this.ctx.lineTo(x + width, y + height - bottomRight);
150
+ this.ctx.arc(x + width - bottomRight, y + height - bottomRight, bottomRight, 0, Math.PI / 2, false);
151
+ this.ctx.lineTo(x + bottomLeft, y + height);
152
+ this.ctx.arc(x + bottomLeft, y + height - bottomLeft, bottomLeft, Math.PI / 2, Math.PI, false);
153
+ this.ctx.lineTo(x, y + topLeft);
154
+ this.ctx.arc(x + topLeft, y + topLeft, topLeft, Math.PI, (Math.PI * 3) / 2, false);
155
+ }
156
+ this.ctx.closePath();
157
+ if (fill) {
158
+ this.ctx.fill();
159
+ }
160
+ if (stroke) {
161
+ this.ctx.stroke();
162
+ }
163
+ }
164
+ customRect(options) {
165
+ const { x, y, width, height, fill, strokes } = options;
166
+ if (fill)
167
+ this.setStyle({ fillStyle: fill });
168
+ this.ctx.fillRect(x, y, width, height);
169
+ if (strokes) {
170
+ const { top, right, bottom, left } = strokes;
171
+ // 上边框
172
+ this.ctx.beginPath();
173
+ this.setStyle({ strokeStyle: top ?? this.colors.transparent });
174
+ this.ctx.moveTo(x, y);
175
+ this.ctx.lineTo(x + width, y);
176
+ this.ctx.stroke();
177
+ // 右边框
178
+ this.ctx.beginPath();
179
+ this.setStyle({ strokeStyle: right ?? this.colors.transparent });
180
+ this.ctx.moveTo(x + width, y);
181
+ this.ctx.lineTo(x + width, y + height);
182
+ this.ctx.stroke();
183
+ // 下边框
184
+ this.ctx.beginPath();
185
+ this.setStyle({ strokeStyle: bottom ?? this.colors.transparent });
186
+ this.ctx.moveTo(x, y + height);
187
+ this.ctx.lineTo(x + width, y + height);
188
+ this.ctx.stroke();
189
+ // 左边框
190
+ this.ctx.beginPath();
191
+ this.setStyle({ strokeStyle: left ?? this.colors.transparent });
192
+ this.ctx.moveTo(x, y);
193
+ this.ctx.lineTo(x, y + height);
194
+ this.ctx.stroke();
195
+ }
196
+ }
197
+ // 换行文本绘制
198
+ wrapText(options) {
199
+ const { x, y, text, maxWidth, lineHeight, maxRow = DEFAULT_WRAP_TEXT_MAX_ROW, fontSize = DEFAULT_FONT_SIZE, fillStyle = this.colors.gray800, textAlign = DEFAULT_TEXT_ALIGN_LEFT, verticalAlign = DEFAULT_TEXT_VERTICAL_ALIGN_TOP, fontWeight = DEFAULT_FONT_WEIGHT, textDecoration = DEFAULT_TEXT_DECORATION, fieldType, needDraw = false } = options;
200
+ let offsetX = 0;
201
+ let offsetY = 0;
202
+ const baselineOffset = verticalAlign === DEFAULT_TEXT_VERTICAL_ALIGN_TOP ? fontSize / 2 : 0;
203
+ const fontStyle = `${fontWeight}-${fontSize}px`;
204
+ const isUnderline = textDecoration === 'underline';
205
+ const textRenderer = (textDataList) => {
206
+ textDataList.forEach((data) => {
207
+ const { offsetX, offsetY, text, width, linkUrl } = data;
208
+ this.ctx.fillText(text, x + offsetX, y + offsetY + baselineOffset);
209
+ if (linkUrl || isUnderline) {
210
+ this.line({
211
+ x: x + offsetX,
212
+ y: y + offsetY + AI_TABLE_OFFSET,
213
+ points: [0, fontSize, width, fontSize],
214
+ stroke: fillStyle
215
+ });
216
+ }
217
+ });
218
+ };
219
+ if (fillStyle)
220
+ this.setStyle({ fillStyle });
221
+ this.ctx.textAlign = textAlign;
222
+ const cacheKey = `${fontStyle}-${maxRow}-${maxWidth || 0}-${fieldType}-${text}`;
223
+ const cacheTextData = textDataCache.get(cacheKey);
224
+ if (cacheTextData) {
225
+ if (this.needDraw && needDraw) {
226
+ textRenderer(cacheTextData.data);
227
+ }
228
+ return cacheTextData;
229
+ }
230
+ const resultData = [];
231
+ // 准确切分包含表情符号的字符串
232
+ const arrText = graphemeSplitter.splitGraphemes(text);
233
+ const textLength = arrText.length;
234
+ const ellipsisWidth = this.ctx.measureText('…').width;
235
+ let showText = ''; // 每个片段显示的文本
236
+ let showTextWidth = 0; // 每段的宽度
237
+ let showLineWidth = 0; // 当前每行显示文字的宽度
238
+ let rowCount = 0;
239
+ const isEllipsis = this.textEllipsis({ text, maxWidth: maxWidth }).isEllipsis;
240
+ for (let n = 0; n < textLength; n++) {
241
+ const curText = arrText[n];
242
+ const isLineBreak = ['\n', '\r'].includes(curText);
243
+ const singleText = isLineBreak ? '' : curText;
244
+ const composeText = showText + singleText;
245
+ const isLimitRow = maxRow ? rowCount >= maxRow - 1 : false;
246
+ const singleTextWidth = isLineBreak ? 0 : this.ctx.measureText(singleText).width;
247
+ showLineWidth += singleTextWidth;
248
+ const diffWidth = isLimitRow ? showLineWidth + (isEllipsis ? ellipsisWidth : 0) : showLineWidth;
249
+ const isLineEnd = diffWidth > maxWidth;
250
+ // 遇到换行符或行尾
251
+ if ((isLineEnd || isLineBreak) && rowCount < maxRow) {
252
+ const isLastLetter = n === arrText.length - 1;
253
+ resultData.push({
254
+ offsetX,
255
+ offsetY,
256
+ width: Math.ceil(showTextWidth),
257
+ text: isLimitRow ? (isLastLetter ? composeText : `${showText}…`) : showText
258
+ });
259
+ showText = singleText;
260
+ offsetX = 0;
261
+ showTextWidth = singleTextWidth;
262
+ showLineWidth = singleTextWidth;
263
+ if (isLimitRow) {
264
+ showText = '';
265
+ break;
266
+ }
267
+ rowCount++;
268
+ offsetY += lineHeight;
269
+ continue;
270
+ }
271
+ showText = composeText;
272
+ showTextWidth += singleTextWidth;
273
+ }
274
+ if (showText) {
275
+ resultData.push({
276
+ offsetX,
277
+ offsetY,
278
+ width: Math.ceil(showTextWidth),
279
+ text: showText
280
+ });
281
+ }
282
+ if (this.needDraw && needDraw) {
283
+ textRenderer(resultData);
284
+ }
285
+ const res = {
286
+ height: rowCount < maxRow ? offsetY + lineHeight : offsetY,
287
+ data: resultData
288
+ };
289
+ textDataCache.set(cacheKey, res);
290
+ return res;
291
+ }
292
+ // 绘制单行文本
293
+ text(options) {
294
+ const { x, y, text, fontSize = DEFAULT_FONT_SIZE, fillStyle = this.colors.gray800, textAlign = DEFAULT_TEXT_ALIGN_LEFT, verticalAlign = DEFAULT_TEXT_VERTICAL_ALIGN_TOP, fontWeight = DEFAULT_FONT_WEIGHT, textDecoration = DEFAULT_TEXT_DECORATION } = options;
295
+ const fontStyle = `${fontWeight} ${fontSize}px ${DEFAULT_FONT_FAMILY}`;
296
+ if (textDecoration === 'underline') {
297
+ const textWidth = getTextWidth(this.ctx, text, fontStyle);
298
+ this.line({
299
+ x: x,
300
+ y: y + AI_TABLE_OFFSET,
301
+ points: [0, fontSize, textWidth, fontSize],
302
+ stroke: fillStyle
303
+ });
304
+ }
305
+ const baselineOffset = verticalAlign === DEFAULT_TEXT_VERTICAL_ALIGN_TOP ? fontSize / 2 : 0;
306
+ if (fillStyle)
307
+ this.setStyle({ fillStyle });
308
+ this.ctx.textAlign = textAlign;
309
+ this.ctx.font = fontStyle;
310
+ this.ctx.fillText(text, x, y + baselineOffset);
311
+ }
312
+ // 绘制标签
313
+ tag(options) {
314
+ const { x, y, width, height, text, radius, background, color = this.colors.gray800, fontSize = AI_TABLE_TAG_FONT_SIZE, fontWeight = DEFAULT_FONT_WEIGHT, stroke } = options;
315
+ // 背景
316
+ this.rect({
317
+ x,
318
+ y,
319
+ width,
320
+ height,
321
+ radius,
322
+ fill: background,
323
+ stroke
324
+ });
325
+ this.text({
326
+ x: x + AI_TABLE_TAG_PADDING,
327
+ y: y + (height - fontSize) / 2,
328
+ text,
329
+ fillStyle: color,
330
+ fontSize,
331
+ fontWeight
332
+ });
333
+ return {
334
+ width,
335
+ height
336
+ };
337
+ }
338
+ image(options, crossOrigin, allowDefault) {
339
+ const { x, y, url, width, height, opacity = 1, clipFunc } = options;
340
+ const colors = AITable.getColors();
341
+ if (!url) {
342
+ return;
343
+ }
344
+ const image = imageCache.getImage(url);
345
+ // Not loaded successfully
346
+ if (image === false) {
347
+ if (allowDefault) {
348
+ this.path({
349
+ x,
350
+ y: y + 2,
351
+ data: WebOutlinedPath,
352
+ size: 16,
353
+ fill: colors.gray600
354
+ });
355
+ }
356
+ return;
357
+ }
358
+ // Unloaded
359
+ if (image == null) {
360
+ return imageCache.loadImage(url, url, { crossOrigin });
361
+ }
362
+ const isOrigin = opacity === 1;
363
+ if (!clipFunc && isOrigin) {
364
+ return this.ctx.drawImage(image, x, y, width, height);
365
+ }
366
+ if (!clipFunc && !isOrigin) {
367
+ this.ctx.save();
368
+ this.ctx.globalAlpha = opacity;
369
+ this.ctx.drawImage(image, x, y, width, height);
370
+ this.ctx.restore();
371
+ return;
372
+ }
373
+ if (clipFunc) {
374
+ this.ctx.save();
375
+ this.ctx.beginPath();
376
+ clipFunc(this.ctx);
377
+ this.ctx.clip();
378
+ this.ctx.globalAlpha = opacity;
379
+ this.ctx.drawImage(image, x, y, width, height);
380
+ this.ctx.restore();
381
+ }
382
+ }
383
+ avatar(options) {
384
+ const { x = 0, y = 0, id, url, title, bgColor = this.colors.white, size = AITableAvatarSize.size36, type = AITableAvatarType.member, opacity = 1 } = options;
385
+ if (title == null || id == null)
386
+ return null;
387
+ const colors = AITable.getColors();
388
+ const avatarSrc = url || '';
389
+ const avatarName = title;
390
+ const avatarBg = avatarSrc ? colors.white : bgColor;
391
+ switch (type) {
392
+ case AITableAvatarType.member: {
393
+ const radius = size / 2;
394
+ if (!avatarSrc) {
395
+ this.ctx.fillStyle = avatarBg;
396
+ this.ctx.beginPath();
397
+ this.ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2, false);
398
+ this.ctx.closePath();
399
+ this.ctx.fill();
400
+ return this.text({
401
+ x: x + radius,
402
+ y: y + radius,
403
+ text: avatarName,
404
+ textAlign: DEFAULT_TEXT_ALIGN_CENTER,
405
+ verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE,
406
+ fontSize: FONT_SIZE_SM,
407
+ fillStyle: colors.white
408
+ });
409
+ }
410
+ return this.image({
411
+ name: avatarSrc,
412
+ x,
413
+ y,
414
+ url: avatarSrc,
415
+ width: size,
416
+ height: size,
417
+ clipFunc: (ctx) => {
418
+ ctx.fillStyle = avatarBg;
419
+ ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2, false);
420
+ ctx.fill();
421
+ },
422
+ opacity
423
+ });
424
+ }
425
+ }
426
+ }
427
+ /**
428
+ * 方法将椭圆弧的端点参数化形式转换为中心参数化形式
429
+ * 接受弧线的端点参数,并计算出弧线的中心点坐标、起始角度、终止角度等参数
430
+ * 返回值:一个包含中心点坐标、半径、旋转角度、起始角度以及角度差的对象,这些参数可以直接用于绘制椭圆弧
431
+ * @returns [cx, cy, rx, ry, theta, dTheta, psi, fs]
432
+ */
433
+ convertEndpointToCenterParameterization(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg) {
434
+ const psi = psiDeg * (Math.PI / 180.0);
435
+ const xp = (Math.cos(psi) * (x1 - x2)) / 2.0 + (Math.sin(psi) * (y1 - y2)) / 2.0;
436
+ const yp = (-1 * Math.sin(psi) * (x1 - x2)) / 2.0 + (Math.cos(psi) * (y1 - y2)) / 2.0;
437
+ const lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);
438
+ if (lambda > 1) {
439
+ rx *= Math.sqrt(lambda);
440
+ ry *= Math.sqrt(lambda);
441
+ }
442
+ let f = Math.sqrt((rx * rx * (ry * ry) - rx * rx * (yp * yp) - ry * ry * (xp * xp)) / (rx * rx * (yp * yp) + ry * ry * (xp * xp)));
443
+ if (fa === fs) {
444
+ f *= -1;
445
+ }
446
+ if (isNaN(f)) {
447
+ f = 0;
448
+ }
449
+ const cxp = (f * rx * yp) / ry;
450
+ const cyp = (f * -ry * xp) / rx;
451
+ const cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp;
452
+ const cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp;
453
+ const vMag = function (v) {
454
+ return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
455
+ };
456
+ const vRatio = function (u, v) {
457
+ return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
458
+ };
459
+ const vAngle = function (u, v) {
460
+ return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));
461
+ };
462
+ const theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);
463
+ const u = [(xp - cxp) / rx, (yp - cyp) / ry];
464
+ const v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];
465
+ let dTheta = vAngle(u, v);
466
+ if (vRatio(u, v) <= -1) {
467
+ dTheta = Math.PI;
468
+ }
469
+ if (vRatio(u, v) >= 1) {
470
+ dTheta = 0;
471
+ }
472
+ if (fs === 0 && dTheta > 0) {
473
+ dTheta = dTheta - 2 * Math.PI;
474
+ }
475
+ if (fs === 1 && dTheta < 0) {
476
+ dTheta = dTheta + 2 * Math.PI;
477
+ }
478
+ return [cx, cy, rx, ry, theta, dTheta, psi, fs];
479
+ }
480
+ /**
481
+ * 计算两个点 (x1, y1) 和 (x2, y2) 之间的直线距离
482
+ * @returns 两个点 (x1, y1) 和 (x2, y2) 之间的直线距离,单位与输入的坐标值相同
483
+ */
484
+ getLineLength(x1, y1, x2, y2) {
485
+ return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
486
+ }
487
+ /**
488
+ * 计算三次贝塞尔曲线上给定参数 t 对应的点的坐标.
489
+ * 可以在指定的 t 参数下计算出曲线上精确的一个点,这个点可以用于绘制平滑曲线的一部分
490
+ * @param pct - 0 到 1 之间的参数,用于指定曲线上的点的位置
491
+ * @param P1x - 曲线的起点 x 坐标
492
+ * @param P1y - 曲线的起点 y 坐标
493
+ * @param P2x - 曲线的第一个控制点 x 坐标
494
+ * @param P2y - 曲线的第一个控制点 y 坐标
495
+ * @param P3x - 曲线的第二个控制点 x 坐标
496
+ * @param P3y - 曲线的第二个控制点 y 坐标
497
+ * @param P4x - 曲线的终点 x 坐标
498
+ * @param P4y - 曲线的终点 y 坐标
499
+ * @returns
500
+ */
501
+ getPointOnCubicBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) {
502
+ function CB1(t) {
503
+ return t * t * t;
504
+ }
505
+ function CB2(t) {
506
+ return 3 * t * t * (1 - t);
507
+ }
508
+ function CB3(t) {
509
+ return 3 * t * (1 - t) * (1 - t);
510
+ }
511
+ function CB4(t) {
512
+ return (1 - t) * (1 - t) * (1 - t);
513
+ }
514
+ const x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);
515
+ const y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);
516
+ return {
517
+ x: x,
518
+ y: y
519
+ };
520
+ }
521
+ /**
522
+ * 计算二次贝塞尔曲线上给定参数 t 对应的点的坐标
523
+ * @param pct - 0 到 1 之间的参数,用于指定曲线上的点的位置
524
+ * @param P1x - 曲线的起点 x 坐标
525
+ * @param P1y - 曲线的起点 y 坐标
526
+ * @param P2x - 曲线的控制点 x 坐标
527
+ * @param P2y - 曲线的控制点 y 坐标
528
+ * @param P3x - 曲线的终点 x 坐标
529
+ * @param P3y - 曲线的终点 y 坐标
530
+ * @returns
531
+ */
532
+ getPointOnQuadraticBezier(pct, P1x, P1y, P2x, P2y, P3x, P3y) {
533
+ function QB1(t) {
534
+ return t * t;
535
+ }
536
+ function QB2(t) {
537
+ return 2 * t * (1 - t);
538
+ }
539
+ function QB3(t) {
540
+ return (1 - t) * (1 - t);
541
+ }
542
+ const x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);
543
+ const y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);
544
+ return {
545
+ x: x,
546
+ y: y
547
+ };
548
+ }
549
+ /**
550
+ * 计算椭圆弧上给定角度 θ 对应的点的坐标
551
+ * @param cx - 椭圆的中心点 x 坐标
552
+ * @param cy - 椭圆的中心点 y 坐标
553
+ * @param rx - 椭圆的 x 轴半径
554
+ * @param ry - 椭圆的 y 轴半径
555
+ * @param theta - 椭圆弧的起始角度
556
+ * @param psi - 椭圆弧的旋转角度
557
+ * @returns
558
+ */
559
+ getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {
560
+ const cosPsi = Math.cos(psi);
561
+ const sinPsi = Math.sin(psi);
562
+ const pt = {
563
+ x: rx * Math.cos(theta),
564
+ y: ry * Math.sin(theta)
565
+ };
566
+ return {
567
+ x: cx + (pt.x * cosPsi - pt.y * sinPsi),
568
+ y: cy + (pt.x * sinPsi + pt.y * cosPsi)
569
+ };
570
+ }
571
+ /**
572
+ * 计算基于不同路径命令的长度
573
+ * @param x - 起点 x 坐标
574
+ * @param y - 起点 y 坐标
575
+ * @param cmd - 路径命令
576
+ * @param points - 与路径命令相关的点的坐标或控制参数
577
+ * @returns
578
+ */
579
+ calcLength(x, y, cmd, points) {
580
+ let len, p1, p2, t;
581
+ switch (cmd) {
582
+ case 'L':
583
+ return this.getLineLength(x, y, points[0], points[1]);
584
+ case 'C':
585
+ len = 0.0;
586
+ p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
587
+ for (t = 0.01; t <= 1; t += 0.01) {
588
+ p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);
589
+ len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
590
+ p1 = p2;
591
+ }
592
+ return len;
593
+ case 'Q':
594
+ len = 0.0;
595
+ p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);
596
+ for (t = 0.01; t <= 1; t += 0.01) {
597
+ p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);
598
+ len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
599
+ p1 = p2;
600
+ }
601
+ return len;
602
+ case 'A':
603
+ len = 0.0;
604
+ const start = points[4];
605
+ const dTheta = points[5];
606
+ const end = points[4] + dTheta;
607
+ let inc = Math.PI / 180.0;
608
+ if (Math.abs(start - end) < inc) {
609
+ inc = Math.abs(start - end);
610
+ }
611
+ p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);
612
+ if (dTheta < 0) {
613
+ for (t = start - inc; t > end; t -= inc) {
614
+ p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
615
+ len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
616
+ p1 = p2;
617
+ }
618
+ }
619
+ else {
620
+ for (t = start + inc; t < end; t += inc) {
621
+ p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);
622
+ len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
623
+ p1 = p2;
624
+ }
625
+ }
626
+ p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);
627
+ len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);
628
+ return len;
629
+ }
630
+ return 0;
631
+ }
632
+ /**
633
+ * 解析 SVG 路径数据字符串,将其转换为一个包含路径命令和坐标点的数组对象
634
+ * @param data - SVG 路径数据字符串
635
+ * @returns
636
+ */
637
+ parsePathData(data) {
638
+ if (!data) {
639
+ return [];
640
+ }
641
+ let cs = data;
642
+ const cc = ['m', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'];
643
+ cs = cs.replace(new RegExp(' ', 'g'), ',');
644
+ for (let n = 0; n < cc.length; n++) {
645
+ cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
646
+ }
647
+ const arr = cs.split('|');
648
+ const ca = [];
649
+ const coords = [];
650
+ let cpx = 0;
651
+ let cpy = 0;
652
+ const re = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi;
653
+ let match;
654
+ for (let n = 1; n < arr.length; n++) {
655
+ let str = arr[n];
656
+ let c = str.charAt(0);
657
+ str = str.slice(1);
658
+ coords.length = 0;
659
+ while ((match = re.exec(str))) {
660
+ coords.push(match[0]);
661
+ }
662
+ const p = [];
663
+ for (let j = 0, jlen = coords.length; j < jlen; j++) {
664
+ if (coords[j] === '00') {
665
+ p.push(0, 0);
666
+ continue;
667
+ }
668
+ const parsed = parseFloat(coords[j]);
669
+ if (!isNaN(parsed)) {
670
+ p.push(parsed);
671
+ }
672
+ else {
673
+ p.push(0);
674
+ }
675
+ }
676
+ while (p.length > 0) {
677
+ if (isNaN(p[0])) {
678
+ break;
679
+ }
680
+ let cmd = null;
681
+ let points = [];
682
+ const startX = cpx;
683
+ const startY = cpy;
684
+ let prevCmd, ctlPtx, ctlPty;
685
+ let rx, ry, psi, fa, fs, x1, y1;
686
+ switch (c) {
687
+ case 'l':
688
+ cpx += p.shift();
689
+ cpy += p.shift();
690
+ cmd = 'L';
691
+ points.push(cpx, cpy);
692
+ break;
693
+ case 'L':
694
+ cpx = p.shift();
695
+ cpy = p.shift();
696
+ points.push(cpx, cpy);
697
+ break;
698
+ case 'm':
699
+ const dx = p.shift();
700
+ const dy = p.shift();
701
+ cpx += dx;
702
+ cpy += dy;
703
+ cmd = 'M';
704
+ if (ca.length > 2 && ca[ca.length - 1].command === 'z') {
705
+ for (let idx = ca.length - 2; idx >= 0; idx--) {
706
+ if (ca[idx].command === 'M') {
707
+ cpx = ca[idx].points[0] + dx;
708
+ cpy = ca[idx].points[1] + dy;
709
+ break;
710
+ }
711
+ }
712
+ }
713
+ points.push(cpx, cpy);
714
+ c = 'l';
715
+ break;
716
+ case 'M':
717
+ cpx = p.shift();
718
+ cpy = p.shift();
719
+ cmd = 'M';
720
+ points.push(cpx, cpy);
721
+ c = 'L';
722
+ break;
723
+ case 'h':
724
+ cpx += p.shift();
725
+ cmd = 'L';
726
+ points.push(cpx, cpy);
727
+ break;
728
+ case 'H':
729
+ cpx = p.shift();
730
+ cmd = 'L';
731
+ points.push(cpx, cpy);
732
+ break;
733
+ case 'v':
734
+ cpy += p.shift();
735
+ cmd = 'L';
736
+ points.push(cpx, cpy);
737
+ break;
738
+ case 'V':
739
+ cpy = p.shift();
740
+ cmd = 'L';
741
+ points.push(cpx, cpy);
742
+ break;
743
+ case 'C':
744
+ points.push(p.shift(), p.shift(), p.shift(), p.shift());
745
+ cpx = p.shift();
746
+ cpy = p.shift();
747
+ points.push(cpx, cpy);
748
+ break;
749
+ case 'c':
750
+ points.push(cpx + p.shift(), cpy + p.shift(), cpx + p.shift(), cpy + p.shift());
751
+ cpx += p.shift();
752
+ cpy += p.shift();
753
+ cmd = 'C';
754
+ points.push(cpx, cpy);
755
+ break;
756
+ case 'S':
757
+ ctlPtx = cpx;
758
+ ctlPty = cpy;
759
+ prevCmd = ca[ca.length - 1];
760
+ if (prevCmd.command === 'C') {
761
+ ctlPtx = cpx + (cpx - prevCmd.points[2]);
762
+ ctlPty = cpy + (cpy - prevCmd.points[3]);
763
+ }
764
+ points.push(ctlPtx, ctlPty, p.shift(), p.shift());
765
+ cpx = p.shift();
766
+ cpy = p.shift();
767
+ cmd = 'C';
768
+ points.push(cpx, cpy);
769
+ break;
770
+ case 's':
771
+ ctlPtx = cpx;
772
+ ctlPty = cpy;
773
+ prevCmd = ca[ca.length - 1];
774
+ if (prevCmd.command === 'C') {
775
+ ctlPtx = cpx + (cpx - prevCmd.points[2]);
776
+ ctlPty = cpy + (cpy - prevCmd.points[3]);
777
+ }
778
+ points.push(ctlPtx, ctlPty, cpx + p.shift(), cpy + p.shift());
779
+ cpx += p.shift();
780
+ cpy += p.shift();
781
+ cmd = 'C';
782
+ points.push(cpx, cpy);
783
+ break;
784
+ case 'Q':
785
+ points.push(p.shift(), p.shift());
786
+ cpx = p.shift();
787
+ cpy = p.shift();
788
+ points.push(cpx, cpy);
789
+ break;
790
+ case 'q':
791
+ points.push(cpx + p.shift(), cpy + p.shift());
792
+ cpx += p.shift();
793
+ cpy += p.shift();
794
+ cmd = 'Q';
795
+ points.push(cpx, cpy);
796
+ break;
797
+ case 'T':
798
+ ctlPtx = cpx;
799
+ ctlPty = cpy;
800
+ prevCmd = ca[ca.length - 1];
801
+ if (prevCmd.command === 'Q') {
802
+ ctlPtx = cpx + (cpx - prevCmd.points[0]);
803
+ ctlPty = cpy + (cpy - prevCmd.points[1]);
804
+ }
805
+ cpx = p.shift();
806
+ cpy = p.shift();
807
+ cmd = 'Q';
808
+ points.push(ctlPtx, ctlPty, cpx, cpy);
809
+ break;
810
+ case 't':
811
+ ctlPtx = cpx;
812
+ ctlPty = cpy;
813
+ prevCmd = ca[ca.length - 1];
814
+ if (prevCmd.command === 'Q') {
815
+ ctlPtx = cpx + (cpx - prevCmd.points[0]);
816
+ ctlPty = cpy + (cpy - prevCmd.points[1]);
817
+ }
818
+ cpx += p.shift();
819
+ cpy += p.shift();
820
+ cmd = 'Q';
821
+ points.push(ctlPtx, ctlPty, cpx, cpy);
822
+ break;
823
+ case 'A':
824
+ rx = p.shift();
825
+ ry = p.shift();
826
+ psi = p.shift();
827
+ fa = p.shift();
828
+ fs = p.shift();
829
+ x1 = cpx;
830
+ y1 = cpy;
831
+ cpx = p.shift();
832
+ cpy = p.shift();
833
+ cmd = 'A';
834
+ points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi);
835
+ break;
836
+ case 'a':
837
+ rx = p.shift();
838
+ ry = p.shift();
839
+ psi = p.shift();
840
+ fa = p.shift();
841
+ fs = p.shift();
842
+ x1 = cpx;
843
+ y1 = cpy;
844
+ cpx += p.shift();
845
+ cpy += p.shift();
846
+ cmd = 'A';
847
+ points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi);
848
+ break;
849
+ }
850
+ ca.push({
851
+ command: cmd || c,
852
+ points: points,
853
+ start: {
854
+ x: startX,
855
+ y: startY
856
+ },
857
+ pathLength: this.calcLength(startX, startY, cmd || c, points)
858
+ });
859
+ }
860
+ if (c === 'z' || c === 'Z') {
861
+ ca.push({
862
+ command: 'z',
863
+ points: [],
864
+ start: undefined,
865
+ pathLength: 0
866
+ });
867
+ }
868
+ }
869
+ return ca;
870
+ }
871
+ /**
872
+ * 根据传入的路径数据 data 在画布上绘制路径
873
+ * @param options
874
+ */
875
+ path(options) {
876
+ const { x, y, scaleX = 1, scaleY = 1, data, fill } = options;
877
+ const dataArray = this.parsePathData(data);
878
+ this.ctx.save();
879
+ this.ctx.beginPath();
880
+ this.ctx.fillStyle = fill;
881
+ this.ctx.translate(x, y);
882
+ this.ctx.scale(scaleX, scaleY);
883
+ let isClosed = false;
884
+ for (let n = 0; n < dataArray.length; n++) {
885
+ const c = dataArray[n].command;
886
+ const p = dataArray[n].points;
887
+ switch (c) {
888
+ case 'L':
889
+ this.ctx.lineTo(p[0], p[1]);
890
+ break;
891
+ case 'M':
892
+ this.ctx.moveTo(p[0], p[1]);
893
+ break;
894
+ case 'C':
895
+ this.ctx.bezierCurveTo(p[0], p[1], p[2], p[3], p[4], p[5]);
896
+ break;
897
+ case 'Q':
898
+ this.ctx.quadraticCurveTo(p[0], p[1], p[2], p[3]);
899
+ break;
900
+ case 'A':
901
+ const cx = p[0];
902
+ const cy = p[1];
903
+ const rx = p[2];
904
+ const ry = p[3];
905
+ const theta = p[4];
906
+ const dTheta = p[5];
907
+ const psi = p[6];
908
+ const fs = p[7];
909
+ const r = rx > ry ? rx : ry;
910
+ const scaleX = rx > ry ? 1 : rx / ry;
911
+ const scaleY = rx > ry ? ry / rx : 1;
912
+ this.ctx.translate(cx, cy);
913
+ this.ctx.rotate(psi);
914
+ this.ctx.scale(scaleX, scaleY);
915
+ this.ctx.arc(0, 0, r, theta, theta + dTheta, (1 - fs));
916
+ this.ctx.scale(1 / scaleX, 1 / scaleY);
917
+ this.ctx.rotate(-psi);
918
+ this.ctx.translate(-cx, -cy);
919
+ break;
920
+ case 'z':
921
+ isClosed = true;
922
+ this.ctx.closePath();
923
+ break;
924
+ }
925
+ }
926
+ if (!isClosed) {
927
+ this.ctx.stroke();
928
+ }
929
+ else {
930
+ this.ctx.fill();
931
+ }
932
+ this.ctx.restore();
933
+ }
934
+ }
935
+ export const drawer = new Drawer();
936
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JpZC9zcmMvcmVuZGVyZXIvZHJhd2Vycy9kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxnQkFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0gsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIsa0NBQWtDLEVBQ2xDLCtCQUErQixFQUMvQix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLGVBQWUsRUFDbEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBVXBCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbkYsb0JBQW9CO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQUV2RDs7R0FFRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBQW5CO1FBQ0ksUUFBRyxHQUE2QixXQUFXLEVBQUUsQ0FBQyxPQUFRLENBQUM7UUFDdkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBbWpDakMsQ0FBQztJQWpqQ1UsT0FBTyxDQUFDLEdBQTZCO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLFdBQVcsRUFB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QUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hGLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxHQUFHLENB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QUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuSSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNaLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1gsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVoQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdkUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXZFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBVztZQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFXLEVBQUUsQ0FBVztZQUM3QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFXLEVBQUUsQ0FBVztZQUM3QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxQixJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVB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QUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQzFCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN6QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQzt3QkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO3dCQUNsRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNoQixHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNoQixHQUFHLEdBQUcsR0FBRyxDQUFDO3dCQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixNQUFNO29CQUNWLEtBQUssR0FBRzt3QkFDSixNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNiLE1BQU0sR0FBRyxHQUFHLENBQUM7d0JBQ2IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQzFCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN6QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQzt3QkFDRCxNQUFNLENBQUMsSUFBSSxD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QU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdyYXBoZW1lU3BsaXR0ZXIgZnJvbSAnZ3JhcGhlbWUtc3BsaXR0ZXInO1xuaW1wb3J0IHtcbiAgICBBSV9UQUJMRV9PRkZTRVQsXG4gICAgQUlfVEFCTEVfVEFHX0ZPTlRfU0laRSxcbiAgICBBSV9UQUJMRV9UQUdfUEFERElORyxcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfRk9OVF9XRUlHSFQsXG4gICAgREVGQVVMVF9URVhUX0FMSUdOX0NFTlRFUixcbiAgICBERUZBVUxUX1RFWFRfQUxJR05fTEVGVCxcbiAgICBERUZBVUxUX1RFWFRfREVDT1JBVElPTixcbiAgICBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fTUlERExFLFxuICAgIERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AsXG4gICAgREVGQVVMVF9XUkFQX1RFWFRfTUFYX1JPVyxcbiAgICBGT05UX1NJWkVfU00sXG4gICAgV2ViT3V0bGluZWRQYXRoXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBSVRhYmxlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuICAgIEFJVGFibGVBcmMsXG4gICAgQUlUYWJsZUF2YXRhclNpemUsXG4gICAgQUlUYWJsZUF2YXRhclR5cGUsXG4gICAgQUlUYWJsZUN0eFN0eWxlLFxuICAgIEFJVGFibGVJbWFnZSxcbiAgICBBSVRhYmxlTGFiZWwsXG4gICAgQUlUYWJsZUxpbmUsXG4gICAgQUlUYWJsZVJlY3QsXG4gICAgQUlUYWJsZVRleHQsXG4gICAgQUlUYWJsZVRleHRFbGxpcHNpcyxcbiAgICBBSVRhYmxlV3JhcFRleHQsXG4gICAgQUlUYWJsZVdyYXBUZXh0RGF0YVxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRUZXh0V2lkdGgsIGltYWdlQ2FjaGUsIHRleHREYXRhQ2FjaGUsIFRleHRNZWFzdXJlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG4vLyDnlKjkuo7mraPnoa7lnLDliIblibLlrZfnrKbkuLLvvIzljIXmi6zooajmg4XnrKblj7dcbmV4cG9ydCBjb25zdCBncmFwaGVtZVNwbGl0dGVyID0gbmV3IEdyYXBoZW1lU3BsaXR0ZXIoKTtcblxuLyoqXG4gKiDnlKjkuo7lnKggQ2FudmFzIOS4iui/m+ihjOeahOWQhOenjee7mOWbvuaTjeS9nO+8jOWMheWQq+S6huaWh+acrOe7mOWItuOAgeefqeW9oue7mOWItuOAgei3r+W+hOe7mOWItuS7peWPiuS4gOS6m+WHoOS9leiuoeeul+etieWKn+iDvVxuICovXG5leHBvcnQgY2xhc3MgRHJhd2VyIHtcbiAgICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IFRleHRNZWFzdXJlKCkuY29udGV4dCE7XG4gICAgbmVlZERyYXcgPSBmYWxzZTtcbiAgICBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuXG4gICAgcHVibGljIGluaXRDdHgoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcbiAgICAgICAgdGhpcy5uZWVkRHJhdyA9IEJvb2xlYW4oY3R4KTtcbiAgICAgICAgdGhpcy5jdHggPSBjdHggfHwgVGV4dE1lYXN1cmUoKS5jb250ZXh0ITtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRleHRCYXNlbGluZSDmjIflrprkuLogbWlkZGxl77yM5YW85a655rWP6KeI5Zmo5beu5byCXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fTUlERExFO1xuICAgIH1cblxuICAgIC8vIOiuvue9ruagt+W8j1xuICAgIHB1YmxpYyBzZXRTdHlsZShvcHRpb25zOiBBSVRhYmxlQ3R4U3R5bGUpIHtcbiAgICAgICAgY29uc3QgeyBmb250U2l6ZSwgZm9udFdlaWdodCwgZmlsbFN0eWxlLCBzdHJva2VTdHlsZSB9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoZm9udFNpemUgfHwgZm9udFdlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jdHguZm9udCA9IGAke2ZvbnRXZWlnaHQgfHwgREVGQVVMVF9GT05UX1dFSUdIVH0gJHtmb250U2l6ZSB8fCBERUZBVUxUX0ZPTlRfU0laRX1weCAke0RFRkFVTFRfRk9OVF9GQU1JTFl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsbFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZVN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g5paH5pys55yB55WlXG4gICAgcHVibGljIHRleHRFbGxpcHNpcyhvcHRpb25zOiBBSVRhYmxlVGV4dEVsbGlwc2lzKSB7XG4gICAgICAgIGNvbnN0IHsgdGV4dCwgbWF4V2lkdGgsIGZvbnRTaXplID0gREVGQVVMVF9GT05UX1NJWkUsIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hUIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIHRleHRXaWR0aDogMCxcbiAgICAgICAgICAgICAgICBpc0VsbGlwc2lzOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZm9udFN0eWxlID0gYCR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX1weCAke0RFRkFVTFRfRk9OVF9GQU1JTFl9YDtcblxuICAgICAgICBpZiAoIW1heFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgdGV4dFdpZHRoOiBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIHRleHQsIGZvbnRTdHlsZSksXG4gICAgICAgICAgICAgICAgaXNFbGxpcHNpczogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGxpcHNpcyA9ICfigKYnO1xuICAgICAgICBjb25zdCB0ZXh0U2l6ZSA9IHRleHQubGVuZ3RoO1xuICAgICAgICAvLyDpooTlhYjnoa7lrprkvKDlhaXmlofmnKznmoTpmIjlgLzlrr3luqZcbiAgICAgICAgbGV0IGd1ZXNzU2l6ZSA9IE1hdGguY2VpbChtYXhXaWR0aCAvIGZvbnRTaXplKTtcbiAgICAgICAgbGV0IGd1ZXNzVGV4dCA9IHRleHQuc3Vic3RyKDAsIGd1ZXNzU2l6ZSk7XG4gICAgICAgIGxldCBndWVzc1dpZHRoID0gZ2V0VGV4dFdpZHRoKHRoaXMuY3R4LCBndWVzc1RleHQsIGZvbnRTdHlsZSk7XG5cbiAgICAgICAgd2hpbGUgKGd1ZXNzV2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSA8PSBndWVzc1NpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0V2lkdGg6IGd1ZXNzV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGlzRWxsaXBzaXM6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGd1ZXNzU2l6ZSsrO1xuICAgICAgICAgICAgZ3Vlc3NUZXh0ID0gdGV4dC5zdWJzdHIoMCwgZ3Vlc3NTaXplKTtcbiAgICAgICAgICAgIGd1ZXNzV2lkdGggPSBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIGd1ZXNzVGV4dCwgZm9udFN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsbGlwc2lzV2lkdGggPSBnZXRUZXh0V2lkdGgodGhpcy5jdHgsIGVsbGlwc2lzLCBmb250U3R5bGUpO1xuICAgICAgICB3aGlsZSAoZ3Vlc3NTaXplID49IDAgJiYgZ3Vlc3NXaWR0aCArIGVsbGlwc2lzV2lkdGggPiBtYXhXaWR0aCkge1xuICAgICAgICAgICAgZ3Vlc3NTaXplLS07XG4gICAgICAgICAgICBndWVzc1RleHQgPSB0ZXh0LnN1YnN0cigwLCBndWVzc1NpemUpO1xuICAgICAgICAgICAgZ3Vlc3NXaWR0aCA9IGdldFRleHRXaWR0aCh0aGlzLmN0eCwgZ3Vlc3NUZXh0LCBmb250U3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IGAke2d1ZXNzVGV4dCB8fCB0ZXh0WzBdfSR7ZWxsaXBzaXN9YCxcbiAgICAgICAgICAgIHRleHRXaWR0aDogbWF4V2lkdGgsXG4gICAgICAgICAgICBpc0VsbGlwc2lzOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8g57uY5Yi257q/5q61XG4gICAgcHVibGljIGxpbmUob3B0aW9uczogQUlUYWJsZUxpbmUpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCBwb2ludHMsIHN0cm9rZSwgY2xvc2VkID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKHN0cm9rZSkgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICAgICAgdGhpcy5jdHgubW92ZVRvKHBvaW50c1swXSwgcG9pbnRzWzFdKTtcblxuICAgICAgICBmb3IgKGxldCBuID0gMjsgbiA8IGxlbmd0aDsgbiArPSAyKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8ocG9pbnRzW25dLCBwb2ludHNbbiArIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgfVxuXG4gICAgLy8g57uY5Yi25ZyGXG4gICAgcHVibGljIGFyYyhvcHRpb25zOiBBSVRhYmxlQXJjKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgc3Ryb2tlLCBmaWxsLCByYWRpdXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBpZiAoZmlsbCkgdGhpcy5zZXRTdHlsZSh7IGZpbGxTdHlsZTogZmlsbCB9KTtcbiAgICAgICAgaWYgKHN0cm9rZSkgdGhpcy5zZXRTdHlsZSh7IHN0cm9rZVN0eWxlOiBzdHJva2UgfSk7XG4gICAgICAgIHRoaXMuY3R4LmFyYyh4LCB5LCByYWRpdXMsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDnu5jliLbnn6nlvaJcbiAgICBwdWJsaWMgcmVjdChvcHRpb25zOiBBSVRhYmxlUmVjdCkge1xuICAgICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgZmlsbCwgc3Ryb2tlIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBpZiAoZmlsbCkgdGhpcy5zZXRTdHlsZSh7IGZpbGxTdHlsZTogZmlsbCB9KTtcbiAgICAgICAgaWYgKHN0cm9rZSkgdGhpcy5zZXRTdHlsZSh7IHN0cm9rZVN0eWxlOiBzdHJva2UgfSk7XG5cbiAgICAgICAgaWYgKCFyYWRpdXMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9wTGVmdCA9IDA7XG4gICAgICAgICAgICBsZXQgdG9wUmlnaHQgPSAwO1xuICAgICAgICAgICAgbGV0IGJvdHRvbUxlZnQgPSAwO1xuICAgICAgICAgICAgbGV0IGJvdHRvbVJpZ2h0ID0gMDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiByYWRpdXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdG9wTGVmdCA9IHRvcFJpZ2h0ID0gYm90dG9tTGVmdCA9IGJvdHRvbVJpZ2h0ID0gTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b3BMZWZ0ID0gTWF0aC5taW4ocmFkaXVzWzBdIHx8IDAsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgdG9wUmlnaHQgPSBNYXRoLm1pbihyYWRpdXNbMV0gfHwgMCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICBib3R0b21SaWdodCA9IE1hdGgubWluKHJhZGl1c1syXSB8fCAwLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQgPSBNYXRoLm1pbihyYWRpdXNbM10gfHwgMCwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHggKyB0b3BMZWZ0LCB5KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmxpbmVUbyh4ICsgd2lkdGggLSB0b3BSaWdodCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5hcmMoeCArIHdpZHRoIC0gdG9wUmlnaHQsIHkgKyB0b3BSaWdodCwgdG9wUmlnaHQsIChNYXRoLlBJICogMykgLyAyLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gYm90dG9tUmlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguYXJjKHggKyB3aWR0aCAtIGJvdHRvbVJpZ2h0LCB5ICsgaGVpZ2h0IC0gYm90dG9tUmlnaHQsIGJvdHRvbVJpZ2h0LCAwLCBNYXRoLlBJIC8gMiwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyBib3R0b21MZWZ0LCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmFyYyh4ICsgYm90dG9tTGVmdCwgeSArIGhlaWdodCAtIGJvdHRvbUxlZnQsIGJvdHRvbUxlZnQsIE1hdGguUEkgLyAyLCBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCwgeSArIHRvcExlZnQpO1xuICAgICAgICAgICAgdGhpcy5jdHguYXJjKHggKyB0b3BMZWZ0LCB5ICsgdG9wTGVmdCwgdG9wTGVmdCwgTWF0aC5QSSwgKE1hdGguUEkgKiAzKSAvIDIsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY3VzdG9tUmVjdChvcHRpb25zOiBBSVRhYmxlUmVjdCkge1xuICAgICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGwsIHN0cm9rZXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChmaWxsKSB0aGlzLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBmaWxsIH0pO1xuICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHN0cm9rZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0IH0gPSBzdHJva2VzO1xuICAgICAgICAgICAgLy8g5LiK6L655qGGXG4gICAgICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoeyBzdHJva2VTdHlsZTogdG9wID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyB3aWR0aCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIC8vIOWPs+i+ueahhlxuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKHsgc3Ryb2tlU3R5bGU6IHJpZ2h0ID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHggKyB3aWR0aCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgLy8g5LiL6L655qGGXG4gICAgICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoeyBzdHJva2VTdHlsZTogYm90dG9tID8/IHRoaXMuY29sb3JzLnRyYW5zcGFyZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHgsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIC8vIOW3pui+ueahhlxuICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKHsgc3Ryb2tlU3R5bGU6IGxlZnQgPz8gdGhpcy5jb2xvcnMudHJhbnNwYXJlbnQgfSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5saW5lVG8oeCwgeSArIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOaNouihjOaWh+acrOe7mOWItlxuICAgIHB1YmxpYyB3cmFwVGV4dChvcHRpb25zOiBBSVRhYmxlV3JhcFRleHQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0LFxuICAgICAgICAgICAgbWF4Um93ID0gREVGQVVMVF9XUkFQX1RFWFRfTUFYX1JPVyxcbiAgICAgICAgICAgIGZvbnRTaXplID0gREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICAgICBmaWxsU3R5bGUgPSB0aGlzLmNvbG9ycy5ncmF5ODAwLFxuICAgICAgICAgICAgdGV4dEFsaWduID0gREVGQVVMVF9URVhUX0FMSUdOX0xFRlQsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduID0gREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX1RPUCxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hULFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb24gPSBERUZBVUxUX1RFWFRfREVDT1JBVElPTixcbiAgICAgICAgICAgIGZpZWxkVHlwZSxcbiAgICAgICAgICAgIG5lZWREcmF3ID0gZmFsc2VcbiAgICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuICAgICAgICBjb25zdCBiYXNlbGluZU9mZnNldCA9IHZlcnRpY2FsQWxpZ24gPT09IERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AgPyBmb250U2l6ZSAvIDIgOiAwO1xuICAgICAgICBjb25zdCBmb250U3R5bGUgPSBgJHtmb250V2VpZ2h0fS0ke2ZvbnRTaXplfXB4YDtcbiAgICAgICAgY29uc3QgaXNVbmRlcmxpbmUgPSB0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZSc7XG4gICAgICAgIGNvbnN0IHRleHRSZW5kZXJlciA9ICh0ZXh0RGF0YUxpc3Q6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICB0ZXh0RGF0YUxpc3QuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb2Zmc2V0WCwgb2Zmc2V0WSwgdGV4dCwgd2lkdGgsIGxpbmtVcmwgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguZmlsbFRleHQodGV4dCwgeCArIG9mZnNldFgsIHkgKyBvZmZzZXRZICsgYmFzZWxpbmVPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5rVXJsIHx8IGlzVW5kZXJsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyBvZmZzZXRZICsgQUlfVEFCTEVfT0ZGU0VULFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBbMCwgZm9udFNpemUsIHdpZHRoLCBmb250U2l6ZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6IGZpbGxTdHlsZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZmlsbFN0eWxlKSB0aGlzLnNldFN0eWxlKHsgZmlsbFN0eWxlIH0pO1xuICAgICAgICB0aGlzLmN0eC50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtmb250U3R5bGV9LSR7bWF4Um93fS0ke21heFdpZHRoIHx8IDB9LSR7ZmllbGRUeXBlfS0ke3RleHR9YDtcbiAgICAgICAgY29uc3QgY2FjaGVUZXh0RGF0YSA9IHRleHREYXRhQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKGNhY2hlVGV4dERhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWREcmF3ICYmIG5lZWREcmF3KSB7XG4gICAgICAgICAgICAgICAgdGV4dFJlbmRlcmVyKGNhY2hlVGV4dERhdGEuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVUZXh0RGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGE6IEFJVGFibGVXcmFwVGV4dERhdGEgPSBbXTtcbiAgICAgICAgLy8g5YeG56Gu5YiH5YiG5YyF5ZCr6KGo5oOF56ym5Y+355qE5a2X56ym5LiyXG4gICAgICAgIGNvbnN0IGFyclRleHQgPSBncmFwaGVtZVNwbGl0dGVyLnNwbGl0R3JhcGhlbWVzKHRleHQpO1xuICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gYXJyVGV4dC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVsbGlwc2lzV2lkdGggPSB0aGlzLmN0eC5tZWFzdXJlVGV4dCgn4oCmJykud2lkdGg7XG4gICAgICAgIGxldCBzaG93VGV4dCA9ICcnOyAvLyDmr4/kuKrniYfmrrXmmL7npLrnmoTmlofmnKxcbiAgICAgICAgbGV0IHNob3dUZXh0V2lkdGggPSAwOyAvLyDmr4/mrrXnmoTlrr3luqZcbiAgICAgICAgbGV0IHNob3dMaW5lV2lkdGggPSAwOyAvLyDlvZPliY3mr4/ooYzmmL7npLrmloflrZfnmoTlrr3luqZcbiAgICAgICAgbGV0IHJvd0NvdW50ID0gMDtcblxuICAgICAgICBjb25zdCBpc0VsbGlwc2lzID0gdGhpcy50ZXh0RWxsaXBzaXMoeyB0ZXh0LCBtYXhXaWR0aDogbWF4V2lkdGggfSkuaXNFbGxpcHNpcztcblxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHRleHRMZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgY3VyVGV4dCA9IGFyclRleHRbbl07XG4gICAgICAgICAgICBjb25zdCBpc0xpbmVCcmVhayA9IFsnXFxuJywgJ1xcciddLmluY2x1ZGVzKGN1clRleHQpO1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVGV4dCA9IGlzTGluZUJyZWFrID8gJycgOiBjdXJUZXh0O1xuICAgICAgICAgICAgY29uc3QgY29tcG9zZVRleHQgPSBzaG93VGV4dCArIHNpbmdsZVRleHQ7XG4gICAgICAgICAgICBjb25zdCBpc0xpbWl0Um93ID0gbWF4Um93ID8gcm93Q291bnQgPj0gbWF4Um93IC0gMSA6IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVGV4dFdpZHRoID0gaXNMaW5lQnJlYWsgPyAwIDogdGhpcy5jdHgubWVhc3VyZVRleHQoc2luZ2xlVGV4dCkud2lkdGg7XG4gICAgICAgICAgICBzaG93TGluZVdpZHRoICs9IHNpbmdsZVRleHRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZXaWR0aCA9IGlzTGltaXRSb3cgPyBzaG93TGluZVdpZHRoICsgKGlzRWxsaXBzaXMgPyBlbGxpcHNpc1dpZHRoIDogMCkgOiBzaG93TGluZVdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNMaW5lRW5kID0gZGlmZldpZHRoID4gbWF4V2lkdGg7XG5cbiAgICAgICAgICAgIC8vIOmBh+WIsOaNouihjOespuaIluihjOWwvlxuICAgICAgICAgICAgaWYgKChpc0xpbmVFbmQgfHwgaXNMaW5lQnJlYWspICYmIHJvd0NvdW50IDwgbWF4Um93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0TGV0dGVyID0gbiA9PT0gYXJyVGV4dC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHJlc3VsdERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBNYXRoLmNlaWwoc2hvd1RleHRXaWR0aCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGlzTGltaXRSb3cgPyAoaXNMYXN0TGV0dGVyID8gY29tcG9zZVRleHQgOiBgJHtzaG93VGV4dH3igKZgKSA6IHNob3dUZXh0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2hvd1RleHQgPSBzaW5nbGVUZXh0O1xuICAgICAgICAgICAgICAgIG9mZnNldFggPSAwO1xuICAgICAgICAgICAgICAgIHNob3dUZXh0V2lkdGggPSBzaW5nbGVUZXh0V2lkdGg7XG4gICAgICAgICAgICAgICAgc2hvd0xpbmVXaWR0aCA9IHNpbmdsZVRleHRXaWR0aDtcblxuICAgICAgICAgICAgICAgIGlmIChpc0xpbWl0Um93KSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dUZXh0ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dDb3VudCsrO1xuICAgICAgICAgICAgICAgIG9mZnNldFkgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2hvd1RleHQgPSBjb21wb3NlVGV4dDtcbiAgICAgICAgICAgIHNob3dUZXh0V2lkdGggKz0gc2luZ2xlVGV4dFdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3dUZXh0KSB7XG4gICAgICAgICAgICByZXN1bHREYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKHNob3dUZXh0V2lkdGgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IHNob3dUZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWREcmF3ICYmIG5lZWREcmF3KSB7XG4gICAgICAgICAgICB0ZXh0UmVuZGVyZXIocmVzdWx0RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgICAgICBoZWlnaHQ6IHJvd0NvdW50IDwgbWF4Um93ID8gb2Zmc2V0WSArIGxpbmVIZWlnaHQgOiBvZmZzZXRZLFxuICAgICAgICAgICAgZGF0YTogcmVzdWx0RGF0YVxuICAgICAgICB9O1xuXG4gICAgICAgIHRleHREYXRhQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIOe7mOWItuWNleihjOaWh+acrFxuICAgIHB1YmxpYyB0ZXh0KG9wdGlvbnM6IEFJVGFibGVUZXh0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGZvbnRTaXplID0gREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgICAgICBmaWxsU3R5bGUgPSB0aGlzLmNvbG9ycy5ncmF5ODAwLFxuICAgICAgICAgICAgdGV4dEFsaWduID0gREVGQVVMVF9URVhUX0FMSUdOX0xFRlQsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduID0gREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX1RPUCxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQgPSBERUZBVUxUX0ZPTlRfV0VJR0hULFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb24gPSBERUZBVUxUX1RFWFRfREVDT1JBVElPTlxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICBjb25zdCBmb250U3R5bGUgPSBgJHtmb250V2VpZ2h0fSAke2ZvbnRTaXplfXB4ICR7REVGQVVMVF9GT05UX0ZBTUlMWX1gO1xuXG4gICAgICAgIGlmICh0ZXh0RGVjb3JhdGlvbiA9PT0gJ3VuZGVybGluZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGdldFRleHRXaWR0aCh0aGlzLmN0eCwgdGV4dCwgZm9udFN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMubGluZSh7XG4gICAgICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgICAgICB5OiB5ICsgQUlfVEFCTEVfT0ZGU0VULFxuICAgICAgICAgICAgICAgIHBvaW50czogWzAsIGZvbnRTaXplLCB0ZXh0V2lkdGgsIGZvbnRTaXplXSxcbiAgICAgICAgICAgICAgICBzdHJva2U6IGZpbGxTdHlsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlbGluZU9mZnNldCA9IHZlcnRpY2FsQWxpZ24gPT09IERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9UT1AgPyBmb250U2l6ZSAvIDIgOiAwO1xuICAgICAgICBpZiAoZmlsbFN0eWxlKSB0aGlzLnNldFN0eWxlKHsgZmlsbFN0eWxlIH0pO1xuICAgICAgICB0aGlzLmN0eC50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAgIHRoaXMuY3R4LmZvbnQgPSBmb250U3R5bGU7XG4gICAgICAgIHRoaXMuY3R4LmZpbGxUZXh0KHRleHQsIHgsIHkgKyBiYXNlbGluZU9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8g57uY5Yi25qCH562+XG4gICAgcHVibGljIHRhZyhvcHRpb25zOiBBSVRhYmxlTGFiZWwpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHJhZGl1cyxcbiAgICAgICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3JzLmdyYXk4MDAsXG4gICAgICAgICAgICBmb250U2l6ZSA9IEFJX1RBQkxFX1RBR19GT05UX1NJWkUsXG4gICAgICAgICAgICBmb250V2VpZ2h0ID0gREVGQVVMVF9GT05UX1dFSUdIVCxcbiAgICAgICAgICAgIHN0cm9rZVxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAvLyDog4zmma9cbiAgICAgICAgdGhpcy5yZWN0KHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICByYWRpdXMsXG4gICAgICAgICAgICBmaWxsOiBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgc3Ryb2tlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGV4dCh7XG4gICAgICAgICAgICB4OiB4ICsgQUlfVEFCTEVfVEFHX1BBRERJTkcsXG4gICAgICAgICAgICB5OiB5ICsgKGhlaWdodCAtIGZvbnRTaXplKSAvIDIsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgZmlsbFN0eWxlOiBjb2xvcixcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgZm9udFdlaWdodFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW1hZ2Uob3B0aW9uczogQUlUYWJsZUltYWdlLCBjcm9zc09yaWdpbj86IGJvb2xlYW4sIGFsbG93RGVmYXVsdD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB1cmwsIHdpZHRoLCBoZWlnaHQsIG9wYWNpdHkgPSAxLCBjbGlwRnVuYyB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgY29sb3JzID0gQUlUYWJsZS5nZXRDb2xvcnMoKTtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlQ2FjaGUuZ2V0SW1hZ2UodXJsKTtcbiAgICAgICAgLy8gTm90IGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgaWYgKGltYWdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKGFsbG93RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0aCh7XG4gICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgIHk6IHkgKyAyLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBXZWJPdXRsaW5lZFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDE2LFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBjb2xvcnMuZ3JheTYwMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVubG9hZGVkXG4gICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1hZ2VDYWNoZS5sb2FkSW1hZ2UodXJsLCB1cmwsIHsgY3Jvc3NPcmlnaW4gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNPcmlnaW4gPSBvcGFjaXR5ID09PSAxO1xuXG4gICAgICAgIGlmICghY2xpcEZ1bmMgJiYgaXNPcmlnaW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN0eC5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjbGlwRnVuYyAmJiAhaXNPcmlnaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShpbWFnZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xpcEZ1bmMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY2xpcEZ1bmModGhpcy5jdHgpO1xuICAgICAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGltYWdlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhdmF0YXIob3B0aW9uczoge1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgIHR5cGU/OiBBSVRhYmxlQXZhdGFyVHlwZTtcbiAgICAgICAgc2l6ZT86IEFJVGFibGVBdmF0YXJTaXplO1xuICAgICAgICBvcGFjaXR5PzogbnVtYmVyO1xuICAgICAgICBiZ0NvbG9yPzogc3RyaW5nO1xuICAgIH0pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeCA9IDAsXG4gICAgICAgICAgICB5ID0gMCxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBiZ0NvbG9yID0gdGhpcy5jb2xvcnMud2hpdGUsXG4gICAgICAgICAgICBzaXplID0gQUlUYWJsZUF2YXRhclNpemUuc2l6ZTM2LFxuICAgICAgICAgICAgdHlwZSA9IEFJVGFibGVBdmF0YXJUeXBlLm1lbWJlcixcbiAgICAgICAgICAgIG9wYWNpdHkgPSAxXG4gICAgICAgIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICh0aXRsZSA9PSBudWxsIHx8IGlkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgICAgICBjb25zdCBhdmF0YXJTcmMgPSB1cmwgfHwgJyc7XG4gICAgICAgIGNvbnN0IGF2YXRhck5hbWUgPSB0aXRsZTtcbiAgICAgICAgY29uc3QgYXZhdGFyQmcgPSBhdmF0YXJTcmMgPyBjb2xvcnMud2hpdGUgOiBiZ0NvbG9yO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBBSVRhYmxlQXZhdGFyVHlwZS5tZW1iZXI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSBzaXplIC8gMjtcbiAgICAgICAgICAgICAgICBpZiAoIWF2YXRhclNyYykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBhdmF0YXJCZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmFyYyh4ICsgcmFkaXVzLCB5ICsgcmFkaXVzLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhdmF0YXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiBERUZBVUxUX1RFWFRfQUxJR05fQ0VOVEVSLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBGT05UX1NJWkVfU00sXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IGNvbG9ycy53aGl0ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdmF0YXJTcmMsXG4gICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgICAgIHVybDogYXZhdGFyU3JjLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICAgICAgICAgICAgICBjbGlwRnVuYzogKGN0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGF2YXRhckJnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyh4ICsgcmFkaXVzLCB5ICsgcmFkaXVzLCByYWRpdXMsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmlrnms5XlsIbmpK3lnIblvKfnmoTnq6/ngrnlj4LmlbDljJblvaLlvI/ovazmjaLkuLrkuK3lv4Plj4LmlbDljJblvaLlvI9cbiAgICAgKiDmjqXlj5flvKfnur/nmoTnq6/ngrnlj4LmlbDvvIzlubborqHnrpflh7rlvKfnur/nmoTkuK3lv4PngrnlnZDmoIfjgIHotbflp4vop5LluqbjgIHnu4jmraLop5LluqbnrYnlj4LmlbBcbiAgICAgKiDov5Tlm57lgLzvvJrkuIDkuKrljIXlkKvkuK3lv4PngrnlnZDmoIfjgIHljYrlvoTjgIHml4vovazop5LluqbjgIHotbflp4vop5Lluqbku6Xlj4rop5Lluqblt67nmoTlr7nosaHvvIzov5nkupvlj4LmlbDlj6/ku6Xnm7TmjqXnlKjkuo7nu5jliLbmpK3lnIblvKdcbiAgICAgKiBAcmV0dXJucyBbY3gsIGN5LCByeCwgcnksIHRoZXRhLCBkVGhldGEsIHBzaSwgZnNdXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oXG4gICAgICAgIHgxOiBudW1iZXIsXG4gICAgICAgIHkxOiBudW1iZXIsXG4gICAgICAgIHgyOiBudW1iZXIsXG4gICAgICAgIHkyOiBudW1iZXIsXG4gICAgICAgIGZhOiBhbnksXG4gICAgICAgIGZzOiBudW1iZXIsXG4gICAgICAgIHJ4OiBudW1iZXIsXG4gICAgICAgIHJ5OiBudW1iZXIsXG4gICAgICAgIHBzaURlZzogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBzaSA9IHBzaURlZyAqIChNYXRoLlBJIC8gMTgwLjApO1xuICAgICAgICBjb25zdCB4cCA9IChNYXRoLmNvcyhwc2kpICogKHgxIC0geDIpKSAvIDIuMCArIChNYXRoLnNpbihwc2kpICogKHkxIC0geTIpKSAvIDIuMDtcbiAgICAgICAgY29uc3QgeXAgPSAoLTEgKiBNYXRoLnNpbihwc2kpICogKHgxIC0geDIpKSAvIDIuMCArIChNYXRoLmNvcyhwc2kpICogKHkxIC0geTIpKSAvIDIuMDtcblxuICAgICAgICBjb25zdCBsYW1iZGEgPSAoeHAgKiB4cCkgLyAocnggKiByeCkgKyAoeXAgKiB5cCkgLyAocnkgKiByeSk7XG5cbiAgICAgICAgaWYgKGxhbWJkYSA+IDEpIHtcbiAgICAgICAgICAgIHJ4ICo9IE1hdGguc3FydChsYW1iZGEpO1xuICAgICAgICAgICAgcnkgKj0gTWF0aC5zcXJ0KGxhbWJkYSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZiA9IE1hdGguc3FydCgocnggKiByeCAqIChyeSAqIHJ5KSAtIHJ4ICogcnggKiAoeXAgKiB5cCkgLSByeSAqIHJ5ICogKHhwICogeHApKSAvIChyeCAqIHJ4ICogKHlwICogeXApICsgcnkgKiByeSAqICh4cCAqIHhwKSkpO1xuXG4gICAgICAgIGlmIChmYSA9PT0gZnMpIHtcbiAgICAgICAgICAgIGYgKj0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGYpKSB7XG4gICAgICAgICAgICBmID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN4cCA9IChmICogcnggKiB5cCkgLyByeTtcbiAgICAgICAgY29uc3QgY3lwID0gKGYgKiAtcnkgKiB4cCkgLyByeDtcblxuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIuMCArIE1hdGguY29zKHBzaSkgKiBjeHAgLSBNYXRoLnNpbihwc2kpICogY3lwO1xuICAgICAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDIuMCArIE1hdGguc2luKHBzaSkgKiBjeHAgKyBNYXRoLmNvcyhwc2kpICogY3lwO1xuXG4gICAgICAgIGNvbnN0IHZNYWcgPSBmdW5jdGlvbiAodjogbnVtYmVyW10pIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZSYXRpbyA9IGZ1bmN0aW9uICh1OiBudW1iZXJbXSwgdjogbnVtYmVyW10pIHtcbiAgICAgICAgICAgIHJldHVybiAodVswXSAqIHZbMF0gKyB1WzFdICogdlsxXSkgLyAodk1hZyh1KSAqIHZNYWcodikpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2QW5nbGUgPSBmdW5jdGlvbiAodTogbnVtYmVyW10sIHY6IG51bWJlcltdKSB7XG4gICAgICAgICAgICByZXR1cm4gKHVbMF0gKiB2WzFdIDwgdVsxXSAqIHZbMF0gPyAtMSA6IDEpICogTWF0aC5hY29zKHZSYXRpbyh1LCB2KSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRoZXRhID0gdkFuZ2xlKFsxLCAwXSwgWyh4cCAtIGN4cCkgLyByeCwgKHlwIC0gY3lwKSAvIHJ5XSk7XG4gICAgICAgIGNvbnN0IHUgPSBbKHhwIC0gY3hwKSAvIHJ4LCAoeXAgLSBjeXApIC8gcnldO1xuICAgICAgICBjb25zdCB2ID0gWygtMSAqIHhwIC0gY3hwKSAvIHJ4LCAoLTEgKiB5cCAtIGN5cCkgLyByeV07XG4gICAgICAgIGxldCBkVGhldGEgPSB2QW5nbGUodSwgdik7XG5cbiAgICAgICAgaWYgKHZSYXRpbyh1LCB2KSA8PSAtMSkge1xuICAgICAgICAgICAgZFRoZXRhID0gTWF0aC5QSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodlJhdGlvKHUsIHYpID49IDEpIHtcbiAgICAgICAgICAgIGRUaGV0YSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZzID09PSAwICYmIGRUaGV0YSA+IDApIHtcbiAgICAgICAgICAgIGRUaGV0YSA9IGRUaGV0YSAtIDIgKiBNYXRoLlBJO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcyA9PT0gMSAmJiBkVGhldGEgPCAwKSB7XG4gICAgICAgICAgICBkVGhldGEgPSBkVGhldGEgKyAyICogTWF0aC5QSTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2N4LCBjeSwgcngsIHJ5LCB0aGV0YSwgZFRoZXRhLCBwc2ksIGZzXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfkuKTkuKrngrkgKHgxLCB5MSkg5ZKMICh4MiwgeTIpIOS5i+mXtOeahOebtOe6v+i3neemu1xuICAgICAqIEByZXR1cm5zIOS4pOS4queCuSAoeDEsIHkxKSDlkowgKHgyLCB5Mikg5LmL6Ze055qE55u057q/6Led56a777yM5Y2V5L2N5LiO6L6T5YWl55qE5Z2Q5qCH5YC855u45ZCMXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaW5lTGVuZ3RoKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+S4ieasoei0neWhnuWwlOabsue6v+S4iue7meWumuWPguaVsCB0IOWvueW6lOeahOeCueeahOWdkOaghy5cbiAgICAgKiDlj6/ku6XlnKjmjIflrprnmoQgdCDlj4LmlbDkuIvorqHnrpflh7rmm7Lnur/kuIrnsr7noa7nmoTkuIDkuKrngrnvvIzov5nkuKrngrnlj6/ku6XnlKjkuo7nu5jliLblubPmu5Hmm7Lnur/nmoTkuIDpg6jliIZcbiAgICAgKiBAcGFyYW0gcGN0IC0gMCDliLAgMSDkuYvpl7TnmoTlj4LmlbDvvIznlKjkuo7mjIflrprmm7Lnur/kuIrnmoTngrnnmoTkvY3nva5cbiAgICAgKiBAcGFyYW0gUDF4IC0g5puy57q/55qE6LW354K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAxeSAtIOabsue6v+eahOi1t+eCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSBQMnggLSDmm7Lnur/nmoTnrKzkuIDkuKrmjqfliLbngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDJ5IC0g5puy57q/55qE56ys5LiA5Liq5o6n5Yi254K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAzeCAtIOabsue6v+eahOesrOS6jOS4quaOp+WItueCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBQM3kgLSDmm7Lnur/nmoTnrKzkuozkuKrmjqfliLbngrkgeSDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDR4IC0g5puy57q/55qE57uI54K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFA0eSAtIOabsue6v+eahOe7iOeCuSB5IOWdkOagh1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRQb2ludE9uQ3ViaWNCZXppZXIoXG4gICAgICAgIHBjdDogbnVtYmVyLFxuICAgICAgICBQMXg6IG51bWJlcixcbiAgICAgICAgUDF5OiBudW1iZXIsXG4gICAgICAgIFAyeDogbnVtYmVyLFxuICAgICAgICBQMnk6IG51bWJlcixcbiAgICAgICAgUDN4OiBudW1iZXIsXG4gICAgICAgIFAzeTogbnVtYmVyLFxuICAgICAgICBQNHg6IG51bWJlcixcbiAgICAgICAgUDR5OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgZnVuY3Rpb24gQ0IxKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHQgKiB0ICogdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIENCMih0OiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAzICogdCAqIHQgKiAoMSAtIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gQ0IzKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIDMgKiB0ICogKDEgLSB0KSAqICgxIC0gdCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBDQjQodDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKDEgLSB0KSAqICgxIC0gdCkgKiAoMSAtIHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeCA9IFA0eCAqIENCMShwY3QpICsgUDN4ICogQ0IyKHBjdCkgKyBQMnggKiBDQjMocGN0KSArIFAxeCAqIENCNChwY3QpO1xuICAgICAgICBjb25zdCB5ID0gUDR5ICogQ0IxKHBjdCkgKyBQM3kgKiBDQjIocGN0KSArIFAyeSAqIENCMyhwY3QpICsgUDF5ICogQ0I0KHBjdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5LqM5qyh6LSd5aGe5bCU5puy57q/5LiK57uZ5a6a5Y+C5pWwIHQg5a+55bqU55qE54K555qE5Z2Q5qCHXG4gICAgICogQHBhcmFtIHBjdCAtIDAg5YiwIDEg5LmL6Ze055qE5Y+C5pWw77yM55So5LqO5oyH5a6a5puy57q/5LiK55qE54K555qE5L2N572uXG4gICAgICogQHBhcmFtIFAxeCAtIOabsue6v+eahOi1t+eCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBQMXkgLSDmm7Lnur/nmoTotbfngrkgeSDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDJ4IC0g5puy57q/55qE5o6n5Yi254K5IHgg5Z2Q5qCHXG4gICAgICogQHBhcmFtIFAyeSAtIOabsue6v+eahOaOp+WItueCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSBQM3ggLSDmm7Lnur/nmoTnu4jngrkgeCDlnZDmoIdcbiAgICAgKiBAcGFyYW0gUDN5IC0g5puy57q/55qE57uI54K5IHkg5Z2Q5qCHXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBvaW50T25RdWFkcmF0aWNCZXppZXIocGN0OiBudW1iZXIsIFAxeDogbnVtYmVyLCBQMXk6IG51bWJlciwgUDJ4OiBudW1iZXIsIFAyeTogbnVtYmVyLCBQM3g6IG51bWJlciwgUDN5OiBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gUUIxKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHQgKiB0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gUUIyKHQ6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiB0ICogKDEgLSB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIFFCMyh0OiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoMSAtIHQpICogKDEgLSB0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHggPSBQM3ggKiBRQjEocGN0KSArIFAyeCAqIFFCMihwY3QpICsgUDF4ICogUUIzKHBjdCk7XG4gICAgICAgIGNvbnN0IHkgPSBQM3kgKiBRQjEocGN0KSArIFAyeSAqIFFCMihwY3QpICsgUDF5ICogUUIzKHBjdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5qSt5ZyG5byn5LiK57uZ5a6a6KeS5bqmIM64IOWvueW6lOeahOeCueeahOWdkOagh1xuICAgICAqIEBwYXJhbSBjeCAtIOakreWchueahOS4reW/g+eCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSBjeSAtIOakreWchueahOS4reW/g+eCuSB5IOWdkOagh1xuICAgICAqIEBwYXJhbSByeCAtIOakreWchueahCB4IOi9tOWNiuW+hFxuICAgICAqIEBwYXJhbSByeSAtIOakreWchueahCB5IOi9tOWNiuW+hFxuICAgICAqIEBwYXJhbSB0aGV0YSAtIOakreWchuW8p+eahOi1t+Wni+inkuW6plxuICAgICAqIEBwYXJhbSBwc2kgLSDmpK3lnIblvKfnmoTml4vovazop5LluqZcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMoY3g6IG51bWJlciwgY3k6IG51bWJlciwgcng6IG51bWJlciwgcnk6IG51bWJlciwgdGhldGE6IG51bWJlciwgcHNpOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY29zUHNpID0gTWF0aC5jb3MocHNpKTtcbiAgICAgICAgY29uc3Qgc2luUHNpID0gTWF0aC5zaW4ocHNpKTtcbiAgICAgICAgY29uc3QgcHQgPSB7XG4gICAgICAgICAgICB4OiByeCAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgICAgIHk6IHJ5ICogTWF0aC5zaW4odGhldGEpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBjeCArIChwdC54ICogY29zUHNpIC0gcHQueSAqIHNpblBzaSksXG4gICAgICAgICAgICB5OiBjeSArIChwdC54ICogc2luUHNpICsgcHQueSAqIGNvc1BzaSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfln7rkuo7kuI3lkIzot6/lvoTlkb3ku6TnmoTplb/luqZcbiAgICAgKiBAcGFyYW0geCAtIOi1t+eCuSB4IOWdkOagh1xuICAgICAqIEBwYXJhbSB5IC0g6LW354K5IHkg5Z2Q5qCHXG4gICAgICogQHBhcmFtIGNtZCAtIOi3r+W+hOWRveS7pFxuICAgICAqIEBwYXJhbSBwb2ludHMgLSDkuI7ot6/lvoTlkb3ku6Tnm7jlhbPnmoTngrnnmoTlnZDmoIfmiJbmjqfliLblj4LmlbBcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHByaXZhdGUgY2FsY0xlbmd0aCh4OiBudW1iZXIsIHk6IG51bWJlciwgY21kOiBzdHJpbmcsIHBvaW50czogbnVtYmVyW10pIHtcbiAgICAgICAgbGV0IGxlbiwgcDEsIHAyLCB0O1xuXG4gICAgICAgIHN3aXRjaCAoY21kKSB7XG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lTGVuZ3RoKHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdKTtcbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgIGxlbiA9IDAuMDtcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMuZ2V0UG9pbnRPbkN1YmljQmV6aWVyKDAsIHgsIHksIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdLCBwb2ludHNbNV0pO1xuICAgICAgICAgICAgICAgIGZvciAodCA9IDAuMDE7IHQgPD0gMTsgdCArPSAwLjAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHAyID0gdGhpcy5nZXRQb2ludE9uQ3ViaWNCZXppZXIodCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1s1XSk7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW47XG4gICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBsZW4gPSAwLjA7XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmdldFBvaW50T25RdWFkcmF0aWNCZXppZXIoMCwgeCwgeSwgcG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTtcbiAgICAgICAgICAgICAgICBmb3IgKHQgPSAwLjAxOyB0IDw9IDE7IHQgKz0gMC4wMSkge1xuICAgICAgICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPblF1YWRyYXRpY0Jlemllcih0LCB4LCB5LCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10pO1xuICAgICAgICAgICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgICAgICAgICBwMSA9IHAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuO1xuICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgbGVuID0gMC4wO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gcG9pbnRzWzRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRUaGV0YSA9IHBvaW50c1s1XTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBwb2ludHNbNF0gKyBkVGhldGE7XG4gICAgICAgICAgICAgICAgbGV0IGluYyA9IE1hdGguUEkgLyAxODAuMDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoc3RhcnQgLSBlbmQpIDwgaW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIGluYyA9IE1hdGguYWJzKHN0YXJ0IC0gZW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgc3RhcnQsIDApO1xuICAgICAgICAgICAgICAgIGlmIChkVGhldGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodCA9IHN0YXJ0IC0gaW5jOyB0ID4gZW5kOyB0IC09IGluYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgdCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodCA9IHN0YXJ0ICsgaW5jOyB0IDwgZW5kOyB0ICs9IGluYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSB0aGlzLmdldFBvaW50T25FbGxpcHRpY2FsQXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgdCwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gdGhpcy5nZXRMaW5lTGVuZ3RoKHAxLngsIHAxLnksIHAyLngsIHAyLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMuZ2V0UG9pbnRPbkVsbGlwdGljYWxBcmMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdLCBlbmQsIDApO1xuICAgICAgICAgICAgICAgIGxlbiArPSB0aGlzLmdldExpbmVMZW5ndGgocDEueCwgcDEueSwgcDIueCwgcDIueSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDop6PmnpAgU1ZHIOi3r+W+hOaVsOaNruWtl+espuS4su+8jOWwhuWFtui9rOaNouS4uuS4gOS4quWMheWQq+i3r+W+hOWRveS7pOWSjOWdkOagh+eCueeahOaVsOe7hOWvueixoVxuICAgICAqIEBwYXJhbSBkYXRhIC0gU1ZHIOi3r+W+hOaVsOaNruWtl+espuS4slxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVBhdGhEYXRhKGRhdGE6IHN0cmluZykge1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjcyA9IGRhdGE7XG4gICAgICAgIGNvbnN0IGNjID0gWydtJywgJ00nLCAnbCcsICdMJywgJ3YnLCAnVicsICdoJywgJ0gnLCAneicsICdaJywgJ2MnLCAnQycsICdxJywgJ1EnLCAndCcsICdUJywgJ3MnLCAnUycsICdhJywgJ0EnXTtcblxuICAgICAgICBjcyA9IGNzLnJlcGxhY2UobmV3IFJlZ0V4cCgnICcsICdnJyksICcsJyk7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgY2MubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGNzID0gY3MucmVwbGFjZShuZXcgUmVnRXhwKGNjW25dLCAnZycpLCAnfCcgKyBjY1tuXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyID0gY3Muc3BsaXQoJ3wnKTtcbiAgICAgICAgY29uc3QgY2E6IGFueSA9IFtdO1xuICAgICAgICBjb25zdCBjb29yZHM6IGFueSA9IFtdO1xuICAgICAgICBsZXQgY3B4ID0gMDtcbiAgICAgICAgbGV0IGNweSA9IDA7XG5cbiAgICAgICAgY29uc3QgcmUgPSAvKFstK10/KChcXGQrXFwuXFxkKyl8KChcXGQrKXwoXFwuXFxkKykpKSg/OmVbLStdP1xcZCspPykvZ2k7XG4gICAgICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICAgICAgZm9yIChsZXQgbiA9IDE7IG4gPCBhcnIubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBhcnJbbl07XG4gICAgICAgICAgICBsZXQgYyA9IHN0ci5jaGFyQXQoMCk7XG4gICAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIGNvb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlLmV4ZWMoc3RyKSkpIHtcbiAgICAgICAgICAgICAgICBjb29yZHMucHVzaChtYXRjaFswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHA6IGFueSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamxlbiA9IGNvb3Jkcy5sZW5ndGg7IGogPCBqbGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29vcmRzW2pdID09PSAnMDAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHAucHVzaCgwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQoY29vcmRzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcC5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcC5wdXNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKHAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihwWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY21kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRzOiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFggPSBjcHg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRZID0gY3B5O1xuICAgICAgICAgICAgICAgIGxldCBwcmV2Q21kLCBjdGxQdHgsIGN0bFB0eTtcbiAgICAgICAgICAgICAgICBsZXQgcngsIHJ5LCBwc2ksIGZhLCBmcywgeDEsIHkxO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IGR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IGR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ00nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhLmxlbmd0aCA+IDIgJiYgY2FbY2EubGVuZ3RoIC0gMV0uY29tbWFuZCA9PT0gJ3onKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gY2EubGVuZ3RoIC0gMjsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYVtpZHhdLmNvbW1hbmQgPT09ICdNJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gY2FbaWR4XS5wb2ludHNbMF0gKyBkeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IGNhW2lkeF0ucG9pbnRzWzFdICsgZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnbCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKGNweCwgY3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHAuc2hpZnQoKSwgcC5zaGlmdCgpLCBwLnNoaWZ0KCksIHAuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHggKyBwLnNoaWZ0KCksIGNweSArIHAuc2hpZnQoKSwgY3B4ICsgcC5zaGlmdCgpLCBjcHkgKyBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnQyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q21kID0gY2FbY2EubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNtZC5jb21tYW5kID09PSAnQycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHggKyAoY3B4IC0gcHJldkNtZC5wb2ludHNbMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweSArIChjcHkgLSBwcmV2Q21kLnBvaW50c1szXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgcC5zaGlmdCgpLCBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR5ID0gY3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNtZCA9IGNhW2NhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDbWQuY29tbWFuZCA9PT0gJ0MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4ICsgKGNweCAtIHByZXZDbWQucG9pbnRzWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHkgKyAoY3B5IC0gcHJldkNtZC5wb2ludHNbM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3RsUHR4LCBjdGxQdHksIGNweCArIHAuc2hpZnQoKSwgY3B5ICsgcC5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweCArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2gocC5zaGlmdCgpLCBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goY3B4ICsgcC5zaGlmdCgpLCBjcHkgKyBwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnUSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjcHgsIGNweSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q21kID0gY2FbY2EubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNtZC5jb21tYW5kID09PSAnUScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHggPSBjcHggKyAoY3B4IC0gcHJldkNtZC5wb2ludHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bFB0eSA9IGNweSArIChjcHkgLSBwcmV2Q21kLnBvaW50c1sxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHkgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnUSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR5ID0gY3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNtZCA9IGNhW2NhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDbWQuY29tbWFuZCA9PT0gJ1EnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsUHR4ID0gY3B4ICsgKGNweCAtIHByZXZDbWQucG9pbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGxQdHkgPSBjcHkgKyAoY3B5IC0gcHJldkNtZC5wb2ludHNbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNweSArPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnUSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChjdGxQdHgsIGN0bFB0eSwgY3B4LCBjcHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnggPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByeSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzaSA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4MSA9IGNweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gY3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B4ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21kID0gJ0EnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gdGhpcy5jb252ZXJ0RW5kcG9pbnRUb0NlbnRlclBhcmFtZXRlcml6YXRpb24oeDEsIHkxLCBjcHgsIGNweSwgZmEsIGZzLCByeCwgcnksIHBzaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgICAgICAgICAgICAgICAgICByeCA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ5ID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHNpID0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmEgPSBwLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcyA9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxID0gY3B4O1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSBjcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcHggKz0gcC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3B5ICs9IHAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdBJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IHRoaXMuY29udmVydEVuZHBvaW50VG9DZW50ZXJQYXJhbWV0ZXJpemF0aW9uKHgxLCB5MSwgY3B4LCBjcHksIGZhLCBmcywgcngsIHJ5LCBwc2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2EucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGNtZCB8fCBjLFxuICAgICAgICAgICAgICAgICAgICBwb2ludHM6IHBvaW50cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHN0YXJ0WCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHN0YXJ0WVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoOiB0aGlzLmNhbGNMZW5ndGgoc3RhcnRYLCBzdGFydFksIGNtZCB8fCBjLCBwb2ludHMpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjID09PSAneicgfHwgYyA9PT0gJ1onKSB7XG4gICAgICAgICAgICAgICAgY2EucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICd6JyxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aDogMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagueaNruS8oOWFpeeahOi3r+W+hOaVsOaNriBkYXRhIOWcqOeUu+W4g+S4iue7mOWItui3r+W+hFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHBhdGgob3B0aW9uczogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgZGF0YTogc3RyaW5nOyBzaXplPzogbnVtYmVyOyBzY2FsZVg/OiBudW1iZXI7IHNjYWxlWT86IG51bWJlcjsgZmlsbDogc3RyaW5nIH0pIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCBzY2FsZVggPSAxLCBzY2FsZVkgPSAxLCBkYXRhLCBmaWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhQXJyYXkgPSB0aGlzLnBhcnNlUGF0aERhdGEoZGF0YSk7XG5cbiAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gZmlsbDtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgICAgICB0aGlzLmN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGRhdGFBcnJheS5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGRhdGFBcnJheVtuXS5jb21tYW5kO1xuICAgICAgICAgICAgY29uc3QgcCA9IGRhdGFBcnJheVtuXS5wb2ludHM7XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgubGluZVRvKHBbMF0sIHBbMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgubW92ZVRvKHBbMF0sIHBbMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguYmV6aWVyQ3VydmVUbyhwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnF1YWRyYXRpY0N1cnZlVG8ocFswXSwgcFsxXSwgcFsyXSwgcFszXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjeCA9IHBbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN5ID0gcFsxXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnggPSBwWzJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByeSA9IHBbM107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoZXRhID0gcFs0XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZFRoZXRhID0gcFs1XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNpID0gcFs2XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnMgPSBwWzddO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gcnggPiByeSA/IHJ4IDogcnk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlWCA9IHJ4ID4gcnkgPyAxIDogcnggLyByeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVZID0gcnggPiByeSA/IHJ5IC8gcnggOiAxO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yb3RhdGUocHNpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5hcmMoMCwgMCwgciwgdGhldGEsIHRoZXRhICsgZFRoZXRhLCAoMSAtIGZzKSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgucm90YXRlKC1wc2kpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoLWN4LCAtY3kpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3onOlxuICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBkcmF3ZXIgPSBuZXcgRHJhd2VyKCk7XG4iXX0=