@hufe921/canvas-editor 0.9.129 → 0.9.131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/canvas-editor.es.js +105 -17
- package/dist/canvas-editor.es.js.map +1 -1
- package/dist/canvas-editor.umd.js +40 -40
- package/dist/canvas-editor.umd.js.map +1 -1
- package/dist/src/editor/core/draw/particle/block/BlockParticle.d.ts +1 -0
- package/dist/src/editor/core/worker/WorkerManager.d.ts +1 -0
- package/dist/src/editor/dataset/enum/Watermark.d.ts +4 -0
- package/dist/src/editor/index.d.ts +2 -2
- package/dist/src/editor/interface/Draw.d.ts +1 -0
- package/dist/src/editor/interface/Editor.d.ts +1 -0
- package/dist/src/editor/interface/Watermark.d.ts +2 -1
- package/dist/src/editor/utils/index.d.ts +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
## [0.9.131](https://github.com/Hufe921/canvas-editor/compare/v0.9.130...v0.9.131) (2026-04-10)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* multiple consecutive lists rendering extra blank lines #1389 ([f344b74](https://github.com/Hufe921/canvas-editor/commit/f344b74bb342408a8f39cdae4d06782e8c5945db)), closes [#1389](https://github.com/Hufe921/canvas-editor/issues/1389)
|
|
7
|
+
* table cell adaptive row height #1388 ([8d23ce3](https://github.com/Hufe921/canvas-editor/commit/8d23ce3fa8eb8edacd0dcf4652c78eb71ded50a4)), closes [#1388](https://github.com/Hufe921/canvas-editor/issues/1388)
|
|
8
|
+
* terminate workers and disconnect observer when editor destroy ([132b992](https://github.com/Hufe921/canvas-editor/commit/132b9927df698012a46e597265fadc5ce0be56f2))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* add filterEmptyControl option to print mode #1385 ([81a6c86](https://github.com/Hufe921/canvas-editor/commit/81a6c86ab0736461f77b821401b08f87a06588c0)), closes [#1385](https://github.com/Hufe921/canvas-editor/issues/1385)
|
|
14
|
+
* support watermark layer configuration #1386 ([b0a068b](https://github.com/Hufe921/canvas-editor/commit/b0a068b097b9ec3a6b89b3385f0bdb589c4204f5)), closes [#1386](https://github.com/Hufe921/canvas-editor/issues/1386)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## [0.9.130](https://github.com/Hufe921/canvas-editor/compare/v0.9.129...v0.9.130) (2026-03-27)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* correct duplicate variable check in TextParticle render ([4b72161](https://github.com/Hufe921/canvas-editor/commit/4b721618d10ef484e92b79f52ea27ee4be316814))
|
|
24
|
+
* ensure trailing line break in element list formatting #1378 ([30074b6](https://github.com/Hufe921/canvas-editor/commit/30074b6b703b3da581c5446a75edb38f4bff56b7)), closes [#1378](https://github.com/Hufe921/canvas-editor/issues/1378)
|
|
25
|
+
* optimize cursor positioning for left/right key handlers #1378 ([a79928f](https://github.com/Hufe921/canvas-editor/commit/a79928fc507cac0302e105110bc31f2baeefb74c)), closes [#1378](https://github.com/Hufe921/canvas-editor/issues/1378)
|
|
26
|
+
* prevent extra line break when list is first element in table #1381 ([bae2394](https://github.com/Hufe921/canvas-editor/commit/bae2394ceffee5e1a5b8f55d5ef8d60f7edc44b9)), closes [#1381](https://github.com/Hufe921/canvas-editor/issues/1381)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Features
|
|
30
|
+
|
|
31
|
+
* support iframe snapshot in getImage api #1380 ([d980298](https://github.com/Hufe921/canvas-editor/commit/d9802988587333b8b624112f554d2b4e9d702e00)), closes [#1380](https://github.com/Hufe921/canvas-editor/issues/1380)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
1
35
|
## [0.9.129](https://github.com/Hufe921/canvas-editor/compare/v0.9.128...v0.9.129) (2026-03-13)
|
|
2
36
|
|
|
3
37
|
|
package/dist/canvas-editor.es.js
CHANGED
|
@@ -23,7 +23,7 @@ var __publicField = (obj, key, value) => {
|
|
|
23
23
|
return value;
|
|
24
24
|
};
|
|
25
25
|
var index = "";
|
|
26
|
-
const version = "0.9.
|
|
26
|
+
const version = "0.9.131";
|
|
27
27
|
var MaxHeightRatio;
|
|
28
28
|
(function(MaxHeightRatio2) {
|
|
29
29
|
MaxHeightRatio2["HALF"] = "half";
|
|
@@ -414,6 +414,14 @@ function isRectIntersect(rect1, rect2) {
|
|
|
414
414
|
function isNonValue(value) {
|
|
415
415
|
return value === void 0 || value === null;
|
|
416
416
|
}
|
|
417
|
+
function loadImage(src) {
|
|
418
|
+
return new Promise((resolve, reject) => {
|
|
419
|
+
const img = new Image();
|
|
420
|
+
img.onload = () => resolve(img);
|
|
421
|
+
img.onerror = reject;
|
|
422
|
+
img.src = src;
|
|
423
|
+
});
|
|
424
|
+
}
|
|
417
425
|
function normalizeLineBreak(text) {
|
|
418
426
|
return text.replace(/\r\n|\r/g, "\n");
|
|
419
427
|
}
|
|
@@ -477,7 +485,8 @@ const EDITOR_CLIPBOARD = `${EDITOR_PREFIX}-clipboard`;
|
|
|
477
485
|
const defaultModeRuleOption = {
|
|
478
486
|
print: {
|
|
479
487
|
imagePreviewerDisabled: false,
|
|
480
|
-
backgroundDisabled: false
|
|
488
|
+
backgroundDisabled: false,
|
|
489
|
+
filterEmptyControl: true
|
|
481
490
|
},
|
|
482
491
|
readonly: {
|
|
483
492
|
imagePreviewerDisabled: false
|
|
@@ -4274,6 +4283,11 @@ var WatermarkType;
|
|
|
4274
4283
|
WatermarkType2["TEXT"] = "text";
|
|
4275
4284
|
WatermarkType2["IMAGE"] = "image";
|
|
4276
4285
|
})(WatermarkType || (WatermarkType = {}));
|
|
4286
|
+
var WatermarkLayer;
|
|
4287
|
+
(function(WatermarkLayer2) {
|
|
4288
|
+
WatermarkLayer2["BOTTOM"] = "bottom";
|
|
4289
|
+
WatermarkLayer2["TOP"] = "top";
|
|
4290
|
+
})(WatermarkLayer || (WatermarkLayer = {}));
|
|
4277
4291
|
const defaultWatermarkOption = {
|
|
4278
4292
|
data: "",
|
|
4279
4293
|
type: WatermarkType.TEXT,
|
|
@@ -4285,7 +4299,8 @@ const defaultWatermarkOption = {
|
|
|
4285
4299
|
font: "Microsoft YaHei",
|
|
4286
4300
|
repeat: false,
|
|
4287
4301
|
gap: [10, 10],
|
|
4288
|
-
numberType: NumberType.ARABIC
|
|
4302
|
+
numberType: NumberType.ARABIC,
|
|
4303
|
+
layer: WatermarkLayer.BOTTOM
|
|
4289
4304
|
};
|
|
4290
4305
|
const defaultZoneOption = {
|
|
4291
4306
|
tipDisabled: true
|
|
@@ -4440,10 +4455,10 @@ function unzipElementList(elementList) {
|
|
|
4440
4455
|
return result;
|
|
4441
4456
|
}
|
|
4442
4457
|
function formatElementList(elementList, options) {
|
|
4443
|
-
var _a, _b;
|
|
4458
|
+
var _a, _b, _c;
|
|
4444
4459
|
const { isHandleFirstElement = true, isForceCompensation = false, editorOptions } = options;
|
|
4445
4460
|
const startElement = elementList[0];
|
|
4446
|
-
if (
|
|
4461
|
+
if ((startElement == null ? void 0 : startElement.type) !== ElementType.LIST && (isForceCompensation || isHandleFirstElement && ((startElement == null ? void 0 : startElement.type) && startElement.type !== ElementType.TEXT || !START_LINE_BREAK_REG.test(startElement == null ? void 0 : startElement.value)))) {
|
|
4447
4462
|
elementList.unshift({
|
|
4448
4463
|
value: ZERO
|
|
4449
4464
|
});
|
|
@@ -4498,6 +4513,12 @@ function formatElementList(elementList, options) {
|
|
|
4498
4513
|
elementList.splice(i, 0, value);
|
|
4499
4514
|
i++;
|
|
4500
4515
|
}
|
|
4516
|
+
if (elementList[i] && (((_a = elementList[i].valueList) == null ? void 0 : _a.length) ? !START_LINE_BREAK_REG.test(elementList[i].valueList[0].value) : !START_LINE_BREAK_REG.test(elementList[i].value))) {
|
|
4517
|
+
elementList.splice(i, 0, {
|
|
4518
|
+
value: ZERO
|
|
4519
|
+
});
|
|
4520
|
+
i++;
|
|
4521
|
+
}
|
|
4501
4522
|
}
|
|
4502
4523
|
i--;
|
|
4503
4524
|
} else if (el.type === ElementType.AREA) {
|
|
@@ -4557,7 +4578,7 @@ function formatElementList(elementList, options) {
|
|
|
4557
4578
|
isHandleFirstElement: true,
|
|
4558
4579
|
isForceCompensation: true
|
|
4559
4580
|
}));
|
|
4560
|
-
if (!td.value[0].size && ((
|
|
4581
|
+
if (!td.value[0].size && ((_b = td.value[1]) == null ? void 0 : _b.size) && isTextLikeElement(td.value[1])) {
|
|
4561
4582
|
td.value[0].size = td.value[1].size;
|
|
4562
4583
|
}
|
|
4563
4584
|
for (let v = 0; v < td.value.length; v++) {
|
|
@@ -4787,7 +4808,7 @@ function formatElementList(elementList, options) {
|
|
|
4787
4808
|
i++;
|
|
4788
4809
|
}
|
|
4789
4810
|
i--;
|
|
4790
|
-
} else if ((!el.type || TEXTLIKE_ELEMENT_TYPE.includes(el.type)) && ((
|
|
4811
|
+
} else if ((!el.type || TEXTLIKE_ELEMENT_TYPE.includes(el.type)) && ((_c = el.value) == null ? void 0 : _c.length) > 1) {
|
|
4791
4812
|
elementList.splice(i, 1);
|
|
4792
4813
|
const valueList = splitText(el.value);
|
|
4793
4814
|
for (let v = 0; v < valueList.length; v++) {
|
|
@@ -7533,6 +7554,20 @@ function left(evt, host) {
|
|
|
7533
7554
|
isSubmitHistory: false,
|
|
7534
7555
|
isCompute: false
|
|
7535
7556
|
});
|
|
7557
|
+
if (isAnchorCollapsed) {
|
|
7558
|
+
const positionList = position.getPositionList();
|
|
7559
|
+
const anchorPosition = positionList[anchorStartIndex];
|
|
7560
|
+
if ((anchorPosition == null ? void 0 : anchorPosition.isLastLetter) && anchorPosition.value !== ZERO && anchorStartIndex + 1 < positionList.length) {
|
|
7561
|
+
const nextPosition = positionList[anchorStartIndex + 1];
|
|
7562
|
+
const element = newElementList[anchorStartIndex];
|
|
7563
|
+
const nextElement = newElementList[anchorStartIndex + 1];
|
|
7564
|
+
if (nextPosition.value !== ZERO && !getIsBlockElement(nextElement) && element.listId === nextElement.listId) {
|
|
7565
|
+
draw.getCursor().drawCursor({
|
|
7566
|
+
hitLineStartIndex: anchorStartIndex + 1
|
|
7567
|
+
});
|
|
7568
|
+
}
|
|
7569
|
+
}
|
|
7570
|
+
}
|
|
7536
7571
|
evt.preventDefault();
|
|
7537
7572
|
}
|
|
7538
7573
|
function right(evt, host) {
|
|
@@ -7677,6 +7712,19 @@ function right(evt, host) {
|
|
|
7677
7712
|
isSubmitHistory: false,
|
|
7678
7713
|
isCompute: false
|
|
7679
7714
|
});
|
|
7715
|
+
if (isAnchorCollapsed) {
|
|
7716
|
+
const anchorPosition = positionList[anchorStartIndex];
|
|
7717
|
+
if ((anchorPosition == null ? void 0 : anchorPosition.isLastLetter) && anchorPosition.value !== ZERO && anchorStartIndex + 1 < positionList.length) {
|
|
7718
|
+
const nextPosition = positionList[anchorStartIndex + 1];
|
|
7719
|
+
const element = elementList[anchorStartIndex];
|
|
7720
|
+
const nextElement = elementList[anchorStartIndex + 1];
|
|
7721
|
+
if (nextPosition.value !== ZERO && !getIsBlockElement(nextElement) && element.listId === nextElement.listId) {
|
|
7722
|
+
draw.getCursor().drawCursor({
|
|
7723
|
+
hitLineStartIndex: anchorStartIndex + 1
|
|
7724
|
+
});
|
|
7725
|
+
}
|
|
7726
|
+
}
|
|
7727
|
+
}
|
|
7680
7728
|
evt.preventDefault();
|
|
7681
7729
|
}
|
|
7682
7730
|
function tab(evt, host) {
|
|
@@ -10973,7 +11021,7 @@ class TextParticle {
|
|
|
10973
11021
|
this.curY = y;
|
|
10974
11022
|
}
|
|
10975
11023
|
_render() {
|
|
10976
|
-
if (!this.text || !~this.curX || !~this.
|
|
11024
|
+
if (!this.text || !~this.curX || !~this.curY)
|
|
10977
11025
|
return;
|
|
10978
11026
|
this.ctx.save();
|
|
10979
11027
|
this.ctx.font = this.curStyle;
|
|
@@ -14142,6 +14190,7 @@ class Control {
|
|
|
14142
14190
|
return this.draw;
|
|
14143
14191
|
}
|
|
14144
14192
|
filterAssistElement(elementList) {
|
|
14193
|
+
const { filterEmptyControl } = this.options.modeRule[EditorMode.PRINT];
|
|
14145
14194
|
return elementList.filter((element, index2) => {
|
|
14146
14195
|
var _a, _b, _c;
|
|
14147
14196
|
if (element.type === ElementType.TABLE) {
|
|
@@ -14193,7 +14242,7 @@ class Control {
|
|
|
14193
14242
|
return isExistValue;
|
|
14194
14243
|
}
|
|
14195
14244
|
}
|
|
14196
|
-
return element.controlComponent !== ControlComponent.PREFIX && element.controlComponent !== ControlComponent.POSTFIX && element.controlComponent !== ControlComponent.PLACEHOLDER;
|
|
14245
|
+
return element.controlComponent !== ControlComponent.PREFIX && element.controlComponent !== ControlComponent.POSTFIX && (!filterEmptyControl || element.controlComponent !== ControlComponent.PLACEHOLDER);
|
|
14197
14246
|
});
|
|
14198
14247
|
}
|
|
14199
14248
|
getIsRangeCanCaptureEvent() {
|
|
@@ -15683,7 +15732,7 @@ function WorkerWrapper$1() {
|
|
|
15683
15732
|
objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
|
|
15684
15733
|
}
|
|
15685
15734
|
}
|
|
15686
|
-
const encodedJs = "KCgpPT57dmFyIFRlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxJZT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGRlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksUmU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbmU9KFQsSSxkKT0+SSBpbiBUP1RlKFQsSSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZH0pOlRbSV09ZCxnPShULEkpPT57Zm9yKHZhciBkIGluIEl8fChJPXt9KSlkZS5jYWxsKEksZCkmJm5lKFQsZCxJW2RdKTtpZihsZSlmb3IodmFyIGQgb2YgbGUoSSkpUmUuY2FsbChJLGQpJiZuZShULGQsSVtkXSk7cmV0dXJuIFR9LFg9KFQsSSk9PkllKFQsQWUoSSkpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5IQUxGPSJoYWxmIixlLk9ORV9USElSRD0ib25lLXRoaXJkIixlLlFVQVJURVI9InF1YXJ0ZXIifSkoVHx8KFQ9e30pKTt2YXIgSTsoZnVuY3Rpb24oZSl7ZS5BUkFCSUM9ImFyYWJpYyIsZS5DSElORVNFPSJjaGluZXNlIn0pKEl8fChJPXt9KSk7dmFyIGQ7KGZ1bmN0aW9uKGUpe2UuSU5MSU5FPSJpbmxpbmUiLGUuQkxPQ0s9ImJsb2NrIixlLlNVUlJPVU5EPSJzdXJyb3VuZCIsZS5GTE9BVF9UT1A9ImZsb2F0LXRvcCIsZS5GTE9BVF9CT1RUT009ImZsb2F0LWJvdHRvbSJ9KShkfHwoZD17fSkpO3ZhciBfOyhmdW5jdGlvbihlKXtlLkJFRk9SRT0iYmVmb3JlIixlLkFGVEVSPSJhZnRlciIsZS5PVVRFUl9CRUZPUkU9Im91dGVyLWJlZm9yZSIsZS5PVVRFUl9BRlRFUj0ib3V0ZXItYWZ0ZXIifSkoX3x8KF89e30pKTt2YXIgTTsoZnVuY3Rpb24oZSl7ZS5ST1c9InJvdyIsZS5DT0xVTU49ImNvbHVtbiJ9KShNfHwoTT17fSkpO2NvbnN0IFA9Ilx1MjAwQiI7VC5IQUxGKyIiLDEvMixULk9ORV9USElSRCsiIiwxLzMsVC5RVUFSVEVSKyIiLDEvNDtmdW5jdGlvbiBiKGUpe2lmKHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU9PSJmdW5jdGlvbiIpcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShlKTtpZighZXx8dHlwZW9mIGUhPSJvYmplY3QiKXJldHVybiBlO2xldCBjPXt9O3JldHVybiBBcnJheS5pc0FycmF5KGUpP2M9ZS5tYXAoRT0+YihFKSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaChFPT57Y1tFXT1iKGVbRV0pfSksY31mdW5jdGlvbiB3KGUsYyl7Y29uc3QgRT17fTtmb3IoY29uc3QgQSBpbiBlKWMuaW5jbHVkZXMoQSkmJihFW0FdPWVbQV0pO3JldHVybiBFfWZ1bmN0aW9uIHJlKGUsYyl7cmV0dXJuIGUubGVuZ3RoIT09Yy5sZW5ndGg/ITE6IWUuc29tZShFPT4hYy5pbmNsdWRlcyhFKSl9dmFyIG47KGZ1bmN0aW9uKGUpe2UuVEVYVD0idGV4dCIsZS5JTUFHRT0iaW1hZ2UiLGUuVEFCTEU9InRhYmxlIixlLkhZUEVSTElOSz0iaHlwZXJsaW5rIixlLlNVUEVSU0NSSVBUPSJzdXBlcnNjcmlwdCIsZS5TVUJTQ1JJUFQ9InN1YnNjcmlwdCIsZS5TRVBBUkFUT1I9InNlcGFyYXRvciIsZS5QQUdFX0JSRUFLPSJwYWdlQnJlYWsiLGUuQ09OVFJPTD0iY29udHJvbCIsZS5BUkVBPSJhcmVhIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuTEFURVg9ImxhdGV4IixlLlRBQj0idGFiIixlLkRBVEU9ImRhdGUiLGUuQkxPQ0s9ImJsb2NrIixlLlRJVExFPSJ0aXRsZSIsZS5MSVNUPSJsaXN0IixlLkxBQkVMPSJsYWJlbCJ9KShufHwobj17fSkpO2NvbnN0IG9lPVsicm93RmxleCIsInJvd01hcmdpbiJdLGNlPVsidHlwZSIsImZvbnQiLCJzaXplIiwiYm9sZCIsImNvbG9yIiwiaXRhbGljIiwiaGlnaGxpZ2h0IiwidW5kZXJsaW5lIiwic3RyaWtlb3V0Iiwicm93RmxleCIsInJvd01hcmdpbiIsImRhc2hBcnJheSIsInRyTGlzdCIsInRhYmxlVG9vbERpc2FibGVkIiwiYm9yZGVyVHlwZSIsImJvcmRlckNvbG9yIiwidHJhbnNsYXRlWCIsIndpZHRoIiwiaGVpZ2h0IiwidXJsIiwiY29sZ3JvdXAiLCJ2YWx1ZUxpc3QiLCJjb250cm9sIiwiY2hlY2tib3giLCJyYWRpbyIsImRhdGVGb3JtYXQiLCJibG9jayIsImxldmVsIiwidGl0bGUiLCJsaXN0VHlwZSIsImxpc3RTdHlsZSIsImxpc3RXcmFwIiwiZ3JvdXBJZHMiLCJjb25jZXB0SWQiLCJpbWdEaXNwbGF5IiwiaW1nRmxvYXRQb3NpdGlvbiIsImltZ1Rvb2xEaXNhYmxlZCIsImltZ1ByZXZpZXdEaXNhYmxlZCIsImltZ0Nyb3AiLCJpbWdDYXB0aW9uIiwidGV4dERlY29yYXRpb24iLCJleHRlbnNpb24iLCJleHRlcm5hbElkIiwiYXJlYUlkIiwiYXJlYSIsImhpZGUiLCJsYWJlbCIsImxhYmVsSWQiLCJsaW5lV2lkdGgiXSxzZT1bImNvbmNlcHRJZCIsImV4dGVuc2lvbiIsImV4dGVybmFsSWQiLCJ2ZXJ0aWNhbEFsaWduIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyVHlwZXMiLCJzbGFzaFR5cGVzIiwiZGlzYWJsZWQiLCJkZWxldGFibGUiXSxmZT1bImZvbnQiLCJzaXplIiwiYm9sZCIsImhpZ2hsaWdodCIsIml0YWxpYyIsInN0cmlrZW91dCJdO24uVEVYVCxuLkhZUEVSTElOSyxuLlNVQlNDUklQVCxuLlNVUEVSU0NSSVBULG4uQ09OVFJPTCxuLkRBVEUsbi5JTUFHRSxuLkxBVEVYLG4uQkxPQ0ssbi5QQUdFX0JSRUFLLG4uU0VQQVJBVE9SLG4uVEFCTEUsbi5USVRMRSxuLkxJU1Q7dmFyIE47KGZ1bmN0aW9uKGUpe2UuVUw9InVsIixlLk9MPSJvbCJ9KShOfHwoTj17fSkpO3ZhciBPOyhmdW5jdGlvbihlKXtlLkRJU0M9ImRpc2MiLGUuQ0lSQ0xFPSJjaXJjbGUiLGUuU1FVQVJFPSJzcXVhcmUiLGUuQ0hFQ0tCT1g9ImNoZWNrYm94In0pKE98fChPPXt9KSk7dmFyIEg7KGZ1bmN0aW9uKGUpe2UuREVDSU1BTD0iZGVjaW1hbCJ9KShIfHwoSD17fSkpO3ZhciB2OyhmdW5jdGlvbihlKXtlW2UuRElTQz1PLkRJU0NdPSJESVNDIixlW2UuQ0lSQ0xFPU8uQ0lSQ0xFXT0iQ0lSQ0xFIixlW2UuU1FVQVJFPU8uU1FVQVJFXT0iU1FVQVJFIixlW2UuREVDSU1BTD1ILkRFQ0lNQUxdPSJERUNJTUFMIixlW2UuQ0hFQ0tCT1g9Ty5DSEVDS0JPWF09IkNIRUNLQk9YIn0pKHZ8fCh2PXt9KSksTy5ESVNDKyIiLE8uQ0lSQ0xFKyIiLE8uU1FVQVJFKyIiLE8uQ0hFQ0tCT1grIiIsTi5PTCsiIixOLlVMKyIiLHYuRElTQysiIix2LkNJUkNMRSsiIix2LlNRVUFSRSsiIix2LkRFQ0lNQUwrIiIsdi5DSEVDS0JPWCsiIjt2YXIgdTsoZnVuY3Rpb24oZSl7ZS5GSVJTVD0iZmlyc3QiLGUuU0VDT05EPSJzZWNvbmQiLGUuVEhJUkQ9InRoaXJkIixlLkZPVVJUSD0iZm91cnRoIixlLkZJRlRIPSJmaWZ0aCIsZS5TSVhUSD0ic2l4dGgifSkodXx8KHU9e30pKSx1LkZJUlNUKyIiLHUuU0VDT05EKyIiLHUuVEhJUkQrIiIsdS5GT1VSVEgrIiIsdS5GSUZUSCsiIix1LlNJWFRIKyIiLHUuRklSU1QrIiIsdS5TRUNPTkQrIiIsdS5USElSRCsiIix1LkZPVVJUSCsiIix1LkZJRlRIKyIiLHUuU0lYVEgrIiIsdS5GSVJTVCx1LlNFQ09ORCx1LlRISVJELHUuRk9VUlRILHUuRklGVEgsdS5TSVhUSDt2YXIgSzsoZnVuY3Rpb24oZSl7ZS5JRlJBTUU9ImlmcmFtZSIsZS5WSURFTz0idmlkZW8ifSkoS3x8KEs9e30pKTt2YXIgRzsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLlNFTEVDVD0ic2VsZWN0IixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuREFURT0iZGF0ZSIsZS5OVU1CRVI9Im51bWJlciJ9KShHfHwoRz17fSkpO3ZhciBDOyhmdW5jdGlvbihlKXtlLlBSRUZJWD0icHJlZml4IixlLlBPU1RGSVg9InBvc3RmaXgiLGUuUFJFX1RFWFQ9InByZVRleHQiLGUuUE9TVF9URVhUPSJwb3N0VGV4dCIsZS5QTEFDRUhPTERFUj0icGxhY2Vob2xkZXIiLGUuVkFMVUU9InZhbHVlIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8ifSkoQ3x8KEM9e30pKTt2YXIgejsoZnVuY3Rpb24oZSl7ZS5ST1dfU1RBUlQ9InJvd1N0YXJ0IixlLlZBTFVFX1NUQVJUPSJ2YWx1ZVN0YXJ0In0pKHp8fCh6PXt9KSk7dmFyIFk7KGZ1bmN0aW9uKGUpe2UuQUNUSVZFPSJhY3RpdmUiLGUuSU5BQ1RJVkU9ImluYWN0aXZlIn0pKFl8fChZPXt9KSk7dmFyIFY7KGZ1bmN0aW9uKGUpe2UuTlVNQkVSPSJudW1iZXIiLGUuT1BFUkFUT1I9Im9wZXJhdG9yIixlLlVUSUxJVFk9InV0aWxpdHkiLGUuRVFVQUw9ImVxdWFsIn0pKFZ8fChWPXt9KSk7dmFyIFE7KGZ1bmN0aW9uKGUpe2UuQ09NUE9ORU5UPSJjb21wb25lbnQiLGUuTUVOVT0ibWVudSIsZS5NQUlOPSJtYWluIixlLkZPT1RFUj0iZm9vdGVyIixlLkNPTlRFWFRNRU5VPSJjb250ZXh0bWVudSIsZS5QT1BVUD0icG9wdXAiLGUuQ0FUQUxPRz0iY2F0YWxvZyIsZS5DT01NRU5UPSJjb21tZW50In0pKFF8fChRPXt9KSk7dmFyIFc7KGZ1bmN0aW9uKGUpe2UuUEFHRT0icGFnZSIsZS5UQUJMRT0idGFibGUifSkoV3x8KFc9e30pKTt2YXIgcTsoZnVuY3Rpb24oZSl7ZS5FRElUPSJlZGl0IixlLkNMRUFOPSJjbGVhbiIsZS5SRUFET05MWT0icmVhZG9ubHkiLGUuRk9STT0iZm9ybSIsZS5QUklOVD0icHJpbnQiLGUuREVTSUdOPSJkZXNpZ24iLGUuR1JBRkZJVEk9ImdyYWZmaXRpIn0pKHF8fChxPXt9KSk7dmFyIFo7KGZ1bmN0aW9uKGUpe2UuSEVBREVSPSJoZWFkZXIiLGUuTUFJTj0ibWFpbiIsZS5GT09URVI9ImZvb3RlciJ9KShafHwoWj17fSkpO3ZhciBKOyhmdW5jdGlvbihlKXtlLlBBR0lORz0icGFnaW5nIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoSnx8KEo9e30pKTt2YXIgajsoZnVuY3Rpb24oZSl7ZS5WRVJUSUNBTD0idmVydGljYWwiLGUuSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCJ9KShqfHwoaj17fSkpO3ZhciAkOyhmdW5jdGlvbihlKXtlLkJSRUFLX0FMTD0iYnJlYWstYWxsIixlLkJSRUFLX1dPUkQ9ImJyZWFrLXdvcmQifSkoJHx8KCQ9e30pKTt2YXIgZWU7KGZ1bmN0aW9uKGUpe2UuU1BFRUQ9InNwZWVkIixlLkNPTVBBVElCSUxJVFk9ImNvbXBhdGliaWxpdHkifSkoZWV8fChlZT17fSkpO3ZhciBEOyhmdW5jdGlvbihlKXtlLkxFRlQ9ImxlZnQiLGUuQ0VOVEVSPSJjZW50ZXIiLGUuUklHSFQ9InJpZ2h0IixlLkFMSUdOTUVOVD0iYWxpZ25tZW50IixlLkpVU1RJRlk9Imp1c3RpZnkifSkoRHx8KEQ9e30pKTt2YXIgdGU7KGZ1bmN0aW9uKGUpe2UuQUxMPSJhbGwiLGUuRU1QVFk9ImVtcHR5IixlLkVYVEVSTkFMPSJleHRlcm5hbCIsZS5JTlRFUk5BTD0iaW50ZXJuYWwiLGUuREFTSD0iZGFzaCJ9KSh0ZXx8KHRlPXt9KSk7dmFyIGllOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLlJJR0hUPSJyaWdodCIsZS5CT1RUT009ImJvdHRvbSIsZS5MRUZUPSJsZWZ0In0pKGllfHwoaWU9e30pKTt2YXIgYWU7KGZ1bmN0aW9uKGUpe2UuRk9SV0FSRD0iZm9yd2FyZCIsZS5CQUNLPSJiYWNrIn0pKGFlfHwoYWU9e30pKTt2YXIgazsoZnVuY3Rpb24oZSl7ZS5DT05UQUlOPSJjb250YWluIixlLkNPVkVSPSJjb3ZlciJ9KShrfHwoaz17fSkpO3ZhciBtOyhmdW5jdGlvbihlKXtlLlJFUEVBVD0icmVwZWF0IixlLk5PX1JFUEVBVD0ibm8tcmVwZWF0IixlLlJFUEVBVF9YPSJyZXBlYXQteCIsZS5SRVBFQVRfWT0icmVwZWF0LXkifSkobXx8KG09e30pKSxrLkNPVkVSLG0uTk9fUkVQRUFUO3ZhciBGOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLk1JRERMRT0ibWlkZGxlIixlLkJPVFRPTT0iYm90dG9tIn0pKEZ8fChGPXt9KSksRi5CT1RUT00sVC5IQUxGLFQuSEFMRjtjb25zdCBFZT17UEFHRV9OTzoie3BhZ2VOb30iLFBBR0VfQ09VTlQ6IntwYWdlQ291bnR9In07RC5DRU5URVIsRWUuUEFHRV9OTyxJLkFSQUJJQyxGLkJPVFRPTTt2YXIgeTsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLklNQUdFPSJpbWFnZSJ9KSh5fHwoeT17fSkpLHkuVEVYVCxJLkFSQUJJQzt2YXIgVTsoZnVuY3Rpb24oZSl7ZS5QQUdFPSJwYWdlIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoVXx8KFU9e30pKSxVLkNPTlRJTlVJVFk7ZnVuY3Rpb24gdWUoZSxjKXtjb25zdCBFPU9iamVjdC5rZXlzKGUpLEE9T2JqZWN0LmtleXMoYyk7aWYoRS5sZW5ndGghPT1BLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IFI9MDtSPEUubGVuZ3RoO1IrKyl7Y29uc3QgYT1FW1JdO2lmKGEhPT0idmFsdWUiJiYhKGE9PT0iZ3JvdXBJZHMiJiZBcnJheS5pc0FycmF5KGVbYV0pJiZBcnJheS5pc0FycmF5KGNbYV0pJiZyZShlW2FdLGNbYV0pKSYmZVthXSE9PWNbYV0pcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gQihlLGM9e30pe2NvbnN0e2V4dHJhUGlja0F0dHJzOkV9PWMsQT1bLi4uY2VdO0UmJkEucHVzaCguLi5FKTtjb25zdCBSPXt2YWx1ZTplLnZhbHVlPT09UD9gCmA6ZS52YWx1ZX07cmV0dXJuIEEuZm9yRWFjaChhPT57Y29uc3QgcD1lW2FdO3AhPT12b2lkIDAmJihSW2FdPXApfSksUn1mdW5jdGlvbiBoKGUsYz17fSl7Y29uc3R7ZXh0cmFQaWNrQXR0cnM6RSxpc0NsYXNzaWZ5QXJlYTpBPSExLGlzQ2xvbmU6Uj0hMH09YyxhPVI/YihlKTplLHA9W107bGV0IGk9MDtmb3IoO2k8YS5sZW5ndGg7KXtsZXQgdD1hW2ldO2lmKGk9PT0wJiZ0LnZhbHVlPT09UCYmIXQubGlzdElkJiYoIXQudHlwZXx8dC50eXBlPT09bi5URVhUKSl7aSsrO2NvbnRpbnVlfWlmKHQuYXJlYUlkKXtjb25zdCBsPXQuYXJlYUlkLGY9dC5hcmVhLHM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgbz1hW2ldO2lmKGwhPT1vLmFyZWFJZCl7aS0tO2JyZWFrfWRlbGV0ZSBvLmFyZWEsZGVsZXRlIG8uYXJlYUlkLHMucHVzaChvKSxpKyt9Y29uc3Qgcj1oKHMsYyk7aWYoQSl7Y29uc3Qgbz17dHlwZTpuLkFSRUEsdmFsdWU6IiIsYXJlYUlkOmwsYXJlYTpmfTtvLnZhbHVlTGlzdD1yLHQ9b31lbHNle3Auc3BsaWNlKGksMCwuLi5yKTtjb250aW51ZX19ZWxzZSBpZih0LnRpdGxlSWQmJnQubGV2ZWwpe2NvbnN0IGw9dC50aXRsZUlkO2lmKGwpe2NvbnN0IGY9dC5sZXZlbCxzPXt0eXBlOm4uVElUTEUsdGl0bGU6dC50aXRsZSx0aXRsZUlkOmwsdmFsdWU6IiIsbGV2ZWw6Zn0scj1bXTtmb3IoO2k8YS5sZW5ndGg7KXtjb25zdCBvPWFbaV07aWYobCE9PW8udGl0bGVJZCl7aS0tO2JyZWFrfWRlbGV0ZSBvLmxldmVsLGRlbGV0ZSBvLnRpdGxlLHIucHVzaChvKSxpKyt9cy52YWx1ZUxpc3Q9aChyLGMpLHQ9c319ZWxzZSBpZih0Lmxpc3RJZCYmdC5saXN0VHlwZSl7Y29uc3QgbD10Lmxpc3RJZDtpZihsKXtjb25zdCBmPXQubGlzdFR5cGUscz10Lmxpc3RTdHlsZSxyPXt0eXBlOm4uTElTVCx2YWx1ZToiIixsaXN0SWQ6bCxsaXN0VHlwZTpmLGxpc3RTdHlsZTpzfSxvPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IEw9YVtpXTtpZihsIT09TC5saXN0SWQpe2ktLTticmVha31kZWxldGUgTC5saXN0VHlwZSxkZWxldGUgTC5saXN0U3R5bGUsby5wdXNoKEwpLGkrK31yLnZhbHVlTGlzdD1oKG8sYyksdD1yfX1lbHNlIGlmKHQudHlwZT09PW4uVEFCTEUpe2lmKHQucGFnaW5nSWQpe2xldCBsPWkrMSxmPTA7Zm9yKDtsPGEubGVuZ3RoOyl7Y29uc3Qgcz1hW2xdO2lmKHMucGFnaW5nSWQ9PT10LnBhZ2luZ0lkKXQuaGVpZ2h0Kz1zLmhlaWdodCx0LnRyTGlzdC5wdXNoKC4uLnMudHJMaXN0KSxsKyssZisrO2Vsc2UgYnJlYWt9aSs9Zn1pZih0LnRyTGlzdClmb3IobGV0IGw9MDtsPHQudHJMaXN0Lmxlbmd0aDtsKyspe2NvbnN0IGY9dC50ckxpc3RbbF07ZGVsZXRlIGYuaWQ7Zm9yKGxldCBzPTA7czxmLnRkTGlzdC5sZW5ndGg7cysrKXtjb25zdCByPWYudGRMaXN0W3NdLG89e2NvbHNwYW46ci5jb2xzcGFuLHJvd3NwYW46ci5yb3dzcGFuLHZhbHVlOmgoci52YWx1ZSxYKGcoe30sYykse2lzQ2xhc3NpZnlBcmVhOiExfSkpfTtzZS5mb3JFYWNoKEw9Pntjb25zdCBTPXJbTF07UyE9PXZvaWQgMCYmKG9bTF09Uyl9KSxmLnRkTGlzdFtzXT1vfX19ZWxzZSBpZih0LnR5cGU9PT1uLkhZUEVSTElOSyl7Y29uc3QgbD10Lmh5cGVybGlua0lkO2lmKGwpe2NvbnN0IGY9e3R5cGU6bi5IWVBFUkxJTkssdmFsdWU6IiIsdXJsOnQudXJsfSxzPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IHI9YVtpXTtpZihsIT09ci5oeXBlcmxpbmtJZCl7aS0tO2JyZWFrfWRlbGV0ZSByLnR5cGUsZGVsZXRlIHIudXJsLHMucHVzaChyKSxpKyt9Zi52YWx1ZUxpc3Q9aChzLGMpLHQ9Zn19ZWxzZSBpZih0LnR5cGU9PT1uLkRBVEUpe2NvbnN0IGw9dC5kYXRlSWQ7aWYobCl7Y29uc3QgZj17dHlwZTpuLkRBVEUsdmFsdWU6IiIsZGF0ZUZvcm1hdDp0LmRhdGVGb3JtYXR9LHM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgcj1hW2ldO2lmKGwhPT1yLmRhdGVJZCl7aS0tO2JyZWFrfWRlbGV0ZSByLnR5cGUsZGVsZXRlIHIuZGF0ZUZvcm1hdCxzLnB1c2gociksaSsrfWYudmFsdWVMaXN0PWgocyxjKSx0PWZ9fWVsc2UgaWYodC5jb250cm9sSWQpe2NvbnN0IGw9dC5jb250cm9sSWQ7aWYodC5jb250cm9sQ29tcG9uZW50PT09Qy5QUkVGSVgpe2NvbnN0IGY9W107bGV0IHM9ITEscj1pO2Zvcig7cjxhLmxlbmd0aDspe2NvbnN0IG89YVtyXTtpZihsIT09by5jb250cm9sSWQpYnJlYWs7by5jb250cm9sQ29tcG9uZW50PT09Qy5WQUxVRSYmKGRlbGV0ZSBvLmNvbnRyb2wsZGVsZXRlIG8uY29udHJvbElkLGYucHVzaChvKSksby5jb250cm9sQ29tcG9uZW50PT09Qy5QT1NURklYJiYocz0hMCkscisrfWlmKHMpe2NvbnN0IG89dyh0LGZlKSxMPWcoZyh7fSx0LmNvbnRyb2wpLG8pLFM9WChnKHt9LHcodCxvZSkpLHt0eXBlOm4uQ09OVFJPTCx2YWx1ZToiIixjb250cm9sOkwsY29udHJvbElkOmx9KTtTLmNvbnRyb2wudmFsdWU9aChmLGMpLHQ9QihTLHtleHRyYVBpY2tBdHRyczpFfSksaSs9ci1pLTF9fWlmKHQuY29udHJvbENvbXBvbmVudCYmKGRlbGV0ZSB0LmNvbnRyb2wsZGVsZXRlIHQuY29udHJvbElkLHQuY29udHJvbENvbXBvbmVudCE9PUMuVkFMVUUmJnQuY29udHJvbENvbXBvbmVudCE9PUMuUFJFX1RFWFQmJnQuY29udHJvbENvbXBvbmVudCE9PUMuUE9TVF9URVhUKSl7aSsrO2NvbnRpbnVlfX1jb25zdCB4PUIodCx7ZXh0cmFQaWNrQXR0cnM6RX0pO2lmKCF0LnR5cGV8fHQudHlwZT09PW4uVEVYVHx8dC50eXBlPT09bi5TVUJTQ1JJUFR8fHQudHlwZT09PW4uU1VQRVJTQ1JJUFQpZm9yKDtpPGEubGVuZ3RoOyl7Y29uc3QgbD1hW2krMV07aWYoaSsrLGwmJnVlKHgsQihsLHtleHRyYVBpY2tBdHRyczpFfSkpKXtjb25zdCBmPWwudmFsdWU9PT1QP2AKYDpsLnZhbHVlO3gudmFsdWUrPWZ9ZWxzZSBicmVha31lbHNlIGkrKztwLnB1c2goeCl9cmV0dXJuIHB9b25tZXNzYWdlPWU9Pntjb25zdCBjPWUuZGF0YSx7b3B0aW9uczpFLGRhdGE6QX09Yyx7ZXh0cmFQaWNrQXR0cnM6Uj1bXX09RXx8e30sYT17aGVhZGVyOmgoQS5oZWFkZXIse2V4dHJhUGlja0F0dHJzOlIsaXNDbG9uZTohMX0pLG1haW46aChBLm1haW4se2V4dHJhUGlja0F0dHJzOlIsaXNDbGFzc2lmeUFyZWE6ITAsaXNDbG9uZTohMX0pLGZvb3RlcjpoKEEuZm9vdGVyLHtleHRyYVBpY2tBdHRyczpSLGlzQ2xvbmU6ITF9KX07cG9zdE1lc3NhZ2UoYSl9fSkoKTt9KSgpOwo=";
|
|
15735
|
+
const encodedJs = "KCgpPT57dmFyIEllPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxBZT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgZGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIG5lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFJlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksT2U9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgcmU9KFQsSSxkKT0+SSBpbiBUP0llKFQsSSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZH0pOlRbSV09ZCxnPShULEkpPT57Zm9yKHZhciBkIGluIEl8fChJPXt9KSlSZS5jYWxsKEksZCkmJnJlKFQsZCxJW2RdKTtpZihuZSlmb3IodmFyIGQgb2YgbmUoSSkpT2UuY2FsbChJLGQpJiZyZShULGQsSVtkXSk7cmV0dXJuIFR9LFg9KFQsSSk9PkFlKFQsZGUoSSkpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5IQUxGPSJoYWxmIixlLk9ORV9USElSRD0ib25lLXRoaXJkIixlLlFVQVJURVI9InF1YXJ0ZXIifSkoVHx8KFQ9e30pKTt2YXIgSTsoZnVuY3Rpb24oZSl7ZS5BUkFCSUM9ImFyYWJpYyIsZS5DSElORVNFPSJjaGluZXNlIn0pKEl8fChJPXt9KSk7dmFyIGQ7KGZ1bmN0aW9uKGUpe2UuSU5MSU5FPSJpbmxpbmUiLGUuQkxPQ0s9ImJsb2NrIixlLlNVUlJPVU5EPSJzdXJyb3VuZCIsZS5GTE9BVF9UT1A9ImZsb2F0LXRvcCIsZS5GTE9BVF9CT1RUT009ImZsb2F0LWJvdHRvbSJ9KShkfHwoZD17fSkpO3ZhciBfOyhmdW5jdGlvbihlKXtlLkJFRk9SRT0iYmVmb3JlIixlLkFGVEVSPSJhZnRlciIsZS5PVVRFUl9CRUZPUkU9Im91dGVyLWJlZm9yZSIsZS5PVVRFUl9BRlRFUj0ib3V0ZXItYWZ0ZXIifSkoX3x8KF89e30pKTt2YXIgdzsoZnVuY3Rpb24oZSl7ZS5ST1c9InJvdyIsZS5DT0xVTU49ImNvbHVtbiJ9KSh3fHwodz17fSkpO2NvbnN0IFA9Ilx1MjAwQiI7VC5IQUxGKyIiLDEvMixULk9ORV9USElSRCsiIiwxLzMsVC5RVUFSVEVSKyIiLDEvNDtmdW5jdGlvbiBiKGUpe2lmKHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU9PSJmdW5jdGlvbiIpcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShlKTtpZighZXx8dHlwZW9mIGUhPSJvYmplY3QiKXJldHVybiBlO2xldCBjPXt9O3JldHVybiBBcnJheS5pc0FycmF5KGUpP2M9ZS5tYXAoRT0+YihFKSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaChFPT57Y1tFXT1iKGVbRV0pfSksY31mdW5jdGlvbiBLKGUsYyl7Y29uc3QgRT17fTtmb3IoY29uc3QgQSBpbiBlKWMuaW5jbHVkZXMoQSkmJihFW0FdPWVbQV0pO3JldHVybiBFfWZ1bmN0aW9uIG9lKGUsYyl7cmV0dXJuIGUubGVuZ3RoIT09Yy5sZW5ndGg/ITE6IWUuc29tZShFPT4hYy5pbmNsdWRlcyhFKSl9dmFyIG47KGZ1bmN0aW9uKGUpe2UuVEVYVD0idGV4dCIsZS5JTUFHRT0iaW1hZ2UiLGUuVEFCTEU9InRhYmxlIixlLkhZUEVSTElOSz0iaHlwZXJsaW5rIixlLlNVUEVSU0NSSVBUPSJzdXBlcnNjcmlwdCIsZS5TVUJTQ1JJUFQ9InN1YnNjcmlwdCIsZS5TRVBBUkFUT1I9InNlcGFyYXRvciIsZS5QQUdFX0JSRUFLPSJwYWdlQnJlYWsiLGUuQ09OVFJPTD0iY29udHJvbCIsZS5BUkVBPSJhcmVhIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuTEFURVg9ImxhdGV4IixlLlRBQj0idGFiIixlLkRBVEU9ImRhdGUiLGUuQkxPQ0s9ImJsb2NrIixlLlRJVExFPSJ0aXRsZSIsZS5MSVNUPSJsaXN0IixlLkxBQkVMPSJsYWJlbCJ9KShufHwobj17fSkpO2NvbnN0IGNlPVsicm93RmxleCIsInJvd01hcmdpbiJdLHNlPVsidHlwZSIsImZvbnQiLCJzaXplIiwiYm9sZCIsImNvbG9yIiwiaXRhbGljIiwiaGlnaGxpZ2h0IiwidW5kZXJsaW5lIiwic3RyaWtlb3V0Iiwicm93RmxleCIsInJvd01hcmdpbiIsImRhc2hBcnJheSIsInRyTGlzdCIsInRhYmxlVG9vbERpc2FibGVkIiwiYm9yZGVyVHlwZSIsImJvcmRlckNvbG9yIiwidHJhbnNsYXRlWCIsIndpZHRoIiwiaGVpZ2h0IiwidXJsIiwiY29sZ3JvdXAiLCJ2YWx1ZUxpc3QiLCJjb250cm9sIiwiY2hlY2tib3giLCJyYWRpbyIsImRhdGVGb3JtYXQiLCJibG9jayIsImxldmVsIiwidGl0bGUiLCJsaXN0VHlwZSIsImxpc3RTdHlsZSIsImxpc3RXcmFwIiwiZ3JvdXBJZHMiLCJjb25jZXB0SWQiLCJpbWdEaXNwbGF5IiwiaW1nRmxvYXRQb3NpdGlvbiIsImltZ1Rvb2xEaXNhYmxlZCIsImltZ1ByZXZpZXdEaXNhYmxlZCIsImltZ0Nyb3AiLCJpbWdDYXB0aW9uIiwidGV4dERlY29yYXRpb24iLCJleHRlbnNpb24iLCJleHRlcm5hbElkIiwiYXJlYUlkIiwiYXJlYSIsImhpZGUiLCJsYWJlbCIsImxhYmVsSWQiLCJsaW5lV2lkdGgiXSxmZT1bImNvbmNlcHRJZCIsImV4dGVuc2lvbiIsImV4dGVybmFsSWQiLCJ2ZXJ0aWNhbEFsaWduIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyVHlwZXMiLCJzbGFzaFR5cGVzIiwiZGlzYWJsZWQiLCJkZWxldGFibGUiXSxFZT1bImZvbnQiLCJzaXplIiwiYm9sZCIsImhpZ2hsaWdodCIsIml0YWxpYyIsInN0cmlrZW91dCJdO24uVEVYVCxuLkhZUEVSTElOSyxuLlNVQlNDUklQVCxuLlNVUEVSU0NSSVBULG4uQ09OVFJPTCxuLkRBVEUsbi5JTUFHRSxuLkxBVEVYLG4uQkxPQ0ssbi5QQUdFX0JSRUFLLG4uU0VQQVJBVE9SLG4uVEFCTEUsbi5USVRMRSxuLkxJU1Q7dmFyIE47KGZ1bmN0aW9uKGUpe2UuVUw9InVsIixlLk9MPSJvbCJ9KShOfHwoTj17fSkpO3ZhciBPOyhmdW5jdGlvbihlKXtlLkRJU0M9ImRpc2MiLGUuQ0lSQ0xFPSJjaXJjbGUiLGUuU1FVQVJFPSJzcXVhcmUiLGUuQ0hFQ0tCT1g9ImNoZWNrYm94In0pKE98fChPPXt9KSk7dmFyIEg7KGZ1bmN0aW9uKGUpe2UuREVDSU1BTD0iZGVjaW1hbCJ9KShIfHwoSD17fSkpO3ZhciB2OyhmdW5jdGlvbihlKXtlW2UuRElTQz1PLkRJU0NdPSJESVNDIixlW2UuQ0lSQ0xFPU8uQ0lSQ0xFXT0iQ0lSQ0xFIixlW2UuU1FVQVJFPU8uU1FVQVJFXT0iU1FVQVJFIixlW2UuREVDSU1BTD1ILkRFQ0lNQUxdPSJERUNJTUFMIixlW2UuQ0hFQ0tCT1g9Ty5DSEVDS0JPWF09IkNIRUNLQk9YIn0pKHZ8fCh2PXt9KSksTy5ESVNDKyIiLE8uQ0lSQ0xFKyIiLE8uU1FVQVJFKyIiLE8uQ0hFQ0tCT1grIiIsTi5PTCsiIixOLlVMKyIiLHYuRElTQysiIix2LkNJUkNMRSsiIix2LlNRVUFSRSsiIix2LkRFQ0lNQUwrIiIsdi5DSEVDS0JPWCsiIjt2YXIgdTsoZnVuY3Rpb24oZSl7ZS5GSVJTVD0iZmlyc3QiLGUuU0VDT05EPSJzZWNvbmQiLGUuVEhJUkQ9InRoaXJkIixlLkZPVVJUSD0iZm91cnRoIixlLkZJRlRIPSJmaWZ0aCIsZS5TSVhUSD0ic2l4dGgifSkodXx8KHU9e30pKSx1LkZJUlNUKyIiLHUuU0VDT05EKyIiLHUuVEhJUkQrIiIsdS5GT1VSVEgrIiIsdS5GSUZUSCsiIix1LlNJWFRIKyIiLHUuRklSU1QrIiIsdS5TRUNPTkQrIiIsdS5USElSRCsiIix1LkZPVVJUSCsiIix1LkZJRlRIKyIiLHUuU0lYVEgrIiIsdS5GSVJTVCx1LlNFQ09ORCx1LlRISVJELHUuRk9VUlRILHUuRklGVEgsdS5TSVhUSDt2YXIgRzsoZnVuY3Rpb24oZSl7ZS5JRlJBTUU9ImlmcmFtZSIsZS5WSURFTz0idmlkZW8ifSkoR3x8KEc9e30pKTt2YXIgejsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLlNFTEVDVD0ic2VsZWN0IixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuREFURT0iZGF0ZSIsZS5OVU1CRVI9Im51bWJlciJ9KSh6fHwoej17fSkpO3ZhciBDOyhmdW5jdGlvbihlKXtlLlBSRUZJWD0icHJlZml4IixlLlBPU1RGSVg9InBvc3RmaXgiLGUuUFJFX1RFWFQ9InByZVRleHQiLGUuUE9TVF9URVhUPSJwb3N0VGV4dCIsZS5QTEFDRUhPTERFUj0icGxhY2Vob2xkZXIiLGUuVkFMVUU9InZhbHVlIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8ifSkoQ3x8KEM9e30pKTt2YXIgWTsoZnVuY3Rpb24oZSl7ZS5ST1dfU1RBUlQ9InJvd1N0YXJ0IixlLlZBTFVFX1NUQVJUPSJ2YWx1ZVN0YXJ0In0pKFl8fChZPXt9KSk7dmFyIFY7KGZ1bmN0aW9uKGUpe2UuQUNUSVZFPSJhY3RpdmUiLGUuSU5BQ1RJVkU9ImluYWN0aXZlIn0pKFZ8fChWPXt9KSk7dmFyIFE7KGZ1bmN0aW9uKGUpe2UuTlVNQkVSPSJudW1iZXIiLGUuT1BFUkFUT1I9Im9wZXJhdG9yIixlLlVUSUxJVFk9InV0aWxpdHkiLGUuRVFVQUw9ImVxdWFsIn0pKFF8fChRPXt9KSk7dmFyIFc7KGZ1bmN0aW9uKGUpe2UuQ09NUE9ORU5UPSJjb21wb25lbnQiLGUuTUVOVT0ibWVudSIsZS5NQUlOPSJtYWluIixlLkZPT1RFUj0iZm9vdGVyIixlLkNPTlRFWFRNRU5VPSJjb250ZXh0bWVudSIsZS5QT1BVUD0icG9wdXAiLGUuQ0FUQUxPRz0iY2F0YWxvZyIsZS5DT01NRU5UPSJjb21tZW50In0pKFd8fChXPXt9KSk7dmFyIHE7KGZ1bmN0aW9uKGUpe2UuUEFHRT0icGFnZSIsZS5UQUJMRT0idGFibGUifSkocXx8KHE9e30pKTt2YXIgWjsoZnVuY3Rpb24oZSl7ZS5FRElUPSJlZGl0IixlLkNMRUFOPSJjbGVhbiIsZS5SRUFET05MWT0icmVhZG9ubHkiLGUuRk9STT0iZm9ybSIsZS5QUklOVD0icHJpbnQiLGUuREVTSUdOPSJkZXNpZ24iLGUuR1JBRkZJVEk9ImdyYWZmaXRpIn0pKFp8fChaPXt9KSk7dmFyIEo7KGZ1bmN0aW9uKGUpe2UuSEVBREVSPSJoZWFkZXIiLGUuTUFJTj0ibWFpbiIsZS5GT09URVI9ImZvb3RlciJ9KShKfHwoSj17fSkpO3ZhciBqOyhmdW5jdGlvbihlKXtlLlBBR0lORz0icGFnaW5nIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoanx8KGo9e30pKTt2YXIgJDsoZnVuY3Rpb24oZSl7ZS5WRVJUSUNBTD0idmVydGljYWwiLGUuSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCJ9KSgkfHwoJD17fSkpO3ZhciBlZTsoZnVuY3Rpb24oZSl7ZS5CUkVBS19BTEw9ImJyZWFrLWFsbCIsZS5CUkVBS19XT1JEPSJicmVhay13b3JkIn0pKGVlfHwoZWU9e30pKTt2YXIgdGU7KGZ1bmN0aW9uKGUpe2UuU1BFRUQ9InNwZWVkIixlLkNPTVBBVElCSUxJVFk9ImNvbXBhdGliaWxpdHkifSkodGV8fCh0ZT17fSkpO3ZhciBEOyhmdW5jdGlvbihlKXtlLkxFRlQ9ImxlZnQiLGUuQ0VOVEVSPSJjZW50ZXIiLGUuUklHSFQ9InJpZ2h0IixlLkFMSUdOTUVOVD0iYWxpZ25tZW50IixlLkpVU1RJRlk9Imp1c3RpZnkifSkoRHx8KEQ9e30pKTt2YXIgaWU7KGZ1bmN0aW9uKGUpe2UuQUxMPSJhbGwiLGUuRU1QVFk9ImVtcHR5IixlLkVYVEVSTkFMPSJleHRlcm5hbCIsZS5JTlRFUk5BTD0iaW50ZXJuYWwiLGUuREFTSD0iZGFzaCJ9KShpZXx8KGllPXt9KSk7dmFyIGFlOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLlJJR0hUPSJyaWdodCIsZS5CT1RUT009ImJvdHRvbSIsZS5MRUZUPSJsZWZ0In0pKGFlfHwoYWU9e30pKTt2YXIgbGU7KGZ1bmN0aW9uKGUpe2UuRk9SV0FSRD0iZm9yd2FyZCIsZS5CQUNLPSJiYWNrIn0pKGxlfHwobGU9e30pKTt2YXIgazsoZnVuY3Rpb24oZSl7ZS5DT05UQUlOPSJjb250YWluIixlLkNPVkVSPSJjb3ZlciJ9KShrfHwoaz17fSkpO3ZhciBtOyhmdW5jdGlvbihlKXtlLlJFUEVBVD0icmVwZWF0IixlLk5PX1JFUEVBVD0ibm8tcmVwZWF0IixlLlJFUEVBVF9YPSJyZXBlYXQteCIsZS5SRVBFQVRfWT0icmVwZWF0LXkifSkobXx8KG09e30pKSxrLkNPVkVSLG0uTk9fUkVQRUFUO3ZhciBGOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLk1JRERMRT0ibWlkZGxlIixlLkJPVFRPTT0iYm90dG9tIn0pKEZ8fChGPXt9KSksRi5CT1RUT00sVC5IQUxGLFQuSEFMRjtjb25zdCB1ZT17UEFHRV9OTzoie3BhZ2VOb30iLFBBR0VfQ09VTlQ6IntwYWdlQ291bnR9In07RC5DRU5URVIsdWUuUEFHRV9OTyxJLkFSQUJJQyxGLkJPVFRPTTt2YXIgeTsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLklNQUdFPSJpbWFnZSJ9KSh5fHwoeT17fSkpO3ZhciBVOyhmdW5jdGlvbihlKXtlLkJPVFRPTT0iYm90dG9tIixlLlRPUD0idG9wIn0pKFV8fChVPXt9KSkseS5URVhULEkuQVJBQklDLFUuQk9UVE9NO3ZhciBCOyhmdW5jdGlvbihlKXtlLlBBR0U9InBhZ2UiLGUuQ09OVElOVUlUWT0iY29udGludWl0eSJ9KShCfHwoQj17fSkpLEIuQ09OVElOVUlUWTtmdW5jdGlvbiBUZShlLGMpe2NvbnN0IEU9T2JqZWN0LmtleXMoZSksQT1PYmplY3Qua2V5cyhjKTtpZihFLmxlbmd0aCE9PUEubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgUj0wO1I8RS5sZW5ndGg7UisrKXtjb25zdCBhPUVbUl07aWYoYSE9PSJ2YWx1ZSImJiEoYT09PSJncm91cElkcyImJkFycmF5LmlzQXJyYXkoZVthXSkmJkFycmF5LmlzQXJyYXkoY1thXSkmJm9lKGVbYV0sY1thXSkpJiZlW2FdIT09Y1thXSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiB4KGUsYz17fSl7Y29uc3R7ZXh0cmFQaWNrQXR0cnM6RX09YyxBPVsuLi5zZV07RSYmQS5wdXNoKC4uLkUpO2NvbnN0IFI9e3ZhbHVlOmUudmFsdWU9PT1QP2AKYDplLnZhbHVlfTtyZXR1cm4gQS5mb3JFYWNoKGE9Pntjb25zdCBwPWVbYV07cCE9PXZvaWQgMCYmKFJbYV09cCl9KSxSfWZ1bmN0aW9uIGgoZSxjPXt9KXtjb25zdHtleHRyYVBpY2tBdHRyczpFLGlzQ2xhc3NpZnlBcmVhOkE9ITEsaXNDbG9uZTpSPSEwfT1jLGE9Uj9iKGUpOmUscD1bXTtsZXQgaT0wO2Zvcig7aTxhLmxlbmd0aDspe2xldCB0PWFbaV07aWYoaT09PTAmJnQudmFsdWU9PT1QJiYhdC5saXN0SWQmJighdC50eXBlfHx0LnR5cGU9PT1uLlRFWFQpKXtpKys7Y29udGludWV9aWYodC5hcmVhSWQpe2NvbnN0IGw9dC5hcmVhSWQsZj10LmFyZWEscz1bXTtmb3IoO2k8YS5sZW5ndGg7KXtjb25zdCBvPWFbaV07aWYobCE9PW8uYXJlYUlkKXtpLS07YnJlYWt9ZGVsZXRlIG8uYXJlYSxkZWxldGUgby5hcmVhSWQscy5wdXNoKG8pLGkrK31jb25zdCByPWgocyxjKTtpZihBKXtjb25zdCBvPXt0eXBlOm4uQVJFQSx2YWx1ZToiIixhcmVhSWQ6bCxhcmVhOmZ9O28udmFsdWVMaXN0PXIsdD1vfWVsc2V7cC5zcGxpY2UoaSwwLC4uLnIpO2NvbnRpbnVlfX1lbHNlIGlmKHQudGl0bGVJZCYmdC5sZXZlbCl7Y29uc3QgbD10LnRpdGxlSWQ7aWYobCl7Y29uc3QgZj10LmxldmVsLHM9e3R5cGU6bi5USVRMRSx0aXRsZTp0LnRpdGxlLHRpdGxlSWQ6bCx2YWx1ZToiIixsZXZlbDpmfSxyPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IG89YVtpXTtpZihsIT09by50aXRsZUlkKXtpLS07YnJlYWt9ZGVsZXRlIG8ubGV2ZWwsZGVsZXRlIG8udGl0bGUsci5wdXNoKG8pLGkrK31zLnZhbHVlTGlzdD1oKHIsYyksdD1zfX1lbHNlIGlmKHQubGlzdElkJiZ0Lmxpc3RUeXBlKXtjb25zdCBsPXQubGlzdElkO2lmKGwpe2NvbnN0IGY9dC5saXN0VHlwZSxzPXQubGlzdFN0eWxlLHI9e3R5cGU6bi5MSVNULHZhbHVlOiIiLGxpc3RJZDpsLGxpc3RUeXBlOmYsbGlzdFN0eWxlOnN9LG89W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3QgTD1hW2ldO2lmKGwhPT1MLmxpc3RJZCl7aS0tO2JyZWFrfWRlbGV0ZSBMLmxpc3RUeXBlLGRlbGV0ZSBMLmxpc3RTdHlsZSxvLnB1c2goTCksaSsrfXIudmFsdWVMaXN0PWgobyxjKSx0PXJ9fWVsc2UgaWYodC50eXBlPT09bi5UQUJMRSl7aWYodC5wYWdpbmdJZCl7bGV0IGw9aSsxLGY9MDtmb3IoO2w8YS5sZW5ndGg7KXtjb25zdCBzPWFbbF07aWYocy5wYWdpbmdJZD09PXQucGFnaW5nSWQpdC5oZWlnaHQrPXMuaGVpZ2h0LHQudHJMaXN0LnB1c2goLi4ucy50ckxpc3QpLGwrKyxmKys7ZWxzZSBicmVha31pKz1mfWlmKHQudHJMaXN0KWZvcihsZXQgbD0wO2w8dC50ckxpc3QubGVuZ3RoO2wrKyl7Y29uc3QgZj10LnRyTGlzdFtsXTtkZWxldGUgZi5pZDtmb3IobGV0IHM9MDtzPGYudGRMaXN0Lmxlbmd0aDtzKyspe2NvbnN0IHI9Zi50ZExpc3Rbc10sbz17Y29sc3BhbjpyLmNvbHNwYW4scm93c3BhbjpyLnJvd3NwYW4sdmFsdWU6aChyLnZhbHVlLFgoZyh7fSxjKSx7aXNDbGFzc2lmeUFyZWE6ITF9KSl9O2ZlLmZvckVhY2goTD0+e2NvbnN0IFM9cltMXTtTIT09dm9pZCAwJiYob1tMXT1TKX0pLGYudGRMaXN0W3NdPW99fX1lbHNlIGlmKHQudHlwZT09PW4uSFlQRVJMSU5LKXtjb25zdCBsPXQuaHlwZXJsaW5rSWQ7aWYobCl7Y29uc3QgZj17dHlwZTpuLkhZUEVSTElOSyx2YWx1ZToiIix1cmw6dC51cmx9LHM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgcj1hW2ldO2lmKGwhPT1yLmh5cGVybGlua0lkKXtpLS07YnJlYWt9ZGVsZXRlIHIudHlwZSxkZWxldGUgci51cmwscy5wdXNoKHIpLGkrK31mLnZhbHVlTGlzdD1oKHMsYyksdD1mfX1lbHNlIGlmKHQudHlwZT09PW4uREFURSl7Y29uc3QgbD10LmRhdGVJZDtpZihsKXtjb25zdCBmPXt0eXBlOm4uREFURSx2YWx1ZToiIixkYXRlRm9ybWF0OnQuZGF0ZUZvcm1hdH0scz1bXTtmb3IoO2k8YS5sZW5ndGg7KXtjb25zdCByPWFbaV07aWYobCE9PXIuZGF0ZUlkKXtpLS07YnJlYWt9ZGVsZXRlIHIudHlwZSxkZWxldGUgci5kYXRlRm9ybWF0LHMucHVzaChyKSxpKyt9Zi52YWx1ZUxpc3Q9aChzLGMpLHQ9Zn19ZWxzZSBpZih0LmNvbnRyb2xJZCl7Y29uc3QgbD10LmNvbnRyb2xJZDtpZih0LmNvbnRyb2xDb21wb25lbnQ9PT1DLlBSRUZJWCl7Y29uc3QgZj1bXTtsZXQgcz0hMSxyPWk7Zm9yKDtyPGEubGVuZ3RoOyl7Y29uc3Qgbz1hW3JdO2lmKGwhPT1vLmNvbnRyb2xJZClicmVhaztvLmNvbnRyb2xDb21wb25lbnQ9PT1DLlZBTFVFJiYoZGVsZXRlIG8uY29udHJvbCxkZWxldGUgby5jb250cm9sSWQsZi5wdXNoKG8pKSxvLmNvbnRyb2xDb21wb25lbnQ9PT1DLlBPU1RGSVgmJihzPSEwKSxyKyt9aWYocyl7Y29uc3Qgbz1LKHQsRWUpLEw9ZyhnKHt9LHQuY29udHJvbCksbyksUz1YKGcoe30sSyh0LGNlKSkse3R5cGU6bi5DT05UUk9MLHZhbHVlOiIiLGNvbnRyb2w6TCxjb250cm9sSWQ6bH0pO1MuY29udHJvbC52YWx1ZT1oKGYsYyksdD14KFMse2V4dHJhUGlja0F0dHJzOkV9KSxpKz1yLWktMX19aWYodC5jb250cm9sQ29tcG9uZW50JiYoZGVsZXRlIHQuY29udHJvbCxkZWxldGUgdC5jb250cm9sSWQsdC5jb250cm9sQ29tcG9uZW50IT09Qy5WQUxVRSYmdC5jb250cm9sQ29tcG9uZW50IT09Qy5QUkVfVEVYVCYmdC5jb250cm9sQ29tcG9uZW50IT09Qy5QT1NUX1RFWFQpKXtpKys7Y29udGludWV9fWNvbnN0IE09eCh0LHtleHRyYVBpY2tBdHRyczpFfSk7aWYoIXQudHlwZXx8dC50eXBlPT09bi5URVhUfHx0LnR5cGU9PT1uLlNVQlNDUklQVHx8dC50eXBlPT09bi5TVVBFUlNDUklQVClmb3IoO2k8YS5sZW5ndGg7KXtjb25zdCBsPWFbaSsxXTtpZihpKyssbCYmVGUoTSx4KGwse2V4dHJhUGlja0F0dHJzOkV9KSkpe2NvbnN0IGY9bC52YWx1ZT09PVA/YApgOmwudmFsdWU7TS52YWx1ZSs9Zn1lbHNlIGJyZWFrfWVsc2UgaSsrO3AucHVzaChNKX1yZXR1cm4gcH1vbm1lc3NhZ2U9ZT0+e2NvbnN0IGM9ZS5kYXRhLHtvcHRpb25zOkUsZGF0YTpBfT1jLHtleHRyYVBpY2tBdHRyczpSPVtdfT1FfHx7fSxhPXtoZWFkZXI6aChBLmhlYWRlcix7ZXh0cmFQaWNrQXR0cnM6Uixpc0Nsb25lOiExfSksbWFpbjpoKEEubWFpbix7ZXh0cmFQaWNrQXR0cnM6Uixpc0NsYXNzaWZ5QXJlYTohMCxpc0Nsb25lOiExfSksZm9vdGVyOmgoQS5mb290ZXIse2V4dHJhUGlja0F0dHJzOlIsaXNDbG9uZTohMX0pfTtwb3N0TWVzc2FnZShhKX19KSgpO30pKCk7Cg==";
|
|
15687
15736
|
const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
|
|
15688
15737
|
function WorkerWrapper() {
|
|
15689
15738
|
const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
|
|
@@ -15764,6 +15813,12 @@ class WorkerManager {
|
|
|
15764
15813
|
});
|
|
15765
15814
|
});
|
|
15766
15815
|
}
|
|
15816
|
+
destroy() {
|
|
15817
|
+
this.wordCountWorker.terminate();
|
|
15818
|
+
this.catalogWorker.terminate();
|
|
15819
|
+
this.groupWorker.terminate();
|
|
15820
|
+
this.valueWorker.terminate();
|
|
15821
|
+
}
|
|
15767
15822
|
}
|
|
15768
15823
|
class Previewer {
|
|
15769
15824
|
constructor(draw) {
|
|
@@ -16574,7 +16629,6 @@ class BaseBlock {
|
|
|
16574
16629
|
}
|
|
16575
16630
|
} else if (block.type === BlockType.IFRAME) {
|
|
16576
16631
|
this.setClientRects(pageNo, x, y);
|
|
16577
|
-
this.positionInfo = { pageNo, x, y };
|
|
16578
16632
|
}
|
|
16579
16633
|
}
|
|
16580
16634
|
render() {
|
|
@@ -16597,6 +16651,7 @@ class BaseBlock {
|
|
|
16597
16651
|
this.blockItem.style.height = `${metrics.height}px`;
|
|
16598
16652
|
this.blockItem.style.left = `${x}px`;
|
|
16599
16653
|
this.blockItem.style.top = `${preY + y}px`;
|
|
16654
|
+
this.positionInfo = { pageNo, x, y };
|
|
16600
16655
|
}
|
|
16601
16656
|
setStatus() {
|
|
16602
16657
|
if (this.block instanceof IFrameBlock) {
|
|
@@ -16678,6 +16733,27 @@ class BlockParticle {
|
|
|
16678
16733
|
}
|
|
16679
16734
|
});
|
|
16680
16735
|
}
|
|
16736
|
+
async drawIframeToPage(pageList, snapDomFunction) {
|
|
16737
|
+
const tasks = [];
|
|
16738
|
+
this.blockMap.forEach((cacheBlock) => {
|
|
16739
|
+
var _a, _b, _c;
|
|
16740
|
+
if (((_a = cacheBlock.getBlockElement().block) == null ? void 0 : _a.type) !== BlockType.IFRAME)
|
|
16741
|
+
return;
|
|
16742
|
+
const positionInfo = cacheBlock.getPositionInfo();
|
|
16743
|
+
if (!positionInfo)
|
|
16744
|
+
return;
|
|
16745
|
+
const iframe = (_b = cacheBlock.getIFrameBlock()) == null ? void 0 : _b.getIframe();
|
|
16746
|
+
if (!iframe)
|
|
16747
|
+
return;
|
|
16748
|
+
const { pageNo, x, y } = positionInfo;
|
|
16749
|
+
const ctx = (_c = pageList[pageNo]) == null ? void 0 : _c.getContext("2d");
|
|
16750
|
+
if (!ctx)
|
|
16751
|
+
return;
|
|
16752
|
+
const { width, height } = cacheBlock.getBlockElement().metrics;
|
|
16753
|
+
tasks.push(snapDomFunction(iframe).then((base64) => loadImage(base64)).then((img) => ctx.drawImage(img, x, y, width, height)));
|
|
16754
|
+
});
|
|
16755
|
+
await Promise.allSettled(tasks);
|
|
16756
|
+
}
|
|
16681
16757
|
pickIframeInfo() {
|
|
16682
16758
|
const result = [];
|
|
16683
16759
|
const { scale } = this.options;
|
|
@@ -19874,7 +19950,7 @@ class Draw {
|
|
|
19874
19950
|
return this.getRowList().length;
|
|
19875
19951
|
}
|
|
19876
19952
|
async getDataURL(payload = {}) {
|
|
19877
|
-
const { pixelRatio, mode } = payload;
|
|
19953
|
+
const { pixelRatio, mode, snapDomFunction } = payload;
|
|
19878
19954
|
if (pixelRatio) {
|
|
19879
19955
|
this.setPagePixelRatio(pixelRatio);
|
|
19880
19956
|
}
|
|
@@ -19890,6 +19966,9 @@ class Draw {
|
|
|
19890
19966
|
isSubmitHistory: false
|
|
19891
19967
|
});
|
|
19892
19968
|
await this.imageObserver.allSettled();
|
|
19969
|
+
if (snapDomFunction) {
|
|
19970
|
+
await this.blockParticle.drawIframeToPage(this.pageList, snapDomFunction);
|
|
19971
|
+
}
|
|
19893
19972
|
const dataUrlList = this.pageList.map((c) => c.toDataURL());
|
|
19894
19973
|
if (pixelRatio) {
|
|
19895
19974
|
this.setPagePixelRatio(null);
|
|
@@ -20203,7 +20282,7 @@ class Draw {
|
|
|
20203
20282
|
computeRowList(payload) {
|
|
20204
20283
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
20205
20284
|
const { innerWidth, elementList, isPagingMode = false, isFromTable = false, startX = 0, startY = 0, pageHeight = 0, mainOuterHeight = 0, surroundElementList = [] } = payload;
|
|
20206
|
-
const { defaultSize, scale, imgCaption, table: { tdPadding
|
|
20285
|
+
const { defaultSize, scale, imgCaption, table: { tdPadding }, defaultTabWidth } = this.options;
|
|
20207
20286
|
const defaultBasicRowMarginHeight = this.getDefaultBasicRowMarginHeight();
|
|
20208
20287
|
const canvas = document.createElement("canvas");
|
|
20209
20288
|
const ctx = canvas.getContext("2d");
|
|
@@ -20297,9 +20376,10 @@ class Draw {
|
|
|
20297
20376
|
}
|
|
20298
20377
|
element.pagingIndex = (_g = element.pagingIndex) != null ? _g : 0;
|
|
20299
20378
|
const trList = element.trList;
|
|
20379
|
+
const tdMinHeight = tdPaddingHeight + defaultSize + rowMargin * 2 / scale;
|
|
20300
20380
|
for (let t = 0; t < trList.length; t++) {
|
|
20301
20381
|
const tr = trList[t];
|
|
20302
|
-
tr.height = tr.minHeight ||
|
|
20382
|
+
tr.height = Math.max(tdMinHeight, tr.minHeight || 0);
|
|
20303
20383
|
tr.minHeight = tr.height;
|
|
20304
20384
|
}
|
|
20305
20385
|
this.tableParticle.computeRowColInfo(element);
|
|
@@ -20997,6 +21077,7 @@ class Draw {
|
|
|
20997
21077
|
const { elementList, positionList, rowList, pageNo } = payload;
|
|
20998
21078
|
const { inactiveAlpha, pageMode, header, footer, pageNumber, lineNumber, pageBorder } = this.options;
|
|
20999
21079
|
const isPrintMode = this.mode === EditorMode.PRINT;
|
|
21080
|
+
const isContinuityMode = pageMode === PageMode.CONTINUITY;
|
|
21000
21081
|
const innerWidth = this.getInnerWidth();
|
|
21001
21082
|
const ctx = this.ctxList[pageNo];
|
|
21002
21083
|
ctx.globalAlpha = !this.zone.isMainActive() ? inactiveAlpha : 1;
|
|
@@ -21007,7 +21088,7 @@ class Draw {
|
|
|
21007
21088
|
if (!isPrintMode) {
|
|
21008
21089
|
this.area.render(ctx, pageNo);
|
|
21009
21090
|
}
|
|
21010
|
-
if (
|
|
21091
|
+
if (!isContinuityMode && this.options.watermark.data && this.options.watermark.layer === WatermarkLayer.BOTTOM) {
|
|
21011
21092
|
this.waterMark.render(ctx, pageNo);
|
|
21012
21093
|
}
|
|
21013
21094
|
if (!isPrintMode) {
|
|
@@ -21061,6 +21142,9 @@ class Draw {
|
|
|
21061
21142
|
if (this.isGraffitiMode()) {
|
|
21062
21143
|
this.graffiti.render(ctx, pageNo);
|
|
21063
21144
|
}
|
|
21145
|
+
if (!isContinuityMode && this.options.watermark.data && this.options.watermark.layer === WatermarkLayer.TOP) {
|
|
21146
|
+
this.waterMark.render(ctx, pageNo);
|
|
21147
|
+
}
|
|
21064
21148
|
}
|
|
21065
21149
|
_disconnectLazyRender() {
|
|
21066
21150
|
var _a;
|
|
@@ -21260,10 +21344,13 @@ class Draw {
|
|
|
21260
21344
|
});
|
|
21261
21345
|
}
|
|
21262
21346
|
destroy() {
|
|
21347
|
+
var _a;
|
|
21263
21348
|
this.container.remove();
|
|
21264
21349
|
this.globalEvent.removeEvent();
|
|
21265
21350
|
this.scrollObserver.removeEvent();
|
|
21266
21351
|
this.selectionObserver.removeEvent();
|
|
21352
|
+
this.workerManager.destroy();
|
|
21353
|
+
(_a = this.lazyRenderIntersectionObserver) == null ? void 0 : _a.disconnect();
|
|
21267
21354
|
}
|
|
21268
21355
|
clearSideEffect() {
|
|
21269
21356
|
this.getPreviewer().clearResizer();
|
|
@@ -22719,7 +22806,7 @@ class CommandAdapt {
|
|
|
22719
22806
|
if (isReadonly)
|
|
22720
22807
|
return;
|
|
22721
22808
|
const options = this.draw.getOptions();
|
|
22722
|
-
const { color, size, opacity, font, gap } = defaultWatermarkOption;
|
|
22809
|
+
const { color, size, opacity, font, gap, layer } = defaultWatermarkOption;
|
|
22723
22810
|
options.watermark.data = payload.data;
|
|
22724
22811
|
options.watermark.type = payload.type || WatermarkType.TEXT;
|
|
22725
22812
|
if (payload.width) {
|
|
@@ -22737,6 +22824,7 @@ class CommandAdapt {
|
|
|
22737
22824
|
options.watermark.numberType = payload.numberType;
|
|
22738
22825
|
}
|
|
22739
22826
|
options.watermark.gap = payload.gap || gap;
|
|
22827
|
+
options.watermark.layer = payload.layer || layer;
|
|
22740
22828
|
this.draw.render({
|
|
22741
22829
|
isSetCursor: false,
|
|
22742
22830
|
isSubmitHistory: false,
|
|
@@ -25107,5 +25195,5 @@ class Editor {
|
|
|
25107
25195
|
this.use = plugin.use.bind(plugin);
|
|
25108
25196
|
}
|
|
25109
25197
|
}
|
|
25110
|
-
export { AreaMode, BackgroundRepeat, BackgroundSize, BlockType, Command, ControlComponent, ControlIndentation, ControlState, ControlType, EDITOR_CLIPBOARD, EDITOR_COMPONENT, Editor, EditorComponent, EditorMode, EditorZone, ElementType, FlexDirection, INTERNAL_CONTEXT_MENU_KEY, INTERNAL_SHORTCUT_KEY, ImageDisplay, KeyMap, LETTER_CLASS, LineNumberType, ListStyle, ListType, LocationPosition, MaxHeightRatio, NumberType, PageMode, PaperDirection, RenderMode, RowFlex, TableBorder, TdBorder, TdSlash, TextDecorationStyle, TitleLevel, VerticalAlign, WatermarkType, WordBreak, createDomFromElementList, Editor as default, getElementListByHTML, getTextFromElementList, splitText };
|
|
25198
|
+
export { AreaMode, BackgroundRepeat, BackgroundSize, BlockType, Command, ControlComponent, ControlIndentation, ControlState, ControlType, EDITOR_CLIPBOARD, EDITOR_COMPONENT, Editor, EditorComponent, EditorMode, EditorZone, ElementType, FlexDirection, INTERNAL_CONTEXT_MENU_KEY, INTERNAL_SHORTCUT_KEY, ImageDisplay, KeyMap, LETTER_CLASS, LineNumberType, ListStyle, ListType, LocationPosition, MaxHeightRatio, NumberType, PageMode, PaperDirection, RenderMode, RowFlex, TableBorder, TdBorder, TdSlash, TextDecorationStyle, TitleLevel, VerticalAlign, WatermarkLayer, WatermarkType, WordBreak, createDomFromElementList, Editor as default, getElementListByHTML, getTextFromElementList, splitText };
|
|
25111
25199
|
//# sourceMappingURL=canvas-editor.es.js.map
|