@zsviczian/excalidraw 0.9.0-obsidian-13 → 0.9.0-obsidian-image-support-9
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 +61 -8
- package/README.md +1 -1
- package/dist/excalidraw-assets-dev/{image-7e0eecf06fd4ae95db83.js → image-4d82da8a5abfcee0a489.js} +1 -1
- package/dist/excalidraw.development.js +129 -64
- package/dist/excalidraw.production.min.js +1 -1
- package/dist/excalidraw.production.min.js.LICENSE.txt +22 -0
- package/package.json +1 -1
- package/types/actions/actionCanvas.d.ts +4 -2
- package/types/actions/manager.d.ts +3 -11
- package/types/actions/types.d.ts +2 -8
- package/types/appState.d.ts +10 -4
- package/types/clipboard.d.ts +1 -0
- package/types/components/Actions.d.ts +5 -2
- package/types/components/App.d.ts +21 -5
- package/types/components/DarkModeToggle.d.ts +3 -3
- package/types/components/InitializeApp.d.ts +2 -10
- package/types/components/LayerUI.d.ts +4 -1
- package/types/components/LibraryUnit.d.ts +3 -2
- package/types/components/MobileMenu.d.ts +4 -1
- package/types/components/ToolButton.d.ts +5 -2
- package/types/components/icons.d.ts +41 -40
- package/types/constants.d.ts +8 -0
- package/types/data/blob.d.ts +13 -2
- package/types/data/encode.d.ts +29 -1
- package/types/data/json.d.ts +1 -1
- package/types/element/collision.d.ts +2 -2
- package/types/element/dragElements.d.ts +1 -1
- package/types/element/index.d.ts +2 -1
- package/types/element/mutateElement.d.ts +1 -1
- package/types/element/newElement.d.ts +4 -1
- package/types/element/resizeElements.d.ts +3 -3
- package/types/element/typeChecks.d.ts +3 -1
- package/types/element/types.d.ts +16 -3
- package/types/keys.d.ts +4 -3
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/image-4d82da8a5abfcee0a489.d.ts +0 -0
- package/types/packages/excalidraw/index.d.ts +1 -1
- package/types/packages/excalidraw/webpack.prod.config.d.ts +3 -1
- package/types/packages/utils.d.ts +1 -1
- package/types/renderer/renderElement.d.ts +3 -2
- package/types/renderer/renderScene.d.ts +3 -2
- package/types/scene/export.d.ts +2 -1
- package/types/scene/types.d.ts +3 -2
- package/types/shapes.d.ts +5 -1
- package/types/types.d.ts +29 -4
- package/types/utils.d.ts +1 -0
- package/types/zindex.d.ts +2 -2
- package/dist/excalidraw-assets-dev/image-bd6a627ff1bbdbae8366.js +0 -32
- package/dist/excalidraw-assets-dev/vendor-ac67d7e09cdab8faffe3.js +0 -323
package/CHANGELOG.md
CHANGED
|
@@ -13,11 +13,19 @@ Please add the latest change on the top under the correct section.
|
|
|
13
13
|
|
|
14
14
|
## Unreleased
|
|
15
15
|
|
|
16
|
-
## Excalidraw
|
|
16
|
+
## Excalidraw API
|
|
17
17
|
|
|
18
|
-
###
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
- Export `THEME` constant from the package so host can use this when passing the theme
|
|
21
|
+
|
|
22
|
+
#### BREAKING CHANGE
|
|
23
|
+
|
|
24
|
+
The `Appearance` type is now removed and renamed to `Theme` so `Theme` type needs to be used.
|
|
25
|
+
|
|
26
|
+
---
|
|
19
27
|
|
|
20
|
-
|
|
28
|
+
## 0.10.0 (2021-10-13)
|
|
21
29
|
|
|
22
30
|
## Excalidraw API
|
|
23
31
|
|
|
@@ -25,22 +33,66 @@ Please add the latest change on the top under the correct section.
|
|
|
25
33
|
|
|
26
34
|
### Fixes
|
|
27
35
|
|
|
28
|
-
- [`onPaste`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#onPaste) prop should return false to prevent the native excalidraw paste action.
|
|
36
|
+
- [`onPaste`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#onPaste) prop should return false to prevent the native excalidraw paste action [#3974](https://github.com/excalidraw/excalidraw/pull/3974).
|
|
29
37
|
|
|
30
|
-
#### BREAKING CHANGE
|
|
38
|
+
#### BREAKING CHANGE
|
|
39
|
+
|
|
40
|
+
- Earlier the paste action was prevented when the prop [`onPaste`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#onPaste) returned true, but now it should return false to prevent the paste action. This was done to make it semantically more correct and intuitive.
|
|
41
|
+
|
|
42
|
+
### Build
|
|
31
43
|
|
|
32
|
-
-
|
|
44
|
+
- Enable jsx transform in webpack [#4049](https://github.com/excalidraw/excalidraw/pull/4049)
|
|
33
45
|
|
|
34
46
|
### Docs
|
|
35
47
|
|
|
36
48
|
- Correct exportToBackend in README to onExportToBackend [#3952](https://github.com/excalidraw/excalidraw/pull/3952)
|
|
37
49
|
|
|
50
|
+
## Excalidraw Library
|
|
51
|
+
|
|
52
|
+
**_This section lists the updates made to the excalidraw library and will not affect the integration._**
|
|
53
|
+
|
|
54
|
+
### Features
|
|
55
|
+
|
|
56
|
+
- Improve freedraw shape [#3984](https://github.com/excalidraw/excalidraw/pull/3984)
|
|
57
|
+
|
|
58
|
+
- Make color ARIA labels better [#3871](https://github.com/excalidraw/excalidraw/pull/3871)
|
|
59
|
+
|
|
60
|
+
- Add origin trial tokens [#3853](https://github.com/excalidraw/excalidraw/pull/3853)
|
|
61
|
+
|
|
62
|
+
- Re-order zoom buttons [#3837](https://github.com/excalidraw/excalidraw/pull/3837)
|
|
63
|
+
|
|
64
|
+
- Add undo/redo buttons & tweak footer [#3832](https://github.com/excalidraw/excalidraw/pull/3832)
|
|
65
|
+
|
|
66
|
+
- Resave to png/svg with metadata if you loaded your scene from a png/svg file [#3645](https://github.com/excalidraw/excalidraw/pull/3645)
|
|
67
|
+
|
|
68
|
+
### Fixes
|
|
69
|
+
|
|
70
|
+
- Abstract and fix legacy fs [#4032](https://github.com/excalidraw/excalidraw/pull/4032)
|
|
71
|
+
|
|
72
|
+
- Context menu positioning [#4025](https://github.com/excalidraw/excalidraw/pull/4025)
|
|
73
|
+
|
|
74
|
+
- Added alert for bad encryption key [#3998](https://github.com/excalidraw/excalidraw/pull/3998)
|
|
75
|
+
|
|
76
|
+
- OnPaste should return false to prevent paste action [#3974](https://github.com/excalidraw/excalidraw/pull/3974)
|
|
77
|
+
|
|
78
|
+
- Help-icon now visible on Safari [#3939](https://github.com/excalidraw/excalidraw/pull/3939)
|
|
79
|
+
|
|
80
|
+
- Permanent zoom mode [#3931](https://github.com/excalidraw/excalidraw/pull/3931)
|
|
81
|
+
|
|
82
|
+
- Undo/redo buttons gap in Safari [#3836](https://github.com/excalidraw/excalidraw/pull/3836)
|
|
83
|
+
|
|
84
|
+
- Prevent gradual canvas misalignment [#3833](https://github.com/excalidraw/excalidraw/pull/3833)
|
|
85
|
+
|
|
86
|
+
- Color picker shortcuts not working when elements selected [#3817](https://github.com/excalidraw/excalidraw/pull/3817)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
38
90
|
## 0.9.0 (2021-07-10)
|
|
39
91
|
|
|
40
92
|
## Excalidraw API
|
|
41
93
|
|
|
42
|
-
- Added `onBeforeTextEdit` and `onBeforeTextSubmit` callback functions.
|
|
43
|
-
- The `onBeforeTextEdit: (textElement: ExcalidrawTextElement) => string` callback is triggered when a text element is about to be edited. The string returned will replace the element's text. If null is returned, the TextElement will not be changed. Use this to pre-process text before editing.
|
|
94
|
+
- Added `onBeforeTextEdit` and `onBeforeTextSubmit` callback functions.
|
|
95
|
+
- The `onBeforeTextEdit: (textElement: ExcalidrawTextElement) => string` callback is triggered when a text element is about to be edited. The string returned will replace the element's text. If null is returned, the TextElement will not be changed. Use this to pre-process text before editing.
|
|
44
96
|
- The `onBeforeTextSubmit: (textElement: ExcalidrawTextElement, textToSubmit:string, isDeleted:boolean) => string` callback is triggered when the editing of a TextElement is finished, but right before the result is submitted. The string returned will replace the text element's text. Use this to post-process text after editing has finished.
|
|
45
97
|
|
|
46
98
|
### Features
|
|
@@ -328,6 +380,7 @@ Please add the latest change on the top under the correct section.
|
|
|
328
380
|
- #### BREAKING CHANGE
|
|
329
381
|
Use `location.hash` when importing libraries to fix installation issues. This will require host apps to add a `hashchange` listener and call the newly exposed `excalidrawAPI.importLibrary(url)` API when applicable [#3320](https://github.com/excalidraw/excalidraw/pull/3320). Check the [readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#importlibrary) for more details.
|
|
330
382
|
- Append `location.pathname` to `libraryReturnUrl` default url [#3325](https://github.com/excalidraw/excalidraw/pull/3325).
|
|
383
|
+
- Support image elements [#3424](https://github.com/excalidraw/excalidraw/pull/3424).
|
|
331
384
|
|
|
332
385
|
### Build
|
|
333
386
|
|
package/README.md
CHANGED
|
@@ -605,7 +605,7 @@ This callback is triggered if passed when something is pasted into the scene. Yo
|
|
|
605
605
|
|
|
606
606
|
This callback must return a `boolean` value or a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) which resolves to a boolean value.
|
|
607
607
|
|
|
608
|
-
In case you want to prevent the excalidraw paste action you must return `
|
|
608
|
+
In case you want to prevent the excalidraw paste action you must return `false`, it will stop the native excalidraw clipboard management flow (nothing will be pasted into the scene).
|
|
609
609
|
|
|
610
610
|
### Does it support collaboration ?
|
|
611
611
|
|
package/dist/excalidraw-assets-dev/{image-7e0eecf06fd4ae95db83.js → image-4d82da8a5abfcee0a489.js}
RENAMED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
\****************************/
|
|
16
16
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
17
17
|
|
|
18
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"toByteString\": () => (/* binding */ toByteString),\n/* harmony export */ \"stringToBase64\": () => (/* binding */ stringToBase64),\n/* harmony export */ \"base64ToString\": () => (/* binding */ base64ToString),\n/* harmony export */ \"encode\": () => (/* binding */ encode),\n/* harmony export */ \"decode\": () => (/* binding */ decode),\n/* harmony export */ \"compressData\": () => (/* binding */ compressData),\n/* harmony export */ \"decompressData\": () => (/* binding */ decompressData)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! pako */ \"../../../node_modules/pako/index.js\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(pako__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _encryption__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./encryption */ \"../../data/encryption.ts\");\n\r\n\r\n // -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = function (data) {\r\n return new Promise(function (resolve, reject) {\r\n const blob = typeof data === \"string\" ? new Blob([new TextEncoder().encode(data)]) : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = function (event) {\r\n if (!event.target || typeof event.target.result !== \"string\") {\r\n return reject(new Error(\"couldn't convert to byte string\"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = function (byteString) {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = function (byteString) {\r\n return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\r\n}; // -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = /*#__PURE__*/ function () {\r\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (str, isByteString = false) {\r\n return isByteString ? window.btoa(str) : window.btoa(yield toByteString(str));\r\n });\r\n return function stringToBase64(_x) {\r\n return _ref.apply(this, arguments);\r\n };\r\n}(); // async to align with stringToBase64\r\nconst base64ToString = /*#__PURE__*/ function () {\r\n var _ref2 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (base64, isByteString = false) {\r\n return isByteString ? window.atob(base64) : byteStringToString(window.atob(base64));\r\n });\r\n return function base64ToString(_x2) {\r\n return _ref2.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// text encoding\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = /*#__PURE__*/ function () {\r\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* ({ text, compress }) {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = yield toByteString((0,pako__WEBPACK_IMPORTED_MODULE_1__.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error(\"encode: cannot deflate\", error);\r\n }\r\n }\r\n return {\r\n version: \"1\",\r\n encoding: \"bstring\",\r\n compressed: !!deflated,\r\n encoded: deflated || (yield toByteString(text))\r\n };\r\n });\r\n return function encode(_x3) {\r\n return _ref3.apply(this, arguments);\r\n };\r\n}();\r\nconst decode = /*#__PURE__*/ function () {\r\n var _ref4 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (data) {\r\n let decoded;\r\n switch (data.encoding) {\r\n case \"bstring\":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed ? data.encoded : yield byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_1__.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: \"string\"\r\n });\r\n }\r\n return decoded;\r\n });\r\n return function decode(_x4) {\r\n return _ref4.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// binary encoding\r\n// -----------------------------------------------------------------------------\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4; // -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = {\r\n 1: 8,\r\n 2: 16,\r\n 4: 32\r\n}; // getter\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you're using constants for the byte size and want to ensure there's no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n} // -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = function (...buffers) {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES + NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length + buffers.reduce(function (acc, buffer) {\r\n return acc + buffer.byteLength;\r\n }, 0));\r\n let cursor = 0; // as the first chunk we'll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = function (concatenatedBuffer) {\r\n const buffers = [];\r\n let cursor = 0; // first chunk is the version (ignored for now)\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n}; // helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = /*#__PURE__*/ function () {\r\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (data, encryptionKey) {\r\n const { encryptedBuffer, iv } = yield (0,_encryption__WEBPACK_IMPORTED_MODULE_2__.encryptData)(encryptionKey, (0,pako__WEBPACK_IMPORTED_MODULE_1__.deflate)(data));\r\n return {\r\n iv,\r\n buffer: new Uint8Array(encryptedBuffer)\r\n };\r\n });\r\n return function _encryptAndCompress(_x5, _x6) {\r\n return _ref5.apply(this, arguments);\r\n };\r\n}();\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = /*#__PURE__*/ function () {\r\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (dataBuffer, options) {\r\n const fileInfo = {\r\n version: 1,\r\n compression: \"pako@1\",\r\n encryption: \"AES-GCM\"\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = yield _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n });\r\n return function compressData(_x7, _x8) {\r\n return _ref6.apply(this, arguments);\r\n };\r\n}();\r\n/** @private */\r\nconst _decryptAndDecompress = /*#__PURE__*/ function () {\r\n var _ref7 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (iv, encryptedBuffer, decryptionKey) {\r\n encryptedBuffer = new Uint8Array(yield (0,_encryption__WEBPACK_IMPORTED_MODULE_2__.decryptData)(iv, encryptedBuffer, decryptionKey));\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_1__.inflate)(encryptedBuffer);\r\n });\r\n return function _decryptAndDecompress(_x9, _x10, _x11) {\r\n return _ref7.apply(this, arguments);\r\n };\r\n}();\r\nconst decompressData = /*#__PURE__*/ function () {\r\n var _ref8 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (bufferView, options) {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [, iv, buffer] = splitBuffers(bufferView);\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(yield _decryptAndDecompress(iv, buffer, options.decryptionKey));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata: JSON.parse(new TextDecoder().decode(contentsMetadataBuffer)),\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer\r\n };\r\n });\r\n return function decompressData(_x12, _x13) {\r\n return _ref8.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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VSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDOUgsT0FBTztZQUNMLDhEQUE4RDtZQUM5RCxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRXRFLHdEQUF3RDtZQUN4RCxJQUFJLEVBQUUsY0FBYztTQUNyQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxFQUFFLENBQUMsQ0FBQyxnRkFBZ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNvZGUudHM/NmZjYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IHsgZGVmbGF0ZSwgaW5mbGF0ZSB9IGZyb20gXCJwYWtvXCI7XG5pbXBvcnQgeyBlbmNyeXB0RGF0YSwgZGVjcnlwdERhdGEgfSBmcm9tIFwiLi9lbmNyeXB0aW9uXCI7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBieXRlIChiaW5hcnkpIHN0cmluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBmYXN0LCBCdWZmZXItY29tcGF0aWJsZSBpbXBsZW1cblxuZXhwb3J0IGNvbnN0IHRvQnl0ZVN0cmluZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgY29uc3QgYmxvYiA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gbmV3IEJsb2IoW25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKV0pIDogbmV3IEJsb2IoW2RhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXSk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmICghZXZlbnQudGFyZ2V0IHx8IHR5cGVvZiBldmVudC50YXJnZXQucmVzdWx0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiY291bGRuJ3QgY29udmVydCB0byBieXRlIHN0cmluZ1wiKSk7XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4gICAgfTtcblxuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gIH0pO1xufTtcblxuY29uc3QgYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoYnl0ZVN0cmluZykge1xuICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICBjb25zdCBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYnl0ZVN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGJ1ZmZlclZpZXdbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICByZXR1cm4gYnVmZmVyO1xufTtcblxuY29uc3QgYnl0ZVN0cmluZ1RvU3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVTdHJpbmcpIHtcbiAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpLmRlY29kZShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihieXRlU3RyaW5nKSk7XG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYmFzZTY0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEBwYXJhbSBpc0J5dGVTdHJpbmcgc2V0IHRvIHRydWUgaWYgYWxyZWFkeSBieXRlIHN0cmluZyB0byBwcmV2ZW50IGJsb2F0XG4gKiAgZHVlIHRvIHJlZW5jb2RpbmdcbiAqL1xuXG5cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0Jhc2U2NCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChzdHIsIGlzQnl0ZVN0cmluZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIGlzQnl0ZVN0cmluZyA/IHdpbmRvdy5idG9hKHN0cikgOiB3aW5kb3cuYnRvYSh5aWVsZCB0b0J5dGVTdHJpbmcoc3RyKSk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBzdHJpbmdUb0Jhc2U2NChfeCkge1xuICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7IC8vIGFzeW5jIHRvIGFsaWduIHdpdGggc3RyaW5nVG9CYXNlNjRcblxuZXhwb3J0IGNvbnN0IGJhc2U2NFRvU3RyaW5nID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChiYXNlNjQsIGlzQnl0ZVN0cmluZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIGlzQnl0ZVN0cmluZyA/IHdpbmRvdy5hdG9iKGJhc2U2NCkgOiBieXRlU3RyaW5nVG9TdHJpbmcod2luZG93LmF0b2IoYmFzZTY0KSk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBiYXNlNjRUb1N0cmluZyhfeDIpIHtcbiAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHRleHQgZW5jb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRW5jb2RlcyAoYW5kIHBvdGVudGlhbGx5IGNvbXByZXNzZXMgdmlhIHpsaWIpIHRleHQgdG8gYnl0ZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoe1xuICAgIHRleHQsXG4gICAgY29tcHJlc3NcbiAgfSkge1xuICAgIGxldCBkZWZsYXRlZDtcblxuICAgIGlmIChjb21wcmVzcyAhPT0gZmFsc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlZmxhdGVkID0geWllbGQgdG9CeXRlU3RyaW5nKGRlZmxhdGUodGV4dCkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcImVuY29kZTogY2Fubm90IGRlZmxhdGVcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiBcIjFcIixcbiAgICAgIGVuY29kaW5nOiBcImJzdHJpbmdcIixcbiAgICAgIGNvbXByZXNzZWQ6ICEhZGVmbGF0ZWQsXG4gICAgICBlbmNvZGVkOiBkZWZsYXRlZCB8fCAoeWllbGQgdG9CeXRlU3RyaW5nKHRleHQpKVxuICAgIH07XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBlbmNvZGUoX3gzKSB7XG4gICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG5leHBvcnQgY29uc3QgZGVjb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY0ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChkYXRhKSB7XG4gICAgbGV0IGRlY29kZWQ7XG5cbiAgICBzd2l0Y2ggKGRhdGEuZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgXCJic3RyaW5nXCI6XG4gICAgICAgIC8vIGlmIGNvbXByZXNzZWQsIGRvIG5vdCBkb3VibGUgZGVjb2RlIHRoZSBic3RyaW5nXG4gICAgICAgIGRlY29kZWQgPSBkYXRhLmNvbXByZXNzZWQgPyBkYXRhLmVuY29kZWQgOiB5aWVsZCBieXRlU3RyaW5nVG9TdHJpbmcoZGF0YS5lbmNvZGVkKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlOiB1bmtub3duIGVuY29kaW5nIFwiJHtkYXRhLmVuY29kaW5nfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuY29tcHJlc3NlZCkge1xuICAgICAgcmV0dXJuIGluZmxhdGUobmV3IFVpbnQ4QXJyYXkoYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIoZGVjb2RlZCkpLCB7XG4gICAgICAgIHRvOiBcInN0cmluZ1wiXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb2RlZDtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGRlY29kZShfeDQpIHtcbiAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGJpbmFyeSBlbmNvZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IENPTkNBVF9CVUZGRVJTX1ZFUlNJT04gPSAxO1xuLyoqIGhvdyBtYW55IGJ5dGVzIHdlIHVzZSB0byBlbmNvZGUgaG93IG1hbnkgYnl0ZXMgdGhlIG5leHQgY2h1bmsgaGFzLlxuICogQ29ycmVzcG9uZHMgdG8gRGF0YVZpZXcgc2V0dGVyIG1ldGhvZHMgKHNldFVpbnQzMiwgc2V0VWludDE2LCBldGMpLlxuICpcbiAqIE5PVEUgISB2YWx1ZXMgbXVzdCBub3QgYmUgY2hhbmdlZCwgd2hpY2ggd291bGQgYmUgYmFja3dhcmRzIGluY29tcGF0aWJsZSAhXG4gKi9cblxuY29uc3QgVkVSU0lPTl9EQVRBVklFV19CWVRFUyA9IDQ7XG5jb25zdCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgPSA0OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBEQVRBX1ZJRVdfQklUU19NQVAgPSB7XG4gIDE6IDgsXG4gIDI6IDE2LFxuICA0OiAzMlxufTsgLy8gZ2V0dGVyXG5cbi8qKlxuICogYWJzdHJhY3Rpb24gb3ZlciBEYXRhVmlldyB0aGF0IHNlcnZlcyBhcyBhIHR5cGVkIGdldHRlci9zZXR0ZXIgaW4gY2FzZVxuICogeW91J3JlIHVzaW5nIGNvbnN0YW50cyBmb3IgdGhlIGJ5dGUgc2l6ZSBhbmQgd2FudCB0byBlbnN1cmUgdGhlcmUncyBub1xuICogZGlzY3JlcGVuYW5jeSBpbiB0aGUgZW5jb2RpbmcgYWNyb3NzIHJlZmFjdG9ycy5cbiAqXG4gKiBEYXRhVmlldyBzZXJ2ZXMgZm9yIGFuIGVuZGlhbi1hZ25vc3RpYyBoYW5kbGluZyBvZiBudW1iZXJzIGluIEFycmF5QnVmZmVycy5cbiAqL1xuZnVuY3Rpb24gZGF0YVZpZXcoYnVmZmVyLCBieXRlcywgb2Zmc2V0LCB2YWx1ZSkge1xuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh2YWx1ZSA+IE1hdGgucG93KDIsIERBVEFfVklFV19CSVRTX01BUFtieXRlc10pIC0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhdHRlbXB0aW5nIHRvIHNldCB2YWx1ZSBoaWdoZXIgdGhhbiB0aGUgYWxsb2NhdGVkIGJ5dGVzICh2YWx1ZTogJHt2YWx1ZX0sIGJ5dGVzOiAke2J5dGVzfSlgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2QgPSBgc2V0VWludCR7REFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXX1gO1xuICAgIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCwgdmFsdWUpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSBgZ2V0VWludCR7REFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXX1gO1xuICByZXR1cm4gbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF0ob2Zmc2V0KTtcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXN1bHRpbmcgY29uY2F0ZW5hdGVkIGJ1ZmZlciBoYXMgdGhpcyBmb3JtYXQ6XG4gKlxuICogW1xuICogICBWRVJTSU9OIGNodW5rICg0IGJ5dGVzKVxuICogICBMRU5HVEggY2h1bmsgMSAoNCBieXRlcylcbiAqICAgREFUQSBjaHVuayAxICh1cCB0byAyXjMyIGJpdHMpXG4gKiAgIExFTkdUSCBjaHVuayAyICg0IGJ5dGVzKVxuICogICBEQVRBIGNodW5rIDIgKHVwIHRvIDJeMzIgYml0cylcbiAqICAgLi4uXG4gKiBdXG4gKlxuICogQHBhcmFtIGJ1ZmZlcnMgZWFjaCBidWZmZXIgKGNodW5rKSBtdXN0IGJlIGF0IG1vc3QgMl4zMiBiaXRzIGxhcmdlICh+NEdCKVxuICovXG5cblxuY29uc3QgY29uY2F0QnVmZmVycyA9IGZ1bmN0aW9uICguLi5idWZmZXJzKSB7XG4gIGNvbnN0IGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShWRVJTSU9OX0RBVEFWSUVXX0JZVEVTICsgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTICogYnVmZmVycy5sZW5ndGggKyBidWZmZXJzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBidWZmZXIpIHtcbiAgICByZXR1cm4gYWNjICsgYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH0sIDApKTtcbiAgbGV0IGN1cnNvciA9IDA7IC8vIGFzIHRoZSBmaXJzdCBjaHVuayB3ZSdsbCBlbmNvZGUgdGhlIHZlcnNpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbiAgZGF0YVZpZXcoYnVmZmVyVmlldywgVkVSU0lPTl9EQVRBVklFV19CWVRFUywgY3Vyc29yLCBDT05DQVRfQlVGRkVSU19WRVJTSU9OKTtcbiAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XG5cbiAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xuICAgIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgY3Vyc29yICs9IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUztcbiAgICBidWZmZXJWaWV3LnNldChidWZmZXIsIGN1cnNvcik7XG4gICAgY3Vyc29yICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlclZpZXc7XG59O1xuLyoqIGNhbiBvbmx5IGJlIHVzZWQgb24gYnVmZmVycyBjcmVhdGVkIHZpYSBgY29uY2F0QnVmZmVycygpYCAqL1xuXG5cbmNvbnN0IHNwbGl0QnVmZmVycyA9IGZ1bmN0aW9uIChjb25jYXRlbmF0ZWRCdWZmZXIpIHtcbiAgY29uc3QgYnVmZmVycyA9IFtdO1xuICBsZXQgY3Vyc29yID0gMDsgLy8gZmlyc3QgY2h1bmsgaXMgdGhlIHZlcnNpb24gKGlnbm9yZWQgZm9yIG5vdylcblxuICBjdXJzb3IgKz0gVkVSU0lPTl9EQVRBVklFV19CWVRFUztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IGRhdGFWaWV3KGNvbmNhdGVuYXRlZEJ1ZmZlciwgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IpO1xuICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XG4gICAgYnVmZmVycy5wdXNoKGNvbmNhdGVuYXRlZEJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIGNodW5rU2l6ZSkpO1xuICAgIGN1cnNvciArPSBjaHVua1NpemU7XG5cbiAgICBpZiAoY3Vyc29yID49IGNvbmNhdGVuYXRlZEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmZmVycztcbn07IC8vIGhlbHBlcnMgZm9yIChkZSljb21wcmVzc2luZyBkYXRhIHdpdGggSlNPTiBtZXRhZGF0YSBpbmNsdWRpbmcgZW5jcnlwdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEBwcml2YXRlICovXG5cblxuY29uc3QgX2VuY3J5cHRBbmRDb21wcmVzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZGF0YSwgZW5jcnlwdGlvbktleSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuY3J5cHRlZEJ1ZmZlcixcbiAgICAgIGl2XG4gICAgfSA9IHlpZWxkIGVuY3J5cHREYXRhKGVuY3J5cHRpb25LZXksIGRlZmxhdGUoZGF0YSkpO1xuICAgIHJldHVybiB7XG4gICAgICBpdixcbiAgICAgIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQnVmZmVyKVxuICAgIH07XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBfZW5jcnlwdEFuZENvbXByZXNzKF94NSwgX3g2KSB7XG4gICAgcmV0dXJuIF9yZWY1LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7XG4vKipcbiAqIFRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQ6XG4gKiBgW11gIHJlZmVycyB0byBhIGJ1ZmZlcnMgd3JhcHBlciAoc2VlIGBjb25jYXRCdWZmZXJzYClcbiAqXG4gKiBbXG4gKiAgIGVuY29kaW5nTWV0YWRhdGFCdWZmZXIsXG4gKiAgIGl2LFxuICogICBbXG4gKiAgICAgIGNvbnRlbnRzTWV0YWRhdGFCdWZmZXJcbiAqICAgICAgY29udGVudHNCdWZmZXJcbiAqICAgXVxuICogXVxuICovXG5cblxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRGF0YSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZGF0YUJ1ZmZlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZpbGVJbmZvID0ge1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGNvbXByZXNzaW9uOiBcInBha29AMVwiLFxuICAgICAgZW5jcnlwdGlvbjogXCJBRVMtR0NNXCJcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kaW5nTWV0YWRhdGFCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoZmlsZUluZm8pKTtcbiAgICBjb25zdCBjb250ZW50c01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMubWV0YWRhdGEgfHwgbnVsbCkpO1xuICAgIGNvbnN0IHtcbiAgICAgIGl2LFxuICAgICAgYnVmZmVyXG4gICAgfSA9IHlpZWxkIF9lbmNyeXB0QW5kQ29tcHJlc3MoY29uY2F0QnVmZmVycyhjb250ZW50c01ldGFkYXRhQnVmZmVyLCBkYXRhQnVmZmVyKSwgb3B0aW9ucy5lbmNyeXB0aW9uS2V5KTtcbiAgICByZXR1cm4gY29uY2F0QnVmZmVycyhlbmNvZGluZ01ldGFkYXRhQnVmZmVyLCBpdiwgYnVmZmVyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXByZXNzRGF0YShfeDcsIF94OCkge1xuICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuLyoqIEBwcml2YXRlICovXG5cbmNvbnN0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaXYsIGVuY3J5cHRlZEJ1ZmZlciwgZGVjcnlwdGlvbktleSkge1xuICAgIGVuY3J5cHRlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHlpZWxkIGRlY3J5cHREYXRhKGl2LCBlbmNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXkpKTtcbiAgICByZXR1cm4gaW5mbGF0ZShlbmNyeXB0ZWRCdWZmZXIpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2RlY3J5cHRBbmREZWNvbXByZXNzKF94OSwgX3gxMCwgX3gxMSkge1xuICAgIHJldHVybiBfcmVmNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc0RhdGEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjggPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGJ1ZmZlclZpZXcsIG9wdGlvbnMpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBlbmNvZGluZyBtZXRhZGF0YSAoaWdub3JlZCBmb3Igbm93KVxuICAgIGNvbnN0IFssIGl2LCBidWZmZXJdID0gc3BsaXRCdWZmZXJzKGJ1ZmZlclZpZXcpO1xuICAgIGNvbnN0IFtjb250ZW50c01ldGFkYXRhQnVmZmVyLCBjb250ZW50c0J1ZmZlcl0gPSBzcGxpdEJ1ZmZlcnMoeWllbGQgX2RlY3J5cHRBbmREZWNvbXByZXNzKGl2LCBidWZmZXIsIG9wdGlvbnMuZGVjcnlwdGlvbktleSkpO1xuICAgIHJldHVybiB7XG4gICAgICAvKiogbWV0YWRhdGEgc291cmNlIGlzIGFsd2F5cyBKU09OIHNvIHdlIGNhbiBkZWNvZGUgaXQgaGVyZSAqL1xuICAgICAgbWV0YWRhdGE6IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIpKSxcblxuICAgICAgLyoqIGRhdGEgY2FuIGJlIGFueXRoaW5nIHNvIHRoZSBjYWxsZXIgbXVzdCBkZWNvZGUgaXQgKi9cbiAgICAgIGRhdGE6IGNvbnRlbnRzQnVmZmVyXG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGRlY29tcHJlc3NEYXRhKF94MTIsIF94MTMpIHtcbiAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../data/encode.ts\n");
|
|
18
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"toByteString\": () => (/* binding */ toByteString),\n/* harmony export */ \"stringToBase64\": () => (/* binding */ stringToBase64),\n/* harmony export */ \"base64ToString\": () => (/* binding */ base64ToString),\n/* harmony export */ \"encode\": () => (/* binding */ encode),\n/* harmony export */ \"decode\": () => (/* binding */ decode),\n/* harmony export */ \"compressData\": () => (/* binding */ compressData),\n/* harmony export */ \"decompressData\": () => (/* binding */ decompressData)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! pako */ \"../../../node_modules/pako/index.js\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(pako__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _encryption__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./encryption */ \"../../data/encryption.ts\");\n\r\n\r\n // -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = function (data) {\r\n return new Promise(function (resolve, reject) {\r\n const blob = typeof data === \"string\" ? new Blob([new TextEncoder().encode(data)]) : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = function (event) {\r\n if (!event.target || typeof event.target.result !== \"string\") {\r\n return reject(new Error(\"couldn't convert to byte string\"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = function (byteString) {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = function (byteString) {\r\n return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\r\n}; // -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = /*#__PURE__*/ function () {\r\n var _ref = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (str, isByteString = false) {\r\n return isByteString ? window.btoa(str) : window.btoa(yield toByteString(str));\r\n });\r\n return function stringToBase64(_x) {\r\n return _ref.apply(this, arguments);\r\n };\r\n}(); // async to align with stringToBase64\r\nconst base64ToString = /*#__PURE__*/ function () {\r\n var _ref2 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (base64, isByteString = false) {\r\n return isByteString ? window.atob(base64) : byteStringToString(window.atob(base64));\r\n });\r\n return function base64ToString(_x2) {\r\n return _ref2.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// text encoding\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = /*#__PURE__*/ function () {\r\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* ({ text, compress }) {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = yield toByteString((0,pako__WEBPACK_IMPORTED_MODULE_1__.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error(\"encode: cannot deflate\", error);\r\n }\r\n }\r\n return {\r\n version: \"1\",\r\n encoding: \"bstring\",\r\n compressed: !!deflated,\r\n encoded: deflated || (yield toByteString(text))\r\n };\r\n });\r\n return function encode(_x3) {\r\n return _ref3.apply(this, arguments);\r\n };\r\n}();\r\nconst decode = /*#__PURE__*/ function () {\r\n var _ref4 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (data) {\r\n let decoded;\r\n switch (data.encoding) {\r\n case \"bstring\":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed ? data.encoded : yield byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_1__.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: \"string\"\r\n });\r\n }\r\n return decoded;\r\n });\r\n return function decode(_x4) {\r\n return _ref4.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// binary encoding\r\n// -----------------------------------------------------------------------------\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4; // -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = {\r\n 1: 8,\r\n 2: 16,\r\n 4: 32\r\n}; // getter\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you're using constants for the byte size and want to ensure there's no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n} // -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = function (...buffers) {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES + NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length + buffers.reduce(function (acc, buffer) {\r\n return acc + buffer.byteLength;\r\n }, 0));\r\n let cursor = 0; // as the first chunk we'll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = function (concatenatedBuffer) {\r\n const buffers = [];\r\n let cursor = 0; // first chunk is the version (ignored for now)\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n}; // helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = /*#__PURE__*/ function () {\r\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (data, encryptionKey) {\r\n const { encryptedBuffer, iv } = yield (0,_encryption__WEBPACK_IMPORTED_MODULE_2__.encryptData)(encryptionKey, (0,pako__WEBPACK_IMPORTED_MODULE_1__.deflate)(data));\r\n return {\r\n iv,\r\n buffer: new Uint8Array(encryptedBuffer)\r\n };\r\n });\r\n return function _encryptAndCompress(_x5, _x6) {\r\n return _ref5.apply(this, arguments);\r\n };\r\n}();\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = /*#__PURE__*/ function () {\r\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (dataBuffer, options) {\r\n const fileInfo = {\r\n version: 1,\r\n compression: \"pako@1\",\r\n encryption: \"AES-GCM\"\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = yield _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n });\r\n return function compressData(_x7, _x8) {\r\n return _ref6.apply(this, arguments);\r\n };\r\n}();\r\n/** @private */\r\nconst _decryptAndDecompress = /*#__PURE__*/ function () {\r\n var _ref7 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (iv, decryptedBuffer, decryptionKey, isCompressed) {\r\n decryptedBuffer = new Uint8Array(yield (0,_encryption__WEBPACK_IMPORTED_MODULE_2__.decryptData)(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_1__.inflate)(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n });\r\n return function _decryptAndDecompress(_x9, _x10, _x11, _x12) {\r\n return _ref7.apply(this, arguments);\r\n };\r\n}();\r\nconst decompressData = /*#__PURE__*/ function () {\r\n var _ref8 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__.default)(function* (bufferView, options) {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(yield _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer\r\n };\r\n }\r\n catch (error) {\r\n console.error(`Error during decompressing and decrypting the file.`, encodingMetadata);\r\n throw error;\r\n }\r\n });\r\n return function decompressData(_x13, _x14) {\r\n return _ref8.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LHFEQUFxRDtRQUNyRCxNQUFNLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBRXRGLElBQUk7WUFDRixNQUFNLENBQUMsc0JBQXNCLEVBQUUsY0FBYyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0scUJBQXFCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzlKLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQzlFLE9BQU87Z0JBQ0wsOERBQThEO2dCQUM5RCxRQUFRO2dCQUVSLHdEQUF3RDtnQkFDeEQsSUFBSSxFQUFFLGNBQWM7YUFDckIsQ0FBQztTQUNIO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDdkYsTUFBTSxLQUFLLENBQUM7U0FDYjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUN2QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztBQUNKLENBQUMsRUFBRSxDQUFDLENBQUMsZ0ZBQWdGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jb2RlLnRzPzZmY2IiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCB7IGRlZmxhdGUsIGluZmxhdGUgfSBmcm9tIFwicGFrb1wiO1xuaW1wb3J0IHsgZW5jcnlwdERhdGEsIGRlY3J5cHREYXRhIH0gZnJvbSBcIi4vZW5jcnlwdGlvblwiOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYnl0ZSAoYmluYXJ5KSBzdHJpbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gZmFzdCwgQnVmZmVyLWNvbXBhdGlibGUgaW1wbGVtXG5cbmV4cG9ydCBjb25zdCB0b0J5dGVTdHJpbmcgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IGJsb2IgPSB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBCbG9iKFtuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YSldKSA6IG5ldyBCbG9iKFtkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKV0pO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50LnRhcmdldCB8fCB0eXBlb2YgZXZlbnQudGFyZ2V0LnJlc3VsdCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgdG8gYnl0ZSBzdHJpbmdcIikpO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgIH07XG5cbiAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpO1xuICB9KTtcbn07XG5cbmNvbnN0IGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGJ5dGVTdHJpbmcpIHtcbiAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGJ5dGVTdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZmZXJWaWV3W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn07XG5cbmNvbnN0IGJ5dGVTdHJpbmdUb1N0cmluZyA9IGZ1bmN0aW9uIChieXRlU3RyaW5nKSB7XG4gIHJldHVybiBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKS5kZWNvZGUoYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIoYnl0ZVN0cmluZykpO1xufTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGJhc2U2NFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBAcGFyYW0gaXNCeXRlU3RyaW5nIHNldCB0byB0cnVlIGlmIGFscmVhZHkgYnl0ZSBzdHJpbmcgdG8gcHJldmVudCBibG9hdFxuICogIGR1ZSB0byByZWVuY29kaW5nXG4gKi9cblxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9CYXNlNjQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoc3RyLCBpc0J5dGVTdHJpbmcgPSBmYWxzZSkge1xuICAgIHJldHVybiBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYnRvYShzdHIpIDogd2luZG93LmJ0b2EoeWllbGQgdG9CeXRlU3RyaW5nKHN0cikpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gc3RyaW5nVG9CYXNlNjQoX3gpIHtcbiAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpOyAvLyBhc3luYyB0byBhbGlnbiB3aXRoIHN0cmluZ1RvQmFzZTY0XG5cbmV4cG9ydCBjb25zdCBiYXNlNjRUb1N0cmluZyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoYmFzZTY0LCBpc0J5dGVTdHJpbmcgPSBmYWxzZSkge1xuICAgIHJldHVybiBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYXRvYihiYXNlNjQpIDogYnl0ZVN0cmluZ1RvU3RyaW5nKHdpbmRvdy5hdG9iKGJhc2U2NCkpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gYmFzZTY0VG9TdHJpbmcoX3gyKSB7XG4gICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyB0ZXh0IGVuY29kaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEVuY29kZXMgKGFuZCBwb3RlbnRpYWxseSBjb21wcmVzc2VzIHZpYSB6bGliKSB0ZXh0IHRvIGJ5dGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNvZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKHtcbiAgICB0ZXh0LFxuICAgIGNvbXByZXNzXG4gIH0pIHtcbiAgICBsZXQgZGVmbGF0ZWQ7XG5cbiAgICBpZiAoY29tcHJlc3MgIT09IGZhbHNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZWZsYXRlZCA9IHlpZWxkIHRvQnl0ZVN0cmluZyhkZWZsYXRlKHRleHQpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlbmNvZGU6IGNhbm5vdCBkZWZsYXRlXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogXCIxXCIsXG4gICAgICBlbmNvZGluZzogXCJic3RyaW5nXCIsXG4gICAgICBjb21wcmVzc2VkOiAhIWRlZmxhdGVkLFxuICAgICAgZW5jb2RlZDogZGVmbGF0ZWQgfHwgKHlpZWxkIHRvQnl0ZVN0cmluZyh0ZXh0KSlcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gZW5jb2RlKF94Mykge1xuICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmNCA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoZGF0YSkge1xuICAgIGxldCBkZWNvZGVkO1xuXG4gICAgc3dpdGNoIChkYXRhLmVuY29kaW5nKSB7XG4gICAgICBjYXNlIFwiYnN0cmluZ1wiOlxuICAgICAgICAvLyBpZiBjb21wcmVzc2VkLCBkbyBub3QgZG91YmxlIGRlY29kZSB0aGUgYnN0cmluZ1xuICAgICAgICBkZWNvZGVkID0gZGF0YS5jb21wcmVzc2VkID8gZGF0YS5lbmNvZGVkIDogeWllbGQgYnl0ZVN0cmluZ1RvU3RyaW5nKGRhdGEuZW5jb2RlZCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZTogdW5rbm93biBlbmNvZGluZyBcIiR7ZGF0YS5lbmNvZGluZ31cImApO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVybiBpbmZsYXRlKG5ldyBVaW50OEFycmF5KGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyKGRlY29kZWQpKSwge1xuICAgICAgICB0bzogXCJzdHJpbmdcIlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29kZWQ7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBkZWNvZGUoX3g0KSB7XG4gICAgcmV0dXJuIF9yZWY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBiaW5hcnkgZW5jb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBDT05DQVRfQlVGRkVSU19WRVJTSU9OID0gMTtcbi8qKiBob3cgbWFueSBieXRlcyB3ZSB1c2UgdG8gZW5jb2RlIGhvdyBtYW55IGJ5dGVzIHRoZSBuZXh0IGNodW5rIGhhcy5cbiAqIENvcnJlc3BvbmRzIHRvIERhdGFWaWV3IHNldHRlciBtZXRob2RzIChzZXRVaW50MzIsIHNldFVpbnQxNiwgZXRjKS5cbiAqXG4gKiBOT1RFICEgdmFsdWVzIG11c3Qgbm90IGJlIGNoYW5nZWQsIHdoaWNoIHdvdWxkIGJlIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUgIVxuICovXG5cbmNvbnN0IFZFUlNJT05fREFUQVZJRVdfQllURVMgPSA0O1xuY29uc3QgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTID0gNDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREFUQV9WSUVXX0JJVFNfTUFQID0ge1xuICAxOiA4LFxuICAyOiAxNixcbiAgNDogMzJcbn07IC8vIGdldHRlclxuXG4vKipcbiAqIGFic3RyYWN0aW9uIG92ZXIgRGF0YVZpZXcgdGhhdCBzZXJ2ZXMgYXMgYSB0eXBlZCBnZXR0ZXIvc2V0dGVyIGluIGNhc2VcbiAqIHlvdSdyZSB1c2luZyBjb25zdGFudHMgZm9yIHRoZSBieXRlIHNpemUgYW5kIHdhbnQgdG8gZW5zdXJlIHRoZXJlJ3Mgbm9cbiAqIGRpc2NyZXBlbmFuY3kgaW4gdGhlIGVuY29kaW5nIGFjcm9zcyByZWZhY3RvcnMuXG4gKlxuICogRGF0YVZpZXcgc2VydmVzIGZvciBhbiBlbmRpYW4tYWdub3N0aWMgaGFuZGxpbmcgb2YgbnVtYmVycyBpbiBBcnJheUJ1ZmZlcnMuXG4gKi9cbmZ1bmN0aW9uIGRhdGFWaWV3KGJ1ZmZlciwgYnl0ZXMsIG9mZnNldCwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPiBNYXRoLnBvdygyLCBEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdKSAtIDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYXR0ZW1wdGluZyB0byBzZXQgdmFsdWUgaGlnaGVyIHRoYW4gdGhlIGFsbG9jYXRlZCBieXRlcyAodmFsdWU6ICR7dmFsdWV9LCBieXRlczogJHtieXRlc30pYCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gYHNldFVpbnQke0RBVEFfVklFV19CSVRTX01BUFtieXRlc119YDtcbiAgICBuZXcgRGF0YVZpZXcoYnVmZmVyLmJ1ZmZlcilbbWV0aG9kXShvZmZzZXQsIHZhbHVlKTtcbiAgICByZXR1cm4gYnVmZmVyO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gYGdldFVpbnQke0RBVEFfVklFV19CSVRTX01BUFtieXRlc119YDtcbiAgcmV0dXJuIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCk7XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmVzdWx0aW5nIGNvbmNhdGVuYXRlZCBidWZmZXIgaGFzIHRoaXMgZm9ybWF0OlxuICpcbiAqIFtcbiAqICAgVkVSU0lPTiBjaHVuayAoNCBieXRlcylcbiAqICAgTEVOR1RIIGNodW5rIDEgKDQgYnl0ZXMpXG4gKiAgIERBVEEgY2h1bmsgMSAodXAgdG8gMl4zMiBiaXRzKVxuICogICBMRU5HVEggY2h1bmsgMiAoNCBieXRlcylcbiAqICAgREFUQSBjaHVuayAyICh1cCB0byAyXjMyIGJpdHMpXG4gKiAgIC4uLlxuICogXVxuICpcbiAqIEBwYXJhbSBidWZmZXJzIGVhY2ggYnVmZmVyIChjaHVuaykgbXVzdCBiZSBhdCBtb3N0IDJeMzIgYml0cyBsYXJnZSAofjRHQilcbiAqL1xuXG5cbmNvbnN0IGNvbmNhdEJ1ZmZlcnMgPSBmdW5jdGlvbiAoLi4uYnVmZmVycykge1xuICBjb25zdCBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoVkVSU0lPTl9EQVRBVklFV19CWVRFUyArIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUyAqIGJ1ZmZlcnMubGVuZ3RoICsgYnVmZmVycy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgYnVmZmVyKSB7XG4gICAgcmV0dXJuIGFjYyArIGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICB9LCAwKSk7XG4gIGxldCBjdXJzb3IgPSAwOyAvLyBhcyB0aGUgZmlyc3QgY2h1bmsgd2UnbGwgZW5jb2RlIHRoZSB2ZXJzaW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4gIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIFZFUlNJT05fREFUQVZJRVdfQllURVMsIGN1cnNvciwgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTik7XG4gIGN1cnNvciArPSBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTO1xuXG4gIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgICBkYXRhVmlldyhidWZmZXJWaWV3LCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvciwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XG4gICAgYnVmZmVyVmlldy5zZXQoYnVmZmVyLCBjdXJzb3IpO1xuICAgIGN1cnNvciArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJWaWV3O1xufTtcbi8qKiBjYW4gb25seSBiZSB1c2VkIG9uIGJ1ZmZlcnMgY3JlYXRlZCB2aWEgYGNvbmNhdEJ1ZmZlcnMoKWAgKi9cblxuXG5jb25zdCBzcGxpdEJ1ZmZlcnMgPSBmdW5jdGlvbiAoY29uY2F0ZW5hdGVkQnVmZmVyKSB7XG4gIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgbGV0IGN1cnNvciA9IDA7IC8vIGZpcnN0IGNodW5rIGlzIHRoZSB2ZXJzaW9uIChpZ25vcmVkIGZvciBub3cpXG5cbiAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBjaHVua1NpemUgPSBkYXRhVmlldyhjb25jYXRlbmF0ZWRCdWZmZXIsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yKTtcbiAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xuICAgIGJ1ZmZlcnMucHVzaChjb25jYXRlbmF0ZWRCdWZmZXIuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyBjaHVua1NpemUpKTtcbiAgICBjdXJzb3IgKz0gY2h1bmtTaXplO1xuXG4gICAgaWYgKGN1cnNvciA+PSBjb25jYXRlbmF0ZWRCdWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlcnM7XG59OyAvLyBoZWxwZXJzIGZvciAoZGUpY29tcHJlc3NpbmcgZGF0YSB3aXRoIEpTT04gbWV0YWRhdGEgaW5jbHVkaW5nIGVuY3J5cHRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBAcHJpdmF0ZSAqL1xuXG5cbmNvbnN0IF9lbmNyeXB0QW5kQ29tcHJlc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGRhdGEsIGVuY3J5cHRpb25LZXkpIHtcbiAgICBjb25zdCB7XG4gICAgICBlbmNyeXB0ZWRCdWZmZXIsXG4gICAgICBpdlxuICAgIH0gPSB5aWVsZCBlbmNyeXB0RGF0YShlbmNyeXB0aW9uS2V5LCBkZWZsYXRlKGRhdGEpKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXYsXG4gICAgICBidWZmZXI6IG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEJ1ZmZlcilcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gX2VuY3J5cHRBbmRDb21wcmVzcyhfeDUsIF94Nikge1xuICAgIHJldHVybiBfcmVmNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSgpO1xuLyoqXG4gKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBmb2xsb3dpbmcgZm9ybWF0OlxuICogYFtdYCByZWZlcnMgdG8gYSBidWZmZXJzIHdyYXBwZXIgKHNlZSBgY29uY2F0QnVmZmVyc2ApXG4gKlxuICogW1xuICogICBlbmNvZGluZ01ldGFkYXRhQnVmZmVyLFxuICogICBpdixcbiAqICAgW1xuICogICAgICBjb250ZW50c01ldGFkYXRhQnVmZmVyXG4gKiAgICAgIGNvbnRlbnRzQnVmZmVyXG4gKiAgIF1cbiAqIF1cbiAqL1xuXG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0RhdGEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGRhdGFCdWZmZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlSW5mbyA9IHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBjb21wcmVzc2lvbjogXCJwYWtvQDFcIixcbiAgICAgIGVuY3J5cHRpb246IFwiQUVTLUdDTVwiXG4gICAgfTtcbiAgICBjb25zdCBlbmNvZGluZ01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGZpbGVJbmZvKSk7XG4gICAgY29uc3QgY29udGVudHNNZXRhZGF0YUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShvcHRpb25zLm1ldGFkYXRhIHx8IG51bGwpKTtcbiAgICBjb25zdCB7XG4gICAgICBpdixcbiAgICAgIGJ1ZmZlclxuICAgIH0gPSB5aWVsZCBfZW5jcnlwdEFuZENvbXByZXNzKGNvbmNhdEJ1ZmZlcnMoY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciksIG9wdGlvbnMuZW5jcnlwdGlvbktleSk7XG4gICAgcmV0dXJuIGNvbmNhdEJ1ZmZlcnMoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcik7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBjb21wcmVzc0RhdGEoX3g3LCBfeDgpIHtcbiAgICByZXR1cm4gX3JlZjYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcbi8qKiBAcHJpdmF0ZSAqL1xuXG5jb25zdCBfZGVjcnlwdEFuZERlY29tcHJlc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZjcgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGl2LCBkZWNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXksIGlzQ29tcHJlc3NlZCkge1xuICAgIGRlY3J5cHRlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHlpZWxkIGRlY3J5cHREYXRhKGl2LCBkZWNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXkpKTtcblxuICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgIHJldHVybiBpbmZsYXRlKGRlY3J5cHRlZEJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY3J5cHRlZEJ1ZmZlcjtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9kZWNyeXB0QW5kRGVjb21wcmVzcyhfeDksIF94MTAsIF94MTEsIF94MTIpIHtcbiAgICByZXR1cm4gX3JlZjcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0oKTtcblxuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NEYXRhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWY4ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChidWZmZXJWaWV3LCBvcHRpb25zKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgZW5jb2RpbmcgbWV0YWRhdGEgKGlnbm9yZWQgZm9yIG5vdylcbiAgICBjb25zdCBbZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcl0gPSBzcGxpdEJ1ZmZlcnMoYnVmZmVyVmlldyk7XG4gICAgY29uc3QgZW5jb2RpbmdNZXRhZGF0YSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVuY29kaW5nTWV0YWRhdGFCdWZmZXIpKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgY29udGVudHNCdWZmZXJdID0gc3BsaXRCdWZmZXJzKHlpZWxkIF9kZWNyeXB0QW5kRGVjb21wcmVzcyhpdiwgYnVmZmVyLCBvcHRpb25zLmRlY3J5cHRpb25LZXksICEhZW5jb2RpbmdNZXRhZGF0YS5jb21wcmVzc2lvbikpO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50c01ldGFkYXRhQnVmZmVyKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAvKiogbWV0YWRhdGEgc291cmNlIGlzIGFsd2F5cyBKU09OIHNvIHdlIGNhbiBkZWNvZGUgaXQgaGVyZSAqL1xuICAgICAgICBtZXRhZGF0YSxcblxuICAgICAgICAvKiogZGF0YSBjYW4gYmUgYW55dGhpbmcgc28gdGhlIGNhbGxlciBtdXN0IGRlY29kZSBpdCAqL1xuICAgICAgICBkYXRhOiBjb250ZW50c0J1ZmZlclxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZHVyaW5nIGRlY29tcHJlc3NpbmcgYW5kIGRlY3J5cHRpbmcgdGhlIGZpbGUuYCwgZW5jb2RpbmdNZXRhZGF0YSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiBkZWNvbXByZXNzRGF0YShfeDEzLCBfeDE0KSB7XG4gICAgcmV0dXJuIF9yZWY4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KCk7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../data/encode.ts\n");
|
|
19
19
|
|
|
20
20
|
/***/ }),
|
|
21
21
|
|