ngx-image-cropper 7.2.1 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +56 -72
  2. package/esm2022/lib/component/cropper.state.mjs +188 -0
  3. package/esm2022/lib/component/image-cropper.component.mjs +523 -0
  4. package/esm2022/lib/interfaces/basic-event.interface.mjs +2 -0
  5. package/esm2022/lib/interfaces/cropper-options.interface.mjs +2 -0
  6. package/esm2022/lib/interfaces/index.mjs +2 -0
  7. package/esm2022/lib/interfaces/move-start.interface.mjs +8 -0
  8. package/esm2022/lib/services/crop.service.mjs +139 -0
  9. package/esm2022/lib/services/load-image.service.mjs +196 -0
  10. package/esm2022/lib/utils/cropper-position.utils.mjs +239 -0
  11. package/{esm2020 → esm2022}/lib/utils/keyboard.utils.mjs +1 -1
  12. package/esm2022/public-api.mjs +7 -0
  13. package/fesm2022/ngx-image-cropper.mjs +1500 -0
  14. package/fesm2022/ngx-image-cropper.mjs.map +1 -0
  15. package/index.d.ts +5 -7
  16. package/lib/component/cropper.state.d.ts +29 -0
  17. package/lib/component/image-cropper.component.d.ts +58 -65
  18. package/lib/interfaces/basic-event.interface.d.ts +4 -0
  19. package/lib/interfaces/cropper-options.interface.d.ts +7 -7
  20. package/lib/interfaces/index.d.ts +0 -1
  21. package/lib/interfaces/move-start.interface.d.ts +4 -6
  22. package/lib/services/crop.service.d.ts +6 -9
  23. package/lib/services/load-image.service.d.ts +5 -8
  24. package/lib/utils/cropper-position.utils.d.ts +11 -0
  25. package/lib/utils/keyboard.utils.d.ts +5 -3
  26. package/package.json +10 -18
  27. package/public-api.d.ts +6 -1
  28. package/esm2020/index.mjs +0 -8
  29. package/esm2020/lib/component/image-cropper.component.mjs +0 -635
  30. package/esm2020/lib/image-cropper.module.mjs +0 -26
  31. package/esm2020/lib/interfaces/cropper-options.interface.mjs +0 -2
  32. package/esm2020/lib/interfaces/cropper.settings.mjs +0 -54
  33. package/esm2020/lib/interfaces/index.mjs +0 -2
  34. package/esm2020/lib/interfaces/move-start.interface.mjs +0 -8
  35. package/esm2020/lib/services/crop.service.mjs +0 -147
  36. package/esm2020/lib/services/cropper-position.service.mjs +0 -200
  37. package/esm2020/lib/services/load-image.service.mjs +0 -201
  38. package/esm2020/lib/utils/hammer.utils.mjs +0 -2
  39. package/esm2020/public-api.mjs +0 -2
  40. package/fesm2015/ngx-image-cropper.mjs +0 -1484
  41. package/fesm2015/ngx-image-cropper.mjs.map +0 -1
  42. package/fesm2020/ngx-image-cropper.mjs +0 -1470
  43. package/fesm2020/ngx-image-cropper.mjs.map +0 -1
  44. package/lib/image-cropper.module.d.ts +0 -8
  45. package/lib/interfaces/cropper.settings.d.ts +0 -38
  46. package/lib/services/cropper-position.service.d.ts +0 -14
  47. package/lib/utils/hammer.utils.d.ts +0 -7
  48. package/ngx-image-cropper.d.ts +0 -5
  49. /package/{esm2020 → esm2022}/lib/interfaces/cropper-position.interface.mjs +0 -0
  50. /package/{esm2020 → esm2022}/lib/interfaces/dimensions.interface.mjs +0 -0
  51. /package/{esm2020 → esm2022}/lib/interfaces/exif-transform.interface.mjs +0 -0
  52. /package/{esm2020 → esm2022}/lib/interfaces/image-cropped-event.interface.mjs +0 -0
  53. /package/{esm2020 → esm2022}/lib/interfaces/image-transform.interface.mjs +0 -0
  54. /package/{esm2020 → esm2022}/lib/interfaces/loaded-image.interface.mjs +0 -0
  55. /package/{esm2020 → esm2022}/lib/utils/blob.utils.mjs +0 -0
  56. /package/{esm2020 → esm2022}/lib/utils/exif.utils.mjs +0 -0
  57. /package/{esm2020 → esm2022}/lib/utils/percentage.utils.mjs +0 -0
  58. /package/{esm2020 → esm2022}/lib/utils/resize.utils.mjs +0 -0
  59. /package/{esm2020 → esm2022}/ngx-image-cropper.mjs +0 -0
