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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZXZlbnQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9pbnRlcmZhY2VzL2Jhc2ljLWV2ZW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBCYXNpY0V2ZW50IHtcbiAgY2xpZW50WDogbnVtYmVyO1xuICBjbGllbnRZOiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1vcHRpb25zLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvaW50ZXJmYWNlcy9jcm9wcGVyLW9wdGlvbnMuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIENyb3BwZXJPcHRpb25zIHtcbiAgZm9ybWF0OiBPdXRwdXRGb3JtYXQ7XG4gIG91dHB1dDogT3V0cHV0VHlwZTtcbiAgYXV0b0Nyb3A6IGJvb2xlYW47XG4gIG1haW50YWluQXNwZWN0UmF0aW86IGJvb2xlYW47XG4gIHJlc2V0Q3JvcE9uQXNwZWN0UmF0aW9DaGFuZ2U6IGJvb2xlYW47XG4gIGFzcGVjdFJhdGlvOiBudW1iZXI7XG4gIHJlc2l6ZVRvV2lkdGg6IG51bWJlcjtcbiAgcmVzaXplVG9IZWlnaHQ6IG51bWJlcjtcbiAgY3JvcHBlck1pbldpZHRoOiBudW1iZXI7XG4gIGNyb3BwZXJNaW5IZWlnaHQ6IG51bWJlcjtcbiAgY3JvcHBlck1heEhlaWdodDogbnVtYmVyO1xuICBjcm9wcGVyTWF4V2lkdGg6IG51bWJlcjtcbiAgY3JvcHBlclN0YXRpY1dpZHRoOiBudW1iZXI7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQ6IG51bWJlcjtcbiAgY2FudmFzUm90YXRpb246IG51bWJlcjtcbiAgcm91bmRDcm9wcGVyOiBib29sZWFuO1xuICBvbmx5U2NhbGVEb3duOiBib29sZWFuO1xuICBpbWFnZVF1YWxpdHk6IG51bWJlcjtcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsO1xuICBjb250YWluV2l0aGluQXNwZWN0UmF0aW86IGJvb2xlYW47XG4gIGhpZGVSZXNpemVTcXVhcmVzOiBib29sZWFuO1xuICBhbGlnbkltYWdlOiAnbGVmdCcgfCAnY2VudGVyJztcbiAgY3JvcHBlckZyYW1lQXJpYUxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNoZWNrSW1hZ2VUeXBlOiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBPdXRwdXRGb3JtYXQgPSAncG5nJyB8ICdqcGVnJyB8ICdibXAnIHwgJ3dlYnAnIHwgJ2ljbyc7XG5leHBvcnQgdHlwZSBPdXRwdXRUeXBlID0gJ2Jhc2U2NCcgfCAnYmxvYic7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL2ludGVyZmFjZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENyb3BwZXJPcHRpb25zLCBPdXRwdXRGb3JtYXQgfSBmcm9tICcuL2Nyb3BwZXItb3B0aW9ucy5pbnRlcmZhY2UnO1xuZXhwb3J0IHsgQ3JvcHBlclBvc2l0aW9uIH0gZnJvbSAnLi9jcm9wcGVyLXBvc2l0aW9uLmludGVyZmFjZSc7XG5leHBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnLi9kaW1lbnNpb25zLmludGVyZmFjZSc7XG5leHBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCB9IGZyb20gJy4vaW1hZ2UtY3JvcHBlZC1ldmVudC5pbnRlcmZhY2UnO1xuZXhwb3J0IHsgTW92ZVN0YXJ0IH0gZnJvbSAnLi9tb3ZlLXN0YXJ0LmludGVyZmFjZSc7XG5leHBvcnQgeyBJbWFnZVRyYW5zZm9ybSB9IGZyb20gJy4vaW1hZ2UtdHJhbnNmb3JtLmludGVyZmFjZSc7XG5leHBvcnQgeyBMb2FkZWRJbWFnZSB9IGZyb20gJy4vbG9hZGVkLWltYWdlLmludGVyZmFjZSc7XG4iXX0=
@@ -0,0 +1,8 @@
1
+ export var MoveTypes;
2
+ (function (MoveTypes) {
3
+ MoveTypes["Drag"] = "drag";
4
+ MoveTypes["Move"] = "move";
5
+ MoveTypes["Resize"] = "resize";
6
+ MoveTypes["Pinch"] = "pinch";
7
+ })(MoveTypes || (MoveTypes = {}));
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS1zdGFydC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL2ludGVyZmFjZXMvbW92ZS1zdGFydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxDQUFOLElBQVksU0FLWDtBQUxELFdBQVksU0FBUztJQUNuQiwwQkFBYSxDQUFBO0lBQ2IsMEJBQWEsQ0FBQTtJQUNiLDhCQUFpQixDQUFBO0lBQ2pCLDRCQUFlLENBQUE7QUFDakIsQ0FBQyxFQUxXLFNBQVMsS0FBVCxTQUFTLFFBS3BCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JvcHBlclBvc2l0aW9uLCBJbWFnZVRyYW5zZm9ybSB9IGZyb20gJy4vJztcblxuZXhwb3J0IHR5cGUgUG9zaXRpb24gPSAnbGVmdCcgfCAndG9wbGVmdCcgfCAndG9wJyB8ICd0b3ByaWdodCcgfCAncmlnaHQnIHwgJ2JvdHRvbXJpZ2h0JyB8ICdib3R0b20nIHwgJ2JvdHRvbWxlZnQnIHwgJ2NlbnRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW92ZVN0YXJ0IHtcbiAgYWN0aXZlOiBib29sZWFuO1xuICB0eXBlOiBNb3ZlVHlwZXMgfCBudWxsO1xuICBwb3NpdGlvbjogUG9zaXRpb24gfCBudWxsO1xuICB0cmFuc2Zvcm0/OiBJbWFnZVRyYW5zZm9ybTtcbiAgY3JvcHBlcjogQ3JvcHBlclBvc2l0aW9uO1xuICBjbGllbnRYOiBudW1iZXI7XG4gIGNsaWVudFk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGVudW0gTW92ZVR5cGVzIHtcbiAgRHJhZyA9ICdkcmFnJyxcbiAgTW92ZSA9ICdtb3ZlJyxcbiAgUmVzaXplID0gJ3Jlc2l6ZScsXG4gIFBpbmNoID0gJ3BpbmNoJ1xufVxuIl19
@@ -0,0 +1,139 @@
1
+ import { resizeCanvas } from '../utils/resize.utils';
2
+ import { percentage } from '../utils/percentage.utils';
3
+ export class CropService {
4
+ crop(cropperState, output) {
5
+ const imagePosition = this.getImagePosition(cropperState);
6
+ const width = imagePosition.x2 - imagePosition.x1;
7
+ const height = imagePosition.y2 - imagePosition.y1;
8
+ const cropCanvas = document.createElement('canvas');
9
+ cropCanvas.width = width;
10
+ cropCanvas.height = height;
11
+ const ctx = cropCanvas.getContext('2d');
12
+ if (!ctx) {
13
+ return null;
14
+ }
15
+ if (cropperState.options.backgroundColor != null) {
16
+ ctx.fillStyle = cropperState.options.backgroundColor;
17
+ ctx.fillRect(0, 0, width, height);
18
+ }
19
+ const scaleX = (cropperState.transform.scale || 1) * (cropperState.transform.flipH ? -1 : 1);
20
+ const scaleY = (cropperState.transform.scale || 1) * (cropperState.transform.flipV ? -1 : 1);
21
+ const { translateH, translateV } = this.getCanvasTranslate(cropperState);
22
+ const transformedImage = cropperState.loadedImage.transformed;
23
+ ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);
24
+ ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
25
+ ctx.rotate((cropperState.transform.rotate || 0) * Math.PI / 180);
26
+ ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
27
+ const result = {
28
+ width, height,
29
+ imagePosition,
30
+ cropperPosition: { ...cropperState.cropper }
31
+ };
32
+ if (cropperState.options.containWithinAspectRatio) {
33
+ result.offsetImagePosition = this.getOffsetImagePosition(cropperState);
34
+ }
35
+ const resizeRatio = this.getResizeRatio(width, height, cropperState.options);
36
+ if (resizeRatio !== 1) {
37
+ result.width = Math.round(width * resizeRatio);
38
+ result.height = cropperState.options.maintainAspectRatio
39
+ ? Math.round(result.width / cropperState.options.aspectRatio)
40
+ : Math.round(height * resizeRatio);
41
+ resizeCanvas(cropCanvas, result.width, result.height);
42
+ }
43
+ if (output === 'blob') {
44
+ return this.cropToBlob(result, cropCanvas, cropperState);
45
+ }
46
+ else {
47
+ result.base64 = cropCanvas.toDataURL('image/' + cropperState.options.format, this.getQuality(cropperState.options));
48
+ return result;
49
+ }
50
+ }
51
+ async cropToBlob(output, cropCanvas, cropperState) {
52
+ output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + cropperState.options.format, this.getQuality(cropperState.options)));
53
+ if (output.blob) {
54
+ output.objectUrl = URL.createObjectURL(output.blob);
55
+ }
56
+ return output;
57
+ }
58
+ getCanvasTranslate(cropperState) {
59
+ if (cropperState.transform.translateUnit === 'px') {
60
+ const ratio = this.getRatio(cropperState);
61
+ return {
62
+ translateH: (cropperState.transform.translateH || 0) * ratio,
63
+ translateV: (cropperState.transform.translateV || 0) * ratio
64
+ };
65
+ }
66
+ else {
67
+ return {
68
+ translateH: cropperState.transform.translateH ? percentage(cropperState.transform.translateH, cropperState.loadedImage.transformed.size.width) : 0,
69
+ translateV: cropperState.transform.translateV ? percentage(cropperState.transform.translateV, cropperState.loadedImage.transformed.size.height) : 0
70
+ };
71
+ }
72
+ }
73
+ getRatio(cropperState) {
74
+ return cropperState.loadedImage.transformed.size.width / cropperState.maxSize.width;
75
+ }
76
+ getImagePosition(cropperState) {
77
+ const ratio = this.getRatio(cropperState);
78
+ const out = {
79
+ x1: Math.round(cropperState.cropper.x1 * ratio),
80
+ y1: Math.round(cropperState.cropper.y1 * ratio),
81
+ x2: Math.round(cropperState.cropper.x2 * ratio),
82
+ y2: Math.round(cropperState.cropper.y2 * ratio)
83
+ };
84
+ if (!cropperState.options.containWithinAspectRatio) {
85
+ out.x1 = Math.max(out.x1, 0);
86
+ out.y1 = Math.max(out.y1, 0);
87
+ out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
88
+ out.y2 = Math.min(out.y2, cropperState.loadedImage.transformed.size.height);
89
+ }
90
+ return out;
91
+ }
92
+ getOffsetImagePosition(cropperState) {
93
+ const canvasRotation = cropperState.options.canvasRotation + cropperState.loadedImage.exifTransform.rotate;
94
+ const ratio = this.getRatio(cropperState);
95
+ let offsetX;
96
+ let offsetY;
97
+ if (canvasRotation % 2) {
98
+ offsetX = (cropperState.loadedImage.transformed.size.width - cropperState.loadedImage.original.size.height) / 2;
99
+ offsetY = (cropperState.loadedImage.transformed.size.height - cropperState.loadedImage.original.size.width) / 2;
100
+ }
101
+ else {
102
+ offsetX = (cropperState.loadedImage.transformed.size.width - cropperState.loadedImage.original.size.width) / 2;
103
+ offsetY = (cropperState.loadedImage.transformed.size.height - cropperState.loadedImage.original.size.height) / 2;
104
+ }
105
+ const out = {
106
+ x1: Math.round(cropperState.cropper.x1 * ratio) - offsetX,
107
+ y1: Math.round(cropperState.cropper.y1 * ratio) - offsetY,
108
+ x2: Math.round(cropperState.cropper.x2 * ratio) - offsetX,
109
+ y2: Math.round(cropperState.cropper.y2 * ratio) - offsetY
110
+ };
111
+ if (!cropperState.options.containWithinAspectRatio) {
112
+ out.x1 = Math.max(out.x1, 0);
113
+ out.y1 = Math.max(out.y1, 0);
114
+ out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
115
+ out.y2 = Math.min(out.y2, cropperState.loadedImage.transformed.size.height);
116
+ }
117
+ return out;
118
+ }
119
+ getResizeRatio(width, height, options) {
120
+ const ratioWidth = options.resizeToWidth / width;
121
+ const ratioHeight = options.resizeToHeight / height;
122
+ const ratios = new Array();
123
+ if (options.resizeToWidth > 0) {
124
+ ratios.push(ratioWidth);
125
+ }
126
+ if (options.resizeToHeight > 0) {
127
+ ratios.push(ratioHeight);
128
+ }
129
+ const result = ratios.length === 0 ? 1 : Math.min(...ratios);
130
+ if (result > 1 && !options.onlyScaleDown) {
131
+ return result;
132
+ }
133
+ return Math.min(result, 1);
134
+ }
135
+ getQuality(options) {
136
+ return Math.min(1, Math.max(0, options.imageQuality / 100));
137
+ }
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9jcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RCxNQUFNLE9BQU8sV0FBVztJQUl0QixJQUFJLENBQUMsWUFBMEIsRUFBRSxNQUFrQjtRQUNqRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUN6RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUU7WUFDaEQsR0FBRyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUNyRCxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NB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QyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUF1QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcm9wcGVyT3B0aW9ucywgQ3JvcHBlclBvc2l0aW9uLCBJbWFnZUNyb3BwZWRFdmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ3JvcHBlclN0YXRlIH0gZnJvbSAnLi4vY29tcG9uZW50L2Nyb3BwZXIuc3RhdGUnO1xuaW1wb3J0IHsgcmVzaXplQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvcmVzaXplLnV0aWxzJztcbmltcG9ydCB7IHBlcmNlbnRhZ2UgfSBmcm9tICcuLi91dGlscy9wZXJjZW50YWdlLnV0aWxzJztcbmltcG9ydCB7IE91dHB1dFR5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nyb3BwZXItb3B0aW9ucy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgQ3JvcFNlcnZpY2Uge1xuXG4gIGNyb3AoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG91dHB1dDogJ2Jsb2InKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBudWxsO1xuICBjcm9wKGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBvdXRwdXQ6ICdiYXNlNjQnKTogSW1hZ2VDcm9wcGVkRXZlbnQgfCBudWxsO1xuICBjcm9wKGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBvdXRwdXQ6IE91dHB1dFR5cGUpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB8IEltYWdlQ3JvcHBlZEV2ZW50IHwgbnVsbCB7XG4gICAgY29uc3QgaW1hZ2VQb3NpdGlvbiA9IHRoaXMuZ2V0SW1hZ2VQb3NpdGlvbihjcm9wcGVyU3RhdGUpO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VQb3NpdGlvbi54MiAtIGltYWdlUG9zaXRpb24ueDE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VQb3NpdGlvbi55MiAtIGltYWdlUG9zaXRpb24ueTE7XG4gICAgY29uc3QgY3JvcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgIGNyb3BDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjcm9wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIGNvbnN0IGN0eCA9IGNyb3BDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZVggPSAoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS5zY2FsZSB8fCAxKSAqIChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLmZsaXBIID8gLTEgOiAxKTtcbiAgICBjb25zdCBzY2FsZVkgPSAoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS5zY2FsZSB8fCAxKSAqIChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLmZsaXBWID8gLTEgOiAxKTtcbiAgICBjb25zdCB7dHJhbnNsYXRlSCwgdHJhbnNsYXRlVn0gPSB0aGlzLmdldENhbnZhc1RyYW5zbGF0ZShjcm9wcGVyU3RhdGUpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtZWRJbWFnZSA9IGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQ7XG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIHNjYWxlWSwgdHJhbnNmb3JtZWRJbWFnZS5zaXplLndpZHRoIC8gMiArIHRyYW5zbGF0ZUgsIHRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyICsgdHJhbnNsYXRlVik7XG4gICAgY3R4LnRyYW5zbGF0ZSgtaW1hZ2VQb3NpdGlvbi54MSAvIHNjYWxlWCwgLWltYWdlUG9zaXRpb24ueTEgLyBzY2FsZVkpO1xuICAgIGN0eC5yb3RhdGUoKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0ucm90YXRlIHx8IDApICogTWF0aC5QSSAvIDE4MCk7XG5cbiAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgdHJhbnNmb3JtZWRJbWFnZS5pbWFnZSxcbiAgICAgIC10cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyLFxuICAgICAgLXRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdDogSW1hZ2VDcm9wcGVkRXZlbnQgPSB7XG4gICAgICB3aWR0aCwgaGVpZ2h0LFxuICAgICAgaW1hZ2VQb3NpdGlvbixcbiAgICAgIGNyb3BwZXJQb3NpdGlvbjogey4uLmNyb3BwZXJTdGF0ZS5jcm9wcGVyfVxuICAgIH07XG4gICAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykge1xuICAgICAgcmVzdWx0Lm9mZnNldEltYWdlUG9zaXRpb24gPSB0aGlzLmdldE9mZnNldEltYWdlUG9zaXRpb24oY3JvcHBlclN0YXRlKTtcbiAgICB9XG4gICAgY29uc3QgcmVzaXplUmF0aW8gPSB0aGlzLmdldFJlc2l6ZVJhdGlvKHdpZHRoLCBoZWlnaHQsIGNyb3BwZXJTdGF0ZS5vcHRpb25zKTtcbiAgICBpZiAocmVzaXplUmF0aW8gIT09IDEpIHtcbiAgICAgIHJlc3VsdC53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiByZXNpemVSYXRpbyk7XG4gICAgICByZXN1bHQuaGVpZ2h0ID0gY3JvcHBlclN0YXRlLm9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpb1xuICAgICAgICA/IE1hdGgucm91bmQocmVzdWx0LndpZHRoIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pXG4gICAgICAgIDogTWF0aC5yb3VuZChoZWlnaHQgKiByZXNpemVSYXRpbyk7XG4gICAgICByZXNpemVDYW52YXMoY3JvcENhbnZhcywgcmVzdWx0LndpZHRoLCByZXN1bHQuaGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKG91dHB1dCA9PT0gJ2Jsb2InKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcm9wVG9CbG9iKHJlc3VsdCwgY3JvcENhbnZhcywgY3JvcHBlclN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmJhc2U2NCA9IGNyb3BDYW52YXMudG9EYXRhVVJMKCdpbWFnZS8nICsgY3JvcHBlclN0YXRlLm9wdGlvbnMuZm9ybWF0LCB0aGlzLmdldFF1YWxpdHkoY3JvcHBlclN0YXRlLm9wdGlvbnMpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcm9wVG9CbG9iKG91dHB1dDogSW1hZ2VDcm9wcGVkRXZlbnQsIGNyb3BDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IFByb21pc2U8SW1hZ2VDcm9wcGVkRXZlbnQ+IHtcbiAgICBvdXRwdXQuYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPihyZXNvbHZlID0+IGNyb3BDYW52YXMudG9CbG9iKHJlc29sdmUsICdpbWFnZS8nICsgY3JvcHBlclN0YXRlLm9wdGlvbnMuZm9ybWF0LCB0aGlzLmdldFF1YWxpdHkoY3JvcHBlclN0YXRlLm9wdGlvbnMpKSk7XG4gICAgaWYgKG91dHB1dC5ibG9iKSB7XG4gICAgICBvdXRwdXQub2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChvdXRwdXQuYmxvYik7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBwcml2YXRlIGdldENhbnZhc1RyYW5zbGF0ZShjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IHsgdHJhbnNsYXRlSDogbnVtYmVyLCB0cmFuc2xhdGVWOiBudW1iZXIgfSB7XG4gICAgaWYgKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0udHJhbnNsYXRlVW5pdCA9PT0gJ3B4Jykge1xuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGNyb3BwZXJTdGF0ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2xhdGVIOiAoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVIIHx8IDApICogcmF0aW8sXG4gICAgICAgIHRyYW5zbGF0ZVY6IChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZVYgfHwgMCkgKiByYXRpb1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNsYXRlSDogY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVIID8gcGVyY2VudGFnZShjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZUgsIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCkgOiAwLFxuICAgICAgICB0cmFuc2xhdGVWOiBjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZVYgPyBwZXJjZW50YWdlKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0udHJhbnNsYXRlViwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCkgOiAwXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmF0aW8oY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLyBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlUG9zaXRpb24oY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5nZXRSYXRpbyhjcm9wcGVyU3RhdGUpO1xuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueDEgKiByYXRpbyksXG4gICAgICB5MTogTWF0aC5yb3VuZChjcm9wcGVyU3RhdGUuY3JvcHBlci55MSAqIHJhdGlvKSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXJTdGF0ZS5jcm9wcGVyLngyICogcmF0aW8pLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueTIgKiByYXRpbylcbiAgICB9O1xuXG4gICAgaWYgKCFjcm9wcGVyU3RhdGUub3B0aW9ucy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIG91dC54MSA9IE1hdGgubWF4KG91dC54MSwgMCk7XG4gICAgICBvdXQueTEgPSBNYXRoLm1heChvdXQueTEsIDApO1xuICAgICAgb3V0LngyID0gTWF0aC5taW4ob3V0LngyLCBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpO1xuICAgICAgb3V0LnkyID0gTWF0aC5taW4ob3V0LnkyLCBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPZmZzZXRJbWFnZVBvc2l0aW9uKGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlKTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNhbnZhc1JvdGF0aW9uICsgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS5leGlmVHJhbnNmb3JtLnJvdGF0ZTtcbiAgICBjb25zdCByYXRpbyA9IHRoaXMuZ2V0UmF0aW8oY3JvcHBlclN0YXRlKTtcbiAgICBsZXQgb2Zmc2V0WDogbnVtYmVyO1xuICAgIGxldCBvZmZzZXRZOiBudW1iZXI7XG5cbiAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICBvZmZzZXRYID0gKGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAtIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICAgIG9mZnNldFkgPSAoY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS53aWR0aCkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXRYID0gKGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAtIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS53aWR0aCkgLyAyO1xuICAgICAgb2Zmc2V0WSA9IChjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUuaGVpZ2h0IC0gY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS5vcmlnaW5hbC5zaXplLmhlaWdodCkgLyAyO1xuICAgIH1cblxuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueDEgKiByYXRpbykgLSBvZmZzZXRYLFxuICAgICAgeTE6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueTEgKiByYXRpbykgLSBvZmZzZXRZLFxuICAgICAgeDI6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueDIgKiByYXRpbykgLSBvZmZzZXRYLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueTIgKiByYXRpbykgLSBvZmZzZXRZXG4gICAgfTtcblxuICAgIGlmICghY3JvcHBlclN0YXRlLm9wdGlvbnMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGdldFJlc2l6ZVJhdGlvKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvcHRpb25zOiBDcm9wcGVyT3B0aW9ucyk6IG51bWJlciB7XG4gICAgY29uc3QgcmF0aW9XaWR0aCA9IG9wdGlvbnMucmVzaXplVG9XaWR0aCAvIHdpZHRoO1xuICAgIGNvbnN0IHJhdGlvSGVpZ2h0ID0gb3B0aW9ucy5yZXNpemVUb0hlaWdodCAvIGhlaWdodDtcbiAgICBjb25zdCByYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgaWYgKG9wdGlvbnMucmVzaXplVG9XaWR0aCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvV2lkdGgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5yZXNpemVUb0hlaWdodCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByYXRpb3MubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKC4uLnJhdGlvcyk7XG5cbiAgICBpZiAocmVzdWx0ID4gMSAmJiAhb3B0aW9ucy5vbmx5U2NhbGVEb3duKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocmVzdWx0LCAxKTtcbiAgfVxuXG4gIGdldFF1YWxpdHkob3B0aW9uczogQ3JvcHBlck9wdGlvbnMpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcHRpb25zLmltYWdlUXVhbGl0eSAvIDEwMCkpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,196 @@
1
+ import { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';
2
+ export class LoadImageService {
3
+ constructor() {
4
+ this.autoRotateSupported = supportsAutomaticRotation();
5
+ }
6
+ async loadImageFile(file, cropperSettings) {
7
+ const arrayBuffer = await file.arrayBuffer();
8
+ if (cropperSettings.options.checkImageType) {
9
+ return await this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);
10
+ }
11
+ return await this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
12
+ }
13
+ checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, imageType, cropperSettings) {
14
+ if (!this.isValidImageType(imageType)) {
15
+ return Promise.reject(new Error('Invalid image type'));
16
+ }
17
+ return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);
18
+ }
19
+ isValidImageType(type) {
20
+ return /image\/(png|jpg|jpeg|heic|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);
21
+ }
22
+ async loadImageFromURL(url, cropperSettings) {
23
+ const res = await fetch(url);
24
+ const blob = await res.blob();
25
+ const buffer = await blob.arrayBuffer();
26
+ return await this.loadImageFromArrayBuffer(buffer, cropperSettings, blob.type);
27
+ }
28
+ loadBase64Image(imageBase64, cropperSettings) {
29
+ const arrayBuffer = this.base64ToArrayBuffer(imageBase64);
30
+ return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
31
+ }
32
+ base64ToArrayBuffer(imageBase64) {
33
+ imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');
34
+ const binaryString = atob(imageBase64);
35
+ const len = binaryString.length;
36
+ const bytes = new Uint8Array(len);
37
+ for (let i = 0; i < len; i++) {
38
+ bytes[i] = binaryString.charCodeAt(i);
39
+ }
40
+ return bytes.buffer;
41
+ }
42
+ async loadImageFromArrayBuffer(arrayBuffer, cropperState, imageType) {
43
+ const res = await new Promise(async (resolve, reject) => {
44
+ try {
45
+ const blob = new Blob([arrayBuffer], imageType ? { type: imageType } : undefined);
46
+ const objectUrl = URL.createObjectURL(blob);
47
+ const originalImage = new Image();
48
+ const isSvg = imageType === 'image/svg+xml';
49
+ const originalImageSize = isSvg ? await this.getSvgImageSize(blob) : undefined;
50
+ originalImage.onload = () => resolve({
51
+ originalImage,
52
+ originalImageSize,
53
+ originalObjectUrl: objectUrl,
54
+ originalArrayBuffer: arrayBuffer
55
+ });
56
+ originalImage.onerror = reject;
57
+ originalImage.src = objectUrl;
58
+ }
59
+ catch (e) {
60
+ reject(e);
61
+ }
62
+ });
63
+ return await this.transformImageFromArrayBuffer(res, cropperState, res.originalImageSize != null);
64
+ }
65
+ async getSvgImageSize(blob) {
66
+ const parser = new DOMParser();
67
+ const doc = parser.parseFromString(await blob.text(), 'image/svg+xml');
68
+ const svgElement = doc.querySelector('svg');
69
+ if (!svgElement) {
70
+ throw Error('Failed to parse SVG image');
71
+ }
72
+ const widthAttr = svgElement.getAttribute('width');
73
+ const heightAttr = svgElement.getAttribute('height');
74
+ if (widthAttr && heightAttr) {
75
+ return null;
76
+ }
77
+ const viewBoxAttr = svgElement.getAttribute('viewBox')
78
+ || svgElement.getAttribute('viewbox');
79
+ if (viewBoxAttr) {
80
+ const viewBox = viewBoxAttr.split(' ');
81
+ return {
82
+ width: +viewBox[2],
83
+ height: +viewBox[3]
84
+ };
85
+ }
86
+ throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');
87
+ }
88
+ async transformImageFromArrayBuffer(res, cropperSettings, forceTransform = false) {
89
+ const autoRotate = await this.autoRotateSupported;
90
+ const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);
91
+ if (!res.originalImage || !res.originalImage.complete) {
92
+ return Promise.reject(new Error('No image loaded'));
93
+ }
94
+ const loadedImage = {
95
+ original: {
96
+ objectUrl: res.originalObjectUrl,
97
+ image: res.originalImage,
98
+ size: res.originalImageSize ?? {
99
+ width: res.originalImage.naturalWidth,
100
+ height: res.originalImage.naturalHeight
101
+ }
102
+ },
103
+ exifTransform
104
+ };
105
+ return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);
106
+ }
107
+ async transformLoadedImage(loadedImage, cropperState, forceTransform = false) {
108
+ const canvasRotation = cropperState.options.canvasRotation + loadedImage.exifTransform.rotate;
109
+ const originalSize = loadedImage.original.size;
110
+ if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperState.options.containWithinAspectRatio) {
111
+ return {
112
+ original: {
113
+ objectUrl: loadedImage.original.objectUrl,
114
+ image: loadedImage.original.image,
115
+ size: { ...originalSize }
116
+ },
117
+ transformed: {
118
+ objectUrl: loadedImage.original.objectUrl,
119
+ image: loadedImage.original.image,
120
+ size: { ...originalSize }
121
+ },
122
+ exifTransform: loadedImage.exifTransform
123
+ };
124
+ }
125
+ const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperState);
126
+ const canvas = document.createElement('canvas');
127
+ canvas.width = transformedSize.width;
128
+ canvas.height = transformedSize.height;
129
+ const ctx = canvas.getContext('2d');
130
+ ctx?.setTransform(loadedImage.exifTransform.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);
131
+ ctx?.rotate(Math.PI * (canvasRotation / 2));
132
+ ctx?.drawImage(loadedImage.original.image, -originalSize.width / 2, -originalSize.height / 2);
133
+ const blob = await new Promise(resolve => canvas.toBlob(resolve, cropperState.options.format));
134
+ if (!blob) {
135
+ throw new Error('Failed to get Blob for transformed image.');
136
+ }
137
+ const objectUrl = URL.createObjectURL(blob);
138
+ const transformedImage = await this.loadImageFromObjectUrl(objectUrl);
139
+ return {
140
+ original: {
141
+ objectUrl: loadedImage.original.objectUrl,
142
+ image: loadedImage.original.image,
143
+ size: { ...originalSize }
144
+ },
145
+ transformed: {
146
+ objectUrl: objectUrl,
147
+ image: transformedImage,
148
+ size: {
149
+ width: transformedImage.width,
150
+ height: transformedImage.height
151
+ }
152
+ },
153
+ exifTransform: loadedImage.exifTransform
154
+ };
155
+ }
156
+ loadImageFromObjectUrl(objectUrl) {
157
+ return new Promise(((resolve, reject) => {
158
+ const image = new Image();
159
+ image.onload = () => resolve(image);
160
+ image.onerror = reject;
161
+ image.src = objectUrl;
162
+ }));
163
+ }
164
+ getTransformedSize(originalSize, exifTransform, cropperState) {
165
+ const canvasRotation = cropperState.options.canvasRotation + exifTransform.rotate;
166
+ if (cropperState.options.containWithinAspectRatio) {
167
+ if (canvasRotation % 2) {
168
+ const minWidthToContain = originalSize.width * cropperState.options.aspectRatio;
169
+ const minHeightToContain = originalSize.height / cropperState.options.aspectRatio;
170
+ return {
171
+ width: Math.max(originalSize.height, minWidthToContain),
172
+ height: Math.max(originalSize.width, minHeightToContain)
173
+ };
174
+ }
175
+ else {
176
+ const minWidthToContain = originalSize.height * cropperState.options.aspectRatio;
177
+ const minHeightToContain = originalSize.width / cropperState.options.aspectRatio;
178
+ return {
179
+ width: Math.max(originalSize.width, minWidthToContain),
180
+ height: Math.max(originalSize.height, minHeightToContain)
181
+ };
182
+ }
183
+ }
184
+ if (canvasRotation % 2) {
185
+ return {
186
+ height: originalSize.width,
187
+ width: originalSize.height
188
+ };
189
+ }
190
+ return {
191
+ width: originalSize.width,
192
+ height: originalSize.height
193
+ };
194
+ }
195
+ }
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbWFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLDhCQUE4QixFQUFFLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFTaEcsTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUVVLHdCQUFtQixHQUFxQix5QkFBeUIsRUFBRSxDQUFDO0lBeU45RSxDQUFDO0lBdk5DLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBVSxFQUFFLGVBQTZCO1FBQzNELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDMUMsT0FBTyxNQUFNLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztTQUN0RztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTyx5Q0FBeUMsQ0FBQyxXQUE0QixFQUFFLFNBQWlCLEVBQUUsZUFBNkI7UUFDOUgsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxPQUFPLDRFQUE0RSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxlQUE2QjtRQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxPQUFPLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxlQUFlLENBQUMsV0FBbUIsRUFBRSxlQUE2QjtRQUNoRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxXQUFtQjtRQUM3QyxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsd0JBQXdCLENBQUMsV0FBNEIsRUFBRSxZQUEwQixFQUFFLFNBQWtCO1FBQ2pILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQXVCLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUUsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLGFBQWEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNsQyxNQUFNLEtBQUssR0FBRyxTQUFTLEtBQUssZUFBZSxDQUFDO2dCQUM1QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQy9FLGFBQWEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNuQyxhQUFhO29CQUNiLGlCQUFpQjtvQkFDakIsaUJBQWlCLEVBQUUsU0FBUztvQkFDNUIsbUJBQW1CLEVBQUUsV0FBVztpQkFDakMsQ0FBQyxDQUFDO2dCQUNILGFBQWEsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUMvQixhQUFhLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQzthQUMvQjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQVU7UUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE1BQU0sS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDMUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztlQUNqRCxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksV0FBVyxFQUFFO1lBQ2YsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxPQUFPO2dCQUNMLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDcEIsQ0FBQztTQUNIO1FBQ0QsTUFBTSxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sS0FBSyxDQUFDLDZCQUE2QixDQUFDLEdBQXlCLEVBQUUsZUFBNkIsRUFBRSxjQUFjLEdBQUcsS0FBSztRQUMxSCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNsRCxNQUFNLGFBQWEsR0FBRyw4QkFBOEIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ3JELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFDRCxNQUFNLFdBQVcsR0FBRztZQUNsQixRQUFRLEVBQUU7Z0JBQ1IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxpQkFBaUI7Z0JBQ2hDLEtBQUssRUFBRSxHQUFHLENBQUMsYUFBYTtnQkFDeEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSTtvQkFDN0IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWTtvQkFDckMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYTtpQkFDeEM7YUFDRjtZQUNELGFBQWE7U0FDZCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQWlDLEVBQUUsWUFBMEIsRUFBRSxjQUFjLEdBQUcsS0FBSztRQUM5RyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsYUFBYyxDQUFDLE1BQU0sQ0FBQztRQUMvRixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsUUFBUyxDQUFDLElBQUksQ0FBQztRQUNoRCxJQUFJLENBQUMsY0FBYyxJQUFJLGNBQWMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7WUFDakksT0FBTztnQkFDTCxRQUFRLEVBQUU7b0JBQ1IsU0FBUyxFQUFFLFdBQVcsQ0FBQyxRQUFTLENBQUMsU0FBUztvQkFDMUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxRQUFTLENBQUMsS0FBSztvQkFDbEMsSUFBSSxFQUFFLEVBQUMsR0FBRyxZQUFZLEVBQUM7aUJBQ3hCO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxTQUFTLEVBQUUsV0FBVyxDQUFDLFFBQVMsQ0FBQyxTQUFTO29CQUMxQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFFBQVMsQ0FBQyxLQUFLO29CQUNsQyxJQUFJLEVBQUUsRUFBQyxHQUFHLFlBQVksRUFBQztpQkFDeEI7Z0JBQ0QsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUFjO2FBQzFDLENBQUM7U0FDSDtRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLGFBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN4RyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxHQUFHLEVBQUUsWUFBWSxDQUNmLFdBQVcsQ0FBQyxhQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN4QyxDQUFDLEVBQ0QsQ0FBQyxFQUNELENBQUMsRUFDRCxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFDaEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ2xCLENBQUM7UUFDRixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLEVBQUUsU0FBUyxDQUNaLFdBQVcsQ0FBQyxRQUFTLENBQUMsS0FBSyxFQUMzQixDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUN2QixDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUN6QixDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBYyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU87WUFDTCxRQUFRLEVBQUU7Z0JBQ1IsU0FBUyxFQUFFLFdBQVcsQ0FBQyxRQUFTLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxRQUFTLENBQUMsS0FBSztnQkFDbEMsSUFBSSxFQUFFLEVBQUMsR0FBRyxZQUFZLEVBQUM7YUFDeEI7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLElBQUksRUFBRTtvQkFDSixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztvQkFDN0IsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE1BQU07aUJBQ2hDO2FBQ0Y7WUFDRCxhQUFhLEVBQUUsV0FBVyxDQUFDLGFBQWM7U0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxTQUFpQjtRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFtQixDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdkIsS0FBSyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsWUFBK0MsRUFDL0MsYUFBNEIsRUFDNUIsWUFBMEI7UUFFMUIsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNsRixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7WUFDakQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ2hGLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDbEYsT0FBTztvQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDO29CQUN2RCxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDO2lCQUN6RCxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO2dCQUNqRixNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ2pGLE9BQU87b0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQztvQkFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQztpQkFDMUQsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsT0FBTztnQkFDTCxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUs7Z0JBQzFCLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTTthQUMzQixDQUFDO1NBQ0g7UUFDRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3pCLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtTQUM1QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGltZW5zaW9ucywgTG9hZGVkSW1hZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENyb3BwZXJTdGF0ZSB9IGZyb20gJy4uL2NvbXBvbmVudC9jcm9wcGVyLnN0YXRlJztcbmltcG9ydCB7IEV4aWZUcmFuc2Zvcm0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4aWYtdHJhbnNmb3JtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXRUcmFuc2Zvcm1hdGlvbnNGcm9tRXhpZkRhdGEsIHN1cHBvcnRzQXV0b21hdGljUm90YXRpb24gfSBmcm9tICcuLi91dGlscy9leGlmLnV0aWxzJztcblxuaW50ZXJmYWNlIExvYWRJbWFnZUFycmF5QnVmZmVyIHtcbiAgb3JpZ2luYWxJbWFnZTogSFRNTEltYWdlRWxlbWVudDtcbiAgb3JpZ2luYWxBcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlO1xuICBvcmlnaW5hbE9iamVjdFVybDogc3RyaW5nO1xuICBvcmlnaW5hbEltYWdlU2l6ZT86IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IH0gfCBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgTG9hZEltYWdlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBhdXRvUm90YXRlU3VwcG9ydGVkOiBQcm9taXNlPGJvb2xlYW4+ID0gc3VwcG9ydHNBdXRvbWF0aWNSb3RhdGlvbigpO1xuXG4gIGFzeW5jIGxvYWRJbWFnZUZpbGUoZmlsZTogRmlsZSwgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU3RhdGUpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCk7XG4gICAgaWYgKGNyb3BwZXJTZXR0aW5ncy5vcHRpb25zLmNoZWNrSW1hZ2VUeXBlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGVja0ltYWdlVHlwZUFuZExvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgZmlsZS50eXBlLCBjcm9wcGVyU2V0dGluZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkSW1hZ2VGcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIsIGNyb3BwZXJTZXR0aW5ncyk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW1hZ2VUeXBlQW5kTG9hZEltYWdlRnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlckxpa2UsIGltYWdlVHlwZTogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTdGF0ZSk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEltYWdlVHlwZShpbWFnZVR5cGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnZhbGlkIGltYWdlIHR5cGUnKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgY3JvcHBlclNldHRpbmdzLCBpbWFnZVR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkSW1hZ2VUeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvaW1hZ2VcXC8ocG5nfGpwZ3xqcGVnfGhlaWN8Ym1wfGdpZnx0aWZmfHN2Z3x3ZWJwfHgtaWNvbnx2bmQubWljcm9zb2Z0Lmljb24pLy50ZXN0KHR5cGUpO1xuICB9XG5cbiAgYXN5bmMgbG9hZEltYWdlRnJvbVVSTCh1cmw6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU3RhdGUpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzLmJsb2IoKTtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZEltYWdlRnJvbUFycmF5QnVmZmVyKGJ1ZmZlciwgY3JvcHBlclNldHRpbmdzLCBibG9iLnR5cGUpO1xuICB9XG5cbiAgbG9hZEJhc2U2NEltYWdlKGltYWdlQmFzZTY0OiBzdHJpbmcsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclN0YXRlKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gdGhpcy5iYXNlNjRUb0FycmF5QnVmZmVyKGltYWdlQmFzZTY0KTtcbiAgICByZXR1cm4gdGhpcy5sb2FkSW1hZ2VGcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIsIGNyb3BwZXJTZXR0aW5ncyk7XG4gIH1cblxuICBwcml2YXRlIGJhc2U2NFRvQXJyYXlCdWZmZXIoaW1hZ2VCYXNlNjQ6IHN0cmluZyk6IEFycmF5QnVmZmVyTGlrZSB7XG4gICAgaW1hZ2VCYXNlNjQgPSBpbWFnZUJhc2U2NC5yZXBsYWNlKC9eZGF0YTooW147XSspO2Jhc2U2NCwvZ21pLCAnJyk7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihpbWFnZUJhc2U2NCk7XG4gICAgY29uc3QgbGVuID0gYmluYXJ5U3RyaW5nLmxlbmd0aDtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzLmJ1ZmZlcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEltYWdlRnJvbUFycmF5QnVmZmVyKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlckxpa2UsIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBpbWFnZVR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgbmV3IFByb21pc2U8TG9hZEltYWdlQXJyYXlCdWZmZXI+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXJyYXlCdWZmZXJdLCBpbWFnZVR5cGUgPyB7dHlwZTogaW1hZ2VUeXBlfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgaXNTdmcgPSBpbWFnZVR5cGUgPT09ICdpbWFnZS9zdmcreG1sJztcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbWFnZVNpemUgPSBpc1N2ZyA/IGF3YWl0IHRoaXMuZ2V0U3ZnSW1hZ2VTaXplKGJsb2IpIDogdW5kZWZpbmVkO1xuICAgICAgICBvcmlnaW5hbEltYWdlLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoe1xuICAgICAgICAgIG9yaWdpbmFsSW1hZ2UsXG4gICAgICAgICAgb3JpZ2luYWxJbWFnZVNpemUsXG4gICAgICAgICAgb3JpZ2luYWxPYmplY3RVcmw6IG9iamVjdFVybCxcbiAgICAgICAgICBvcmlnaW5hbEFycmF5QnVmZmVyOiBhcnJheUJ1ZmZlclxuICAgICAgICB9KTtcbiAgICAgICAgb3JpZ2luYWxJbWFnZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICBvcmlnaW5hbEltYWdlLnNyYyA9IG9iamVjdFVybDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYW5zZm9ybUltYWdlRnJvbUFycmF5QnVmZmVyKHJlcywgY3JvcHBlclN0YXRlLCByZXMub3JpZ2luYWxJbWFnZVNpemUgIT0gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFN2Z0ltYWdlU2l6ZShibG9iOiBCbG9iKTogUHJvbWlzZTx7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGF3YWl0IGJsb2IudGV4dCgpLCAnaW1hZ2Uvc3ZnK3htbCcpO1xuICAgIGNvbnN0IHN2Z0VsZW1lbnQgPSBkb2MucXVlcnlTZWxlY3Rvcignc3ZnJyk7XG4gICAgaWYgKCFzdmdFbGVtZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIFNWRyBpbWFnZScpO1xuICAgIH1cbiAgICBjb25zdCB3aWR0aEF0dHIgPSBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICBjb25zdCBoZWlnaHRBdHRyID0gc3ZnRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuICAgIGlmICh3aWR0aEF0dHIgJiYgaGVpZ2h0QXR0cikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3hBdHRyID0gc3ZnRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnKVxuICAgICAgfHwgc3ZnRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3ZpZXdib3gnKTtcbiAgICBpZiAodmlld0JveEF0dHIpIHtcbiAgICAgIGNvbnN0IHZpZXdCb3ggPSB2aWV3Qm94QXR0ci5zcGxpdCgnICcpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6ICt2aWV3Qm94WzJdLFxuICAgICAgICBoZWlnaHQ6ICt2aWV3Qm94WzNdXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBFcnJvcignRmFpbGVkIHRvIGxvYWQgU1ZHIGltYWdlLiBTVkcgbXVzdCBoYXZlIHdpZHRoICsgaGVpZ2h0IG9yIHZpZXdCb3ggZGVmaW5pdGlvbi4nKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJhbnNmb3JtSW1hZ2VGcm9tQXJyYXlCdWZmZXIocmVzOiBMb2FkSW1hZ2VBcnJheUJ1ZmZlciwgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU3RhdGUsIGZvcmNlVHJhbnNmb3JtID0gZmFsc2UpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgYXV0b1JvdGF0ZSA9IGF3YWl0IHRoaXMuYXV0b1JvdGF0ZVN1cHBvcnRlZDtcbiAgICBjb25zdCBleGlmVHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtYXRpb25zRnJvbUV4aWZEYXRhKGF1dG9Sb3RhdGUgPyAtMSA6IHJlcy5vcmlnaW5hbEFycmF5QnVmZmVyKTtcbiAgICBpZiAoIXJlcy5vcmlnaW5hbEltYWdlIHx8ICFyZXMub3JpZ2luYWxJbWFnZS5jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gaW1hZ2UgbG9hZGVkJykpO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWRJbWFnZSA9IHtcbiAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgIG9iamVjdFVybDogcmVzLm9yaWdpbmFsT2JqZWN0VXJsLFxuICAgICAgICBpbWFnZTogcmVzLm9yaWdpbmFsSW1hZ2UsXG4gICAgICAgIHNpemU6IHJlcy5vcmlnaW5hbEltYWdlU2l6ZSA/PyB7XG4gICAgICAgICAgd2lkdGg6IHJlcy5vcmlnaW5hbEltYWdlLm5hdHVyYWxXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHJlcy5vcmlnaW5hbEltYWdlLm5hdHVyYWxIZWlnaHRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGV4aWZUcmFuc2Zvcm1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUxvYWRlZEltYWdlKGxvYWRlZEltYWdlLCBjcm9wcGVyU2V0dGluZ3MsIGZvcmNlVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGFzeW5jIHRyYW5zZm9ybUxvYWRlZEltYWdlKGxvYWRlZEltYWdlOiBQYXJ0aWFsPExvYWRlZEltYWdlPiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIGZvcmNlVHJhbnNmb3JtID0gZmFsc2UpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgY2FudmFzUm90YXRpb24gPSBjcm9wcGVyU3RhdGUub3B0aW9ucy5jYW52YXNSb3RhdGlvbiArIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLnJvdGF0ZTtcbiAgICBjb25zdCBvcmlnaW5hbFNpemUgPSBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuc2l6ZTtcbiAgICBpZiAoIWZvcmNlVHJhbnNmb3JtICYmIGNhbnZhc1JvdGF0aW9uID09PSAwICYmICFsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIS5mbGlwICYmICFjcm9wcGVyU3RhdGUub3B0aW9ucy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgb2JqZWN0VXJsOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEub2JqZWN0VXJsLFxuICAgICAgICAgIGltYWdlOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAgICAgc2l6ZTogey4uLm9yaWdpbmFsU2l6ZX1cbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtZWQ6IHtcbiAgICAgICAgICBvYmplY3RVcmw6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5vYmplY3RVcmwsXG4gICAgICAgICAgaW1hZ2U6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZSxcbiAgICAgICAgICBzaXplOiB7Li4ub3JpZ2luYWxTaXplfVxuICAgICAgICB9LFxuICAgICAgICBleGlmVHJhbnNmb3JtOiBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZFNpemUgPSB0aGlzLmdldFRyYW5zZm9ybWVkU2l6ZShvcmlnaW5hbFNpemUsIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLCBjcm9wcGVyU3RhdGUpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRyYW5zZm9ybWVkU2l6ZS53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdHJhbnNmb3JtZWRTaXplLmhlaWdodDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHg/LnNldFRyYW5zZm9ybShcbiAgICAgIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLmZsaXAgPyAtMSA6IDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICBjYW52YXMud2lkdGggLyAyLFxuICAgICAgY2FudmFzLmhlaWdodCAvIDJcbiAgICApO1xuICAgIGN0eD8ucm90YXRlKE1hdGguUEkgKiAoY2FudmFzUm90YXRpb24gLyAyKSk7XG4gICAgY3R4Py5kcmF3SW1hZ2UoXG4gICAgICBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAtb3JpZ2luYWxTaXplLndpZHRoIC8gMixcbiAgICAgIC1vcmlnaW5hbFNpemUuaGVpZ2h0IC8gMlxuICAgICk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPihyZXNvbHZlID0+IGNhbnZhcy50b0Jsb2IocmVzb2x2ZSwgY3JvcHBlclN0YXRlLm9wdGlvbnMuZm9ybWF0KSk7XG4gICAgaWYgKCFibG9iKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgQmxvYiBmb3IgdHJhbnNmb3JtZWQgaW1hZ2UuJyk7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgY29uc3QgdHJhbnNmb3JtZWRJbWFnZSA9IGF3YWl0IHRoaXMubG9hZEltYWdlRnJvbU9iamVjdFVybChvYmplY3RVcmwpO1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW5hbDoge1xuICAgICAgICBvYmplY3RVcmw6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5vYmplY3RVcmwsXG4gICAgICAgIGltYWdlOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAgIHNpemU6IHsuLi5vcmlnaW5hbFNpemV9XG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtZWQ6IHtcbiAgICAgICAgb2JqZWN0VXJsOiBvYmplY3RVcmwsXG4gICAgICAgIGltYWdlOiB0cmFuc2Zvcm1lZEltYWdlLFxuICAgICAgICBzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IHRyYW5zZm9ybWVkSW1hZ2Uud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB0cmFuc2Zvcm1lZEltYWdlLmhlaWdodFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXhpZlRyYW5zZm9ybTogbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSFcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSW1hZ2VGcm9tT2JqZWN0VXJsKG9iamVjdFVybDogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+KCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWFnZSk7XG4gICAgICBpbWFnZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgaW1hZ2Uuc3JjID0gb2JqZWN0VXJsO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNmb3JtZWRTaXplKFxuICAgIG9yaWdpbmFsU2l6ZTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9LFxuICAgIGV4aWZUcmFuc2Zvcm06IEV4aWZUcmFuc2Zvcm0sXG4gICAgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGVcbiAgKTogRGltZW5zaW9ucyB7XG4gICAgY29uc3QgY2FudmFzUm90YXRpb24gPSBjcm9wcGVyU3RhdGUub3B0aW9ucy5jYW52YXNSb3RhdGlvbiArIGV4aWZUcmFuc2Zvcm0ucm90YXRlO1xuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgICAgY29uc3QgbWluV2lkdGhUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUud2lkdGggKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0VG9Db250YWluID0gb3JpZ2luYWxTaXplLmhlaWdodCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1heChvcmlnaW5hbFNpemUuaGVpZ2h0LCBtaW5XaWR0aFRvQ29udGFpbiksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChvcmlnaW5hbFNpemUud2lkdGgsIG1pbkhlaWdodFRvQ29udGFpbilcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLmhlaWdodCAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHRUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUud2lkdGggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogTWF0aC5tYXgob3JpZ2luYWxTaXplLndpZHRoLCBtaW5XaWR0aFRvQ29udGFpbiksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChvcmlnaW5hbFNpemUuaGVpZ2h0LCBtaW5IZWlnaHRUb0NvbnRhaW4pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhbnZhc1JvdGF0aW9uICUgMikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0OiBvcmlnaW5hbFNpemUud2lkdGgsXG4gICAgICAgIHdpZHRoOiBvcmlnaW5hbFNpemUuaGVpZ2h0XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IG9yaWdpbmFsU2l6ZS53aWR0aCxcbiAgICAgIGhlaWdodDogb3JpZ2luYWxTaXplLmhlaWdodFxuICAgIH07XG4gIH1cbn1cbiJdfQ==