@stemy/ngx-utils 10.2.44 → 10.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +27 -27
  2. package/bundles/stemy-ngx-utils.umd.js +5654 -5640
  3. package/bundles/stemy-ngx-utils.umd.js.map +1 -1
  4. package/bundles/stemy-ngx-utils.umd.min.js +1 -1
  5. package/bundles/stemy-ngx-utils.umd.min.js.map +1 -1
  6. package/esm2015/ngx-utils/common-types.js +111 -111
  7. package/esm2015/ngx-utils/components/dynamic-table/dynamic-table.component.js +139 -139
  8. package/esm2015/ngx-utils/components/pagination-menu/pagination-menu.component.js +96 -96
  9. package/esm2015/ngx-utils/components/unordered-list/unordered-list.component.js +51 -51
  10. package/esm2015/ngx-utils/directives/async-method.directive.js +58 -58
  11. package/esm2015/ngx-utils/directives/background.directive.js +51 -51
  12. package/esm2015/ngx-utils/directives/dynamic-table-template.directive.js +19 -19
  13. package/esm2015/ngx-utils/directives/global-template.directive.js +27 -27
  14. package/esm2015/ngx-utils/directives/icon.directive.js +59 -59
  15. package/esm2015/ngx-utils/directives/ngx-template-outlet.directive.js +88 -88
  16. package/esm2015/ngx-utils/directives/pagination-item.directive.js +33 -33
  17. package/esm2015/ngx-utils/directives/pagination.directive.js +76 -71
  18. package/esm2015/ngx-utils/directives/resource-if.directive.js +51 -51
  19. package/esm2015/ngx-utils/directives/sticky-class.directive.js +35 -35
  20. package/esm2015/ngx-utils/directives/sticky.directive.js +48 -48
  21. package/esm2015/ngx-utils/directives/unordered-list-item.directive.js +70 -70
  22. package/esm2015/ngx-utils/directives/unordered-list-template.directive.js +26 -26
  23. package/esm2015/ngx-utils/ngx-utils.module.js +232 -232
  24. package/esm2015/ngx-utils/pipes/chunk.pipe.js +21 -21
  25. package/esm2015/ngx-utils/pipes/entries.pipe.js +24 -24
  26. package/esm2015/ngx-utils/pipes/extra-item-properties.pipe.js +27 -27
  27. package/esm2015/ngx-utils/pipes/filter.pipe.js +38 -38
  28. package/esm2015/ngx-utils/pipes/find.pipe.js +25 -25
  29. package/esm2015/ngx-utils/pipes/format-number.pipe.js +19 -19
  30. package/esm2015/ngx-utils/pipes/get-offset.pipe.js +13 -13
  31. package/esm2015/ngx-utils/pipes/get-type.pipe.js +12 -12
  32. package/esm2015/ngx-utils/pipes/global-template.pipe.js +35 -35
  33. package/esm2015/ngx-utils/pipes/group-by.pipe.js +23 -23
  34. package/esm2015/ngx-utils/pipes/is-type.pipe.js +12 -12
  35. package/esm2015/ngx-utils/pipes/join.pipe.js +15 -15
  36. package/esm2015/ngx-utils/pipes/keys.pipe.js +18 -18
  37. package/esm2015/ngx-utils/pipes/map.pipe.js +25 -25
  38. package/esm2015/ngx-utils/pipes/max.pipe.js +22 -22
  39. package/esm2015/ngx-utils/pipes/min.pipe.js +22 -22
  40. package/esm2015/ngx-utils/pipes/reduce.pipe.js +26 -26
  41. package/esm2015/ngx-utils/pipes/remap.pipe.js +28 -28
  42. package/esm2015/ngx-utils/pipes/replace.pipe.js +12 -12
  43. package/esm2015/ngx-utils/pipes/reverse.pipe.js +20 -20
  44. package/esm2015/ngx-utils/pipes/round.pipe.js +19 -19
  45. package/esm2015/ngx-utils/pipes/safe-html.pipe.js +32 -32
  46. package/esm2015/ngx-utils/pipes/translate.pipe.js +81 -81
  47. package/esm2015/ngx-utils/pipes/values.pipe.js +18 -18
  48. package/esm2015/ngx-utils/plugins/resize-event.plugin.js +59 -59
  49. package/esm2015/ngx-utils/plugins/scroll-event.plugin.js +52 -52
  50. package/esm2015/ngx-utils/services/acl.service.js +78 -78
  51. package/esm2015/ngx-utils/services/api.service.js +35 -35
  52. package/esm2015/ngx-utils/services/auth.service.js +14 -14
  53. package/esm2015/ngx-utils/services/base-http.client.js +46 -46
  54. package/esm2015/ngx-utils/services/base-http.service.js +274 -274
  55. package/esm2015/ngx-utils/services/config.service.js +95 -95
  56. package/esm2015/ngx-utils/services/error-handler.service.js +49 -49
  57. package/esm2015/ngx-utils/services/events.service.js +24 -24
  58. package/esm2015/ngx-utils/services/formatter.service.js +44 -44
  59. package/esm2015/ngx-utils/services/global-template.service.js +35 -35
  60. package/esm2015/ngx-utils/services/icon.service.js +24 -24
  61. package/esm2015/ngx-utils/services/language.service.js +117 -117
  62. package/esm2015/ngx-utils/services/open-api.service.js +41 -41
  63. package/esm2015/ngx-utils/services/promise.service.js +49 -49
  64. package/esm2015/ngx-utils/services/state.service.js +143 -143
  65. package/esm2015/ngx-utils/services/static-language.service.js +144 -144
  66. package/esm2015/ngx-utils/services/storage.service.js +48 -48
  67. package/esm2015/ngx-utils/services/toaster.service.js +29 -29
  68. package/esm2015/ngx-utils/services/translated-url.serializer.js +70 -70
  69. package/esm2015/ngx-utils/services/universal.service.js +73 -73
  70. package/esm2015/ngx-utils/utils/ajax-request-handler.js +40 -40
  71. package/esm2015/ngx-utils/utils/array.utils.js +100 -90
  72. package/esm2015/ngx-utils/utils/auth.guard.js +153 -153
  73. package/esm2015/ngx-utils/utils/canvas.utils.js +388 -388
  74. package/esm2015/ngx-utils/utils/date.utils.js +28 -28
  75. package/esm2015/ngx-utils/utils/file.utils.js +90 -90
  76. package/esm2015/ngx-utils/utils/generic-value.js +20 -20
  77. package/esm2015/ngx-utils/utils/geometry.js +132 -132
  78. package/esm2015/ngx-utils/utils/initializer.js +17 -17
  79. package/esm2015/ngx-utils/utils/loader.utils.js +55 -55
  80. package/esm2015/ngx-utils/utils/math.utils.js +15 -15
  81. package/esm2015/ngx-utils/utils/object.utils.js +248 -248
  82. package/esm2015/ngx-utils/utils/observable.utils.js +63 -63
  83. package/esm2015/ngx-utils/utils/reflect.utils.js +33 -33
  84. package/esm2015/ngx-utils/utils/set.utils.js +20 -20
  85. package/esm2015/ngx-utils/utils/string.utils.js +28 -28
  86. package/esm2015/ngx-utils/utils/timer.utils.js +52 -52
  87. package/esm2015/ngx-utils/utils/unique.utils.js +24 -24
  88. package/esm2015/ngx-utils/utils/vector.js +77 -77
  89. package/esm2015/public_api.js +83 -83
  90. package/esm2015/stemy-ngx-utils.js +7 -7
  91. package/fesm2015/stemy-ngx-utils.js +4552 -4537
  92. package/fesm2015/stemy-ngx-utils.js.map +1 -1
  93. package/ngx-utils/common-types.d.ts +284 -284
  94. package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +43 -43
  95. package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +28 -28
  96. package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +22 -22
  97. package/ngx-utils/directives/async-method.directive.d.ts +16 -16
  98. package/ngx-utils/directives/background.directive.d.ts +14 -14
  99. package/ngx-utils/directives/dynamic-table-template.directive.d.ts +8 -8
  100. package/ngx-utils/directives/global-template.directive.d.ts +10 -10
  101. package/ngx-utils/directives/icon.directive.d.ts +20 -20
  102. package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +14 -14
  103. package/ngx-utils/directives/pagination-item.directive.d.ts +12 -12
  104. package/ngx-utils/directives/pagination.directive.d.ts +22 -21
  105. package/ngx-utils/directives/resource-if.directive.d.ts +16 -16
  106. package/ngx-utils/directives/sticky-class.directive.d.ts +12 -12
  107. package/ngx-utils/directives/sticky.directive.d.ts +16 -16
  108. package/ngx-utils/directives/unordered-list-item.directive.d.ts +25 -25
  109. package/ngx-utils/directives/unordered-list-template.directive.d.ts +10 -10
  110. package/ngx-utils/ngx-utils.module.d.ts +76 -76
  111. package/ngx-utils/pipes/chunk.pipe.d.ts +4 -4
  112. package/ngx-utils/pipes/entries.pipe.d.ts +9 -9
  113. package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +5 -5
  114. package/ngx-utils/pipes/filter.pipe.d.ts +5 -5
  115. package/ngx-utils/pipes/find.pipe.d.ts +5 -5
  116. package/ngx-utils/pipes/format-number.pipe.d.ts +7 -7
  117. package/ngx-utils/pipes/get-offset.pipe.d.ts +4 -4
  118. package/ngx-utils/pipes/get-type.pipe.d.ts +4 -4
  119. package/ngx-utils/pipes/global-template.pipe.d.ts +13 -13
  120. package/ngx-utils/pipes/group-by.pipe.d.ts +5 -5
  121. package/ngx-utils/pipes/is-type.pipe.d.ts +4 -4
  122. package/ngx-utils/pipes/join.pipe.d.ts +4 -4
  123. package/ngx-utils/pipes/keys.pipe.d.ts +4 -4
  124. package/ngx-utils/pipes/map.pipe.d.ts +5 -5
  125. package/ngx-utils/pipes/max.pipe.d.ts +4 -4
  126. package/ngx-utils/pipes/min.pipe.d.ts +4 -4
  127. package/ngx-utils/pipes/reduce.pipe.d.ts +5 -5
  128. package/ngx-utils/pipes/remap.pipe.d.ts +4 -4
  129. package/ngx-utils/pipes/replace.pipe.d.ts +4 -4
  130. package/ngx-utils/pipes/reverse.pipe.d.ts +4 -4
  131. package/ngx-utils/pipes/round.pipe.d.ts +7 -7
  132. package/ngx-utils/pipes/safe-html.pipe.d.ts +7 -7
  133. package/ngx-utils/pipes/translate.pipe.d.ts +15 -15
  134. package/ngx-utils/pipes/values.pipe.d.ts +4 -4
  135. package/ngx-utils/plugins/resize-event.plugin.d.ts +10 -10
  136. package/ngx-utils/plugins/scroll-event.plugin.d.ts +11 -11
  137. package/ngx-utils/services/acl.service.d.ts +12 -12
  138. package/ngx-utils/services/api.service.d.ts +14 -14
  139. package/ngx-utils/services/auth.service.d.ts +8 -8
  140. package/ngx-utils/services/base-http.client.d.ts +12 -12
  141. package/ngx-utils/services/base-http.service.d.ts +42 -42
  142. package/ngx-utils/services/config.service.d.ts +21 -21
  143. package/ngx-utils/services/error-handler.service.d.ts +10 -10
  144. package/ngx-utils/services/events.service.d.ts +11 -11
  145. package/ngx-utils/services/formatter.service.d.ts +12 -12
  146. package/ngx-utils/services/global-template.service.d.ts +16 -16
  147. package/ngx-utils/services/icon.service.d.ts +10 -10
  148. package/ngx-utils/services/language.service.d.ts +18 -18
  149. package/ngx-utils/services/open-api.service.d.ts +8 -8
  150. package/ngx-utils/services/promise.service.d.ts +15 -15
  151. package/ngx-utils/services/state.service.d.ts +41 -41
  152. package/ngx-utils/services/static-language.service.d.ts +41 -41
  153. package/ngx-utils/services/storage.service.d.ts +12 -12
  154. package/ngx-utils/services/toaster.service.d.ts +10 -10
  155. package/ngx-utils/services/translated-url.serializer.d.ts +16 -16
  156. package/ngx-utils/services/universal.service.d.ts +24 -24
  157. package/ngx-utils/utils/ajax-request-handler.d.ts +11 -11
  158. package/ngx-utils/utils/array.utils.d.ts +10 -9
  159. package/ngx-utils/utils/auth.guard.d.ts +26 -26
  160. package/ngx-utils/utils/canvas.utils.d.ts +13 -13
  161. package/ngx-utils/utils/date.utils.d.ts +8 -8
  162. package/ngx-utils/utils/file.utils.d.ts +14 -14
  163. package/ngx-utils/utils/generic-value.d.ts +8 -8
  164. package/ngx-utils/utils/geometry.d.ts +50 -50
  165. package/ngx-utils/utils/initializer.d.ts +11 -11
  166. package/ngx-utils/utils/loader.utils.d.ts +7 -7
  167. package/ngx-utils/utils/math.utils.d.ts +5 -5
  168. package/ngx-utils/utils/object.utils.d.ts +31 -31
  169. package/ngx-utils/utils/observable.utils.d.ts +12 -12
  170. package/ngx-utils/utils/reflect.utils.d.ts +9 -9
  171. package/ngx-utils/utils/set.utils.d.ts +4 -4
  172. package/ngx-utils/utils/string.utils.d.ts +7 -7
  173. package/ngx-utils/utils/timer.utils.d.ts +6 -6
  174. package/ngx-utils/utils/unique.utils.d.ts +5 -5
  175. package/ngx-utils/utils/vector.d.ts +23 -23
  176. package/package.json +1 -1
  177. package/public_api.d.ts +82 -82
  178. package/stemy-ngx-utils.d.ts +6 -6
  179. package/stemy-ngx-utils.metadata.json +1 -1
  180. package/tools/circular.js +116 -116
  181. package/tools/config.js +78 -78
  182. package/tools/icons.js +13 -13