@@ -1,201 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';
3
- import * as i0 from "@angular/core";
4
- export class LoadImageService {
5
- constructor() {
6
- this.autoRotateSupported = supportsAutomaticRotation();
7
- }
8
- async loadImageFile(file, cropperSettings) {
9
- const arrayBuffer = await file.arrayBuffer();
10
- return await this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);
11
- }
12
- checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, imageType, cropperSettings) {
13
- if (!this.isValidImageType(imageType)) {
14
- return Promise.reject(new Error('Invalid image type'));
15
- }
16
- return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);
17
- }
18
- isValidImageType(type) {
19
- return /image\/(png|jpg|jpeg|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);
20
- }
21
- async loadImageFromURL(url, cropperSettings) {
22
- const res = await fetch(url);
23
- const blob = await res.blob();
24
- const buffer = await blob.arrayBuffer();
25
- return await this.loadImageFromArrayBuffer(buffer, cropperSettings, blob.type);
26
- }
27
- loadBase64Image(imageBase64, cropperSettings) {
28
- const arrayBuffer = this.base64ToArrayBuffer(imageBase64);
29
- return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
30
- }
31
- base64ToArrayBuffer(imageBase64) {
32
- imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');
33
- const binaryString = atob(imageBase64);
34
- const len = binaryString.length;
35
- const bytes = new Uint8Array(len);
36
- for (let i = 0; i < len; i++) {
37
- bytes[i] = binaryString.charCodeAt(i);
38
- }
39
- return bytes.buffer;
40
- }
41
- async loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType) {
42
- const res = await new Promise(async (resolve, reject) => {
43
- try {
44
- const blob = new Blob([arrayBuffer], imageType ? { type: imageType } : undefined);
45
- const objectUrl = URL.createObjectURL(blob);
46
- const originalImage = new Image();
47
- const isSvg = imageType === 'image/svg+xml';
48
- const originalImageSize = isSvg ? await this.getSvgImageSize(blob) : undefined;
49
- originalImage.onload = () => resolve({
50
- originalImage,
51
- originalImageSize,
52
- originalObjectUrl: objectUrl,
53
- originalArrayBuffer: arrayBuffer
54
- });
55
- originalImage.onerror = reject;
56
- originalImage.src = objectUrl;
57
- }
58
- catch (e) {
59
- reject(e);
60
- }
61
- });
62
- return await this.transformImageFromArrayBuffer(res, cropperSettings, res.originalImageSize != null);
63
- }
64
- async getSvgImageSize(blob) {
65
- const parser = new DOMParser();
66
- const doc = parser.parseFromString(await blob.text(), 'image/svg+xml');
67
- const svgElement = doc.querySelector('svg');
68
- if (!svgElement) {
69
- throw Error('Failed to parse SVG image');
70
- }
71
- const widthAttr = svgElement.getAttribute('width');
72
- const heightAttr = svgElement.getAttribute('height');
73
- if (widthAttr && heightAttr) {
74
- return null;
75
- }
76
- const viewBoxAttr = svgElement.getAttribute('viewBox')
77
- || svgElement.getAttribute('viewbox');
78
- if (viewBoxAttr) {
79
- const viewBox = viewBoxAttr.split(' ');
80
- return {
81
- width: +viewBox[2],
82
- height: +viewBox[3]
83
- };
84
- }
85
- throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');
86
- }
87
- async transformImageFromArrayBuffer(res, cropperSettings, forceTransform = false) {
88
- const autoRotate = await this.autoRotateSupported;
89
- const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);
90
- if (!res.originalImage || !res.originalImage.complete) {
91
- return Promise.reject(new Error('No image loaded'));
92
- }
93
- const loadedImage = {
94
- original: {
95
- objectUrl: res.originalObjectUrl,
96
- image: res.originalImage,
97
- size: res.originalImageSize ?? {
98
- width: res.originalImage.naturalWidth,
99
- height: res.originalImage.naturalHeight
100
- }
101
- },
102
- exifTransform
103
- };
104
- return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);
105
- }
106
- async transformLoadedImage(loadedImage, cropperSettings, forceTransform = false) {
107
- const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;
108
- const originalSize = loadedImage.original.size;
109
- if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
110
- return {
111
- original: {
112
- objectUrl: loadedImage.original.objectUrl,
113
- image: loadedImage.original.image,
114
- size: { ...originalSize }
115
- },
116
- transformed: {
117
- objectUrl: loadedImage.original.objectUrl,
118
- image: loadedImage.original.image,
119
- size: { ...originalSize }
120
- },
121
- exifTransform: loadedImage.exifTransform
122
- };
123
- }
124
- const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperSettings);
125
- const canvas = document.createElement('canvas');
126
- canvas.width = transformedSize.width;
127
- canvas.height = transformedSize.height;
128
- const ctx = canvas.getContext('2d');
129
- ctx?.setTransform(loadedImage.exifTransform.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);
130
- ctx?.rotate(Math.PI * (canvasRotation / 2));
131
- ctx?.drawImage(loadedImage.original.image, -originalSize.width / 2, -originalSize.height / 2);
132
- const blob = await new Promise(resolve => canvas.toBlob(resolve, cropperSettings.format));
133
- if (!blob) {
134
- throw new Error('Failed to get Blob for transformed image.');
135
- }
136
- const objectUrl = URL.createObjectURL(blob);
137
- const transformedImage = await this.loadImageFromObjectUrl(objectUrl);
138
- return {
139
- original: {
140
- objectUrl: loadedImage.original.objectUrl,
141
- image: loadedImage.original.image,
142
- size: { ...originalSize }
143
- },
144
- transformed: {
145
- objectUrl: objectUrl,
146
- image: transformedImage,
147
- size: {
148
- width: transformedImage.width,
149
- height: transformedImage.height
150
- }
151
- },
152
- exifTransform: loadedImage.exifTransform
153
- };
154
- }
155
- loadImageFromObjectUrl(objectUrl) {
156
- return new Promise(((resolve, reject) => {
157
- const image = new Image();
158
- image.onload = () => resolve(image);
159
- image.onerror = reject;
160
- image.src = objectUrl;
161
- }));
162
- }
163
- getTransformedSize(originalSize, exifTransform, cropperSettings) {
164
- const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;
165
- if (cropperSettings.containWithinAspectRatio) {
166
- if (canvasRotation % 2) {
167
- const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;
168
- const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;
169
- return {
170
- width: Math.max(originalSize.height, minWidthToContain),
171
- height: Math.max(originalSize.width, minHeightToContain)
172
- };
173
- }
174
- else {
175
- const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;
176
- const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;
177
- return {
178
- width: Math.max(originalSize.width, minWidthToContain),
179
- height: Math.max(originalSize.height, minHeightToContain)
180
- };
181
- }
182
- }
183
- if (canvasRotation % 2) {
184
- return {
185
- height: originalSize.width,
186
- width: originalSize.height
187
- };
188
- }
189
- return {
190
- width: originalSize.width,
191
- height: originalSize.height
192
- };
193
- }
194
- }
195
- LoadImageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
196
- LoadImageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, providedIn: 'root' });
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, decorators: [{
198
- type: Injectable,
199
- args: [{ providedIn: 'root' }]
200
- }] });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbWFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFVaEcsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUdVLHdCQUFtQixHQUFxQix5QkFBeUIsRUFBRSxDQUFDO0tBc043RTtJQXBOQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVUsRUFBRSxlQUFnQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLHlDQUF5QyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFTyx5Q0FBeUMsQ0FBQyxXQUE0QixFQUFFLFNBQWlCLEVBQUUsZUFBZ0M7UUFDakksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxPQUFPLHVFQUF1RSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVcsRUFB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UUFFRCxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsT0FBTztnQkFDTCxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUs7Z0JBQzFCLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTTthQUMzQixDQUFDO1NBQ0g7UUFDRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3pCLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtTQUM1QixDQUFDO0lBQ0osQ0FBQzs7OEdBdk5VLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBREosTUFBTTs0RkFDbEIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpbWVuc2lvbnMsIExvYWRlZEltYWdlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDcm9wcGVyU2V0dGluZ3MgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nyb3BwZXIuc2V0dGluZ3MnO1xuaW1wb3J0IHsgRXhpZlRyYW5zZm9ybSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXhpZi10cmFuc2Zvcm0uaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldFRyYW5zZm9ybWF0aW9uc0Zyb21FeGlmRGF0YSwgc3VwcG9ydHNBdXRvbWF0aWNSb3RhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V4aWYudXRpbHMnO1xuXG5pbnRlcmZhY2UgTG9hZEltYWdlQXJyYXlCdWZmZXIge1xuICBvcmlnaW5hbEltYWdlOiBIVE1MSW1hZ2VFbGVtZW50O1xuICBvcmlnaW5hbEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlckxpa2U7XG4gIG9yaWdpbmFsT2JqZWN0VXJsOiBzdHJpbmc7XG4gIG9yaWdpbmFsSW1hZ2VTaXplPzogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfSB8IG51bGw7XG59XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIExvYWRJbWFnZVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgYXV0b1JvdGF0ZVN1cHBvcnRlZDogUHJvbWlzZTxib29sZWFuPiA9IHN1cHBvcnRzQXV0b21hdGljUm90YXRpb24oKTtcblxuICBhc3luYyBsb2FkSW1hZ2VGaWxlKGZpbGU6IEZpbGUsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNoZWNrSW1hZ2VUeXBlQW5kTG9hZEltYWdlRnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyLCBmaWxlLnR5cGUsIGNyb3BwZXJTZXR0aW5ncyk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW1hZ2VUeXBlQW5kTG9hZEltYWdlRnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlckxpa2UsIGltYWdlVHlwZTogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEltYWdlVHlwZShpbWFnZVR5cGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnZhbGlkIGltYWdlIHR5cGUnKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgY3JvcHBlclNldHRpbmdzLCBpbWFnZVR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkSW1hZ2VUeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvaW1hZ2VcXC8ocG5nfGpwZ3xqcGVnfGJtcHxnaWZ8dGlmZnxzdmd8d2VicHx4LWljb258dm5kLm1pY3Jvc29mdC5pY29uKS8udGVzdCh0eXBlKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRJbWFnZUZyb21VUkwodXJsOiBzdHJpbmcsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlcy5ibG9iKCk7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihidWZmZXIsIGNyb3BwZXJTZXR0aW5ncywgYmxvYi50eXBlKTtcbiAgfVxuXG4gIGxvYWRCYXNlNjRJbWFnZShpbWFnZUJhc2U2NDogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IHRoaXMuYmFzZTY0VG9BcnJheUJ1ZmZlcihpbWFnZUJhc2U2NCk7XG4gICAgcmV0dXJuIHRoaXMubG9hZEltYWdlRnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyLCBjcm9wcGVyU2V0dGluZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBiYXNlNjRUb0FycmF5QnVmZmVyKGltYWdlQmFzZTY0OiBzdHJpbmcpOiBBcnJheUJ1ZmZlckxpa2Uge1xuICAgIGltYWdlQmFzZTY0ID0gaW1hZ2VCYXNlNjQucmVwbGFjZSgvXmRhdGE6KFteO10rKTtiYXNlNjQsL2dtaSwgJycpO1xuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoaW1hZ2VCYXNlNjQpO1xuICAgIGNvbnN0IGxlbiA9IGJpbmFyeVN0cmluZy5sZW5ndGg7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcy5idWZmZXI7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgaW1hZ2VUeXBlPzogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IG5ldyBQcm9taXNlPExvYWRJbWFnZUFycmF5QnVmZmVyPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2FycmF5QnVmZmVyXSwgaW1hZ2VUeXBlID8ge3R5cGU6IGltYWdlVHlwZX0gOiB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGNvbnN0IGlzU3ZnID0gaW1hZ2VUeXBlID09PSAnaW1hZ2Uvc3ZnK3htbCc7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2VTaXplID0gaXNTdmcgPyBhd2FpdCB0aGlzLmdldFN2Z0ltYWdlU2l6ZShibG9iKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgb3JpZ2luYWxJbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHtcbiAgICAgICAgICBvcmlnaW5hbEltYWdlLFxuICAgICAgICAgIG9yaWdpbmFsSW1hZ2VTaXplLFxuICAgICAgICAgIG9yaWdpbmFsT2JqZWN0VXJsOiBvYmplY3RVcmwsXG4gICAgICAgICAgb3JpZ2luYWxBcnJheUJ1ZmZlcjogYXJyYXlCdWZmZXJcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsSW1hZ2Uub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgb3JpZ2luYWxJbWFnZS5zcmMgPSBvYmplY3RVcmw7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy50cmFuc2Zvcm1JbWFnZUZyb21BcnJheUJ1ZmZlcihyZXMsIGNyb3BwZXJTZXR0aW5ncywgcmVzLm9yaWdpbmFsSW1hZ2VTaXplICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRTdmdJbWFnZVNpemUoYmxvYjogQmxvYik6IFByb21pc2U8eyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfSB8IG51bGw+IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhhd2FpdCBibG9iLnRleHQoKSwgJ2ltYWdlL3N2Zyt4bWwnKTtcbiAgICBjb25zdCBzdmdFbGVtZW50ID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgIGlmICghc3ZnRWxlbWVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBTVkcgaW1hZ2UnKTtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGhBdHRyID0gc3ZnRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgY29uc3QgaGVpZ2h0QXR0ciA9IHN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICBpZiAod2lkdGhBdHRyICYmIGhlaWdodEF0dHIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB2aWV3Qm94QXR0ciA9IHN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Qm94JylcbiAgICAgIHx8IHN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCd2aWV3Ym94Jyk7XG4gICAgaWYgKHZpZXdCb3hBdHRyKSB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gdmlld0JveEF0dHIuc3BsaXQoJyAnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiArdmlld0JveFsyXSxcbiAgICAgICAgaGVpZ2h0OiArdmlld0JveFszXVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIFNWRyBpbWFnZS4gU1ZHIG11c3QgaGF2ZSB3aWR0aCArIGhlaWdodCBvciB2aWV3Qm94IGRlZmluaXRpb24uJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyYW5zZm9ybUltYWdlRnJvbUFycmF5QnVmZmVyKHJlczogTG9hZEltYWdlQXJyYXlCdWZmZXIsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzLCBmb3JjZVRyYW5zZm9ybSA9IGZhbHNlKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGNvbnN0IGF1dG9Sb3RhdGUgPSBhd2FpdCB0aGlzLmF1dG9Sb3RhdGVTdXBwb3J0ZWQ7XG4gICAgY29uc3QgZXhpZlRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybWF0aW9uc0Zyb21FeGlmRGF0YShhdXRvUm90YXRlID8gLTEgOiByZXMub3JpZ2luYWxBcnJheUJ1ZmZlcik7XG4gICAgaWYgKCFyZXMub3JpZ2luYWxJbWFnZSB8fCAhcmVzLm9yaWdpbmFsSW1hZ2UuY29tcGxldGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIGltYWdlIGxvYWRlZCcpKTtcbiAgICB9XG4gICAgY29uc3QgbG9hZGVkSW1hZ2UgPSB7XG4gICAgICBvcmlnaW5hbDoge1xuICAgICAgICBvYmplY3RVcmw6IHJlcy5vcmlnaW5hbE9iamVjdFVybCxcbiAgICAgICAgaW1hZ2U6IHJlcy5vcmlnaW5hbEltYWdlLFxuICAgICAgICBzaXplOiByZXMub3JpZ2luYWxJbWFnZVNpemUgPz8ge1xuICAgICAgICAgIHdpZHRoOiByZXMub3JpZ2luYWxJbWFnZS5uYXR1cmFsV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZXMub3JpZ2luYWxJbWFnZS5uYXR1cmFsSGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBleGlmVHJhbnNmb3JtXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Mb2FkZWRJbWFnZShsb2FkZWRJbWFnZSwgY3JvcHBlclNldHRpbmdzLCBmb3JjZVRyYW5zZm9ybSk7XG4gIH1cblxuICBhc3luYyB0cmFuc2Zvcm1Mb2FkZWRJbWFnZShsb2FkZWRJbWFnZTogUGFydGlhbDxMb2FkZWRJbWFnZT4sIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzLCBmb3JjZVRyYW5zZm9ybSA9IGZhbHNlKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGNvbnN0IGNhbnZhc1JvdGF0aW9uID0gY3JvcHBlclNldHRpbmdzLmNhbnZhc1JvdGF0aW9uICsgbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSEucm90YXRlO1xuICAgIGNvbnN0IG9yaWdpbmFsU2l6ZSA9IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5zaXplO1xuICAgIGlmICghZm9yY2VUcmFuc2Zvcm0gJiYgY2FudmFzUm90YXRpb24gPT09IDAgJiYgIWxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLmZsaXAgJiYgIWNyb3BwZXJTZXR0aW5ncy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgb2JqZWN0VXJsOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEub2JqZWN0VXJsLFxuICAgICAgICAgIGltYWdlOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAgICAgc2l6ZTogey4uLm9yaWdpbmFsU2l6ZX1cbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtZWQ6IHtcbiAgICAgICAgICBvYmplY3RVcmw6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5vYmplY3RVcmwsXG4gICAgICAgICAgaW1hZ2U6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZSxcbiAgICAgICAgICBzaXplOiB7Li4ub3JpZ2luYWxTaXplfVxuICAgICAgICB9LFxuICAgICAgICBleGlmVHJhbnNmb3JtOiBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZFNpemUgPSB0aGlzLmdldFRyYW5zZm9ybWVkU2l6ZShvcmlnaW5hbFNpemUsIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLCBjcm9wcGVyU2V0dGluZ3MpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRyYW5zZm9ybWVkU2l6ZS53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdHJhbnNmb3JtZWRTaXplLmhlaWdodDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHg/LnNldFRyYW5zZm9ybShcbiAgICAgIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLmZsaXAgPyAtMSA6IDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICBjYW52YXMud2lkdGggLyAyLFxuICAgICAgY2FudmFzLmhlaWdodCAvIDJcbiAgICApO1xuICAgIGN0eD8ucm90YXRlKE1hdGguUEkgKiAoY2FudmFzUm90YXRpb24gLyAyKSk7XG4gICAgY3R4Py5kcmF3SW1hZ2UoXG4gICAgICBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAtb3JpZ2luYWxTaXplLndpZHRoIC8gMixcbiAgICAgIC1vcmlnaW5hbFNpemUuaGVpZ2h0IC8gMlxuICAgICk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPihyZXNvbHZlID0+IGNhbnZhcy50b0Jsb2IocmVzb2x2ZSwgY3JvcHBlclNldHRpbmdzLmZvcm1hdCkpO1xuICAgIGlmICghYmxvYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IEJsb2IgZm9yIHRyYW5zZm9ybWVkIGltYWdlLicpO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkSW1hZ2UgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUZyb21PYmplY3RVcmwob2JqZWN0VXJsKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgb2JqZWN0VXJsOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEub2JqZWN0VXJsLFxuICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgICBzaXplOiB7Li4ub3JpZ2luYWxTaXplfVxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgIG9iamVjdFVybDogb2JqZWN0VXJsLFxuICAgICAgICBpbWFnZTogdHJhbnNmb3JtZWRJbWFnZSxcbiAgICAgICAgc2l6ZToge1xuICAgICAgICAgIHdpZHRoOiB0cmFuc2Zvcm1lZEltYWdlLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogdHJhbnNmb3JtZWRJbWFnZS5oZWlnaHRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGV4aWZUcmFuc2Zvcm06IGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltYWdlRnJvbU9iamVjdFVybChvYmplY3RVcmw6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PigoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1hZ2UpO1xuICAgICAgaW1hZ2Uub25lcnJvciA9IHJlamVjdDtcbiAgICAgIGltYWdlLnNyYyA9IG9iamVjdFVybDtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRyYW5zZm9ybWVkU2l6ZShcbiAgICBvcmlnaW5hbFNpemU6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICBleGlmVHJhbnNmb3JtOiBFeGlmVHJhbnNmb3JtLFxuICAgIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzXG4gICk6IERpbWVuc2lvbnMge1xuICAgIGNvbnN0IGNhbnZhc1JvdGF0aW9uID0gY3JvcHBlclNldHRpbmdzLmNhbnZhc1JvdGF0aW9uICsgZXhpZlRyYW5zZm9ybS5yb3RhdGU7XG4gICAgaWYgKGNyb3BwZXJTZXR0aW5ncy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgICAgY29uc3QgbWluV2lkdGhUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUud2lkdGggKiBjcm9wcGVyU2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIGNvbnN0IG1pbkhlaWdodFRvQ29udGFpbiA9IG9yaWdpbmFsU2l6ZS5oZWlnaHQgLyBjcm9wcGVyU2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS5oZWlnaHQsIG1pbldpZHRoVG9Db250YWluKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS53aWR0aCwgbWluSGVpZ2h0VG9Db250YWluKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWluV2lkdGhUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUuaGVpZ2h0ICogY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHRUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUud2lkdGggLyBjcm9wcGVyU2V0dGluZ3MuYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS53aWR0aCwgbWluV2lkdGhUb0NvbnRhaW4pLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5tYXgob3JpZ2luYWxTaXplLmhlaWdodCwgbWluSGVpZ2h0VG9Db250YWluKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogb3JpZ2luYWxTaXplLndpZHRoLFxuICAgICAgICB3aWR0aDogb3JpZ2luYWxTaXplLmhlaWdodFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBvcmlnaW5hbFNpemUud2lkdGgsXG4gICAgICBoZWlnaHQ6IG9yaWdpbmFsU2l6ZS5oZWlnaHRcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWVyLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi91dGlscy9oYW1tZXIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEhhbW1lclN0YXRpYyA9IG5ldyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQsIG9wdGlvbnM/OiBhbnkpID0+IEhhbW1lck1hbmFnZXI7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbW1lck1hbmFnZXIge1xuICBnZXQoZXZlbnROYW1lOiBzdHJpbmcpOiBIYW1tZXJNYW5hZ2VyO1xuXG4gIHNldChvcHRpb25zOiBhbnkpOiBIYW1tZXJNYW5hZ2VyO1xuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoZXY6IGFueSkgPT4gYW55KTogdm9pZDtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export * from './index';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=