@@ -1,388 +1,388 @@
1
- import { CanvasColor } from "../common-types";
2
- import { ObjectUtils } from "./object.utils";
3
- class BlurStack {
4
- constructor() {
5
- this.r = 0;
6
- this.g = 0;
7
- this.b = 0;
8
- this.a = 0;
9
- this.next = null;
10
- }
11
- }
12
- const mul_table = [
13
- 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512,
14
- 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512,
15
- 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456,
16
- 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512,
17
- 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328,
18
- 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456,
19
- 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335,
20
- 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512,
21
- 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405,
22
- 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328,
23
- 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271,
24
- 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456,
25
- 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388,
26
- 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335,
27
- 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292,
28
- 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259
29
- ];
30
- const shg_table = [
31
- 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
32
- 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
33
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
34
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
35
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
36
- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
37
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
38
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
39
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
40
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
41
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
42
- 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
43
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
44
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
45
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
46
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
47
- ];
48
- export class CanvasUtils {
49
- static manipulatePixels(canvas, ctx, colorTransformer) {
50
- const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
51
- const pixels = imgData.data;
52
- for (let i = 0, n = pixels.length; i < n; i += 4) {
53
- const clr = new CanvasColor(pixels[i], pixels[i + 1], pixels[i + 2], pixels[i + 3]);
54
- const greyscale = clr.r * .3 + clr.g * .59 + clr.b * .11;
55
- const color = colorTransformer(clr, greyscale);
56
- pixels[i] = color.r;
57
- pixels[i + 1] = color.g;
58
- pixels[i + 2] = color.b;
59
- pixels[i + 3] = color.a;
60
- }
61
- ctx.putImageData(imgData, 0, 0);
62
- }
63
- static thresholding(canvas, ctx, threshold = 50, colorTransformer) {
64
- const min = new CanvasColor(0, 0, 0, 255);
65
- const max = new CanvasColor(0, 0, 0, 0);
66
- colorTransformer = ObjectUtils.isFunction(colorTransformer) ? colorTransformer : ((color, limit) => {
67
- return limit ? max : min;
68
- });
69
- CanvasUtils.manipulatePixels(canvas, ctx, (color, greyscale) => {
70
- return colorTransformer(color, greyscale > threshold, greyscale);
71
- });
72
- }
73
- static stackBlur(canvas, ctx, radius = 10) {
74
- if (isNaN(radius) || radius < 1)
75
- return;
76
- radius |= 0;
77
- const top_x = 0;
78
- const top_y = 0;
79
- const width = canvas.width;
80
- const height = canvas.height;
81
- let imageData = null;
82
- try {
83
- try {
84
- imageData = ctx.getImageData(top_x, top_y, width, height);
85
- }
86
- catch (e) {
87
- // NOTE: this part is supposedly only needed if you want to work with local files
88
- // so it might be okay to remove the whole try/catch block and just use
89
- // imageData = ctx.getImageData( top_x, top_y, width, height );
90
- try {
91
- netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
92
- imageData = ctx.getImageData(top_x, top_y, width, height);
93
- }
94
- catch (e) {
95
- alert("Cannot access local image");
96
- throw new Error("unable to access local image data: " + e);
97
- }
98
- }
99
- }
100
- catch (e) {
101
- alert("Cannot access image");
102
- throw new Error("unable to access image data: " + e);
103
- }
104
- const pixels = imageData.data;
105
- let x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs;
106
- const div = radius + radius + 1;
107
- const widthMinus1 = width - 1;
108
- const heightMinus1 = height - 1;
109
- const radiusPlus1 = radius + 1;
110
- const sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
111
- const stackStart = new BlurStack();
112
- let stackEnd = null;
113
- let stack = stackStart;
114
- for (i = 1; i < div; i++) {
115
- stack = stack.next = new BlurStack();
116
- if (i == radiusPlus1) {
117
- stackEnd = stack;
118
- }
119
- }
120
- stack.next = stackStart;
121
- let stackIn = null;
122
- let stackOut = null;
123
- yw = yi = 0;
124
- const mul_sum = mul_table[radius];
125
- const shg_sum = shg_table[radius];
126
- for (y = 0; y < height; y++) {
127
- r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
128
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
129
- g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
130
- b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
131
- a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
132
- r_sum += sumFactor * pr;
133
- g_sum += sumFactor * pg;
134
- b_sum += sumFactor * pb;
135
- a_sum += sumFactor * pa;
136
- stack = stackStart;
137
- for (i = 0; i < radiusPlus1; i++) {
138
- stack.r = pr;
139
- stack.g = pg;
140
- stack.b = pb;
141
- stack.a = pa;
142
- stack = stack.next;
143
- }
144
- for (i = 1; i < radiusPlus1; i++) {
145
- p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
146
- r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
147
- g_sum += (stack.g = (pg = pixels[p + 1])) * rbs;
148
- b_sum += (stack.b = (pb = pixels[p + 2])) * rbs;
149
- a_sum += (stack.a = (pa = pixels[p + 3])) * rbs;
150
- r_in_sum += pr;
151
- g_in_sum += pg;
152
- b_in_sum += pb;
153
- a_in_sum += pa;
154
- stack = stack.next;
155
- }
156
- stackIn = stackStart;
157
- stackOut = stackEnd;
158
- for (x = 0; x < width; x++) {
159
- pixels[yi + 3] = pa = (a_sum * mul_sum) >> shg_sum;
160
- if (pa != 0) {
161
- pa = 255 / pa;
162
- pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;
163
- pixels[yi + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
164
- pixels[yi + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
165
- }
166
- else {
167
- pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
168
- }
169
- r_sum -= r_out_sum;
170
- g_sum -= g_out_sum;
171
- b_sum -= b_out_sum;
172
- a_sum -= a_out_sum;
173
- r_out_sum -= stackIn.r;
174
- g_out_sum -= stackIn.g;
175
- b_out_sum -= stackIn.b;
176
- a_out_sum -= stackIn.a;
177
- p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
178
- r_in_sum += (stackIn.r = pixels[p]);
179
- g_in_sum += (stackIn.g = pixels[p + 1]);
180
- b_in_sum += (stackIn.b = pixels[p + 2]);
181
- a_in_sum += (stackIn.a = pixels[p + 3]);
182
- r_sum += r_in_sum;
183
- g_sum += g_in_sum;
184
- b_sum += b_in_sum;
185
- a_sum += a_in_sum;
186
- stackIn = stackIn.next;
187
- r_out_sum += (pr = stackOut.r);
188
- g_out_sum += (pg = stackOut.g);
189
- b_out_sum += (pb = stackOut.b);
190
- a_out_sum += (pa = stackOut.a);
191
- r_in_sum -= pr;
192
- g_in_sum -= pg;
193
- b_in_sum -= pb;
194
- a_in_sum -= pa;
195
- stackOut = stackOut.next;
196
- yi += 4;
197
- }
198
- yw += width;
199
- }
200
- for (x = 0; x < width; x++) {
201
- g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
202
- yi = x << 2;
203
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
204
- g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
205
- b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
206
- a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
207
- r_sum += sumFactor * pr;
208
- g_sum += sumFactor * pg;
209
- b_sum += sumFactor * pb;
210
- a_sum += sumFactor * pa;
211
- stack = stackStart;
212
- for (i = 0; i < radiusPlus1; i++) {
213
- stack.r = pr;
214
- stack.g = pg;
215
- stack.b = pb;
216
- stack.a = pa;
217
- stack = stack.next;
218
- }
219
- yp = width;
220
- for (i = 1; i <= radius; i++) {
221
- yi = (yp + x) << 2;
222
- r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
223
- g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;
224
- b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;
225
- a_sum += (stack.a = (pa = pixels[yi + 3])) * rbs;
226
- r_in_sum += pr;
227
- g_in_sum += pg;
228
- b_in_sum += pb;
229
- a_in_sum += pa;
230
- stack = stack.next;
231
- if (i < heightMinus1) {
232
- yp += width;
233
- }
234
- }
235
- yi = x;
236
- stackIn = stackStart;
237
- stackOut = stackEnd;
238
- for (y = 0; y < height; y++) {
239
- p = yi << 2;
240
- pixels[p + 3] = pa = (a_sum * mul_sum) >> shg_sum;
241
- if (pa > 0) {
242
- pa = 255 / pa;
243
- pixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;
244
- pixels[p + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
245
- pixels[p + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
246
- }
247
- else {
248
- pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;
249
- }
250
- r_sum -= r_out_sum;
251
- g_sum -= g_out_sum;
252
- b_sum -= b_out_sum;
253
- a_sum -= a_out_sum;
254
- r_out_sum -= stackIn.r;
255
- g_out_sum -= stackIn.g;
256
- b_out_sum -= stackIn.b;
257
- a_out_sum -= stackIn.a;
258
- p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
259
- r_sum += (r_in_sum += (stackIn.r = pixels[p]));
260
- g_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));
261
- b_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));
262
- a_sum += (a_in_sum += (stackIn.a = pixels[p + 3]));
263
- stackIn = stackIn.next;
264
- r_out_sum += (pr = stackOut.r);
265
- g_out_sum += (pg = stackOut.g);
266
- b_out_sum += (pb = stackOut.b);
267
- a_out_sum += (pa = stackOut.a);
268
- r_in_sum -= pr;
269
- g_in_sum -= pg;
270
- b_in_sum -= pb;
271
- a_in_sum -= pa;
272
- stackOut = stackOut.next;
273
- yi += width;
274
- }
275
- }
276
- ctx.putImageData(imageData, top_x, top_y);
277
- }
278
- static measureTextFontSize(maxWidth, maxHeight, lines, font, lineHeightPercent = 1.1, canvas) {
279
- const startSize = maxHeight;
280
- const context = canvas.getContext("2d");
281
- if (!canvas) {
282
- canvas = document.createElement("canvas");
283
- document.body.appendChild(canvas);
284
- }
285
- canvas.width = maxWidth + maxHeight;
286
- canvas.height = maxHeight * 2;
287
- let fontSize = CanvasUtils.halveValidateFontSize(startSize, (size) => {
288
- CanvasUtils.setFontProps(context, font, size);
289
- const maxTextLinesWidth = CanvasUtils.getTextWidth(context, lines);
290
- return maxWidth - maxTextLinesWidth;
291
- });
292
- const bitmapHeight = CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent);
293
- if (bitmapHeight > maxHeight) {
294
- fontSize = CanvasUtils.halveValidateFontSize(fontSize, (size) => {
295
- return maxHeight - CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, size, lineHeightPercent);
296
- });
297
- }
298
- return fontSize;
299
- }
300
- static drawLines(context, lines, font, size, lineHeightPercent = 1.1, align = "left", baseLine = "top", x = 0, y = 0) {
301
- CanvasUtils.setFontProps(context, font, size, align, baseLine);
302
- for (let i = 0; i < lines.length; i++) {
303
- const line = lines[i];
304
- context.fillText(line, x, y);
305
- if (i < lines.length - 1) {
306
- y += size * lineHeightPercent;
307
- }
308
- }
309
- return y;
310
- }
311
- static wrapText(context, text, x, y, maxWidth) {
312
- const words = text.split(" ");
313
- const lineHeight = context.measureText("M").width * 1.3;
314
- const lines = [];
315
- let line = "";
316
- for (let n = 0; n < words.length; n++) {
317
- const testLine = line + words[n] + " ";
318
- const metrics = context.measureText(testLine);
319
- const testWidth = metrics.width;
320
- if (testWidth > maxWidth && n > 0) {
321
- lines.push(line);
322
- line = words[n] + " ";
323
- }
324
- else {
325
- line = testLine;
326
- }
327
- }
328
- lines.push(line);
329
- y -= lineHeight * .5 * lines.length;
330
- lines.forEach(l => {
331
- context.fillText(l, x, y);
332
- y += lineHeight;
333
- });
334
- }
335
- static setFontProps(context, font, fontSize, align = "left", baseLine = "top") {
336
- context.font = `${fontSize}px ${font}`;
337
- context.textAlign = align;
338
- context.textBaseline = baseLine;
339
- }
340
- static getTextWidth(context, lines) {
341
- let maxWidth = 0;
342
- for (let i = 0; i < lines.length; i++) {
343
- const line = lines[i];
344
- maxWidth = Math.max(maxWidth, context.measureText(line).width);
345
- }
346
- return maxWidth;
347
- }
348
- static getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent) {
349
- const width = canvas.width;
350
- const height = canvas.height;
351
- context.clearRect(0, 0, width, height);
352
- const textY = CanvasUtils.drawLines(context, lines, font, fontSize, lineHeightPercent, "left", "top", fontSize * .5, fontSize * .5);
353
- const imageData = context.getImageData(0, 0, width, height);
354
- let textHeight = 0;
355
- yLoop: for (let y = 0; y < height; y++) {
356
- for (let x = 0; x < width; x++) {
357
- const index = (x + y * width) * 4;
358
- if (imageData.data[index + 3] > 0) {
359
- textHeight = y + 1;
360
- continue yLoop;
361
- }
362
- }
363
- }
364
- return Math.max(textHeight, textY + fontSize);
365
- }
366
- static halveValidateFontSize(startSize, callback) {
367
- let fontSize = startSize;
368
- let lastFontSize = 0;
369
- let direction;
370
- for (let i = 0; i < 20; i++) {
371
- direction = callback(fontSize);
372
- const tempSize = fontSize;
373
- if (direction < 0) {
374
- fontSize = fontSize - (Math.abs(fontSize - lastFontSize) / 2);
375
- }
376
- else {
377
- fontSize = fontSize + (Math.abs(fontSize - lastFontSize) / 2);
378
- }
379
- lastFontSize = tempSize;
380
- if (Math.abs(fontSize - lastFontSize) < 0.1) {
381
- break;
382
- }
383
- }
384
- fontSize = Math.floor(fontSize);
385
- return fontSize;
386
- }
387
- }
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3N0ZW15L1dvcmsvbmd4LXV0aWxzL3NyYy8iLCJzb3VyY2VzIjpbIm5neC11dGlscy91dGlscy9jYW52YXMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUkzQyxNQUFNLFNBQVM7SUFBZjtRQUNJLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1FBQ2QsTUFBQyxHQUFXLENBQUMsQ0FBQztRQUNkLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxTQUFJLEdBQWMsSUFBSSxDQUFDO0lBQzNCLENBQUM7Q0FBQTtBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2QsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQUMsQ0FBQztBQUUvRSxNQUFNLFNBQVMsR0FBRztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDN0QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFF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VSxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsUUFBa0M7UUFDdEYsSUFBSSxRQUFRLEdBQVcsU0FBUyxDQUFDO1FBQ2pDLElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztRQUM3QixJQUFJLFNBQWlCLENBQUM7UUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sUUFBUSxHQUFXLFFBQVEsQ0FBQztZQUNsQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2YsUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNILFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNqRTtZQUNELFlBQVksR0FBRyxRQUFRLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3pDLE1BQU07YUFDVDtTQUNKO1FBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDYW52YXNDb2xvcn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LnV0aWxzXCI7XG5cbmRlY2xhcmUgY29uc3QgbmV0c2NhcGU6IGFueTtcblxuY2xhc3MgQmx1clN0YWNrIHtcbiAgICByOiBudW1iZXIgPSAwO1xuICAgIGc6IG51bWJlciA9IDA7XG4gICAgYjogbnVtYmVyID0gMDtcbiAgICBhOiBudW1iZXIgPSAwO1xuICAgIG5leHQ6IEJsdXJTdGFjayA9IG51bGw7XG59XG5cbmNvbnN0IG11bF90YWJsZSA9IFtcbiAgICA1MTIsIDUxMiwgNDU2LCA1MTIsIDMyOCwgNDU2LCAzMzUsIDUxMiwgNDA1LCAzMjgsIDI3MSwgNDU2LCAzODgsIDMzNSwgMjkyLCA1MTIsXG4gICAgNDU0LCA0MDUsIDM2NCwgMzI4LCAyOTgsIDI3MSwgNDk2LCA0NTYsIDQyMCwgMzg4LCAzNjAsIDMzNSwgMzEyLCAyOTIsIDI3MywgNTEyLFxuICAgIDQ4MiwgNDU0LCA0MjgsIDQwNSwgMzgzLCAzNjQsIDM0NSwgMzI4LCAzMTIsIDI5OCwgMjg0LCAyNzEsIDI1OSwgNDk2LCA0NzUsIDQ1NixcbiAgICA0MzcsIDQyMCwgNDA0LCAzODgsIDM3NCwgMzYwLCAzNDcsIDMzNSwgMzIzLCAzMTIsIDMwMiwgMjkyLCAyODIsIDI3MywgMjY1LCA1MTIsXG4gICAgNDk3LCA0ODIsIDQ2OCwgNDU0LCA0NDEsIDQyOCwgNDE3LCA0MDUsIDM5NCwgMzgzLCAzNzMsIDM2NCwgMzU0LCAzNDUsIDMzNywgMzI4LFxuICAgIDMyMCwgMzEyLCAzMDUsIDI5OCwgMjkxLCAyODQsIDI3OCwgMjcxLCAyNjUsIDI1OSwgNTA3LCA0OTYsIDQ4NSwgNDc1LCA0NjUsIDQ1NixcbiAgICA0NDYsIDQzNywgNDI4LCA0MjAsIDQxMiwgNDA0LCAzOTYsIDM4OCwgMzgxLCAzNzQsIDM2NywgMzYwLCAzNTQsIDM0NywgMzQxLCAzMzUsXG4gICAgMzI5LCAzMjMsIDMxOCwgMzEyLCAzMDcsIDMwMiwgMjk3LCAyOTIsIDI4NywgMjgyLCAyNzgsIDI3MywgMjY5LCAyNjUsIDI2MSwgNTEyLFxuICAgIDUwNSwgNDk3LCA0ODksIDQ4MiwgNDc1LCA0NjgsIDQ2MSwgNDU0LCA0NDcsIDQ0MSwgNDM1LCA0MjgsIDQyMiwgNDE3LCA0MTEsIDQwNSxcbiAgICAzOTksIDM5NCwgMzg5LCAzODMsIDM3OCwgMzczLCAzNjgsIDM2NCwgMzU5LCAzNTQsIDM1MCwgMzQ1LCAzNDEsIDMzNywgMzMyLCAzMjgsXG4gICAgMzI0LCAzMjAsIDMxNiwgMzEyLCAzMDksIDMwNSwgMzAxLCAyOTgsIDI5NCwgMjkxLCAyODcsIDI4NCwgMjgxLCAyNzgsIDI3NCwgMjcxLFxuICAgIDI2OCwgMjY1LCAyNjIsIDI1OSwgMjU3LCA1MDcsIDUwMSwgNDk2LCA0OTEsIDQ4NSwgNDgwLCA0NzUsIDQ3MCwgNDY1LCA0NjAsIDQ1NixcbiAgICA0NTEsIDQ0NiwgNDQyLCA0MzcsIDQzMywgNDI4LCA0MjQsIDQyMCwgNDE2LCA0MTIsIDQwOCwgNDA0LCA0MDAsIDM5NiwgMzkyLCAzODgsXG4gICAgMzg1LCAzODEsIDM3NywgMzc0LCAzNzAsIDM2NywgMzYzLCAzNjAsIDM1NywgMzU0LCAzNTAsIDM0NywgMzQ0LCAzNDEsIDMzOCwgMzM1LFxuICAgIDMzMiwgMzI5LCAzMjYsIDMyMywgMzIwLCAzMTgsIDMxNSwgMzEyLCAzMTAsIDMwNywgMzA0LCAzMDIsIDI5OSwgMjk3LCAyOTQsIDI5MixcbiAgICAyODksIDI4NywgMjg1LCAyODIsIDI4MCwgMjc4LCAyNzUsIDI3MywgMjcxLCAyNjksIDI2NywgMjY1LCAyNjMsIDI2MSwgMjU5XTtcblxuY29uc3Qgc2hnX3RhYmxlID0gW1xuICAgIDksIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsXG4gICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksXG4gICAgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsXG4gICAgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjEsXG4gICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsXG4gICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXG4gICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsXG4gICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNF07XG5cbmV4cG9ydCBjbGFzcyBDYW52YXNVdGlscyB7XG5cbiAgICBzdGF0aWMgbWFuaXB1bGF0ZVBpeGVscyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgY29sb3JUcmFuc2Zvcm1lcjogKGNvbG9yOiBDYW52YXNDb2xvciwgZ3JleXNjYWxlPzogbnVtYmVyKSA9PiBDYW52YXNDb2xvcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWdEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBpbWdEYXRhLmRhdGE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gcGl4ZWxzLmxlbmd0aDsgaSA8IG47IGkgKz0gNCkge1xuICAgICAgICAgICAgY29uc3QgY2xyID0gbmV3IENhbnZhc0NvbG9yKHBpeGVsc1tpXSwgcGl4ZWxzW2kgKyAxXSwgcGl4ZWxzW2kgKyAyXSwgcGl4ZWxzW2kgKyAzXSk7XG4gICAgICAgICAgICBjb25zdCBncmV5c2NhbGUgPSBjbHIuciAqIC4zICsgY2xyLmcgKiAuNTkgKyBjbHIuYiAqIC4xMTtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JUcmFuc2Zvcm1lcihjbHIsIGdyZXlzY2FsZSk7XG4gICAgICAgICAgICBwaXhlbHNbaV0gPSBjb2xvci5yO1xuICAgICAgICAgICAgcGl4ZWxzW2kgKyAxXSA9IGNvbG9yLmc7XG4gICAgICAgICAgICBwaXhlbHNbaSArIDJdID0gY29sb3IuYjtcbiAgICAgICAgICAgIHBpeGVsc1tpICsgM10gPSBjb2xvci5hO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHRocmVzaG9sZGluZyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgdGhyZXNob2xkOiBudW1iZXIgPSA1MCwgY29sb3JUcmFuc2Zvcm1lcjogKGNvbG9yOiBDYW52YXNDb2xvciwgbGltaXQ6IGJvb2xlYW4sIGdyZXlzY2FsZT86IG51bWJlcikgPT4gQ2FudmFzQ29sb3IpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWluID0gbmV3IENhbnZhc0NvbG9yKDAsIDAsIDAsIDI1NSk7XG4gICAgICAgIGNvbnN0IG1heCA9IG5ldyBDYW52YXNDb2xvcigwLCAwLCAwLCAwKTtcbiAgICAgICAgY29sb3JUcmFuc2Zvcm1lciA9IE9iamVjdFV0aWxzLmlzRnVuY3Rpb24oY29sb3JUcmFuc2Zvcm1lcikgPyBjb2xvclRyYW5zZm9ybWVyIDogKChjb2xvcjogQ2FudmFzQ29sb3IsIGxpbWl0OiBib29sZWFuKTogQ2FudmFzQ29sb3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxpbWl0ID8gbWF4IDogbWluO1xuICAgICAgICB9KTtcbiAgICAgICAgQ2FudmFzVXRpbHMubWFuaXB1bGF0ZVBpeGVscyhjYW52YXMsIGN0eCwgKGNvbG9yLCBncmV5c2NhbGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb2xvclRyYW5zZm9ybWVyKGNvbG9yLCBncmV5c2NhbGUgPiB0aHJlc2hvbGQsIGdyZXlzY2FsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdGFja0JsdXIoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHJhZGl1czogbnVtYmVyID0gMTApOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDwgMSkgcmV0dXJuO1xuICAgICAgICByYWRpdXMgfD0gMDtcblxuICAgICAgICBjb25zdCB0b3BfeCA9IDA7XG4gICAgICAgIGNvbnN0IHRvcF95ID0gMDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG5cbiAgICAgICAgbGV0IGltYWdlRGF0YSA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSh0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gTk9URTogdGhpcyBwYXJ0IGlzIHN1cHBvc2VkbHkgb25seSBuZWVkZWQgaWYgeW91IHdhbnQgdG8gd29yayB3aXRoIGxvY2FsIGZpbGVzXG4gICAgICAgICAgICAgICAgLy8gc28gaXQgbWlnaHQgYmUgb2theSB0byByZW1vdmUgdGhlIHdob2xlIHRyeS9jYXRjaCBibG9jayBhbmQganVzdCB1c2VcbiAgICAgICAgICAgICAgICAvLyBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKCB0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuZXRzY2FwZS5zZWN1cml0eS5Qcml2aWxlZ2VNYW5hZ2VyLmVuYWJsZVByaXZpbGVnZShcIlVuaXZlcnNhbEJyb3dzZXJSZWFkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKHRvcF94LCB0b3BfeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIkNhbm5vdCBhY2Nlc3MgbG9jYWwgaW1hZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBhY2Nlc3MgbG9jYWwgaW1hZ2UgZGF0YTogXCIgKyBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFsZXJ0KFwiQ2Fubm90IGFjY2VzcyBpbWFnZVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBhY2Nlc3MgaW1hZ2UgZGF0YTogXCIgKyBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBpeGVscyA9IGltYWdlRGF0YS5kYXRhO1xuXG4gICAgICAgIGxldCB4LCB5LCBpLCBwLCB5cCwgeWksIHl3LCByX3N1bSwgZ19zdW0sIGJfc3VtLCBhX3N1bSxcbiAgICAgICAgICAgIHJfb3V0X3N1bSwgZ19vdXRfc3VtLCBiX291dF9zdW0sIGFfb3V0X3N1bSxcbiAgICAgICAgICAgIHJfaW5fc3VtLCBnX2luX3N1bSwgYl9pbl9zdW0sIGFfaW5fc3VtLFxuICAgICAgICAgICAgcHIsIHBnLCBwYiwgcGEsIHJicztcblxuICAgICAgICBjb25zdCBkaXYgPSByYWRpdXMgKyByYWRpdXMgKyAxO1xuICAgICAgICBjb25zdCB3aWR0aE1pbnVzMSA9IHdpZHRoIC0gMTtcbiAgICAgICAgY29uc3QgaGVpZ2h0TWludXMxID0gaGVpZ2h0IC0gMTtcbiAgICAgICAgY29uc3QgcmFkaXVzUGx1czEgPSByYWRpdXMgKyAxO1xuICAgICAgICBjb25zdCBzdW1GYWN0b3IgPSByYWRpdXNQbHVzMSAqIChyYWRpdXNQbHVzMSArIDEpIC8gMjtcblxuICAgICAgICBjb25zdCBzdGFja1N0YXJ0ID0gbmV3IEJsdXJTdGFjaygpO1xuICAgICAgICBsZXQgc3RhY2tFbmQgPSBudWxsO1xuICAgICAgICBsZXQgc3RhY2sgPSBzdGFja1N0YXJ0O1xuXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBkaXY7IGkrKykge1xuICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0ID0gbmV3IEJsdXJTdGFjaygpO1xuICAgICAgICAgICAgaWYgKGkgPT0gcmFkaXVzUGx1czEpIHtcbiAgICAgICAgICAgICAgICBzdGFja0VuZCA9IHN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrLm5leHQgPSBzdGFja1N0YXJ0O1xuICAgICAgICBsZXQgc3RhY2tJbiA9IG51bGw7XG4gICAgICAgIGxldCBzdGFja091dCA9IG51bGw7XG5cbiAgICAgICAgeXcgPSB5aSA9IDA7XG5cbiAgICAgICAgY29uc3QgbXVsX3N1bSA9IG11bF90YWJsZVtyYWRpdXNdO1xuICAgICAgICBjb25zdCBzaGdfc3VtID0gc2hnX3RhYmxlW3JhZGl1c107XG5cbiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICByX2luX3N1bSA9IGdfaW5fc3VtID0gYl9pbl9zdW0gPSBhX2luX3N1bSA9IHJfc3VtID0gZ19zdW0gPSBiX3N1bSA9IGFfc3VtID0gMDtcblxuICAgICAgICAgICAgcl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocHIgPSBwaXhlbHNbeWldKTtcbiAgICAgICAgICAgIGdfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBnID0gcGl4ZWxzW3lpICsgMV0pO1xuICAgICAgICAgICAgYl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGIgPSBwaXhlbHNbeWkgKyAyXSk7XG4gICAgICAgICAgICBhX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwYSA9IHBpeGVsc1t5aSArIDNdKTtcblxuICAgICAgICAgICAgcl9zdW0gKz0gc3VtRmFjdG9yICogcHI7XG4gICAgICAgICAgICBnX3N1bSArPSBzdW1GYWN0b3IgKiBwZztcbiAgICAgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuICAgICAgICAgICAgYV9zdW0gKz0gc3VtRmFjdG9yICogcGE7XG5cbiAgICAgICAgICAgIHN0YWNrID0gc3RhY2tTdGFydDtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5yID0gcHI7XG4gICAgICAgICAgICAgICAgc3RhY2suZyA9IHBnO1xuICAgICAgICAgICAgICAgIHN0YWNrLmIgPSBwYjtcbiAgICAgICAgICAgICAgICBzdGFjay5hID0gcGE7XG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmFkaXVzUGx1czE7IGkrKykge1xuICAgICAgICAgICAgICAgIHAgPSB5aSArICgod2lkdGhNaW51czEgPCBpID8gd2lkdGhNaW51czEgOiBpKSA8PCAyKTtcbiAgICAgICAgICAgICAgICByX3N1bSArPSAoc3RhY2suciA9IChwciA9IHBpeGVsc1twXSkpICogKHJicyA9IHJhZGl1c1BsdXMxIC0gaSk7XG4gICAgICAgICAgICAgICAgZ19zdW0gKz0gKHN0YWNrLmcgPSAocGcgPSBwaXhlbHNbcCArIDFdKSkgKiByYnM7XG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gKHN0YWNrLmIgPSAocGIgPSBwaXhlbHNbcCArIDJdKSkgKiByYnM7XG4gICAgICAgICAgICAgICAgYV9zdW0gKz0gKHN0YWNrLmEgPSAocGEgPSBwaXhlbHNbcCArIDNdKSkgKiByYnM7XG5cbiAgICAgICAgICAgICAgICByX2luX3N1bSArPSBwcjtcbiAgICAgICAgICAgICAgICBnX2luX3N1bSArPSBwZztcbiAgICAgICAgICAgICAgICBiX2luX3N1bSArPSBwYjtcbiAgICAgICAgICAgICAgICBhX2luX3N1bSArPSBwYTtcblxuICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcbiAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG4gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIHBpeGVsc1t5aSArIDNdID0gcGEgPSAoYV9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtO1xuICAgICAgICAgICAgICAgIGlmIChwYSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhID0gMjU1IC8gcGE7XG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1t5aV0gPSAoKHJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3lpICsgMV0gPSAoKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3lpICsgMl0gPSAoKGJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbeWldID0gcGl4ZWxzW3lpICsgMV0gPSBwaXhlbHNbeWkgKyAyXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcl9zdW0gLT0gcl9vdXRfc3VtO1xuICAgICAgICAgICAgICAgIGdfc3VtIC09IGdfb3V0X3N1bTtcbiAgICAgICAgICAgICAgICBiX3N1bSAtPSBiX291dF9zdW07XG4gICAgICAgICAgICAgICAgYV9zdW0gLT0gYV9vdXRfc3VtO1xuXG4gICAgICAgICAgICAgICAgcl9vdXRfc3VtIC09IHN0YWNrSW4ucjtcbiAgICAgICAgICAgICAgICBnX291dF9zdW0gLT0gc3RhY2tJbi5nO1xuICAgICAgICAgICAgICAgIGJfb3V0X3N1bSAtPSBzdGFja0luLmI7XG4gICAgICAgICAgICAgICAgYV9vdXRfc3VtIC09IHN0YWNrSW4uYTtcblxuICAgICAgICAgICAgICAgIHAgPSAoeXcgKyAoKHAgPSB4ICsgcmFkaXVzICsgMSkgPCB3aWR0aE1pbnVzMSA/IHAgOiB3aWR0aE1pbnVzMSkpIDw8IDI7XG5cbiAgICAgICAgICAgICAgICByX2luX3N1bSArPSAoc3RhY2tJbi5yID0gcGl4ZWxzW3BdKTtcbiAgICAgICAgICAgICAgICBnX2luX3N1bSArPSAoc3RhY2tJbi5nID0gcGl4ZWxzW3AgKyAxXSk7XG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gKz0gKHN0YWNrSW4uYiA9IHBpeGVsc1twICsgMl0pO1xuICAgICAgICAgICAgICAgIGFfaW5fc3VtICs9IChzdGFja0luLmEgPSBwaXhlbHNbcCArIDNdKTtcblxuICAgICAgICAgICAgICAgIHJfc3VtICs9IHJfaW5fc3VtO1xuICAgICAgICAgICAgICAgIGdfc3VtICs9IGdfaW5fc3VtO1xuICAgICAgICAgICAgICAgIGJfc3VtICs9IGJfaW5fc3VtO1xuICAgICAgICAgICAgICAgIGFfc3VtICs9IGFfaW5fc3VtO1xuXG4gICAgICAgICAgICAgICAgc3RhY2tJbiA9IHN0YWNrSW4ubmV4dDtcblxuICAgICAgICAgICAgICAgIHJfb3V0X3N1bSArPSAocHIgPSBzdGFja091dC5yKTtcbiAgICAgICAgICAgICAgICBnX291dF9zdW0gKz0gKHBnID0gc3RhY2tPdXQuZyk7XG4gICAgICAgICAgICAgICAgYl9vdXRfc3VtICs9IChwYiA9IHN0YWNrT3V0LmIpO1xuICAgICAgICAgICAgICAgIGFfb3V0X3N1bSArPSAocGEgPSBzdGFja091dC5hKTtcblxuICAgICAgICAgICAgICAgIHJfaW5fc3VtIC09IHByO1xuICAgICAgICAgICAgICAgIGdfaW5fc3VtIC09IHBnO1xuICAgICAgICAgICAgICAgIGJfaW5fc3VtIC09IHBiO1xuICAgICAgICAgICAgICAgIGFfaW5fc3VtIC09IHBhO1xuXG4gICAgICAgICAgICAgICAgc3RhY2tPdXQgPSBzdGFja091dC5uZXh0O1xuXG4gICAgICAgICAgICAgICAgeWkgKz0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHl3ICs9IHdpZHRoO1xuICAgICAgICB9XG5cblxuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZ19pbl9zdW0gPSBiX2luX3N1bSA9IGFfaW5fc3VtID0gcl9pbl9zdW0gPSBnX3N1bSA9IGJfc3VtID0gYV9zdW0gPSByX3N1bSA9IDA7XG5cbiAgICAgICAgICAgIHlpID0geCA8PCAyO1xuICAgICAgICAgICAgcl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocHIgPSBwaXhlbHNbeWldKTtcbiAgICAgICAgICAgIGdfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBnID0gcGl4ZWxzW3lpICsgMV0pO1xuICAgICAgICAgICAgYl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGIgPSBwaXhlbHNbeWkgKyAyXSk7XG4gICAgICAgICAgICBhX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwYSA9IHBpeGVsc1t5aSArIDNdKTtcblxuICAgICAgICAgICAgcl9zdW0gKz0gc3VtRmFjdG9yICogcHI7XG4gICAgICAgICAgICBnX3N1bSArPSBzdW1GYWN0b3IgKiBwZztcbiAgICAgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xuICAgICAgICAgICAgYV9zdW0gKz0gc3VtRmFjdG9yICogcGE7XG5cbiAgICAgICAgICAgIHN0YWNrID0gc3RhY2tTdGFydDtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5yID0gcHI7XG4gICAgICAgICAgICAgICAgc3RhY2suZyA9IHBnO1xuICAgICAgICAgICAgICAgIHN0YWNrLmIgPSBwYjtcbiAgICAgICAgICAgICAgICBzdGFjay5hID0gcGE7XG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5cCA9IHdpZHRoO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHJhZGl1czsgaSsrKSB7XG4gICAgICAgICAgICAgICAgeWkgPSAoeXAgKyB4KSA8PCAyO1xuXG4gICAgICAgICAgICAgICAgcl9zdW0gKz0gKHN0YWNrLnIgPSAocHIgPSBwaXhlbHNbeWldKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcbiAgICAgICAgICAgICAgICBnX3N1bSArPSAoc3RhY2suZyA9IChwZyA9IHBpeGVsc1t5aSArIDFdKSkgKiByYnM7XG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gKHN0YWNrLmIgPSAocGIgPSBwaXhlbHNbeWkgKyAyXSkpICogcmJzO1xuICAgICAgICAgICAgICAgIGFfc3VtICs9IChzdGFjay5hID0gKHBhID0gcGl4ZWxzW3lpICsgM10pKSAqIHJicztcblxuICAgICAgICAgICAgICAgIHJfaW5fc3VtICs9IHByO1xuICAgICAgICAgICAgICAgIGdfaW5fc3VtICs9IHBnO1xuICAgICAgICAgICAgICAgIGJfaW5fc3VtICs9IHBiO1xuICAgICAgICAgICAgICAgIGFfaW5fc3VtICs9IHBhO1xuXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5uZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGkgPCBoZWlnaHRNaW51czEpIHtcbiAgICAgICAgICAgICAgICAgICAgeXAgKz0gd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5aSA9IHg7XG4gICAgICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcbiAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tFbmQ7XG4gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBwID0geWkgPDwgMjtcbiAgICAgICAgICAgICAgICBwaXhlbHNbcCArIDNdID0gcGEgPSAoYV9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtO1xuICAgICAgICAgICAgICAgIGlmIChwYSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGEgPSAyNTUgLyBwYTtcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3BdID0gKChyX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1twICsgMV0gPSAoKGdfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3AgKyAyXSA9ICgoYl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1twXSA9IHBpeGVsc1twICsgMV0gPSBwaXhlbHNbcCArIDJdID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByX3N1bSAtPSByX291dF9zdW07XG4gICAgICAgICAgICAgICAgZ19zdW0gLT0gZ19vdXRfc3VtO1xuICAgICAgICAgICAgICAgIGJfc3VtIC09IGJfb3V0X3N1bTtcbiAgICAgICAgICAgICAgICBhX3N1bSAtPSBhX291dF9zdW07XG5cbiAgICAgICAgICAgICAgICByX291dF9zdW0gLT0gc3RhY2tJbi5yO1xuICAgICAgICAgICAgICAgIGdfb3V0X3N1bSAtPSBzdGFja0luLmc7XG4gICAgICAgICAgICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcbiAgICAgICAgICAgICAgICBhX291dF9zdW0gLT0gc3RhY2tJbi5hO1xuXG4gICAgICAgICAgICAgICAgcCA9ICh4ICsgKCgocCA9IHkgKyByYWRpdXNQbHVzMSkgPCBoZWlnaHRNaW51czEgPyBwIDogaGVpZ2h0TWludXMxKSAqIHdpZHRoKSkgPDwgMjtcblxuICAgICAgICAgICAgICAgIHJfc3VtICs9IChyX2luX3N1bSArPSAoc3RhY2tJbi5yID0gcGl4ZWxzW3BdKSk7XG4gICAgICAgICAgICAgICAgZ19zdW0gKz0gKGdfaW5fc3VtICs9IChzdGFja0luLmcgPSBwaXhlbHNbcCArIDFdKSk7XG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gKGJfaW5fc3VtICs9IChzdGFja0luLmIgPSBwaXhlbHNbcCArIDJdKSk7XG4gICAgICAgICAgICAgICAgYV9zdW0gKz0gKGFfaW5fc3VtICs9IChzdGFja0luLmEgPSBwaXhlbHNbcCArIDNdKSk7XG5cbiAgICAgICAgICAgICAgICBzdGFja0luID0gc3RhY2tJbi5uZXh0O1xuXG4gICAgICAgICAgICAgICAgcl9vdXRfc3VtICs9IChwciA9IHN0YWNrT3V0LnIpO1xuICAgICAgICAgICAgICAgIGdfb3V0X3N1bSArPSAocGcgPSBzdGFja091dC5nKTtcbiAgICAgICAgICAgICAgICBiX291dF9zdW0gKz0gKHBiID0gc3RhY2tPdXQuYik7XG4gICAgICAgICAgICAgICAgYV9vdXRfc3VtICs9IChwYSA9IHN0YWNrT3V0LmEpO1xuXG4gICAgICAgICAgICAgICAgcl9pbl9zdW0gLT0gcHI7XG4gICAgICAgICAgICAgICAgZ19pbl9zdW0gLT0gcGc7XG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gLT0gcGI7XG4gICAgICAgICAgICAgICAgYV9pbl9zdW0gLT0gcGE7XG5cbiAgICAgICAgICAgICAgICBzdGFja091dCA9IHN0YWNrT3V0Lm5leHQ7XG5cbiAgICAgICAgICAgICAgICB5aSArPSB3aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCB0b3BfeCwgdG9wX3kpO1xuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlVGV4dEZvbnRTaXplKG1heFdpZHRoOiBudW1iZXIsIG1heEhlaWdodDogbnVtYmVyLCBsaW5lczogc3RyaW5nW10sIGZvbnQ6IHN0cmluZywgbGluZUhlaWdodFBlcmNlbnQ6IG51bWJlciA9IDEuMSwgY2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQpOiBudW1iZXIge1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0U2l6ZTogbnVtYmVyID0gbWF4SGVpZ2h0O1xuICAgICAgICBjb25zdCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXG4gICAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgICAgICBjYW52YXMgPSA8SFRNTENhbnZhc0VsZW1lbnQ+ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IG1heFdpZHRoICsgbWF4SGVpZ2h0O1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gbWF4SGVpZ2h0ICogMjtcblxuICAgICAgICBsZXQgZm9udFNpemU6IG51bWJlciA9IENhbnZhc1V0aWxzLmhhbHZlVmFsaWRhdGVGb250U2l6ZShzdGFydFNpemUsIChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIENhbnZhc1V0aWxzLnNldEZvbnRQcm9wcyhjb250ZXh0LCBmb250LCBzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFRleHRMaW5lc1dpZHRoID0gQ2FudmFzVXRpbHMuZ2V0VGV4dFdpZHRoKGNvbnRleHQsIGxpbmVzKTtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aCAtIG1heFRleHRMaW5lc1dpZHRoO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBiaXRtYXBIZWlnaHQ6IG51bWJlciA9IENhbnZhc1V0aWxzLmdldFRleHRCaXRtYXBIZWlnaHQoY2FudmFzLCBjb250ZXh0LCBsaW5lcywgZm9udCwgZm9udFNpemUsIGxpbmVIZWlnaHRQZXJjZW50KTtcbiAgICAgICAgaWYgKGJpdG1hcEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgICAgZm9udFNpemUgPSBDYW52YXNVdGlscy5oYWx2ZVZhbGlkYXRlRm9udFNpemUoZm9udFNpemUsIChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVpZ2h0IC0gQ2FudmFzVXRpbHMuZ2V0VGV4dEJpdG1hcEhlaWdodChjYW52YXMsIGNvbnRleHQsIGxpbmVzLCBmb250LCBzaXplLCBsaW5lSGVpZ2h0UGVyY2VudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb250U2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZHJhd0xpbmVzKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgbGluZXM6IHN0cmluZ1tdLCBmb250OiBzdHJpbmcsIHNpemU6IG51bWJlciwgbGluZUhlaWdodFBlcmNlbnQ6IG51bWJlciA9IDEuMSwgYWxpZ246IHN0cmluZyA9IFwibGVmdFwiLCBiYXNlTGluZTogc3RyaW5nID0gXCJ0b3BcIiwgeDogbnVtYmVyID0gMCwgeTogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgICAgIENhbnZhc1V0aWxzLnNldEZvbnRQcm9wcyhjb250ZXh0LCBmb250LCBzaXplLCBhbGlnbiwgYmFzZUxpbmUpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmU6IHN0cmluZyA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dChsaW5lLCB4LCB5KTtcbiAgICAgICAgICAgIGlmIChpIDwgbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHkgKz0gc2l6ZSAqIGxpbmVIZWlnaHRQZXJjZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH1cblxuICAgIHN0YXRpYyB3cmFwVGV4dChjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIG1heFdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd29yZHMgPSB0ZXh0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGNvbnRleHQubWVhc3VyZVRleHQoXCJNXCIpLndpZHRoICogMS4zO1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGxpbmUgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHdvcmRzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0TGluZSA9IGxpbmUgKyB3b3Jkc1tuXSArIFwiIFwiO1xuICAgICAgICAgICAgY29uc3QgbWV0cmljcyA9IGNvbnRleHQubWVhc3VyZVRleHQodGVzdExpbmUpO1xuICAgICAgICAgICAgY29uc3QgdGVzdFdpZHRoID0gbWV0cmljcy53aWR0aDtcbiAgICAgICAgICAgIGlmICh0ZXN0V2lkdGggPiBtYXhXaWR0aCAmJiBuID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IHdvcmRzW25dICsgXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaW5lID0gdGVzdExpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgeSAtPSBsaW5lSGVpZ2h0ICogLjUgKiBsaW5lcy5sZW5ndGg7XG4gICAgICAgIGxpbmVzLmZvckVhY2gobCA9PiB7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGwsIHgsIHkpO1xuICAgICAgICAgICAgeSArPSBsaW5lSGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0Rm9udFByb3BzKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgZm9udDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhbGlnbjogc3RyaW5nID0gXCJsZWZ0XCIsIGJhc2VMaW5lOiBzdHJpbmcgPSBcInRvcFwiKTogdm9pZCB7XG4gICAgICAgIGNvbnRleHQuZm9udCA9IGAke2ZvbnRTaXplfXB4ICR7Zm9udH1gO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9IDxhbnk+YWxpZ247XG4gICAgICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gPGFueT5iYXNlTGluZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUZXh0V2lkdGgoY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBsaW5lczogc3RyaW5nW10pOiBudW1iZXIge1xuICAgICAgICBsZXQgbWF4V2lkdGg6IG51bWJlciA9IDA7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZTogc3RyaW5nID0gbGluZXNbaV07XG4gICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBjb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4V2lkdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGV4dEJpdG1hcEhlaWdodChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGxpbmVzOiBzdHJpbmdbXSwgZm9udDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBsaW5lSGVpZ2h0UGVyY2VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNhbnZhcy53aWR0aDtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjYW52YXMuaGVpZ2h0O1xuICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBjb25zdCB0ZXh0WSA9IENhbnZhc1V0aWxzLmRyYXdMaW5lcyhjb250ZXh0LCBsaW5lcywgZm9udCwgZm9udFNpemUsIGxpbmVIZWlnaHRQZXJjZW50LCBcImxlZnRcIiwgXCJ0b3BcIiwgZm9udFNpemUgKiAuNSwgZm9udFNpemUgKiAuNSk7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YTogSW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgbGV0IHRleHRIZWlnaHQ6IG51bWJlciA9IDA7XG5cbiAgICAgICAgeUxvb3A6Zm9yIChsZXQgeTogbnVtYmVyID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4OiBudW1iZXIgPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSAoeCArIHkgKiB3aWR0aCkgKiA0O1xuICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0SGVpZ2h0ID0geSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHlMb29wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0ZXh0SGVpZ2h0LCB0ZXh0WSArIGZvbnRTaXplKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoYWx2ZVZhbGlkYXRlRm9udFNpemUoc3RhcnRTaXplOiBudW1iZXIsIGNhbGxiYWNrOiAoc2l6ZTogbnVtYmVyKSA9PiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgZm9udFNpemU6IG51bWJlciA9IHN0YXJ0U2l6ZTtcbiAgICAgICAgbGV0IGxhc3RGb250U2l6ZTogbnVtYmVyID0gMDtcbiAgICAgICAgbGV0IGRpcmVjdGlvbjogbnVtYmVyO1xuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAyMDsgaSsrKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSBjYWxsYmFjayhmb250U2l6ZSk7XG4gICAgICAgICAgICBjb25zdCB0ZW1wU2l6ZTogbnVtYmVyID0gZm9udFNpemU7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplID0gZm9udFNpemUgLSAoTWF0aC5hYnMoZm9udFNpemUgLSBsYXN0Rm9udFNpemUpIC8gMik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplID0gZm9udFNpemUgKyAoTWF0aC5hYnMoZm9udFNpemUgLSBsYXN0Rm9udFNpemUpIC8gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0Rm9udFNpemUgPSB0ZW1wU2l6ZTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhmb250U2l6ZSAtIGxhc3RGb250U2l6ZSkgPCAwLjEpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb250U2l6ZSA9IE1hdGguZmxvb3IoZm9udFNpemUpO1xuICAgICAgICByZXR1cm4gZm9udFNpemU7XG4gICAgfVxufVxuIl19
1
+ import { CanvasColor } from "../common-types";
2
+ import { ObjectUtils } from "./object.utils";
3
+ class BlurStack {
4
+ constructor() {
5
+ this.r = 0;
6
+ this.g = 0;
7
+ this.b = 0;
8
+ this.a = 0;
9
+ this.next = null;
10
+ }
11
+ }
12
+ const mul_table = [
13
+ 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512,
14
+ 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512,
15
+ 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456,
16
+ 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512,
17
+ 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328,
18
+ 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456,
19
+ 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335,
20
+ 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512,
21
+ 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405,
22
+ 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328,
23
+ 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271,
24
+ 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456,
25
+ 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388,
26
+ 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335,
27
+ 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292,
28
+ 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259
29
+ ];
30
+ const shg_table = [
31
+ 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
32
+ 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
33
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
34
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
35
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
36
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
37
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
38
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
39
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
40
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
41
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
42
+ 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
43
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
44
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
45
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
46
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
47
+ ];
48
+ export class CanvasUtils {
49
+ static manipulatePixels(canvas, ctx, colorTransformer) {
50
+ const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
51
+ const pixels = imgData.data;
52
+ for (let i = 0, n = pixels.length; i < n; i += 4) {
53
+ const clr = new CanvasColor(pixels[i], pixels[i + 1], pixels[i + 2], pixels[i + 3]);
54
+ const greyscale = clr.r * .3 + clr.g * .59 + clr.b * .11;
55
+ const color = colorTransformer(clr, greyscale);
56
+ pixels[i] = color.r;
57
+ pixels[i + 1] = color.g;
58
+ pixels[i + 2] = color.b;
59
+ pixels[i + 3] = color.a;
60
+ }
61
+ ctx.putImageData(imgData, 0, 0);
62
+ }
63
+ static thresholding(canvas, ctx, threshold = 50, colorTransformer) {
64
+ const min = new CanvasColor(0, 0, 0, 255);
65
+ const max = new CanvasColor(0, 0, 0, 0);
66
+ colorTransformer = ObjectUtils.isFunction(colorTransformer) ? colorTransformer : ((color, limit) => {
67
+ return limit ? max : min;
68
+ });
69
+ CanvasUtils.manipulatePixels(canvas, ctx, (color, greyscale) => {
70
+ return colorTransformer(color, greyscale > threshold, greyscale);
71
+ });
72
+ }
73
+ static stackBlur(canvas, ctx, radius = 10) {
74
+ if (isNaN(radius) || radius < 1)
75
+ return;
76
+ radius |= 0;
77
+ const top_x = 0;
78
+ const top_y = 0;
79
+ const width = canvas.width;
80
+ const height = canvas.height;
81
+ let imageData = null;
82
+ try {
83
+ try {
84
+ imageData = ctx.getImageData(top_x, top_y, width, height);
85
+ }
86
+ catch (e) {
87
+ // NOTE: this part is supposedly only needed if you want to work with local files
88
+ // so it might be okay to remove the whole try/catch block and just use
89
+ // imageData = ctx.getImageData( top_x, top_y, width, height );
90
+ try {
91
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
92
+ imageData = ctx.getImageData(top_x, top_y, width, height);
93
+ }
94
+ catch (e) {
95
+ alert("Cannot access local image");
96
+ throw new Error("unable to access local image data: " + e);
97
+ }
98
+ }
99
+ }
100
+ catch (e) {
101
+ alert("Cannot access image");
102
+ throw new Error("unable to access image data: " + e);
103
+ }
104
+ const pixels = imageData.data;
105
+ let x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs;
106
+ const div = radius + radius + 1;
107
+ const widthMinus1 = width - 1;
108
+ const heightMinus1 = height - 1;
109
+ const radiusPlus1 = radius + 1;
110
+ const sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
111
+ const stackStart = new BlurStack();
112
+ let stackEnd = null;
113
+ let stack = stackStart;
114
+ for (i = 1; i < div; i++) {
115
+ stack = stack.next = new BlurStack();
116
+ if (i == radiusPlus1) {
117
+ stackEnd = stack;
118
+ }
119
+ }
120
+ stack.next = stackStart;
121
+ let stackIn = null;
122
+ let stackOut = null;
123
+ yw = yi = 0;
124
+ const mul_sum = mul_table[radius];
125
+ const shg_sum = shg_table[radius];
126
+ for (y = 0; y < height; y++) {
127
+ r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
128
+ r_out_sum = radiusPlus1 * (pr = pixels[yi]);
129
+ g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
130
+ b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
131
+ a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
132
+ r_sum += sumFactor * pr;
133
+ g_sum += sumFactor * pg;
134
+ b_sum += sumFactor * pb;
135
+ a_sum += sumFactor * pa;
136
+ stack = stackStart;
137
+ for (i = 0; i < radiusPlus1; i++) {
138
+ stack.r = pr;
139
+ stack.g = pg;
140
+ stack.b = pb;
141
+ stack.a = pa;
142
+ stack = stack.next;
143
+ }
144
+ for (i = 1; i < radiusPlus1; i++) {
145
+ p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
146
+ r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
147
+ g_sum += (stack.g = (pg = pixels[p + 1])) * rbs;
148
+ b_sum += (stack.b = (pb = pixels[p + 2])) * rbs;
149
+ a_sum += (stack.a = (pa = pixels[p + 3])) * rbs;
150
+ r_in_sum += pr;
151
+ g_in_sum += pg;
152
+ b_in_sum += pb;
153
+ a_in_sum += pa;
154
+ stack = stack.next;
155
+ }
156
+ stackIn = stackStart;
157
+ stackOut = stackEnd;
158
+ for (x = 0; x < width; x++) {
159
+ pixels[yi + 3] = pa = (a_sum * mul_sum) >> shg_sum;
160
+ if (pa != 0) {
161
+ pa = 255 / pa;
162
+ pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;
163
+ pixels[yi + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
164
+ pixels[yi + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
165
+ }
166
+ else {
167
+ pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
168
+ }
169
+ r_sum -= r_out_sum;
170
+ g_sum -= g_out_sum;
171
+ b_sum -= b_out_sum;
172
+ a_sum -= a_out_sum;
173
+ r_out_sum -= stackIn.r;
174
+ g_out_sum -= stackIn.g;
175
+ b_out_sum -= stackIn.b;
176
+ a_out_sum -= stackIn.a;
177
+ p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
178
+ r_in_sum += (stackIn.r = pixels[p]);
179
+ g_in_sum += (stackIn.g = pixels[p + 1]);
180
+ b_in_sum += (stackIn.b = pixels[p + 2]);
181
+ a_in_sum += (stackIn.a = pixels[p + 3]);
182
+ r_sum += r_in_sum;
183
+ g_sum += g_in_sum;
184
+ b_sum += b_in_sum;
185
+ a_sum += a_in_sum;
186
+ stackIn = stackIn.next;
187
+ r_out_sum += (pr = stackOut.r);
188
+ g_out_sum += (pg = stackOut.g);
189
+ b_out_sum += (pb = stackOut.b);
190
+ a_out_sum += (pa = stackOut.a);
191
+ r_in_sum -= pr;
192
+ g_in_sum -= pg;
193
+ b_in_sum -= pb;
194
+ a_in_sum -= pa;
195
+ stackOut = stackOut.next;
196
+ yi += 4;
197
+ }
198
+ yw += width;
199
+ }
200
+ for (x = 0; x < width; x++) {
201
+ g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
202
+ yi = x << 2;
203
+ r_out_sum = radiusPlus1 * (pr = pixels[yi]);
204
+ g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
205
+ b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
206
+ a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
207
+ r_sum += sumFactor * pr;
208
+ g_sum += sumFactor * pg;
209
+ b_sum += sumFactor * pb;
210
+ a_sum += sumFactor * pa;
211
+ stack = stackStart;
212
+ for (i = 0; i < radiusPlus1; i++) {
213
+ stack.r = pr;
214
+ stack.g = pg;
215
+ stack.b = pb;
216
+ stack.a = pa;
217
+ stack = stack.next;
218
+ }
219
+ yp = width;
220
+ for (i = 1; i <= radius; i++) {
221
+ yi = (yp + x) << 2;
222
+ r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
223
+ g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;
224
+ b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;
225
+ a_sum += (stack.a = (pa = pixels[yi + 3])) * rbs;
226
+ r_in_sum += pr;
227
+ g_in_sum += pg;
228
+ b_in_sum += pb;
229
+ a_in_sum += pa;
230
+ stack = stack.next;
231
+ if (i < heightMinus1) {
232
+ yp += width;
233
+ }
234
+ }
235
+ yi = x;
236
+ stackIn = stackStart;
237
+ stackOut = stackEnd;
238
+ for (y = 0; y < height; y++) {
239
+ p = yi << 2;
240
+ pixels[p + 3] = pa = (a_sum * mul_sum) >> shg_sum;
241
+ if (pa > 0) {
242
+ pa = 255 / pa;
243
+ pixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;
244
+ pixels[p + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;
245
+ pixels[p + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;
246
+ }
247
+ else {
248
+ pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;
249
+ }
250
+ r_sum -= r_out_sum;
251
+ g_sum -= g_out_sum;
252
+ b_sum -= b_out_sum;
253
+ a_sum -= a_out_sum;
254
+ r_out_sum -= stackIn.r;
255
+ g_out_sum -= stackIn.g;
256
+ b_out_sum -= stackIn.b;
257
+ a_out_sum -= stackIn.a;
258
+ p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
259
+ r_sum += (r_in_sum += (stackIn.r = pixels[p]));
260
+ g_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));
261
+ b_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));
262
+ a_sum += (a_in_sum += (stackIn.a = pixels[p + 3]));
263
+ stackIn = stackIn.next;
264
+ r_out_sum += (pr = stackOut.r);
265
+ g_out_sum += (pg = stackOut.g);
266
+ b_out_sum += (pb = stackOut.b);
267
+ a_out_sum += (pa = stackOut.a);
268
+ r_in_sum -= pr;
269
+ g_in_sum -= pg;
270
+ b_in_sum -= pb;
271
+ a_in_sum -= pa;
272
+ stackOut = stackOut.next;
273
+ yi += width;
274
+ }
275
+ }
276
+ ctx.putImageData(imageData, top_x, top_y);
277
+ }
278
+ static measureTextFontSize(maxWidth, maxHeight, lines, font, lineHeightPercent = 1.1, canvas) {
279
+ const startSize = maxHeight;
280
+ const context = canvas.getContext("2d");
281
+ if (!canvas) {
282
+ canvas = document.createElement("canvas");
283
+ document.body.appendChild(canvas);
284
+ }
285
+ canvas.width = maxWidth + maxHeight;
286
+ canvas.height = maxHeight * 2;
287
+ let fontSize = CanvasUtils.halveValidateFontSize(startSize, (size) => {
288
+ CanvasUtils.setFontProps(context, font, size);
289
+ const maxTextLinesWidth = CanvasUtils.getTextWidth(context, lines);
290
+ return maxWidth - maxTextLinesWidth;
291
+ });
292
+ const bitmapHeight = CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent);
293
+ if (bitmapHeight > maxHeight) {
294
+ fontSize = CanvasUtils.halveValidateFontSize(fontSize, (size) => {
295
+ return maxHeight - CanvasUtils.getTextBitmapHeight(canvas, context, lines, font, size, lineHeightPercent);
296
+ });
297
+ }
298
+ return fontSize;
299
+ }
300
+ static drawLines(context, lines, font, size, lineHeightPercent = 1.1, align = "left", baseLine = "top", x = 0, y = 0) {
301
+ CanvasUtils.setFontProps(context, font, size, align, baseLine);
302
+ for (let i = 0; i < lines.length; i++) {
303
+ const line = lines[i];
304
+ context.fillText(line, x, y);
305
+ if (i < lines.length - 1) {
306
+ y += size * lineHeightPercent;
307
+ }
308
+ }
309
+ return y;
310
+ }
311
+ static wrapText(context, text, x, y, maxWidth) {
312
+ const words = text.split(" ");
313
+ const lineHeight = context.measureText("M").width * 1.3;
314
+ const lines = [];
315
+ let line = "";
316
+ for (let n = 0; n < words.length; n++) {
317
+ const testLine = line + words[n] + " ";
318
+ const metrics = context.measureText(testLine);
319
+ const testWidth = metrics.width;
320
+ if (testWidth > maxWidth && n > 0) {
321
+ lines.push(line);
322
+ line = words[n] + " ";
323
+ }
324
+ else {
325
+ line = testLine;
326
+ }
327
+ }
328
+ lines.push(line);
329
+ y -= lineHeight * .5 * lines.length;
330
+ lines.forEach(l => {
331
+ context.fillText(l, x, y);
332
+ y += lineHeight;
333
+ });
334
+ }
335
+ static setFontProps(context, font, fontSize, align = "left", baseLine = "top") {
336
+ context.font = `${fontSize}px ${font}`;
337
+ context.textAlign = align;
338
+ context.textBaseline = baseLine;
339
+ }
340
+ static getTextWidth(context, lines) {
341
+ let maxWidth = 0;
342
+ for (let i = 0; i < lines.length; i++) {
343
+ const line = lines[i];
344
+ maxWidth = Math.max(maxWidth, context.measureText(line).width);
345
+ }
346
+ return maxWidth;
347
+ }
348
+ static getTextBitmapHeight(canvas, context, lines, font, fontSize, lineHeightPercent) {
349
+ const width = canvas.width;
350
+ const height = canvas.height;
351
+ context.clearRect(0, 0, width, height);
352
+ const textY = CanvasUtils.drawLines(context, lines, font, fontSize, lineHeightPercent, "left", "top", fontSize * .5, fontSize * .5);
353
+ const imageData = context.getImageData(0, 0, width, height);
354
+ let textHeight = 0;
355
+ yLoop: for (let y = 0; y < height; y++) {
356
+ for (let x = 0; x < width; x++) {
357
+ const index = (x + y * width) * 4;
358
+ if (imageData.data[index + 3] > 0) {
359
+ textHeight = y + 1;
360
+ continue yLoop;
361
+ }
362
+ }
363
+ }
364
+ return Math.max(textHeight, textY + fontSize);
365
+ }
366
+ static halveValidateFontSize(startSize, callback) {
367
+ let fontSize = startSize;
368
+ let lastFontSize = 0;
369
+ let direction;
370
+ for (let i = 0; i < 20; i++) {
371
+ direction = callback(fontSize);
372
+ const tempSize = fontSize;
373
+ if (direction < 0) {
374
+ fontSize = fontSize - (Math.abs(fontSize - lastFontSize) / 2);
375
+ }
376
+ else {
377
+ fontSize = fontSize + (Math.abs(fontSize - lastFontSize) / 2);
378
+ }
379
+ lastFontSize = tempSize;
380
+ if (Math.abs(fontSize - lastFontSize) < 0.1) {
381
+ break;
382
+ }
383
+ }
384
+ fontSize = Math.floor(fontSize);
385
+ return fontSize;
386
+ }
387
+ }
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IkQ6L1dvcmsvbmd4LXV0aWxzL3NyYy8iLCJzb3VyY2VzIjpbIm5neC11dGlscy91dGlscy9jYW52YXMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUkzQyxNQUFNLFNBQVM7SUFBZjtRQUNJLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxNQUFDLEdBQVcsQ0FBQyxDQUFDO1FBQ2QsTUFBQyxHQUFXLENBQUMsQ0FBQztRQUNkLE1BQUMsR0FBVyxDQUFDLENBQUM7UUFDZCxTQUFJLEdBQWMsSUFBSSxDQUFDO0lBQzNCLENBQUM7Q0FBQTtBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2QsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUM5RSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQUMsQ0FBQztBQUUvRSxNQUFNLFNBQVMsR0FBRztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDN0QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzlELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDOUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM5RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFB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QUssR0FBRyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsUUFBa0M7UUFDdEYsSUFBSSxRQUFRLEdBQVcsU0FBUyxDQUFDO1FBQ2pDLElBQUksWUFBWSxHQUFXLENBQUMsQ0FBQztRQUM3QixJQUFJLFNBQWlCLENBQUM7UUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sUUFBUSxHQUFXLFFBQVEsQ0FBQztZQUNsQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2YsUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNILFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNqRTtZQUNELFlBQVksR0FBRyxRQUFRLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3pDLE1BQU07YUFDVDtTQUNKO1FBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDYW52YXNDb2xvcn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi9vYmplY3QudXRpbHNcIjtcclxuXHJcbmRlY2xhcmUgY29uc3QgbmV0c2NhcGU6IGFueTtcclxuXHJcbmNsYXNzIEJsdXJTdGFjayB7XHJcbiAgICByOiBudW1iZXIgPSAwO1xyXG4gICAgZzogbnVtYmVyID0gMDtcclxuICAgIGI6IG51bWJlciA9IDA7XHJcbiAgICBhOiBudW1iZXIgPSAwO1xyXG4gICAgbmV4dDogQmx1clN0YWNrID0gbnVsbDtcclxufVxyXG5cclxuY29uc3QgbXVsX3RhYmxlID0gW1xyXG4gICAgNTEyLCA1MTIsIDQ1NiwgNTEyLCAzMjgsIDQ1NiwgMzM1LCA1MTIsIDQwNSwgMzI4LCAyNzEsIDQ1NiwgMzg4LCAzMzUsIDI5MiwgNTEyLFxyXG4gICAgNDU0LCA0MDUsIDM2NCwgMzI4LCAyOTgsIDI3MSwgNDk2LCA0NTYsIDQyMCwgMzg4LCAzNjAsIDMzNSwgMzEyLCAyOTIsIDI3MywgNTEyLFxyXG4gICAgNDgyLCA0NTQsIDQyOCwgNDA1LCAzODMsIDM2NCwgMzQ1LCAzMjgsIDMxMiwgMjk4LCAyODQsIDI3MSwgMjU5LCA0OTYsIDQ3NSwgNDU2LFxyXG4gICAgNDM3LCA0MjAsIDQwNCwgMzg4LCAzNzQsIDM2MCwgMzQ3LCAzMzUsIDMyMywgMzEyLCAzMDIsIDI5MiwgMjgyLCAyNzMsIDI2NSwgNTEyLFxyXG4gICAgNDk3LCA0ODIsIDQ2OCwgNDU0LCA0NDEsIDQyOCwgNDE3LCA0MDUsIDM5NCwgMzgzLCAzNzMsIDM2NCwgMzU0LCAzNDUsIDMzNywgMzI4LFxyXG4gICAgMzIwLCAzMTIsIDMwNSwgMjk4LCAyOTEsIDI4NCwgMjc4LCAyNzEsIDI2NSwgMjU5LCA1MDcsIDQ5NiwgNDg1LCA0NzUsIDQ2NSwgNDU2LFxyXG4gICAgNDQ2LCA0MzcsIDQyOCwgNDIwLCA0MTIsIDQwNCwgMzk2LCAzODgsIDM4MSwgMzc0LCAzNjcsIDM2MCwgMzU0LCAzNDcsIDM0MSwgMzM1LFxyXG4gICAgMzI5LCAzMjMsIDMxOCwgMzEyLCAzMDcsIDMwMiwgMjk3LCAyOTIsIDI4NywgMjgyLCAyNzgsIDI3MywgMjY5LCAyNjUsIDI2MSwgNTEyLFxyXG4gICAgNTA1LCA0OTcsIDQ4OSwgNDgyLCA0NzUsIDQ2OCwgNDYxLCA0NTQsIDQ0NywgNDQxLCA0MzUsIDQyOCwgNDIyLCA0MTcsIDQxMSwgNDA1LFxyXG4gICAgMzk5LCAzOTQsIDM4OSwgMzgzLCAzNzgsIDM3MywgMzY4LCAzNjQsIDM1OSwgMzU0LCAzNTAsIDM0NSwgMzQxLCAzMzcsIDMzMiwgMzI4LFxyXG4gICAgMzI0LCAzMjAsIDMxNiwgMzEyLCAzMDksIDMwNSwgMzAxLCAyOTgsIDI5NCwgMjkxLCAyODcsIDI4NCwgMjgxLCAyNzgsIDI3NCwgMjcxLFxyXG4gICAgMjY4LCAyNjUsIDI2MiwgMjU5LCAyNTcsIDUwNywgNTAxLCA0OTYsIDQ5MSwgNDg1LCA0ODAsIDQ3NSwgNDcwLCA0NjUsIDQ2MCwgNDU2LFxyXG4gICAgNDUxLCA0NDYsIDQ0MiwgNDM3LCA0MzMsIDQyOCwgNDI0LCA0MjAsIDQxNiwgNDEyLCA0MDgsIDQwNCwgNDAwLCAzOTYsIDM5MiwgMzg4LFxyXG4gICAgMzg1LCAzODEsIDM3NywgMzc0LCAzNzAsIDM2NywgMzYzLCAzNjAsIDM1NywgMzU0LCAzNTAsIDM0NywgMzQ0LCAzNDEsIDMzOCwgMzM1LFxyXG4gICAgMzMyLCAzMjksIDMyNiwgMzIzLCAzMjAsIDMxOCwgMzE1LCAzMTIsIDMxMCwgMzA3LCAzMDQsIDMwMiwgMjk5LCAyOTcsIDI5NCwgMjkyLFxyXG4gICAgMjg5LCAyODcsIDI4NSwgMjgyLCAyODAsIDI3OCwgMjc1LCAyNzMsIDI3MSwgMjY5LCAyNjcsIDI2NSwgMjYzLCAyNjEsIDI1OV07XHJcblxyXG5jb25zdCBzaGdfdGFibGUgPSBbXHJcbiAgICA5LCAxMSwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE3LFxyXG4gICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksXHJcbiAgICAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCxcclxuICAgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIxLFxyXG4gICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsXHJcbiAgICAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMixcclxuICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLFxyXG4gICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsXHJcbiAgICAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMyxcclxuICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLFxyXG4gICAgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsXHJcbiAgICAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCxcclxuICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LFxyXG4gICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsXHJcbiAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCxcclxuICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjRdO1xyXG5cclxuZXhwb3J0IGNsYXNzIENhbnZhc1V0aWxzIHtcclxuXHJcbiAgICBzdGF0aWMgbWFuaXB1bGF0ZVBpeGVscyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgY29sb3JUcmFuc2Zvcm1lcjogKGNvbG9yOiBDYW52YXNDb2xvciwgZ3JleXNjYWxlPzogbnVtYmVyKSA9PiBDYW52YXNDb2xvcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gaW1nRGF0YS5kYXRhO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gcGl4ZWxzLmxlbmd0aDsgaSA8IG47IGkgKz0gNCkge1xyXG4gICAgICAgICAgICBjb25zdCBjbHIgPSBuZXcgQ2FudmFzQ29sb3IocGl4ZWxzW2ldLCBwaXhlbHNbaSArIDFdLCBwaXhlbHNbaSArIDJdLCBwaXhlbHNbaSArIDNdKTtcclxuICAgICAgICAgICAgY29uc3QgZ3JleXNjYWxlID0gY2xyLnIgKiAuMyArIGNsci5nICogLjU5ICsgY2xyLmIgKiAuMTE7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JUcmFuc2Zvcm1lcihjbHIsIGdyZXlzY2FsZSk7XHJcbiAgICAgICAgICAgIHBpeGVsc1tpXSA9IGNvbG9yLnI7XHJcbiAgICAgICAgICAgIHBpeGVsc1tpICsgMV0gPSBjb2xvci5nO1xyXG4gICAgICAgICAgICBwaXhlbHNbaSArIDJdID0gY29sb3IuYjtcclxuICAgICAgICAgICAgcGl4ZWxzW2kgKyAzXSA9IGNvbG9yLmE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHRocmVzaG9sZGluZyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgdGhyZXNob2xkOiBudW1iZXIgPSA1MCwgY29sb3JUcmFuc2Zvcm1lcjogKGNvbG9yOiBDYW52YXNDb2xvciwgbGltaXQ6IGJvb2xlYW4sIGdyZXlzY2FsZT86IG51bWJlcikgPT4gQ2FudmFzQ29sb3IpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtaW4gPSBuZXcgQ2FudmFzQ29sb3IoMCwgMCwgMCwgMjU1KTtcclxuICAgICAgICBjb25zdCBtYXggPSBuZXcgQ2FudmFzQ29sb3IoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgY29sb3JUcmFuc2Zvcm1lciA9IE9iamVjdFV0aWxzLmlzRnVuY3Rpb24oY29sb3JUcmFuc2Zvcm1lcikgPyBjb2xvclRyYW5zZm9ybWVyIDogKChjb2xvcjogQ2FudmFzQ29sb3IsIGxpbWl0OiBib29sZWFuKTogQ2FudmFzQ29sb3IgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbGltaXQgPyBtYXggOiBtaW47XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgQ2FudmFzVXRpbHMubWFuaXB1bGF0ZVBpeGVscyhjYW52YXMsIGN0eCwgKGNvbG9yLCBncmV5c2NhbGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yVHJhbnNmb3JtZXIoY29sb3IsIGdyZXlzY2FsZSA+IHRocmVzaG9sZCwgZ3JleXNjYWxlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3RhY2tCbHVyKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCByYWRpdXM6IG51bWJlciA9IDEwKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDwgMSkgcmV0dXJuO1xyXG4gICAgICAgIHJhZGl1cyB8PSAwO1xyXG5cclxuICAgICAgICBjb25zdCB0b3BfeCA9IDA7XHJcbiAgICAgICAgY29uc3QgdG9wX3kgPSAwO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gY2FudmFzLndpZHRoO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGxldCBpbWFnZURhdGEgPSBudWxsO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSh0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTk9URTogdGhpcyBwYXJ0IGlzIHN1cHBvc2VkbHkgb25seSBuZWVkZWQgaWYgeW91IHdhbnQgdG8gd29yayB3aXRoIGxvY2FsIGZpbGVzXHJcbiAgICAgICAgICAgICAgICAvLyBzbyBpdCBtaWdodCBiZSBva2F5IHRvIHJlbW92ZSB0aGUgd2hvbGUgdHJ5L2NhdGNoIGJsb2NrIGFuZCBqdXN0IHVzZVxyXG4gICAgICAgICAgICAgICAgLy8gaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSggdG9wX3gsIHRvcF95LCB3aWR0aCwgaGVpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldHNjYXBlLnNlY3VyaXR5LlByaXZpbGVnZU1hbmFnZXIuZW5hYmxlUHJpdmlsZWdlKFwiVW5pdmVyc2FsQnJvd3NlclJlYWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSh0b3BfeCwgdG9wX3ksIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiQ2Fubm90IGFjY2VzcyBsb2NhbCBpbWFnZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gYWNjZXNzIGxvY2FsIGltYWdlIGRhdGE6IFwiICsgZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KFwiQ2Fubm90IGFjY2VzcyBpbWFnZVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGFjY2VzcyBpbWFnZSBkYXRhOiBcIiArIGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gaW1hZ2VEYXRhLmRhdGE7XHJcblxyXG4gICAgICAgIGxldCB4LCB5LCBpLCBwLCB5cCwgeWksIHl3LCByX3N1bSwgZ19zdW0sIGJfc3VtLCBhX3N1bSxcclxuICAgICAgICAgICAgcl9vdXRfc3VtLCBnX291dF9zdW0sIGJfb3V0X3N1bSwgYV9vdXRfc3VtLFxyXG4gICAgICAgICAgICByX2luX3N1bSwgZ19pbl9zdW0sIGJfaW5fc3VtLCBhX2luX3N1bSxcclxuICAgICAgICAgICAgcHIsIHBnLCBwYiwgcGEsIHJicztcclxuXHJcbiAgICAgICAgY29uc3QgZGl2ID0gcmFkaXVzICsgcmFkaXVzICsgMTtcclxuICAgICAgICBjb25zdCB3aWR0aE1pbnVzMSA9IHdpZHRoIC0gMTtcclxuICAgICAgICBjb25zdCBoZWlnaHRNaW51czEgPSBoZWlnaHQgLSAxO1xyXG4gICAgICAgIGNvbnN0IHJhZGl1c1BsdXMxID0gcmFkaXVzICsgMTtcclxuICAgICAgICBjb25zdCBzdW1GYWN0b3IgPSByYWRpdXNQbHVzMSAqIChyYWRpdXNQbHVzMSArIDEpIC8gMjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhY2tTdGFydCA9IG5ldyBCbHVyU3RhY2soKTtcclxuICAgICAgICBsZXQgc3RhY2tFbmQgPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFjayA9IHN0YWNrU3RhcnQ7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBkaXY7IGkrKykge1xyXG4gICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQgPSBuZXcgQmx1clN0YWNrKCk7XHJcbiAgICAgICAgICAgIGlmIChpID09IHJhZGl1c1BsdXMxKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFja0VuZCA9IHN0YWNrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YWNrLm5leHQgPSBzdGFja1N0YXJ0O1xyXG4gICAgICAgIGxldCBzdGFja0luID0gbnVsbDtcclxuICAgICAgICBsZXQgc3RhY2tPdXQgPSBudWxsO1xyXG5cclxuICAgICAgICB5dyA9IHlpID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgbXVsX3N1bSA9IG11bF90YWJsZVtyYWRpdXNdO1xyXG4gICAgICAgIGNvbnN0IHNoZ19zdW0gPSBzaGdfdGFibGVbcmFkaXVzXTtcclxuXHJcbiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XHJcbiAgICAgICAgICAgIHJfaW5fc3VtID0gZ19pbl9zdW0gPSBiX2luX3N1bSA9IGFfaW5fc3VtID0gcl9zdW0gPSBnX3N1bSA9IGJfc3VtID0gYV9zdW0gPSAwO1xyXG5cclxuICAgICAgICAgICAgcl9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocHIgPSBwaXhlbHNbeWldKTtcclxuICAgICAgICAgICAgZ19vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGcgPSBwaXhlbHNbeWkgKyAxXSk7XHJcbiAgICAgICAgICAgIGJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBiID0gcGl4ZWxzW3lpICsgMl0pO1xyXG4gICAgICAgICAgICBhX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwYSA9IHBpeGVsc1t5aSArIDNdKTtcclxuXHJcbiAgICAgICAgICAgIHJfc3VtICs9IHN1bUZhY3RvciAqIHByO1xyXG4gICAgICAgICAgICBnX3N1bSArPSBzdW1GYWN0b3IgKiBwZztcclxuICAgICAgICAgICAgYl9zdW0gKz0gc3VtRmFjdG9yICogcGI7XHJcbiAgICAgICAgICAgIGFfc3VtICs9IHN1bUZhY3RvciAqIHBhO1xyXG5cclxuICAgICAgICAgICAgc3RhY2sgPSBzdGFja1N0YXJ0O1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1c1BsdXMxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnIgPSBwcjtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmcgPSBwZztcclxuICAgICAgICAgICAgICAgIHN0YWNrLmIgPSBwYjtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmEgPSBwYTtcclxuICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJhZGl1c1BsdXMxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHAgPSB5aSArICgod2lkdGhNaW51czEgPCBpID8gd2lkdGhNaW51czEgOiBpKSA8PCAyKTtcclxuICAgICAgICAgICAgICAgIHJfc3VtICs9IChzdGFjay5yID0gKHByID0gcGl4ZWxzW3BdKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcclxuICAgICAgICAgICAgICAgIGdfc3VtICs9IChzdGFjay5nID0gKHBnID0gcGl4ZWxzW3AgKyAxXSkpICogcmJzO1xyXG4gICAgICAgICAgICAgICAgYl9zdW0gKz0gKHN0YWNrLmIgPSAocGIgPSBwaXhlbHNbcCArIDJdKSkgKiByYnM7XHJcbiAgICAgICAgICAgICAgICBhX3N1bSArPSAoc3RhY2suYSA9IChwYSA9IHBpeGVsc1twICsgM10pKSAqIHJicztcclxuXHJcbiAgICAgICAgICAgICAgICByX2luX3N1bSArPSBwcjtcclxuICAgICAgICAgICAgICAgIGdfaW5fc3VtICs9IHBnO1xyXG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gKz0gcGI7XHJcbiAgICAgICAgICAgICAgICBhX2luX3N1bSArPSBwYTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcclxuICAgICAgICAgICAgc3RhY2tPdXQgPSBzdGFja0VuZDtcclxuICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIHBpeGVsc1t5aSArIDNdID0gcGEgPSAoYV9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBwYSA9IDI1NSAvIHBhO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1t5aV0gPSAoKHJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbeWkgKyAxXSA9ICgoZ19zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1t5aSArIDJdID0gKChiX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1t5aV0gPSBwaXhlbHNbeWkgKyAxXSA9IHBpeGVsc1t5aSArIDJdID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByX3N1bSAtPSByX291dF9zdW07XHJcbiAgICAgICAgICAgICAgICBnX3N1bSAtPSBnX291dF9zdW07XHJcbiAgICAgICAgICAgICAgICBiX3N1bSAtPSBiX291dF9zdW07XHJcbiAgICAgICAgICAgICAgICBhX3N1bSAtPSBhX291dF9zdW07XHJcblxyXG4gICAgICAgICAgICAgICAgcl9vdXRfc3VtIC09IHN0YWNrSW4ucjtcclxuICAgICAgICAgICAgICAgIGdfb3V0X3N1bSAtPSBzdGFja0luLmc7XHJcbiAgICAgICAgICAgICAgICBiX291dF9zdW0gLT0gc3RhY2tJbi5iO1xyXG4gICAgICAgICAgICAgICAgYV9vdXRfc3VtIC09IHN0YWNrSW4uYTtcclxuXHJcbiAgICAgICAgICAgICAgICBwID0gKHl3ICsgKChwID0geCArIHJhZGl1cyArIDEpIDwgd2lkdGhNaW51czEgPyBwIDogd2lkdGhNaW51czEpKSA8PCAyO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfaW5fc3VtICs9IChzdGFja0luLnIgPSBwaXhlbHNbcF0pO1xyXG4gICAgICAgICAgICAgICAgZ19pbl9zdW0gKz0gKHN0YWNrSW4uZyA9IHBpeGVsc1twICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gKz0gKHN0YWNrSW4uYiA9IHBpeGVsc1twICsgMl0pO1xyXG4gICAgICAgICAgICAgICAgYV9pbl9zdW0gKz0gKHN0YWNrSW4uYSA9IHBpeGVsc1twICsgM10pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfc3VtICs9IHJfaW5fc3VtO1xyXG4gICAgICAgICAgICAgICAgZ19zdW0gKz0gZ19pbl9zdW07XHJcbiAgICAgICAgICAgICAgICBiX3N1bSArPSBiX2luX3N1bTtcclxuICAgICAgICAgICAgICAgIGFfc3VtICs9IGFfaW5fc3VtO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9vdXRfc3VtICs9IChwciA9IHN0YWNrT3V0LnIpO1xyXG4gICAgICAgICAgICAgICAgZ19vdXRfc3VtICs9IChwZyA9IHN0YWNrT3V0LmcpO1xyXG4gICAgICAgICAgICAgICAgYl9vdXRfc3VtICs9IChwYiA9IHN0YWNrT3V0LmIpO1xyXG4gICAgICAgICAgICAgICAgYV9vdXRfc3VtICs9IChwYSA9IHN0YWNrT3V0LmEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfaW5fc3VtIC09IHByO1xyXG4gICAgICAgICAgICAgICAgZ19pbl9zdW0gLT0gcGc7XHJcbiAgICAgICAgICAgICAgICBiX2luX3N1bSAtPSBwYjtcclxuICAgICAgICAgICAgICAgIGFfaW5fc3VtIC09IHBhO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICB5aSArPSA0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHl3ICs9IHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XHJcbiAgICAgICAgICAgIGdfaW5fc3VtID0gYl9pbl9zdW0gPSBhX2luX3N1bSA9IHJfaW5fc3VtID0gZ19zdW0gPSBiX3N1bSA9IGFfc3VtID0gcl9zdW0gPSAwO1xyXG5cclxuICAgICAgICAgICAgeWkgPSB4IDw8IDI7XHJcbiAgICAgICAgICAgIHJfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHByID0gcGl4ZWxzW3lpXSk7XHJcbiAgICAgICAgICAgIGdfb3V0X3N1bSA9IHJhZGl1c1BsdXMxICogKHBnID0gcGl4ZWxzW3lpICsgMV0pO1xyXG4gICAgICAgICAgICBiX291dF9zdW0gPSByYWRpdXNQbHVzMSAqIChwYiA9IHBpeGVsc1t5aSArIDJdKTtcclxuICAgICAgICAgICAgYV9vdXRfc3VtID0gcmFkaXVzUGx1czEgKiAocGEgPSBwaXhlbHNbeWkgKyAzXSk7XHJcblxyXG4gICAgICAgICAgICByX3N1bSArPSBzdW1GYWN0b3IgKiBwcjtcclxuICAgICAgICAgICAgZ19zdW0gKz0gc3VtRmFjdG9yICogcGc7XHJcbiAgICAgICAgICAgIGJfc3VtICs9IHN1bUZhY3RvciAqIHBiO1xyXG4gICAgICAgICAgICBhX3N1bSArPSBzdW1GYWN0b3IgKiBwYTtcclxuXHJcbiAgICAgICAgICAgIHN0YWNrID0gc3RhY2tTdGFydDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByYWRpdXNQbHVzMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5yID0gcHI7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5nID0gcGc7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5iID0gcGI7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5hID0gcGE7XHJcbiAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHlwID0gd2lkdGg7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHJhZGl1czsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB5aSA9ICh5cCArIHgpIDw8IDI7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9zdW0gKz0gKHN0YWNrLnIgPSAocHIgPSBwaXhlbHNbeWldKSkgKiAocmJzID0gcmFkaXVzUGx1czEgLSBpKTtcclxuICAgICAgICAgICAgICAgIGdfc3VtICs9IChzdGFjay5nID0gKHBnID0gcGl4ZWxzW3lpICsgMV0pKSAqIHJicztcclxuICAgICAgICAgICAgICAgIGJfc3VtICs9IChzdGFjay5iID0gKHBiID0gcGl4ZWxzW3lpICsgMl0pKSAqIHJicztcclxuICAgICAgICAgICAgICAgIGFfc3VtICs9IChzdGFjay5hID0gKHBhID0gcGl4ZWxzW3lpICsgM10pKSAqIHJicztcclxuXHJcbiAgICAgICAgICAgICAgICByX2luX3N1bSArPSBwcjtcclxuICAgICAgICAgICAgICAgIGdfaW5fc3VtICs9IHBnO1xyXG4gICAgICAgICAgICAgICAgYl9pbl9zdW0gKz0gcGI7XHJcbiAgICAgICAgICAgICAgICBhX2luX3N1bSArPSBwYTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCBoZWlnaHRNaW51czEpIHtcclxuICAgICAgICAgICAgICAgICAgICB5cCArPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeWkgPSB4O1xyXG4gICAgICAgICAgICBzdGFja0luID0gc3RhY2tTdGFydDtcclxuICAgICAgICAgICAgc3RhY2tPdXQgPSBzdGFja0VuZDtcclxuICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XHJcbiAgICAgICAgICAgICAgICBwID0geWkgPDwgMjtcclxuICAgICAgICAgICAgICAgIHBpeGVsc1twICsgM10gPSBwYSA9IChhX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW07XHJcbiAgICAgICAgICAgICAgICBpZiAocGEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGEgPSAyNTUgLyBwYTtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbcF0gPSAoKHJfc3VtICogbXVsX3N1bSkgPj4gc2hnX3N1bSkgKiBwYTtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbcCArIDFdID0gKChnX3N1bSAqIG11bF9zdW0pID4+IHNoZ19zdW0pICogcGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW3AgKyAyXSA9ICgoYl9zdW0gKiBtdWxfc3VtKSA+PiBzaGdfc3VtKSAqIHBhO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwaXhlbHNbcF0gPSBwaXhlbHNbcCArIDFdID0gcGl4ZWxzW3AgKyAyXSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcl9zdW0gLT0gcl9vdXRfc3VtO1xyXG4gICAgICAgICAgICAgICAgZ19zdW0gLT0gZ19vdXRfc3VtO1xyXG4gICAgICAgICAgICAgICAgYl9zdW0gLT0gYl9vdXRfc3VtO1xyXG4gICAgICAgICAgICAgICAgYV9zdW0gLT0gYV9vdXRfc3VtO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfb3V0X3N1bSAtPSBzdGFja0luLnI7XHJcbiAgICAgICAgICAgICAgICBnX291dF9zdW0gLT0gc3RhY2tJbi5nO1xyXG4gICAgICAgICAgICAgICAgYl9vdXRfc3VtIC09IHN0YWNrSW4uYjtcclxuICAgICAgICAgICAgICAgIGFfb3V0X3N1bSAtPSBzdGFja0luLmE7XHJcblxyXG4gICAgICAgICAgICAgICAgcCA9ICh4ICsgKCgocCA9IHkgKyByYWRpdXNQbHVzMSkgPCBoZWlnaHRNaW51czEgPyBwIDogaGVpZ2h0TWludXMxKSAqIHdpZHRoKSkgPDwgMjtcclxuXHJcbiAgICAgICAgICAgICAgICByX3N1bSArPSAocl9pbl9zdW0gKz0gKHN0YWNrSW4uciA9IHBpeGVsc1twXSkpO1xyXG4gICAgICAgICAgICAgICAgZ19zdW0gKz0gKGdfaW5fc3VtICs9IChzdGFja0luLmcgPSBwaXhlbHNbcCArIDFdKSk7XHJcbiAgICAgICAgICAgICAgICBiX3N1bSArPSAoYl9pbl9zdW0gKz0gKHN0YWNrSW4uYiA9IHBpeGVsc1twICsgMl0pKTtcclxuICAgICAgICAgICAgICAgIGFfc3VtICs9IChhX2luX3N1bSArPSAoc3RhY2tJbi5hID0gcGl4ZWxzW3AgKyAzXSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YWNrSW4gPSBzdGFja0luLm5leHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgcl9vdXRfc3VtICs9IChwciA9IHN0YWNrT3V0LnIpO1xyXG4gICAgICAgICAgICAgICAgZ19vdXRfc3VtICs9IChwZyA9IHN0YWNrT3V0LmcpO1xyXG4gICAgICAgICAgICAgICAgYl9vdXRfc3VtICs9IChwYiA9IHN0YWNrT3V0LmIpO1xyXG4gICAgICAgICAgICAgICAgYV9vdXRfc3VtICs9IChwYSA9IHN0YWNrT3V0LmEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJfaW5fc3VtIC09IHByO1xyXG4gICAgICAgICAgICAgICAgZ19pbl9zdW0gLT0gcGc7XHJcbiAgICAgICAgICAgICAgICBiX2luX3N1bSAtPSBwYjtcclxuICAgICAgICAgICAgICAgIGFfaW5fc3VtIC09IHBhO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YWNrT3V0ID0gc3RhY2tPdXQubmV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICB5aSArPSB3aWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIHRvcF94LCB0b3BfeSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG1lYXN1cmVUZXh0Rm9udFNpemUobWF4V2lkdGg6IG51bWJlciwgbWF4SGVpZ2h0OiBudW1iZXIsIGxpbmVzOiBzdHJpbmdbXSwgZm9udDogc3RyaW5nLCBsaW5lSGVpZ2h0UGVyY2VudDogbnVtYmVyID0gMS4xLCBjYW52YXM/OiBIVE1MQ2FudmFzRWxlbWVudCk6IG51bWJlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0U2l6ZTogbnVtYmVyID0gbWF4SGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcblxyXG4gICAgICAgIGlmICghY2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNhbnZhcyA9IDxIVE1MQ2FudmFzRWxlbWVudD5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYW52YXMud2lkdGggPSBtYXhXaWR0aCArIG1heEhlaWdodDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gbWF4SGVpZ2h0ICogMjtcclxuXHJcbiAgICAgICAgbGV0IGZvbnRTaXplOiBudW1iZXIgPSBDYW52YXNVdGlscy5oYWx2ZVZhbGlkYXRlRm9udFNpemUoc3RhcnRTaXplLCAoc2l6ZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIENhbnZhc1V0aWxzLnNldEZvbnRQcm9wcyhjb250ZXh0LCBmb250LCBzaXplKTtcclxuICAgICAgICAgICAgY29uc3QgbWF4VGV4dExpbmVzV2lkdGggPSBDYW52YXNVdGlscy5nZXRUZXh0V2lkdGgoY29udGV4dCwgbGluZXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF4V2lkdGggLSBtYXhUZXh0TGluZXNXaWR0aDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgYml0bWFwSGVpZ2h0OiBudW1iZXIgPSBDYW52YXNVdGlscy5nZXRUZXh0Qml0bWFwSGVpZ2h0KGNhbnZhcywgY29udGV4dCwgbGluZXMsIGZvbnQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0UGVyY2VudCk7XHJcbiAgICAgICAgaWYgKGJpdG1hcEhlaWdodCA+IG1heEhlaWdodCkge1xyXG4gICAgICAgICAgICBmb250U2l6ZSA9IENhbnZhc1V0aWxzLmhhbHZlVmFsaWRhdGVGb250U2l6ZShmb250U2l6ZSwgKHNpemU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCAtIENhbnZhc1V0aWxzLmdldFRleHRCaXRtYXBIZWlnaHQoY2FudmFzLCBjb250ZXh0LCBsaW5lcywgZm9udCwgc2l6ZSwgbGluZUhlaWdodFBlcmNlbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb250U2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZHJhd0xpbmVzKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgbGluZXM6IHN0cmluZ1tdLCBmb250OiBzdHJpbmcsIHNpemU6IG51bWJlciwgbGluZUhlaWdodFBlcmNlbnQ6IG51bWJlciA9IDEuMSwgYWxpZ246IHN0cmluZyA9IFwibGVmdFwiLCBiYXNlTGluZTogc3RyaW5nID0gXCJ0b3BcIiwgeDogbnVtYmVyID0gMCwgeTogbnVtYmVyID0gMCk6IG51bWJlciB7XHJcbiAgICAgICAgQ2FudmFzVXRpbHMuc2V0Rm9udFByb3BzKGNvbnRleHQsIGZvbnQsIHNpemUsIGFsaWduLCBiYXNlTGluZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmU6IHN0cmluZyA9IGxpbmVzW2ldO1xyXG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGxpbmUsIHgsIHkpO1xyXG4gICAgICAgICAgICBpZiAoaSA8IGxpbmVzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHkgKz0gc2l6ZSAqIGxpbmVIZWlnaHRQZXJjZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB5O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB3cmFwVGV4dChjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIG1heFdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBjb250ZXh0Lm1lYXN1cmVUZXh0KFwiTVwiKS53aWR0aCAqIDEuMztcclxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBsZXQgbGluZSA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB3b3Jkcy5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0TGluZSA9IGxpbmUgKyB3b3Jkc1tuXSArIFwiIFwiO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXN0TGluZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3RXaWR0aCA9IG1ldHJpY3Mud2lkdGg7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0V2lkdGggPiBtYXhXaWR0aCAmJiBuID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSB3b3Jkc1tuXSArIFwiIFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGluZSA9IHRlc3RMaW5lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxpbmVzLnB1c2gobGluZSk7XHJcbiAgICAgICAgeSAtPSBsaW5lSGVpZ2h0ICogLjUgKiBsaW5lcy5sZW5ndGg7XHJcbiAgICAgICAgbGluZXMuZm9yRWFjaChsID0+IHtcclxuICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dChsLCB4LCB5KTtcclxuICAgICAgICAgICAgeSArPSBsaW5lSGVpZ2h0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXRGb250UHJvcHMoY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBmb250OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGFsaWduOiBzdHJpbmcgPSBcImxlZnRcIiwgYmFzZUxpbmU6IHN0cmluZyA9IFwidG9wXCIpOiB2b2lkIHtcclxuICAgICAgICBjb250ZXh0LmZvbnQgPSBgJHtmb250U2l6ZX1weCAke2ZvbnR9YDtcclxuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9IDxhbnk+YWxpZ247XHJcbiAgICAgICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSA8YW55PmJhc2VMaW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRXaWR0aChjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGxpbmVzOiBzdHJpbmdbXSk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IG1heFdpZHRoOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lOiBzdHJpbmcgPSBsaW5lc1tpXTtcclxuICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgY29udGV4dC5tZWFzdXJlVGV4dChsaW5lKS53aWR0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXhXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUZXh0Qml0bWFwSGVpZ2h0KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgbGluZXM6IHN0cmluZ1tdLCBmb250OiBzdHJpbmcsIGZvbnRTaXplOiBudW1iZXIsIGxpbmVIZWlnaHRQZXJjZW50OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBjYW52YXMud2lkdGg7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0WSA9IENhbnZhc1V0aWxzLmRyYXdMaW5lcyhjb250ZXh0LCBsaW5lcywgZm9udCwgZm9udFNpemUsIGxpbmVIZWlnaHRQZXJjZW50LCBcImxlZnRcIiwgXCJ0b3BcIiwgZm9udFNpemUgKiAuNSwgZm9udFNpemUgKiAuNSk7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VEYXRhOiBJbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgbGV0IHRleHRIZWlnaHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIHlMb29wOmZvciAobGV0IHk6IG51bWJlciA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB4OiBudW1iZXIgPSAwOyB4IDwgd2lkdGg7IHgrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9ICh4ICsgeSAqIHdpZHRoKSAqIDQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0SGVpZ2h0ID0geSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgeUxvb3A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0ZXh0SGVpZ2h0LCB0ZXh0WSArIGZvbnRTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBoYWx2ZVZhbGlkYXRlRm9udFNpemUoc3RhcnRTaXplOiBudW1iZXIsIGNhbGxiYWNrOiAoc2l6ZTogbnVtYmVyKSA9PiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBmb250U2l6ZTogbnVtYmVyID0gc3RhcnRTaXplO1xyXG4gICAgICAgIGxldCBsYXN0Rm9udFNpemU6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvbjogbnVtYmVyO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMjA7IGkrKykge1xyXG4gICAgICAgICAgICBkaXJlY3Rpb24gPSBjYWxsYmFjayhmb250U2l6ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBTaXplOiBudW1iZXIgPSBmb250U2l6ZTtcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgICAgIGZvbnRTaXplID0gZm9udFNpemUgLSAoTWF0aC5hYnMoZm9udFNpemUgLSBsYXN0Rm9udFNpemUpIC8gMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb250U2l6ZSA9IGZvbnRTaXplICsgKE1hdGguYWJzKGZvbnRTaXplIC0gbGFzdEZvbnRTaXplKSAvIDIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxhc3RGb250U2l6ZSA9IHRlbXBTaXplO1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZm9udFNpemUgLSBsYXN0Rm9udFNpemUpIDwgMC4xKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb250U2l6ZSA9IE1hdGguZmxvb3IoZm9udFNpemUpO1xyXG4gICAgICAgIHJldHVybiBmb250U2l6ZTtcclxuICAgIH1cclxufVxyXG4iXX0=