@colijnit/homedecorator 255.1.2 → 255.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/app/core/model/homedecorator-settings-options.d.ts +1 -0
  2. package/app/core/service/homedecorator-connector-adapter.service.d.ts +1 -1
  3. package/app/core/service/utils.service.d.ts +1 -0
  4. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.scss +2 -4
  5. package/app/plugins/core3d/items/floor-plane-item.d.ts +8 -1
  6. package/app/plugins/core3d/items/metadata.d.ts +2 -0
  7. package/app/plugins/core3d/service/ar.service.d.ts +1 -0
  8. package/app/plugins/core3d/service/floor-pattern.service.d.ts +26 -0
  9. package/app/plugins/core3d/service/floor-tile-intersection.service.d.ts +25 -0
  10. package/app/plugins/core3d/service/outline.service.d.ts +1 -2
  11. package/app/plugins/core3d/service/post-processing.service.d.ts +6 -0
  12. package/app/plugins/core3d/service/scene.service.d.ts +4 -1
  13. package/app/plugins/core3d/service/ssr.service.d.ts +18 -0
  14. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +40 -3
  15. package/app/plugins/render/service/new-render.service.d.ts +1 -0
  16. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +10 -1
  17. package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +1 -0
  18. package/app/plugins/toolbar/toolbar.module.d.ts +2 -1
  19. package/app/shared/pdf-export/pdf-export.component.d.ts +20 -0
  20. package/app/shared/pdf-export/pdf-export.component.scss +19 -0
  21. package/app/shared/pdf-export/pdf-export.module.d.ts +11 -0
  22. package/assets/icons/pen-ruler.svg +1 -0
  23. package/assets/icons/xmark_regular.svg +1 -0
  24. package/bundles/colijnit-homedecorator.umd.js +1195 -174
  25. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  26. package/colijnit-homedecorator-255.1.2.tgz +0 -0
  27. package/esm2015/app/app.version.js +4 -4
  28. package/esm2015/app/core/model/homedecorator-settings-options.js +2 -1
  29. package/esm2015/app/core/model/light-preset.js +11 -7
  30. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +4 -6
  31. package/esm2015/app/core/service/homedecorator-connector.service.js +3 -1
  32. package/esm2015/app/core/service/utils.service.js +16 -1
  33. package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.js +2 -2
  34. package/esm2015/app/plugins/core3d/items/floor-plane-item.js +25 -2
  35. package/esm2015/app/plugins/core3d/items/metadata.js +1 -1
  36. package/esm2015/app/plugins/core3d/service/ar.service.js +14 -1
  37. package/esm2015/app/plugins/core3d/service/floor-pattern.service.js +156 -0
  38. package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +122 -0
  39. package/esm2015/app/plugins/core3d/service/floor.service.js +5 -2
  40. package/esm2015/app/plugins/core3d/service/outline.service.js +9 -8
  41. package/esm2015/app/plugins/core3d/service/post-processing.service.js +77 -22
  42. package/esm2015/app/plugins/core3d/service/scene.service.js +30 -13
  43. package/esm2015/app/plugins/core3d/service/ssr.service.js +53 -0
  44. package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.js +3 -3
  45. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +335 -79
  46. package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +3 -2
  47. package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +3 -2
  48. package/esm2015/app/plugins/render/service/new-render.service.js +37 -13
  49. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +135 -5
  50. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +34 -8
  51. package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +9 -25
  52. package/esm2015/app/plugins/toolbar/toolbar.module.js +8 -4
  53. package/esm2015/app/shared/pdf-export/pdf-export.component.js +86 -0
  54. package/esm2015/app/shared/pdf-export/pdf-export.module.js +38 -0
  55. package/fesm2015/colijnit-homedecorator.js +1156 -181
  56. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  57. package/package.json +2 -2
  58. package/assets/hdri/ground_MASK.jpg +0 -0
@@ -0,0 +1,156 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Vector3, MathUtils } from 'three';
3
+ import * as i0 from "@angular/core";
4
+ export var FloorPattern;
5
+ (function (FloorPattern) {
6
+ FloorPattern[FloorPattern["NORMAL"] = 0] = "NORMAL";
7
+ FloorPattern[FloorPattern["HERRINGBONE"] = 1] = "HERRINGBONE";
8
+ FloorPattern[FloorPattern["HON60"] = 2] = "HON60";
9
+ FloorPattern[FloorPattern["HON45"] = 3] = "HON45";
10
+ })(FloorPattern || (FloorPattern = {}));
11
+ export var FloorPatternDirection;
12
+ (function (FloorPatternDirection) {
13
+ FloorPatternDirection[FloorPatternDirection["STANDING"] = 0] = "STANDING";
14
+ FloorPatternDirection[FloorPatternDirection["LYING"] = 1] = "LYING";
15
+ })(FloorPatternDirection || (FloorPatternDirection = {}));
16
+ export class FloorPatternService {
17
+ generatePattern(floorPattern, plankSize, floorSize, direction = FloorPatternDirection.LYING) {
18
+ const floorRotation = direction === FloorPatternDirection.STANDING ? 90 : 0;
19
+ let floorWidth = floorSize.x;
20
+ let floorLength = floorSize.z;
21
+ if (direction === FloorPatternDirection.STANDING) {
22
+ floorWidth = floorSize.z;
23
+ floorLength = floorSize.x;
24
+ }
25
+ switch (floorPattern) {
26
+ case FloorPattern.NORMAL:
27
+ return this._normalPattern(plankSize, floorWidth, floorLength, floorRotation);
28
+ case FloorPattern.HERRINGBONE:
29
+ return this._herringBone(plankSize, floorWidth, floorLength, floorRotation);
30
+ case FloorPattern.HON45:
31
+ return this._hon(plankSize, floorWidth, floorLength, floorRotation, 45);
32
+ case FloorPattern.HON60:
33
+ return this._hon(plankSize, floorWidth, floorLength, floorRotation, 60);
34
+ }
35
+ }
36
+ _rotatePatternOnZAxis(items, floorRotation) {
37
+ if (floorRotation % 360 > 0) {
38
+ items.forEach(item => {
39
+ const radians = MathUtils.degToRad(floorRotation);
40
+ const x = item.position.x;
41
+ const z = item.position.z;
42
+ item.position.x = x * Math.cos(radians) - z * Math.sin(radians);
43
+ item.position.z = x * Math.sin(radians) + z * Math.cos(radians);
44
+ });
45
+ }
46
+ }
47
+ _normalPattern(plankSize, floorWidth, floorLength, floorRotation) {
48
+ const items = [];
49
+ const stepOffsetAmount = .4;
50
+ const plankWidth = plankSize.x;
51
+ const plankLength = plankSize.z;
52
+ const offsetSteps = plankWidth / stepOffsetAmount;
53
+ const rows = Math.ceil(floorLength / plankLength);
54
+ const columns = Math.ceil(floorWidth / plankWidth);
55
+ const centerOffsetX = (floorWidth / 2 * -1) + (plankWidth / 2);
56
+ const centerOffsetZ = (floorLength / 2 * -1) + (plankLength / 2);
57
+ let currentOffsetStep = 0;
58
+ for (let row = 0; row < rows; row++) {
59
+ if (currentOffsetStep > offsetSteps) {
60
+ currentOffsetStep = 0;
61
+ }
62
+ const plankPosZ = (plankLength * row);
63
+ const currentOffsetAmount = stepOffsetAmount * currentOffsetStep;
64
+ const planks = currentOffsetStep > 0 ? columns + 1 : columns;
65
+ for (let col = 0; col < planks; col++) {
66
+ const plankPosX = (plankWidth * col) - currentOffsetAmount;
67
+ items.push({
68
+ position: new Vector3(plankPosX + centerOffsetX, 0, plankPosZ + centerOffsetZ),
69
+ rotation: new Vector3(0, MathUtils.degToRad(floorRotation), 0),
70
+ isLeft: true
71
+ });
72
+ }
73
+ currentOffsetStep++;
74
+ }
75
+ this._rotatePatternOnZAxis(items, floorRotation);
76
+ return items;
77
+ }
78
+ _herringBone(plankSize, floorWidth, floorLength, floorRotation) {
79
+ const items = [];
80
+ const herringBoneAngle = 45;
81
+ const sqrt2 = Math.sqrt(2);
82
+ const plankWidth = plankSize.x;
83
+ const plankLength = plankSize.z;
84
+ const offsetPlankPosX = plankWidth * sqrt2;
85
+ const offsetPlankPosZ = plankLength * sqrt2;
86
+ const columns = Math.ceil(floorWidth / (plankWidth * sqrt2));
87
+ const rows = Math.ceil(floorLength / (plankLength * sqrt2) +
88
+ // add extra rows so that there isn't a gap
89
+ offsetPlankPosX * 2);
90
+ const centerOffsetX = floorWidth / 2 * -1 + offsetPlankPosX / 4 - offsetPlankPosZ / 4;
91
+ const centerOffsetZ = floorLength / 2 * -1 - offsetPlankPosX / 4;
92
+ for (let column = 0; column < columns; column++) {
93
+ const plankPosX = offsetPlankPosX * column;
94
+ for (let row = 0; row < rows; row++) {
95
+ const plankPosZ = offsetPlankPosZ * row;
96
+ const plankLeft = {
97
+ position: new Vector3(plankPosX + centerOffsetX, 0, plankPosZ + centerOffsetZ),
98
+ rotation: new Vector3(0, MathUtils.degToRad(floorRotation + herringBoneAngle), 0),
99
+ isLeft: true
100
+ };
101
+ const plankRight = {
102
+ position: new Vector3(plankPosX + offsetPlankPosX / 2 + centerOffsetX, 0, plankPosZ + offsetPlankPosZ / 2 + centerOffsetZ),
103
+ rotation: new Vector3(0, MathUtils.degToRad(floorRotation - herringBoneAngle), 0),
104
+ isLeft: false
105
+ };
106
+ items.push(plankLeft, plankRight);
107
+ }
108
+ }
109
+ this._rotatePatternOnZAxis(items, floorRotation);
110
+ return items;
111
+ }
112
+ _hon(plankSize, floorWidth, floorLength, floorRotation, patternAngle) {
113
+ const items = [];
114
+ const patternAngleRad = MathUtils.degToRad(patternAngle);
115
+ const plankWidth = plankSize.x;
116
+ const plankLength = plankSize.z;
117
+ const sin = Math.sin(patternAngleRad);
118
+ const cos = Math.cos(patternAngleRad);
119
+ const overlapValue = plankLength * cos;
120
+ const rowExtendValue = plankWidth * cos;
121
+ const offsetZ = plankLength * cos * 2;
122
+ const offsetX = plankWidth * sin;
123
+ const centerOffsetX = (floorWidth - offsetX) / 2 + overlapValue;
124
+ const centerOffsetZ = (floorLength + rowExtendValue) / 2;
125
+ const columns = Math.ceil(floorWidth / ((offsetX - overlapValue) * 2));
126
+ const rows = Math.ceil((floorLength + rowExtendValue) / offsetZ);
127
+ for (let column = 0; column < columns; column++) {
128
+ const plankPosX = column * (offsetX - overlapValue) * 2;
129
+ for (let row = 0; row < rows; row++) {
130
+ const plankPosZ = row * offsetZ;
131
+ const plankLeft = {
132
+ position: new Vector3(plankPosX - centerOffsetX, 0, plankPosZ - centerOffsetZ),
133
+ rotation: new Vector3(0, MathUtils.degToRad((90 - patternAngle) + floorRotation), 0),
134
+ isLeft: true
135
+ };
136
+ const plankRight = {
137
+ position: new Vector3(plankPosX + offsetX - overlapValue - centerOffsetX, 0, plankPosZ - centerOffsetZ),
138
+ rotation: new Vector3(0, MathUtils.degToRad((90 + patternAngle) + floorRotation), 0),
139
+ isLeft: false
140
+ };
141
+ items.push(plankLeft, plankRight);
142
+ }
143
+ }
144
+ this._rotatePatternOnZAxis(items, floorRotation);
145
+ return items;
146
+ }
147
+ }
148
+ FloorPatternService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorPatternService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
149
+ FloorPatternService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorPatternService, providedIn: 'root' });
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorPatternService, decorators: [{
151
+ type: Injectable,
152
+ args: [{
153
+ providedIn: 'root'
154
+ }]
155
+ }] });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3ItcGF0dGVybi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9jb3JlM2Qvc2VydmljZS9mbG9vci1wYXR0ZXJuLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLE9BQU8sQ0FBQzs7QUFFbEQsTUFBTSxDQUFOLElBQVksWUFLWDtBQUxELFdBQVksWUFBWTtJQUN0QixtREFBTSxDQUFBO0lBQ04sNkRBQVcsQ0FBQTtJQUNYLGlEQUFLLENBQUE7SUFDTCxpREFBSyxDQUFBO0FBQ1AsQ0FBQyxFQUxXLFlBQVksS0FBWixZQUFZLFFBS3ZCO0FBRUQsTUFBTSxDQUFOLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQix5RUFBUSxDQUFBO0lBQ1IsbUVBQUssQ0FBQTtBQUNQLENBQUMsRUFIVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBR2hDO0FBV0QsTUFBTSxPQUFPLG1CQUFtQjtJQUV2QixlQUFlLENBQ3BCLFlBQTBCLEVBQzFCLFNBQWtCLEVBQ2xCLFNBQWtCLEVBQ2xCLFlBQW1DLHFCQUFxQixDQUFDLEtBQUs7UUFFOUQsTUFBTSxhQUFhLEdBQUcsU0FBUyxLQUFLLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTlCLElBQUksU0FBUyxLQUFLLHFCQUFxQixDQUFDLFFBQVEsRUFBRTtZQUNoRCxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN6QixXQUFXLEdB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RUFBRSxDQUFDLENBQUM7b0JBQ3BGLE1BQU0sRUFBRSxJQUFJO2lCQUNiLENBQUM7Z0JBRUYsTUFBTSxVQUFVLEdBQTBCO29CQUN4QyxRQUFRLEVBQUUsSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sR0FBRyxZQUFZLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxTQUFTLEdBQUcsYUFBYSxDQUFDO29CQUN2RyxRQUFRLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNyRixNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDO2dCQUVGLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ25DO1NBQ0Y7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7aUhBbExVLG1CQUFtQjtxSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07NEZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7VmVjdG9yMywgTWF0aFV0aWxzLCBWZWN0b3IyfSBmcm9tICd0aHJlZSc7XHJcblxyXG5leHBvcnQgZW51bSBGbG9vclBhdHRlcm4ge1xyXG4gIE5PUk1BTCxcclxuICBIRVJSSU5HQk9ORSxcclxuICBIT042MCxcclxuICBIT040NVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBGbG9vclBhdHRlcm5EaXJlY3Rpb24ge1xyXG4gIFNUQU5ESU5HLFxyXG4gIExZSU5HXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmxvb3JQYXR0ZXJuVHJhbnNmb3JtIHtcclxuICBwb3NpdGlvbjogVmVjdG9yMztcclxuICByb3RhdGlvbjogVmVjdG9yMztcclxuICBpc0xlZnQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZsb29yUGF0dGVyblNlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVQYXR0ZXJuKFxyXG4gICAgZmxvb3JQYXR0ZXJuOiBGbG9vclBhdHRlcm4sXHJcbiAgICBwbGFua1NpemU6IFZlY3RvcjMsXHJcbiAgICBmbG9vclNpemU6IFZlY3RvcjMsXHJcbiAgICBkaXJlY3Rpb246IEZsb29yUGF0dGVybkRpcmVjdGlvbiA9IEZsb29yUGF0dGVybkRpcmVjdGlvbi5MWUlOR1xyXG4gICk6IEZsb29yUGF0dGVyblRyYW5zZm9ybVtdIHtcclxuICAgIGNvbnN0IGZsb29yUm90YXRpb24gPSBkaXJlY3Rpb24gPT09IEZsb29yUGF0dGVybkRpcmVjdGlvbi5TVEFORElORyA/IDkwIDogMDtcclxuICAgIGxldCBmbG9vcldpZHRoID0gZmxvb3JTaXplLng7XHJcbiAgICBsZXQgZmxvb3JMZW5ndGggPSBmbG9vclNpemUuejtcclxuXHJcbiAgICBpZiAoZGlyZWN0aW9uID09PSBGbG9vclBhdHRlcm5EaXJlY3Rpb24uU1RBTkRJTkcpIHtcclxuICAgICAgZmxvb3JXaWR0aCA9IGZsb29yU2l6ZS56O1xyXG4gICAgICBmbG9vckxlbmd0aCA9IGZsb29yU2l6ZS54O1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAoZmxvb3JQYXR0ZXJuKSB7XHJcbiAgICAgIGNhc2UgRmxvb3JQYXR0ZXJuLk5PUk1BTDpcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm9ybWFsUGF0dGVybihwbGFua1NpemUsIGZsb29yV2lkdGgsIGZsb29yTGVuZ3RoLCBmbG9vclJvdGF0aW9uKTtcclxuICAgICAgY2FzZSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlcnJpbmdCb25lKHBsYW5rU2l6ZSwgZmxvb3JXaWR0aCwgZmxvb3JMZW5ndGgsIGZsb29yUm90YXRpb24pO1xyXG4gICAgICBjYXNlIEZsb29yUGF0dGVybi5IT040NTpcclxuICAgICAgICByZXR1cm4gdGhpcy5faG9uKHBsYW5rU2l6ZSwgZmxvb3JXaWR0aCwgZmxvb3JMZW5ndGgsIGZsb29yUm90YXRpb24sIDQ1KTtcclxuICAgICAgY2FzZSBGbG9vclBhdHRlcm4uSE9ONjA6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvbihwbGFua1NpemUsIGZsb29yV2lkdGgsIGZsb29yTGVuZ3RoLCBmbG9vclJvdGF0aW9uLCA2MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yb3RhdGVQYXR0ZXJuT25aQXhpcyhpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10sIGZsb29yUm90YXRpb246IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmIChmbG9vclJvdGF0aW9uICUgMzYwID4gMCkge1xyXG4gICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IHJhZGlhbnMgPSBNYXRoVXRpbHMuZGVnVG9SYWQoZmxvb3JSb3RhdGlvbik7XHJcbiAgICAgICAgY29uc3QgeCA9IGl0ZW0ucG9zaXRpb24ueDtcclxuICAgICAgICBjb25zdCB6ID0gaXRlbS5wb3NpdGlvbi56O1xyXG4gICAgICAgIGl0ZW0ucG9zaXRpb24ueCA9IHggKiBNYXRoLmNvcyhyYWRpYW5zKSAtIHogKiBNYXRoLnNpbihyYWRpYW5zKTtcclxuICAgICAgICBpdGVtLnBvc2l0aW9uLnogPSB4ICogTWF0aC5zaW4ocmFkaWFucykgKyB6ICogTWF0aC5jb3MocmFkaWFucyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbm9ybWFsUGF0dGVybihcclxuICAgIHBsYW5rU2l6ZTogVmVjdG9yMyxcclxuICAgIGZsb29yV2lkdGg6IG51bWJlcixcclxuICAgIGZsb29yTGVuZ3RoOiBudW1iZXIsXHJcbiAgICBmbG9vclJvdGF0aW9uOiBudW1iZXJcclxuICApOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSB7XHJcbiAgICBjb25zdCBpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10gPSBbXTtcclxuICAgIGNvbnN0IHN0ZXBPZmZzZXRBbW91bnQgPSAuNDtcclxuICAgIGNvbnN0IHBsYW5rV2lkdGggPSBwbGFua1NpemUueDtcclxuICAgIGNvbnN0IHBsYW5rTGVuZ3RoID0gcGxhbmtTaXplLno7XHJcbiAgICBjb25zdCBvZmZzZXRTdGVwcyA9IHBsYW5rV2lkdGggLyBzdGVwT2Zmc2V0QW1vdW50O1xyXG4gICAgY29uc3Qgcm93cyA9IE1hdGguY2VpbChmbG9vckxlbmd0aCAvIHBsYW5rTGVuZ3RoKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwoZmxvb3JXaWR0aCAvIHBsYW5rV2lkdGgpO1xyXG5cclxuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSAoZmxvb3JXaWR0aCAvIDIgKiAtMSkgKyAocGxhbmtXaWR0aCAvIDIpO1xyXG4gICAgY29uc3QgY2VudGVyT2Zmc2V0WiA9IChmbG9vckxlbmd0aCAvIDIgKiAtMSkgKyAocGxhbmtMZW5ndGggLyAyKTtcclxuXHJcbiAgICBsZXQgIGN1cnJlbnRPZmZzZXRTdGVwID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xyXG4gICAgICBpZiAoY3VycmVudE9mZnNldFN0ZXAgPiBvZmZzZXRTdGVwcykge1xyXG4gICAgICAgIGN1cnJlbnRPZmZzZXRTdGVwID0gMDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwbGFua1Bvc1ogPSAocGxhbmtMZW5ndGggKiByb3cpO1xyXG4gICAgICBjb25zdCBjdXJyZW50T2Zmc2V0QW1vdW50ID0gc3RlcE9mZnNldEFtb3VudCAqIGN1cnJlbnRPZmZzZXRTdGVwO1xyXG5cclxuICAgICAgY29uc3QgcGxhbmtzID0gY3VycmVudE9mZnNldFN0ZXAgPiAwID8gY29sdW1ucyArIDEgOiBjb2x1bW5zO1xyXG5cclxuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgcGxhbmtzOyBjb2wrKykge1xyXG4gICAgICAgIGNvbnN0IHBsYW5rUG9zWCA9IChwbGFua1dpZHRoICogY29sKSAtIGN1cnJlbnRPZmZzZXRBbW91bnQ7XHJcbiAgICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICBwb3NpdGlvbjogbmV3IFZlY3RvcjMocGxhbmtQb3NYICsgY2VudGVyT2Zmc2V0WCwgMCwgcGxhbmtQb3NaICsgY2VudGVyT2Zmc2V0WiksXHJcbiAgICAgICAgICByb3RhdGlvbjogbmV3IFZlY3RvcjMoMCwgTWF0aFV0aWxzLmRlZ1RvUmFkKGZsb29yUm90YXRpb24pLCAwKSxcclxuICAgICAgICAgIGlzTGVmdDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnRPZmZzZXRTdGVwKys7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yb3RhdGVQYXR0ZXJuT25aQXhpcyhpdGVtcywgZmxvb3JSb3RhdGlvbik7XHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oZXJyaW5nQm9uZShcclxuICAgIHBsYW5rU2l6ZTogVmVjdG9yMyxcclxuICAgIGZsb29yV2lkdGg6IG51bWJlcixcclxuICAgIGZsb29yTGVuZ3RoOiBudW1iZXIsXHJcbiAgICBmbG9vclJvdGF0aW9uOiBudW1iZXJcclxuICApOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSB7XHJcbiAgICBjb25zdCBpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10gPSBbXTtcclxuICAgIGNvbnN0IGhlcnJpbmdCb25lQW5nbGUgPSA0NTtcclxuICAgIGNvbnN0IHNxcnQyID0gTWF0aC5zcXJ0KDIpO1xyXG4gICAgY29uc3QgcGxhbmtXaWR0aCA9IHBsYW5rU2l6ZS54O1xyXG4gICAgY29uc3QgcGxhbmtMZW5ndGggPSBwbGFua1NpemUuejtcclxuICAgIGNvbnN0IG9mZnNldFBsYW5rUG9zWCA9IHBsYW5rV2lkdGggKiBzcXJ0MjtcclxuICAgIGNvbnN0IG9mZnNldFBsYW5rUG9zWiA9IHBsYW5rTGVuZ3RoICogc3FydDI7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gTWF0aC5jZWlsKGZsb29yV2lkdGggLyAocGxhbmtXaWR0aCAqIHNxcnQyKSk7XHJcbiAgICBjb25zdCByb3dzID0gTWF0aC5jZWlsKFxyXG4gICAgICBmbG9vckxlbmd0aCAvIChwbGFua0xlbmd0aCAqIHNxcnQyKSArXHJcbiAgICAgIC8vIGFkZCBleHRyYSByb3dzIHNvIHRoYXQgdGhlcmUgaXNuJ3QgYSBnYXBcclxuICAgICAgb2Zmc2V0UGxhbmtQb3NYICogMlxyXG4gICAgKTtcclxuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSBmbG9vcldpZHRoIC8gMiAqIC0xICsgb2Zmc2V0UGxhbmtQb3NYIC8gNCAtIG9mZnNldFBsYW5rUG9zWiAvIDQ7XHJcbiAgICBjb25zdCBjZW50ZXJPZmZzZXRaID0gZmxvb3JMZW5ndGggLyAyICogLTEgLSBvZmZzZXRQbGFua1Bvc1ggLyA0O1xyXG5cclxuICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IGNvbHVtbnM7IGNvbHVtbisrKSB7XHJcbiAgICAgIGNvbnN0IHBsYW5rUG9zWCA9IG9mZnNldFBsYW5rUG9zWCAqIGNvbHVtbjtcclxuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcclxuICAgICAgICBjb25zdCBwbGFua1Bvc1ogPSBvZmZzZXRQbGFua1Bvc1ogKiByb3c7XHJcblxyXG4gICAgICAgIGNvbnN0IHBsYW5rTGVmdDogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtID0ge1xyXG4gICAgICAgICAgcG9zaXRpb246IG5ldyBWZWN0b3IzKHBsYW5rUG9zWCArIGNlbnRlck9mZnNldFgsIDAsIHBsYW5rUG9zWiArIGNlbnRlck9mZnNldFopLFxyXG4gICAgICAgICAgcm90YXRpb246IG5ldyBWZWN0b3IzKDAsIE1hdGhVdGlscy5kZWdUb1JhZChmbG9vclJvdGF0aW9uICsgaGVycmluZ0JvbmVBbmdsZSksIDApLFxyXG4gICAgICAgICAgaXNMZWZ0OiB0cnVlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgcGxhbmtSaWdodDogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtID0ge1xyXG4gICAgICAgICAgcG9zaXRpb246IG5ldyBWZWN0b3IzKFxyXG4gICAgICAgICAgICBwbGFua1Bvc1ggKyBvZmZzZXRQbGFua1Bvc1ggLyAyICsgY2VudGVyT2Zmc2V0WCxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgcGxhbmtQb3NaICsgb2Zmc2V0UGxhbmtQb3NaIC8gMiArIGNlbnRlck9mZnNldFpcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICByb3RhdGlvbjogbmV3IFZlY3RvcjMoMCwgTWF0aFV0aWxzLmRlZ1RvUmFkKGZsb29yUm90YXRpb24gLSBoZXJyaW5nQm9uZUFuZ2xlKSwgMCksXHJcbiAgICAgICAgICBpc0xlZnQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpdGVtcy5wdXNoKHBsYW5rTGVmdCwgcGxhbmtSaWdodCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX3JvdGF0ZVBhdHRlcm5PblpBeGlzKGl0ZW1zLCBmbG9vclJvdGF0aW9uKTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hvbiAoXHJcbiAgICBwbGFua1NpemU6IFZlY3RvcjMsXHJcbiAgICBmbG9vcldpZHRoOiBudW1iZXIsXHJcbiAgICBmbG9vckxlbmd0aDogbnVtYmVyLFxyXG4gICAgZmxvb3JSb3RhdGlvbjogbnVtYmVyLFxyXG4gICAgcGF0dGVybkFuZ2xlOiBudW1iZXJcclxuICApOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSB7XHJcbiAgICBjb25zdCBpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10gPSBbXTtcclxuICAgIGNvbnN0IHBhdHRlcm5BbmdsZVJhZDogbnVtYmVyID0gTWF0aFV0aWxzLmRlZ1RvUmFkKHBhdHRlcm5BbmdsZSk7XHJcbiAgICBjb25zdCBwbGFua1dpZHRoID0gcGxhbmtTaXplLng7XHJcbiAgICBjb25zdCBwbGFua0xlbmd0aCA9IHBsYW5rU2l6ZS56O1xyXG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4ocGF0dGVybkFuZ2xlUmFkKTtcclxuICAgIGNvbnN0IGNvcyAgPSBNYXRoLmNvcyhwYXR0ZXJuQW5nbGVSYWQpO1xyXG4gICAgY29uc3Qgb3ZlcmxhcFZhbHVlID0gcGxhbmtMZW5ndGggKiBjb3M7XHJcbiAgICBjb25zdCByb3dFeHRlbmRWYWx1ZSA9IHBsYW5rV2lkdGggKiBjb3M7XHJcbiAgICBjb25zdCBvZmZzZXRaID0gcGxhbmtMZW5ndGggKiBjb3MgKiAyO1xyXG4gICAgY29uc3Qgb2Zmc2V0WCA9IHBsYW5rV2lkdGggKiBzaW47XHJcblxyXG4gICAgY29uc3QgY2VudGVyT2Zmc2V0WCA9IChmbG9vcldpZHRoICAtIG9mZnNldFgpIC8gMiArIG92ZXJsYXBWYWx1ZTtcclxuICAgIGNvbnN0IGNlbnRlck9mZnNldFogPSAoZmxvb3JMZW5ndGggKyByb3dFeHRlbmRWYWx1ZSkgLyAyO1xyXG4gICAgY29uc3QgY29sdW1ucyA9IE1hdGguY2VpbChmbG9vcldpZHRoIC8gKChvZmZzZXRYIC0gb3ZlcmxhcFZhbHVlKSAqIDIpKTtcclxuICAgIGNvbnN0IHJvd3MgPSBNYXRoLmNlaWwoKGZsb29yTGVuZ3RoICsgcm93RXh0ZW5kVmFsdWUpIC8gb2Zmc2V0Wik7XHJcblxyXG4gICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgY29sdW1uczsgY29sdW1uKyspIHtcclxuICAgICAgY29uc3QgcGxhbmtQb3NYID0gY29sdW1uICogKG9mZnNldFggLSBvdmVybGFwVmFsdWUpICogMjtcclxuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcclxuXHJcbiAgICAgICAgY29uc3QgcGxhbmtQb3NaID0gcm93ICogb2Zmc2V0WjtcclxuICAgICAgICBjb25zdCBwbGFua0xlZnQ6IEZsb29yUGF0dGVyblRyYW5zZm9ybSA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uOiBuZXcgVmVjdG9yMyhwbGFua1Bvc1ggLSBjZW50ZXJPZmZzZXRYLCAwLCBwbGFua1Bvc1ogLSBjZW50ZXJPZmZzZXRaKSxcclxuICAgICAgICAgIHJvdGF0aW9uOiBuZXcgVmVjdG9yMygwLCBNYXRoVXRpbHMuZGVnVG9SYWQoKDkwIC0gcGF0dGVybkFuZ2xlKSArIGZsb29yUm90YXRpb24pLCAwKSxcclxuICAgICAgICAgIGlzTGVmdDogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHBsYW5rUmlnaHQ6IEZsb29yUGF0dGVyblRyYW5zZm9ybSA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uOiBuZXcgVmVjdG9yMyhwbGFua1Bvc1ggKyBvZmZzZXRYIC0gb3ZlcmxhcFZhbHVlIC0gY2VudGVyT2Zmc2V0WCwgMCwgcGxhbmtQb3NaIC0gY2VudGVyT2Zmc2V0WiksXHJcbiAgICAgICAgICByb3RhdGlvbjogbmV3IFZlY3RvcjMoMCwgTWF0aFV0aWxzLmRlZ1RvUmFkKCAoOTAgKyBwYXR0ZXJuQW5nbGUpICsgZmxvb3JSb3RhdGlvbiksIDApLFxyXG4gICAgICAgICAgaXNMZWZ0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGl0ZW1zLnB1c2gocGxhbmtMZWZ0LCBwbGFua1JpZ2h0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fcm90YXRlUGF0dGVybk9uWkF4aXMoaXRlbXMsIGZsb29yUm90YXRpb24pO1xyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,122 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { MeshBVH } from 'three-mesh-bvh';
3
+ import { BoxGeometry, Color, DoubleSide, EdgesGeometry, Matrix4, Mesh, MeshBasicMaterial, Object3D, Vector2 } from 'three';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./scene.service";
6
+ export class FloorTileIntersectionService {
7
+ constructor(_sceneService) {
8
+ this._sceneService = _sceneService;
9
+ this._debug = false;
10
+ this._edgeCollisionMargin = 0.05;
11
+ }
12
+ toggleDebug() {
13
+ this._debug = !this._debug;
14
+ }
15
+ countTiles(floorMesh, floorPattern, geometry) {
16
+ const result = {
17
+ left: 0,
18
+ right: 0,
19
+ edge: 0,
20
+ total: 0,
21
+ };
22
+ console.log(floorMesh.position);
23
+ const { floorHits, edgeHits } = this._checkIntersection2(floorMesh, floorPattern, geometry);
24
+ for (const floorHit of floorHits) {
25
+ if (floorHit.isLeft) {
26
+ result.left += 1;
27
+ }
28
+ else {
29
+ result.right += 1;
30
+ }
31
+ }
32
+ result.edge = edgeHits.length;
33
+ result.total = floorHits.length;
34
+ return result;
35
+ }
36
+ _checkIntersection2(floorMesh, floorPattern, geometry) {
37
+ // const edgeColliders = this._generateEdgeColliders(floorMesh.geometry);
38
+ const result = {
39
+ floorHits: new Array(),
40
+ edgeHits: new Array()
41
+ };
42
+ const bvh = new MeshBVH(geometry);
43
+ const positionReference = new Object3D();
44
+ for (const floorItem of floorPattern) {
45
+ const pos = floorItem.position;
46
+ positionReference.position.set(pos.x, pos.y, pos.z);
47
+ positionReference.updateMatrixWorld();
48
+ const floorWorldToBhv = new Matrix4()
49
+ .copy(positionReference.matrixWorld)
50
+ .invert()
51
+ .multiply(floorMesh.matrixWorld);
52
+ if (bvh.intersectsGeometry(floorMesh.geometry, floorWorldToBhv)) {
53
+ result.floorHits.push(floorItem);
54
+ // TODO: find solution for edge detection, this should work as it used the same logic as for the floor.
55
+ // for (const edgeCollider of edgeColliders) {
56
+ // const edgeWorldToBhv = new Matrix4()
57
+ // .copy(positionReference.matrixWorld)
58
+ // .invert()
59
+ // .multiply(edgeCollider.matrixWorld);
60
+ // if (bvh.intersectsGeometry(edgeCollider.geometry, edgeWorldToBhv)) {
61
+ // result.edgeHits.push(floorItem);
62
+ // }
63
+ // }
64
+ }
65
+ }
66
+ return result;
67
+ }
68
+ _generateEdgeColliders(floorGeom) {
69
+ const edgeLinesGeom = new EdgesGeometry(floorGeom);
70
+ const linePositions = edgeLinesGeom.getAttribute('position').array;
71
+ const edges = new Array();
72
+ for (let i = 0; i < linePositions.length; i += 6) {
73
+ // store vector a and b (1 line pair), because we work in 2D we skip the y-axis which should be zero
74
+ const vectorA = new Vector2(linePositions[i], linePositions[i + 2]);
75
+ const vectorB = new Vector2(linePositions[i + 3], linePositions[i + 5]);
76
+ // calculate center of line
77
+ const position = new Vector2().lerpVectors(vectorA, vectorB, .5);
78
+ // calculate length
79
+ const length = vectorA.distanceTo(vectorB);
80
+ // create normalised orientation
81
+ const unitVector = new Vector2().subVectors(vectorB, vectorA).normalize();
82
+ // rotation in radians
83
+ const rotation = Math.atan2(unitVector.y, unitVector.x);
84
+ // create edge line with volume
85
+ const edgeGeom = new BoxGeometry(length, 0.1, this._edgeCollisionMargin);
86
+ const edge = new Mesh(edgeGeom);
87
+ // position edge
88
+ edge.rotation.y = rotation * -1;
89
+ edge.position.z = position.y;
90
+ edge.position.x = position.x;
91
+ // update bounding box value for correct collision
92
+ edge.updateMatrixWorld();
93
+ edge.geometry.computeBoundingBox();
94
+ edge.geometry.boundingBox.applyMatrix4(edge.matrixWorld);
95
+ // adds meshes to scene
96
+ edges.push(edge);
97
+ }
98
+ if (this._debug) {
99
+ const scene = this._sceneService.scene;
100
+ for (const edge of edges) {
101
+ edge.material = this._randomColMat();
102
+ scene.add(edge);
103
+ }
104
+ }
105
+ return edges;
106
+ }
107
+ _randomColMat() {
108
+ const color = new Color(Math.random(), Math.random(), Math.random());
109
+ return new MeshBasicMaterial({ color: color, wireframe: false, side: DoubleSide });
110
+ }
111
+ ngOnDestroy() {
112
+ }
113
+ }
114
+ FloorTileIntersectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorTileIntersectionService, deps: [{ token: i1.SceneService }], target: i0.ɵɵFactoryTarget.Injectable });
115
+ FloorTileIntersectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorTileIntersectionService, providedIn: 'root' });
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FloorTileIntersectionService, decorators: [{
117
+ type: Injectable,
118
+ args: [{
119
+ providedIn: 'root'
120
+ }]
121
+ }], ctorParameters: function () { return [{ type: i1.SceneService }]; } });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3ItdGlsZS1pbnRlcnNlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2UvZmxvb3ItdGlsZS1pbnRlcnNlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBRXBELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBRUwsV0FBVyxFQUVYLEtBQUssRUFDTCxVQUFVLEVBQ1YsYUFBYSxFQUFFLE9BQU8sRUFDdEIsSUFBSSxFQUNKLGlCQUFpQixFQUFFLFFBQVEsRUFHM0IsT0FBTyxFQUVSLE1BQU0sT0FBTyxDQUFDOzs7QUFhZixNQUFNLE9BQU8sNEJBQTRCO0lBSXZDLFlBQ1UsYUFBMkI7UUFBM0Isa0JBQWEsR0FBYixhQUFhLENBQWM7UUFFbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRU0sVUFBVSxDQUNmLFNBQWUsRUFDZixZQUEwQyxFQUMxQyxRQUF3QjtRQUV4QixNQUFNLE1BQU0sR0FBcUI7WUFDL0IsSUFBSSxFQUFFLENBQUM7WUFDUCxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksRUFBRSxDQUFDO1lBQ1AsS0FBSyxFQUFFLENBQUM7U0FDVCxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsTUFBTSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtZQUNoQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2FBQ2xCO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQ25CO1NBQ0Y7UUFDRCxNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDOUIsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsU0FBZSxFQUNmLFlBQTBDLEVBQzFDLFFBQXdCO1FBRXhCLHlFQUF5RTtRQUN6RSxNQUFNLE1BQU0sR0FBRztZQUNiLFNBQVMsRUFBRSxJQUFJLEtBQUssRUFBeUI7WUFDN0MsUUFBUSxFQUFFLElBQUksS0FBSyxFQUF5QjtTQUM3QyxDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLEtBQUssTUFBTSxTQUFTLElBQUksWUFBWSxFQUFFO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDL0IsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQUU7aUJBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7aUJBQ25DLE1BQU0sRUFBRTtpQkFDUixRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25DLElBQUssR0FBRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLEVBQUU7Z0JBQ2hFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUVqQyx1R0FBdUc7Z0JBQ3ZHLDhDQUE4QztnQkFDOUMseUNBQXlDO2dCQUN6QywyQ0FBMkM7Z0JBQzNDLGdCQUFnQjtnQkFDaEIsMkNBQTJDO2dCQUMzQyx5RUFBeUU7Z0JBQ3pFLHVDQUF1QztnQkFDdkMsTUFBTTtnQkFDTixJQUFJO2FBQ0w7U0FDRjtRQUVDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxTQUF5QjtRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBUSxDQUFDO1FBRWhDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEQsb0dBQW9HO1lBQ3BHLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsMkJBQTJCO1lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakUsbUJBQW1CO1lBQ25CLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsZ0NBQWdDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRSxzQkFBc0I7WUFDdEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCwrQkFBK0I7WUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN6RSxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxnQkFBZ0I7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM3QixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekQsdUJBQXVCO1lBRXZCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEI7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUN2QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakI7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGFBQWE7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNyRSxPQUFPLElBQUksaUJBQWlCLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELFdBQVc7SUFDWCxDQUFDOzswSEFqSVUsNEJBQTRCOzhIQUE1Qiw0QkFBNEIsY0FGM0IsTUFBTTs0RkFFUCw0QkFBNEI7a0JBSHhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi9zY2VuZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNoQlZIfSBmcm9tICd0aHJlZS1tZXNoLWJ2aCc7XHJcbmltcG9ydCB7XHJcbiAgQm94MyxcclxuICBCb3hHZW9tZXRyeSxcclxuICBCdWZmZXJHZW9tZXRyeSxcclxuICBDb2xvcixcclxuICBEb3VibGVTaWRlLFxyXG4gIEVkZ2VzR2VvbWV0cnksIE1hdHJpeDQsXHJcbiAgTWVzaCxcclxuICBNZXNoQmFzaWNNYXRlcmlhbCwgT2JqZWN0M0QsIFNoYXBlLFxyXG4gIFNoYXBlR2VvbWV0cnksXHJcbiAgVHJpYW5nbGUsXHJcbiAgVmVjdG9yMixcclxuICBWZWN0b3IzXHJcbn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0Zsb29yUGF0dGVyblRyYW5zZm9ybX0gZnJvbSAnLi9mbG9vci1wYXR0ZXJuLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGbG9vckNvdW50UmVzdWx0IHtcclxuICBsZWZ0OiBudW1iZXI7XHJcbiAgcmlnaHQ6IG51bWJlcjtcclxuICBlZGdlOiBudW1iZXI7XHJcbiAgdG90YWw6IG51bWJlcjtcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfZGVidWc6IEJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfZWRnZUNvbGxpc2lvbk1hcmdpbjogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9kZWJ1ZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5fZWRnZUNvbGxpc2lvbk1hcmdpbiA9IDAuMDU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlRGVidWcoKSB7XHJcbiAgICB0aGlzLl9kZWJ1ZyA9ICF0aGlzLl9kZWJ1ZztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3VudFRpbGVzKFxyXG4gICAgZmxvb3JNZXNoOiBNZXNoLFxyXG4gICAgZmxvb3JQYXR0ZXJuOiBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+LFxyXG4gICAgZ2VvbWV0cnk6IEJ1ZmZlckdlb21ldHJ5XHJcbiAgKTogRmxvb3JDb3VudFJlc3VsdCB7XHJcbiAgICBjb25zdCByZXN1bHQ6IEZsb29yQ291bnRSZXN1bHQgPSB7XHJcbiAgICAgIGxlZnQ6IDAsXHJcbiAgICAgIHJpZ2h0OiAwLFxyXG4gICAgICBlZGdlOiAwLFxyXG4gICAgICB0b3RhbDogMCxcclxuICAgIH07XHJcbiAgICBjb25zb2xlLmxvZyhmbG9vck1lc2gucG9zaXRpb24pO1xyXG4gICBjb25zdCB7Zmxvb3JIaXRzLCBlZGdlSGl0c30gPSB0aGlzLl9jaGVja0ludGVyc2VjdGlvbjIoZmxvb3JNZXNoLCBmbG9vclBhdHRlcm4sIGdlb21ldHJ5KTtcclxuICAgIGZvciAoY29uc3QgZmxvb3JIaXQgb2YgZmxvb3JIaXRzKSB7XHJcbiAgICAgIGlmIChmbG9vckhpdC5pc0xlZnQpIHtcclxuICAgICAgICByZXN1bHQubGVmdCArPSAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5yaWdodCArPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXN1bHQuZWRnZSA9IGVkZ2VIaXRzLmxlbmd0aDtcclxuICAgIHJlc3VsdC50b3RhbCA9IGZsb29ySGl0cy5sZW5ndGg7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2hlY2tJbnRlcnNlY3Rpb24yKFxyXG4gICAgZmxvb3JNZXNoOiBNZXNoLFxyXG4gICAgZmxvb3JQYXR0ZXJuOiBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+LFxyXG4gICAgZ2VvbWV0cnk6IEJ1ZmZlckdlb21ldHJ5XHJcbiAgKSB7XHJcbiAgICAvLyBjb25zdCBlZGdlQ29sbGlkZXJzID0gdGhpcy5fZ2VuZXJhdGVFZGdlQ29sbGlkZXJzKGZsb29yTWVzaC5nZW9tZXRyeSk7XHJcbiAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgIGZsb29ySGl0czogbmV3IEFycmF5PEZsb29yUGF0dGVyblRyYW5zZm9ybT4oKSxcclxuICAgICAgZWRnZUhpdHM6IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KClcclxuICAgIH07XHJcbiAgICBjb25zdCBidmggPSBuZXcgTWVzaEJWSChnZW9tZXRyeSk7XHJcbiAgICBjb25zdCBwb3NpdGlvblJlZmVyZW5jZSA9IG5ldyBPYmplY3QzRCgpO1xyXG4gICAgZm9yIChjb25zdCBmbG9vckl0ZW0gb2YgZmxvb3JQYXR0ZXJuKSB7XHJcbiAgICAgIGNvbnN0IHBvcyA9IGZsb29ySXRlbS5wb3NpdGlvbjtcclxuICAgICAgcG9zaXRpb25SZWZlcmVuY2UucG9zaXRpb24uc2V0KHBvcy54LCBwb3MueSwgcG9zLnopO1xyXG4gICAgICBwb3NpdGlvblJlZmVyZW5jZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuICAgICAgY29uc3QgZmxvb3JXb3JsZFRvQmh2ID0gbmV3IE1hdHJpeDQoKVxyXG4gICAgICAgIC5jb3B5KHBvc2l0aW9uUmVmZXJlbmNlLm1hdHJpeFdvcmxkKVxyXG4gICAgICAgIC5pbnZlcnQoKVxyXG4gICAgICAgIC5tdWx0aXBseShmbG9vck1lc2gubWF0cml4V29ybGQpO1xyXG4gICAgICBpZiAoIGJ2aC5pbnRlcnNlY3RzR2VvbWV0cnkoZmxvb3JNZXNoLmdlb21ldHJ5LCBmbG9vcldvcmxkVG9CaHYpKSB7XHJcbiAgICAgICAgcmVzdWx0LmZsb29ySGl0cy5wdXNoKGZsb29ySXRlbSk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IGZpbmQgc29sdXRpb24gZm9yIGVkZ2UgZGV0ZWN0aW9uLCB0aGlzIHNob3VsZCB3b3JrIGFzIGl0IHVzZWQgdGhlIHNhbWUgbG9naWMgYXMgZm9yIHRoZSBmbG9vci5cclxuICAgICAgICAvLyBmb3IgKGNvbnN0IGVkZ2VDb2xsaWRlciBvZiBlZGdlQ29sbGlkZXJzKSB7XHJcbiAgICAgICAgLy8gICBjb25zdCBlZGdlV29ybGRUb0JodiA9IG5ldyBNYXRyaXg0KClcclxuICAgICAgICAvLyAgICAgLmNvcHkocG9zaXRpb25SZWZlcmVuY2UubWF0cml4V29ybGQpXHJcbiAgICAgICAgLy8gICAgIC5pbnZlcnQoKVxyXG4gICAgICAgIC8vICAgICAubXVsdGlwbHkoZWRnZUNvbGxpZGVyLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICAvLyAgIGlmIChidmguaW50ZXJzZWN0c0dlb21ldHJ5KGVkZ2VDb2xsaWRlci5nZW9tZXRyeSwgZWRnZVdvcmxkVG9CaHYpKSB7XHJcbiAgICAgICAgLy8gICAgIHJlc3VsdC5lZGdlSGl0cy5wdXNoKGZsb29ySXRlbSk7XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2VuZXJhdGVFZGdlQ29sbGlkZXJzKGZsb29yR2VvbTogQnVmZmVyR2VvbWV0cnkpOiBBcnJheTxNZXNoPiB7XHJcbiAgICBjb25zdCBlZGdlTGluZXNHZW9tID0gbmV3IEVkZ2VzR2VvbWV0cnkoZmxvb3JHZW9tKTtcclxuICAgIGNvbnN0IGxpbmVQb3NpdGlvbnMgPSBlZGdlTGluZXNHZW9tLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKS5hcnJheTtcclxuICAgIGNvbnN0IGVkZ2VzID0gbmV3IEFycmF5PE1lc2g+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lUG9zaXRpb25zLmxlbmd0aDsgaSArPSA2KSB7XHJcbiAgICAgIC8vIHN0b3JlIHZlY3RvciBhIGFuZCBiICgxIGxpbmUgcGFpciksIGJlY2F1c2Ugd2Ugd29yayBpbiAyRCB3ZSBza2lwIHRoZSB5LWF4aXMgd2hpY2ggc2hvdWxkIGJlIHplcm9cclxuICAgICAgY29uc3QgdmVjdG9yQSA9IG5ldyBWZWN0b3IyKGxpbmVQb3NpdGlvbnNbaV0sIGxpbmVQb3NpdGlvbnNbaSArIDJdKTtcclxuICAgICAgY29uc3QgdmVjdG9yQiA9IG5ldyBWZWN0b3IyKGxpbmVQb3NpdGlvbnNbaSArIDNdLCBsaW5lUG9zaXRpb25zW2kgKyA1XSk7XHJcbiAgICAgIC8vIGNhbGN1bGF0ZSBjZW50ZXIgb2YgbGluZVxyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IyKCkubGVycFZlY3RvcnModmVjdG9yQSwgdmVjdG9yQiwgLjUpO1xyXG4gICAgICAvLyBjYWxjdWxhdGUgbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHZlY3RvckEuZGlzdGFuY2VUbyh2ZWN0b3JCKTtcclxuICAgICAgLy8gY3JlYXRlIG5vcm1hbGlzZWQgb3JpZW50YXRpb25cclxuICAgICAgY29uc3QgdW5pdFZlY3RvciA9IG5ldyBWZWN0b3IyKCkuc3ViVmVjdG9ycyh2ZWN0b3JCLCB2ZWN0b3JBKS5ub3JtYWxpemUoKTtcclxuICAgICAgLy8gcm90YXRpb24gaW4gcmFkaWFuc1xyXG4gICAgICBjb25zdCByb3RhdGlvbiA9IE1hdGguYXRhbjIodW5pdFZlY3Rvci55LCB1bml0VmVjdG9yLngpO1xyXG4gICAgICAvLyBjcmVhdGUgZWRnZSBsaW5lIHdpdGggdm9sdW1lXHJcbiAgICAgIGNvbnN0IGVkZ2VHZW9tID0gbmV3IEJveEdlb21ldHJ5KGxlbmd0aCwgMC4xLCB0aGlzLl9lZGdlQ29sbGlzaW9uTWFyZ2luKTtcclxuICAgICAgY29uc3QgZWRnZSA9IG5ldyBNZXNoKGVkZ2VHZW9tKTtcclxuICAgICAgLy8gcG9zaXRpb24gZWRnZVxyXG4gICAgICBlZGdlLnJvdGF0aW9uLnkgPSByb3RhdGlvbiAqIC0xO1xyXG4gICAgICBlZGdlLnBvc2l0aW9uLnogPSBwb3NpdGlvbi55O1xyXG4gICAgICBlZGdlLnBvc2l0aW9uLnggPSBwb3NpdGlvbi54O1xyXG4gICAgICAvLyB1cGRhdGUgYm91bmRpbmcgYm94IHZhbHVlIGZvciBjb3JyZWN0IGNvbGxpc2lvblxyXG4gICAgICBlZGdlLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcbiAgICAgIGVkZ2UuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICAgIGVkZ2UuZ2VvbWV0cnkuYm91bmRpbmdCb3guYXBwbHlNYXRyaXg0KGVkZ2UubWF0cml4V29ybGQpO1xyXG4gICAgICAvLyBhZGRzIG1lc2hlcyB0byBzY2VuZVxyXG5cclxuICAgICAgZWRnZXMucHVzaChlZGdlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9kZWJ1Zykge1xyXG4gICAgICBjb25zdCBzY2VuZSA9IHRoaXMuX3NjZW5lU2VydmljZS5zY2VuZTtcclxuICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XHJcbiAgICAgICAgZWRnZS5tYXRlcmlhbCA9IHRoaXMuX3JhbmRvbUNvbE1hdCgpO1xyXG4gICAgICAgIHNjZW5lLmFkZChlZGdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlZGdlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JhbmRvbUNvbE1hdCgpIHtcclxuICAgIGNvbnN0IGNvbG9yID0gbmV3IENvbG9yKE1hdGgucmFuZG9tKCksIE1hdGgucmFuZG9tKCksIE1hdGgucmFuZG9tKCkpO1xyXG4gICAgcmV0dXJuIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiBjb2xvciwgd2lyZWZyYW1lOiBmYWxzZSAsIHNpZGU6IERvdWJsZVNpZGUgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICB9XHJcbn1cclxuIl19
@@ -137,11 +137,14 @@ export class FloorService {
137
137
  else {
138
138
  geometry = new ShapeGeometry(shape).center();
139
139
  }
140
+ this._sceneService.needsRender = true;
141
+ // floorMaterial.metalness = 0;
142
+ geometry.rotateX(Math.PI / 2);
140
143
  const floorMaterial = yield this._createFloorMaterial(color, texture);
141
144
  const floorMesh = new ThreeMesh(geometry, floorMaterial);
142
145
  const floorPlane = new FloorPlaneItem({ itemType: ItemType.FloorDecoration }, floorMesh);
143
146
  floorPlane.name = 'floor-plane';
144
- floorPlane.rotation.set(Math.PI / 2, 0, 0);
147
+ // floorPlane.rotation.set(Math.PI / 2, 0, 0);
145
148
  floorPlane.receiveShadow = true;
146
149
  floorPlane.castShadow = false;
147
150
  const floorCenter = corners ? this._getFloorCenter(corners) : new Vector3(0, 0, 0);
@@ -226,4 +229,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
226
229
  providedIn: 'root'
227
230
  }]
228
231
  }], ctorParameters: function () { return [{ type: i1.SceneService }, { type: i2.OutlineService }, { type: i3.ItemService }, { type: i4.HomedecoratorSettingsService }]; } });
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2UvZmxvb3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFDTCxjQUFjLEVBQ2QsS0FBSyxFQUNMLFVBQVUsRUFFVixJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osYUFBYSxFQUNiLEtBQUssRUFDTCxhQUFhLEVBQ2IsT0FBTyxFQUNQLE9BQU8sRUFDUixNQUFNLE9BQU8sQ0FBQztBQUdmLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHcEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFHckUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7O0FBTzVDLE1BQU0sT0FBTyxZQUFZO0lBb0J2QixZQUNZLGFBQTJCLEVBQzNCLGVBQStCLEVBQy9CLFlBQXlCLEVBQzNCLGdCQUE4QztRQUg1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDM0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE4QjtRQW5CaEQsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFDL0IsVUFBSyxHQUFtQixFQUFFLENBQUM7UUFvQmpDLElBQUksQ0FBQyxLQUFL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LENBQUM7Z0JBQzdFLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDbEIsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1lBQ0QsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDakMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBRU8sZUFBZSxDQUFDLE9BQWlCO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDOzswR0FqT1UsWUFBWTs4R0FBWixZQUFZLGNBRlgsTUFBTTs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBCdWZmZXJHZW9tZXRyeSxcclxuICBDb2xvcixcclxuICBEb3VibGVTaWRlLFxyXG4gIE1hdGVyaWFsLFxyXG4gIE1lc2gsXHJcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXHJcbiAgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXHJcbiAgUGF0aCxcclxuICBQbGFuZUdlb21ldHJ5LFxyXG4gIFNoYXBlLFxyXG4gIFNoYXBlR2VvbWV0cnksXHJcbiAgVmVjdG9yMixcclxuICBWZWN0b3IzXHJcbn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7U2NlbmVTZXJ2aWNlfSBmcm9tICcuL3NjZW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcclxuaW1wb3J0IHtDb3JuZXIsIFJvb219IGZyb20gJy4uL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7VGV4dHVyZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC90ZXh0dXJlJztcclxuaW1wb3J0IHtNYXRlcmlhbFV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL21hdGVyaWFsLnV0aWxzJztcclxuaW1wb3J0IHtUaHJlZU1lc2h9IGZyb20gJy4uL2l0ZW1zL3RocmVlLW1lc2gnO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtPdXRsaW5lU2VydmljZX0gZnJvbSAnLi9vdXRsaW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7Rmxvb3JQbGFuZUl0ZW19IGZyb20gJy4uL2l0ZW1zL2Zsb29yLXBsYW5lLWl0ZW0nO1xyXG5pbXBvcnQge0l0ZW1UeXBlfSBmcm9tICcuLi9pdGVtcy9pdGVtLXR5cGUnO1xyXG5pbXBvcnQge1JlZmxlY3Rvcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL29iamVjdHMvUmVmbGVjdG9yJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZsb29yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgX2dyb3VuZFBsYW5lOiBNZXNoO1xyXG4gIHByaXZhdGUgX2Zsb29yUGxhbmU6IEZsb29yUGxhbmVJdGVtO1xyXG5cclxuICBwcml2YXRlIF9mbG9vcnM6IEZsb29yUGxhbmVJdGVtW10gPSBbXTtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9taXJyb3JQbGFuZTogUmVmbGVjdG9yO1xyXG5cclxuICBwdWJsaWMgZ2V0IGdyb3VuZFBsYW5lKCk6IE1lc2gge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dyb3VuZFBsYW5lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBncm91bmRQbGFuZShtZXNoOiBNZXNoKSB7XHJcbiAgICB0aGlzLl9ncm91bmRQbGFuZSA9IG1lc2g7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmxvb3JUb0NvbmZpZ3VyZTogRmxvb3JQbGFuZUl0ZW07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgICBwcml2YXRlIF9zY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcclxuICAgICAgcHJpdmF0ZSBfb3V0bGluZVNlcnZpY2U6IE91dGxpbmVTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lSW5pdGlhbGl6ZWQuc3Vic2NyaWJlKChpbml0aWFsaXplZDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChpbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgdGhpcy5fY3JlYXRlR3JvdW5kUGxhbmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gKCkgPT4gdGhpcy5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgVXRpbHMuRGlzcG9zZU9iamVjdCh0aGlzLl9ncm91bmRQbGFuZSk7XHJcbiAgICB0aGlzLl9mbG9vcnMuZm9yRWFjaChmID0+IFV0aWxzLkRpc3Bvc2VPYmplY3QoZikpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZsb29yUGxhbmUoKTogRmxvb3JQbGFuZUl0ZW0ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zsb29yUGxhbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Rmxvb3JUZXh0dXJlKHJvb206IFJvb20sIHRleHR1cmU6IFRleHR1cmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmbG9vclBsYW5lOiBGbG9vclBsYW5lSXRlbTtcclxuICAgIGlmIChyb29tKSB7XHJcbiAgICAgIGZsb29yUGxhbmUgPSByb29tLmZsb29yUGxhbmU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmbG9vclBsYW5lID0gdGhpcy5fZmxvb3JzWzBdO1xyXG4gICAgfVxyXG4gICAgZmxvb3JQbGFuZS5yZXNldEdlb21ldHJ5KCk7XHJcbiAgICBpZiAodGV4dHVyZSAmJiB0ZXh0dXJlLnNpbXBsZVBsYW5lKSB7XHJcbiAgICAgIGZsb29yUGxhbmUudXBkYXRlR2VvbWV0cnkobmV3IFBsYW5lR2VvbWV0cnkoNiwgNikpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmxvb3JNYXRlcmlhbCA9IGF3YWl0IHRoaXMuX2NyZWF0ZUZsb29yTWF0ZXJpYWwobnVsbCwgdGV4dHVyZSk7XHJcbiAgICBpZiAocm9vbSkge1xyXG4gICAgICB0aGlzLl91cGRhdGVGbG9vck1hdGVyaWFsKHJvb20uZmxvb3JQbGFuZSwgZmxvb3JNYXRlcmlhbCwgdGV4dHVyZSk7XHJcbiAgICAgIHJvb20uZmxvb3JUZXh0dXJlID0gdGV4dHVyZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZUZsb29yTWF0ZXJpYWwodGhpcy5fZmxvb3JzWzBdLCBmbG9vck1hdGVyaWFsLCB0ZXh0dXJlKTtcclxuICAgIH1cclxuICAgIC8vIHJvb20uZmxvb3JDb2xvciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Rmxvb3JDb2xvcihyb29tOiBSb29tLCBjb2xvcjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjb25zdCBmbG9vclBsYW5lID0gdGhpcy5nZW5lcmF0ZUZsb29yUGxhbmUoY29sb3IsIG51bGwsIHJvb20uY29ybmVycyk7XHJcbiAgICAvLyBmbG9vclBsYW5lLnVzZXJEYXRhID0ge3Jvb206IHJvb219O1xyXG4gICAgLy8gdGhpcy5yZW1vdmVGbG9vcihyb29tLmZsb29yUGxhbmUsIGZhbHNlKTtcclxuICAgIC8vIHJvb20uZmxvb3JQbGFuZSA9IGZsb29yUGxhbmU7XHJcbiAgICBjb25zdCBmbG9vck1hdGVyaWFsID0gYXdhaXQgdGhpcy5fY3JlYXRlRmxvb3JNYXRlcmlhbChjb2xvciwgbnVsbCk7XHJcbiAgICB0aGlzLl91cGRhdGVGbG9vck1hdGVyaWFsKHJvb20uZmxvb3JQbGFuZSwgZmxvb3JNYXRlcmlhbCk7XHJcbiAgICByb29tLmZsb29yVGV4dHVyZSA9IG51bGw7XHJcbiAgICByb29tLmZsb29yQ29sb3IgPSBjb2xvcjtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UudXBkYXRlUGF0aFRyYWNlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZ2hMaWdodEZsb29yKGZsb29yT2JqZWN0OiBGbG9vclBsYW5lSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKGZsb29yT2JqZWN0ICYmIGZsb29yT2JqZWN0LnV1aWQpIHtcclxuICAgICAgY29uc3QgY3VycmVudEZsb29yOiBGbG9vclBsYW5lSXRlbSA9IHRoaXMuX2Zsb29ycy5maW5kKGYgPT4gZi51dWlkID09PSBmbG9vck9iamVjdC51dWlkKTtcclxuICAgICAgaWYgKGN1cnJlbnRGbG9vcikge1xyXG4gICAgICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLnNob3dPdXRsaW5lKGN1cnJlbnRGbG9vcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bkhpZ2hMaWdodEZsb29ycygpOiB2b2lkIHtcclxuICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLmhpZGVPdXRsaW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uZmlndXJlRmxvb3IoZmxvb3JPYmplY3Q6IEZsb29yUGxhbmVJdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLmZsb29yVG9Db25maWd1cmUgPSBmbG9vck9iamVjdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVGbG9vcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbG9vcnMuZm9yRWFjaChmbG9vciA9PiB7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5yZW1vdmVPYmplY3QoZmxvb3IpO1xyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKGZsb29yKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fZmxvb3JzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbG9vclBsYW5lKFxyXG4gICAgY29sb3I6IENvbG9yIHwgc3RyaW5nIHwgbnVtYmVyLCB0ZXh0dXJlPzogVGV4dHVyZSwgY29ybmVycz86IENvcm5lcltdLCBuZXN0ZWRSb29tcz86IGFueSwgZmxvb3JHZW9tZXRyeT86IEJ1ZmZlckdlb21ldHJ5KTogUHJvbWlzZTxGbG9vclBsYW5lSXRlbT4ge1xyXG4gICAgbGV0IGdlb21ldHJ5LCBzaGFwZTtcclxuICAgIGlmIChjb3JuZXJzKSB7XHJcbiAgICAgIGNvbnN0IHBvaW50cyA9IGNvcm5lcnMubWFwKGNvcm5lciA9PlxyXG4gICAgICAgIG5ldyBWZWN0b3IyKGNvcm5lci54LCBjb3JuZXIueSkpO1xyXG4gICAgICBzaGFwZSA9IG5ldyBTaGFwZShwb2ludHMpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIGhvbGVzIGZvciBuZXN0ZWQgcm9vbXNcclxuICAgICAgaWYgKG5lc3RlZFJvb21zKSB7XHJcbiAgICAgICAgbmVzdGVkUm9vbXNcclxuICAgICAgICAgIC5tYXAoKG5lc3RlZFJvb20pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5lc3RlZFJvb20uaW50ZXJpb3JDb3JuZXJzLm1hcChjb3JuZXIgPT5cclxuICAgICAgICAgICAgICBuZXcgVmVjdG9yMihjb3JuZXIueCwgY29ybmVyLnkpKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZmlsdGVyKG5lc3RlZFJvb20gPT4gVXRpbHMucG9seWdvbkluc2lkZVBvbHlnb24obmVzdGVkUm9vbSwgcG9pbnRzKSlcclxuICAgICAgICAgIC5maWx0ZXIoKG5lc3RlZFJvb20sIGluZGV4LCBhcnJheSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgICAuc2xpY2UoaW5kZXggKyAxKVxyXG4gICAgICAgICAgICAgIC5ldmVyeShsYXJnZXJOZXN0ZWRSb29tID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhVXRpbHMucG9seWdvbkluc2lkZVBvbHlnb24obmVzdGVkUm9vbSwgbGFyZ2VyTmVzdGVkUm9vbSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmZvckVhY2goaG9sZVBvaW50ID0+IHNoYXBlLmhvbGVzLnB1c2gobmV3IFBhdGgoaG9sZVBvaW50KSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZmxvb3JHZW9tZXRyeSkge1xyXG4gICAgICBnZW9tZXRyeSA9IGZsb29yR2VvbWV0cnk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnZW9tZXRyeSA9IG5ldyBTaGFwZUdlb21ldHJ5KHNoYXBlKS5jZW50ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmbG9vck1hdGVyaWFsID0gYXdhaXQgdGhpcy5fY3JlYXRlRmxvb3JNYXRlcmlhbChjb2xvciwgdGV4dHVyZSk7XHJcblxyXG4gICAgY29uc3QgZmxvb3JNZXNoOiBNZXNoID0gbmV3IFRocmVlTWVzaChnZW9tZXRyeSwgZmxvb3JNYXRlcmlhbCk7XHJcbiAgICBjb25zdCBmbG9vclBsYW5lOiBGbG9vclBsYW5lSXRlbSA9IG5ldyBGbG9vclBsYW5lSXRlbSh7aXRlbVR5cGU6IEl0ZW1UeXBlLkZsb29yRGVjb3JhdGlvbn0sIGZsb29yTWVzaCk7XHJcbiAgICBmbG9vclBsYW5lLm5hbWUgPSAnZmxvb3ItcGxhbmUnO1xyXG4gICAgZmxvb3JQbGFuZS5yb3RhdGlvbi5zZXQoTWF0aC5QSSAvIDIsIDAsIDApO1xyXG4gICAgZmxvb3JQbGFuZS5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICAgIGZsb29yUGxhbmUuY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZmxvb3JDZW50ZXIgPSBjb3JuZXJzID8gdGhpcy5fZ2V0Rmxvb3JDZW50ZXIoY29ybmVycykgOiBuZXcgVmVjdG9yMygwLCAwLCAwKTtcclxuICAgIGZsb29yUGxhbmUucG9zaXRpb24uc2V0KGZsb29yQ2VudGVyLngsIDAuMDAwMSwgZmxvb3JDZW50ZXIueik7XHJcbiAgICB0aGlzLl9hZGRGbG9vcihmbG9vclBsYW5lLCBmYWxzZSk7XHJcbiAgICB0aGlzLl9mbG9vclBsYW5lID0gZmxvb3JQbGFuZTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICByZXR1cm4gZmxvb3JQbGFuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGbG9vclkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ncm91bmRQbGFuZS5wb3NpdGlvbi55O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUZsb29yKGZsb29yOiBGbG9vclBsYW5lSXRlbSwgZm9yY2VSZW5kZXI6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbG9vcnMuc3BsaWNlKHRoaXMuX2Zsb29ycy5pbmRleE9mKGZsb29yKSwgMSk7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UucmVtb3ZlT2JqZWN0KGZsb29yLCBmb3JjZVJlbmRlcik7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKGZsb29yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZEZsb29yKGZsb29yOiBGbG9vclBsYW5lSXRlbSwgZm9yY2VSZW5kZXI6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbG9vcnMucHVzaChmbG9vcik7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYWRkT2JqZWN0KGZsb29yLCBmb3JjZVJlbmRlcik7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5hZGRJdGVtKGZsb29yLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVGbG9vck1hdGVyaWFsKGZsb29yOiBGbG9vclBsYW5lSXRlbSwgZmxvb3JNYXRlcmlhbDogTWF0ZXJpYWwsIHRleHR1cmU/OiBUZXh0dXJlKTogdm9pZCB7XHJcbiAgICBVdGlscy5EaXNwb3NlTWF0ZXJpYWwoZmxvb3IuZ2V0TWF0ZXJpYWwoKSk7XHJcbiAgICBmbG9vci5mbG9vck1hdGVyaWFsID0gZmxvb3JNYXRlcmlhbDtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UudXBkYXRlUGF0aFRyYWNlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlR3JvdW5kUGxhbmUoKTogdm9pZCB7XHJcbiAgICAvLyBncm91bmQgcGxhbmUgdXNlZCB0byBmaW5kIGludGVyc2VjdGlvbnNcclxuICAgIGNvbnN0IHNpemUgPSAxMDAwO1xyXG4gICAgdGhpcy5fZ3JvdW5kUGxhbmUgPSBuZXcgTWVzaChcclxuICAgICAgbmV3IFBsYW5lR2VvbWV0cnkoc2l6ZSwgc2l6ZSksXHJcbiAgICAgIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7dmlzaWJsZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlLCBvcGFjaXR5OiAwfSkpO1xyXG4gICAgdGhpcy5fZ3JvdW5kUGxhbmUucm90YXRpb24ueCA9IC1NYXRoLlBJIC8gMjtcclxuICAgIHRoaXMuX2dyb3VuZFBsYW5lLm5hbWUgPSAnZ3JvdW5kLXBsYW5lJztcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5hZGRPYmplY3QodGhpcy5fZ3JvdW5kUGxhbmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlRmxvb3JNYXRlcmlhbChjb2xvcjogQ29sb3IgfCBzdHJpbmcgfCBudW1iZXIsIHRleHR1cmU/OiBUZXh0dXJlKTogUHJvbWlzZTxNZXNoU3RhbmRhcmRNYXRlcmlhbD4ge1xyXG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xyXG4gICAgICBzaWRlOiBEb3VibGVTaWRlXHJcbiAgICB9O1xyXG4gICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgIG9wdGlvbnMuY29sb3IgPSBjb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmbG9vck1hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKG9wdGlvbnMpOyAvLyBUT0RPOiBUeXBlIG9mIG1hdGVyaWFsIHNob3VsZCBiZSBiYXNlZCBvbiBhdmFpbGFibGUgbWFwc1xyXG4gICAgZmxvb3JNYXRlcmlhbC5wb2x5Z29uT2Zmc2V0ID0gdHJ1ZTtcclxuICAgIGZsb29yTWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciA9IDAuNTtcclxuICAgIGZsb29yTWF0ZXJpYWwubmFtZSA9ICdkZWZhdWx0X2Zsb29ybWF0ZXJpYWwnO1xyXG4gICAgaWYgKHRleHR1cmUpIHtcclxuICAgICAgYXdhaXQgTWF0ZXJpYWxVdGlscy5HZXRNYXRlcmlhbE1hcHMoZmxvb3JNYXRlcmlhbCwgdGV4dHVyZSk7XHJcbiAgICAgIC8vIFJvdWdobmVzcyB2YWx1ZSBpcyBzZXQgdG8gMC44IGlmIG5vIHZhbHVlIGlzIGRlZmluZWQsIHRoaXMgcHJldmVudHMgaGlnaGx5IHJlZmxlY3RpdmUgZmxvb3JzXHJcbiAgICAgIGlmICh0ZXh0dXJlLmNvbG9yKSB7XHJcbiAgICAgICAgZmxvb3JNYXRlcmlhbC5jb2xvciA9IG5ldyBDb2xvcihwYXJzZUludCh0ZXh0dXJlLmNvbG9yLCAwKSk7XHJcbiAgICAgIH1cclxuICAgICAgZmxvb3JNYXRlcmlhbC5yb3VnaG5lc3MgPSAhaXNOaWxsKHRleHR1cmUucm91Z2huZXNzKSA/IHRleHR1cmUucm91Z2huZXNzIDogMC44O1xyXG4gICAgICBmbG9vck1hdGVyaWFsLm1ldGFsbmVzcyA9ICFpc05pbGwodGV4dHVyZS5tZXRhbG5lc3MpID8gdGV4dHVyZS5tZXRhbG5lc3MgOiAwO1xyXG4gICAgICBmbG9vck1hdGVyaWFsLmJ1bXBTY2FsZSA9ICFpc05pbGwodGV4dHVyZS5idW1wU2NhbGUpID8gdGV4dHVyZS5idW1wU2NhbGUgOiAxO1xyXG4gICAgICBpZiAodGV4dHVyZS5taXJyb3IpIHtcclxuICAgICAgICBmbG9vck1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICBmbG9vck1hdGVyaWFsLm9wYWNpdHkgPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmbG9vck1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIHJldHVybiBmbG9vck1hdGVyaWFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Rmxvb3JDZW50ZXIoY29ybmVyczogQ29ybmVyW10pOiBWZWN0b3IzIHtcclxuICAgIGNvbnN0IHBvaW50cyA9IGNvcm5lcnMubWFwKGNvcm5lciA9PlxyXG4gICAgICBuZXcgVmVjdG9yMyhjb3JuZXIueCwgMCwgY29ybmVyLnkpKTtcclxuICAgIGNvbnN0IGZsb29yQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGZsb29yR2VvID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyhwb2ludHMpO1xyXG4gICAgZmxvb3JHZW8uY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICBmbG9vckdlby5ib3VuZGluZ0JveC5nZXRDZW50ZXIoZmxvb3JDZW50ZXIpO1xyXG4gICAgcmV0dXJuIGZsb29yQ2VudGVyO1xyXG4gIH1cclxufVxyXG4iXX0=
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2UvZmxvb3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFDTCxjQUFjLEVBQ2QsS0FBSyxFQUNMLFVBQVUsRUFFVixJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osYUFBYSxFQUNiLEtBQUssRUFDTCxhQUFhLEVBQ2IsT0FBTyxFQUNQLE9BQU8sRUFDUixNQUFNLE9BQU8sQ0FBQztBQUdmLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHcEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFHckUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7O0FBTzVDLE1BQU0sT0FBTyxZQUFZO0lBb0J2QixZQUNZLGFBQTJCLEVBQzNCLGVBQStCLEVBQy9CLFlBQXlCLEVBQzNCLGdCQUE4QztRQUg1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDM0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE4QjtRQW5CaEQsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFDL0IsVUFBSyxHQUFtQixFQUFFLENBQUM7UUFvQmpDLElBQUksQ0FBQyxLQUFL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QUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDbEIsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1lBQ0QsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDakMsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBRU8sZUFBZSxDQUFDLE9BQWlCO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDOzswR0FwT1UsWUFBWTs4R0FBWixZQUFZLGNBRlgsTUFBTTs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBCdWZmZXJHZW9tZXRyeSxcclxuICBDb2xvcixcclxuICBEb3VibGVTaWRlLFxyXG4gIE1hdGVyaWFsLFxyXG4gIE1lc2gsXHJcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXHJcbiAgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXHJcbiAgUGF0aCxcclxuICBQbGFuZUdlb21ldHJ5LFxyXG4gIFNoYXBlLFxyXG4gIFNoYXBlR2VvbWV0cnksXHJcbiAgVmVjdG9yMixcclxuICBWZWN0b3IzXHJcbn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7U2NlbmVTZXJ2aWNlfSBmcm9tICcuL3NjZW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcclxuaW1wb3J0IHtDb3JuZXIsIFJvb219IGZyb20gJy4uL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7VGV4dHVyZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC90ZXh0dXJlJztcclxuaW1wb3J0IHtNYXRlcmlhbFV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL21hdGVyaWFsLnV0aWxzJztcclxuaW1wb3J0IHtUaHJlZU1lc2h9IGZyb20gJy4uL2l0ZW1zL3RocmVlLW1lc2gnO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtPdXRsaW5lU2VydmljZX0gZnJvbSAnLi9vdXRsaW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7Rmxvb3JQbGFuZUl0ZW19IGZyb20gJy4uL2l0ZW1zL2Zsb29yLXBsYW5lLWl0ZW0nO1xyXG5pbXBvcnQge0l0ZW1UeXBlfSBmcm9tICcuLi9pdGVtcy9pdGVtLXR5cGUnO1xyXG5pbXBvcnQge1JlZmxlY3Rvcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL29iamVjdHMvUmVmbGVjdG9yJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZsb29yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgX2dyb3VuZFBsYW5lOiBNZXNoO1xyXG4gIHByaXZhdGUgX2Zsb29yUGxhbmU6IEZsb29yUGxhbmVJdGVtO1xyXG5cclxuICBwcml2YXRlIF9mbG9vcnM6IEZsb29yUGxhbmVJdGVtW10gPSBbXTtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9taXJyb3JQbGFuZTogUmVmbGVjdG9yO1xyXG5cclxuICBwdWJsaWMgZ2V0IGdyb3VuZFBsYW5lKCk6IE1lc2gge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dyb3VuZFBsYW5lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBncm91bmRQbGFuZShtZXNoOiBNZXNoKSB7XHJcbiAgICB0aGlzLl9ncm91bmRQbGFuZSA9IG1lc2g7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmxvb3JUb0NvbmZpZ3VyZTogRmxvb3JQbGFuZUl0ZW07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgICBwcml2YXRlIF9zY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcclxuICAgICAgcHJpdmF0ZSBfb3V0bGluZVNlcnZpY2U6IE91dGxpbmVTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lSW5pdGlhbGl6ZWQuc3Vic2NyaWJlKChpbml0aWFsaXplZDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChpbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgdGhpcy5fY3JlYXRlR3JvdW5kUGxhbmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gKCkgPT4gdGhpcy5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgVXRpbHMuRGlzcG9zZU9iamVjdCh0aGlzLl9ncm91bmRQbGFuZSk7XHJcbiAgICB0aGlzLl9mbG9vcnMuZm9yRWFjaChmID0+IFV0aWxzLkRpc3Bvc2VPYmplY3QoZikpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZsb29yUGxhbmUoKTogRmxvb3JQbGFuZUl0ZW0ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zsb29yUGxhbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Rmxvb3JUZXh0dXJlKHJvb206IFJvb20sIHRleHR1cmU6IFRleHR1cmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmbG9vclBsYW5lOiBGbG9vclBsYW5lSXRlbTtcclxuICAgIGlmIChyb29tKSB7XHJcbiAgICAgIGZsb29yUGxhbmUgPSByb29tLmZsb29yUGxhbmU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmbG9vclBsYW5lID0gdGhpcy5fZmxvb3JzWzBdO1xyXG4gICAgfVxyXG4gICAgZmxvb3JQbGFuZS5yZXNldEdlb21ldHJ5KCk7XHJcbiAgICBpZiAodGV4dHVyZSAmJiB0ZXh0dXJlLnNpbXBsZVBsYW5lKSB7XHJcbiAgICAgIGZsb29yUGxhbmUudXBkYXRlR2VvbWV0cnkobmV3IFBsYW5lR2VvbWV0cnkoNiwgNikpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmxvb3JNYXRlcmlhbCA9IGF3YWl0IHRoaXMuX2NyZWF0ZUZsb29yTWF0ZXJpYWwobnVsbCwgdGV4dHVyZSk7XHJcbiAgICBpZiAocm9vbSkge1xyXG4gICAgICB0aGlzLl91cGRhdGVGbG9vck1hdGVyaWFsKHJvb20uZmxvb3JQbGFuZSwgZmxvb3JNYXRlcmlhbCwgdGV4dHVyZSk7XHJcbiAgICAgIHJvb20uZmxvb3JUZXh0dXJlID0gdGV4dHVyZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZUZsb29yTWF0ZXJpYWwodGhpcy5fZmxvb3JzWzBdLCBmbG9vck1hdGVyaWFsLCB0ZXh0dXJlKTtcclxuICAgIH1cclxuICAgIC8vIHJvb20uZmxvb3JDb2xvciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Rmxvb3JDb2xvcihyb29tOiBSb29tLCBjb2xvcjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjb25zdCBmbG9vclBsYW5lID0gdGhpcy5nZW5lcmF0ZUZsb29yUGxhbmUoY29sb3IsIG51bGwsIHJvb20uY29ybmVycyk7XHJcbiAgICAvLyBmbG9vclBsYW5lLnVzZXJEYXRhID0ge3Jvb206IHJvb219O1xyXG4gICAgLy8gdGhpcy5yZW1vdmVGbG9vcihyb29tLmZsb29yUGxhbmUsIGZhbHNlKTtcclxuICAgIC8vIHJvb20uZmxvb3JQbGFuZSA9IGZsb29yUGxhbmU7XHJcbiAgICBjb25zdCBmbG9vck1hdGVyaWFsID0gYXdhaXQgdGhpcy5fY3JlYXRlRmxvb3JNYXRlcmlhbChjb2xvciwgbnVsbCk7XHJcbiAgICB0aGlzLl91cGRhdGVGbG9vck1hdGVyaWFsKHJvb20uZmxvb3JQbGFuZSwgZmxvb3JNYXRlcmlhbCk7XHJcbiAgICByb29tLmZsb29yVGV4dHVyZSA9IG51bGw7XHJcbiAgICByb29tLmZsb29yQ29sb3IgPSBjb2xvcjtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UudXBkYXRlUGF0aFRyYWNlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZ2hMaWdodEZsb29yKGZsb29yT2JqZWN0OiBGbG9vclBsYW5lSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKGZsb29yT2JqZWN0ICYmIGZsb29yT2JqZWN0LnV1aWQpIHtcclxuICAgICAgY29uc3QgY3VycmVudEZsb29yOiBGbG9vclBsYW5lSXRlbSA9IHRoaXMuX2Zsb29ycy5maW5kKGYgPT4gZi51dWlkID09PSBmbG9vck9iamVjdC51dWlkKTtcclxuICAgICAgaWYgKGN1cnJlbnRGbG9vcikge1xyXG4gICAgICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLnNob3dPdXRsaW5lKGN1cnJlbnRGbG9vcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bkhpZ2hMaWdodEZsb29ycygpOiB2b2lkIHtcclxuICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLmhpZGVPdXRsaW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uZmlndXJlRmxvb3IoZmxvb3JPYmplY3Q6IEZsb29yUGxhbmVJdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLmZsb29yVG9Db25maWd1cmUgPSBmbG9vck9iamVjdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVGbG9vcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbG9vcnMuZm9yRWFjaChmbG9vciA9PiB7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5yZW1vdmVPYmplY3QoZmxvb3IpO1xyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKGZsb29yKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fZmxvb3JzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbG9vclBsYW5lKFxyXG4gICAgY29sb3I6IENvbG9yIHwgc3RyaW5nIHwgbnVtYmVyLCB0ZXh0dXJlPzogVGV4dHVyZSwgY29ybmVycz86IENvcm5lcltdLCBuZXN0ZWRSb29tcz86IGFueSwgZmxvb3JHZW9tZXRyeT86IEJ1ZmZlckdlb21ldHJ5KTogUHJvbWlzZTxGbG9vclBsYW5lSXRlbT4ge1xyXG4gICAgbGV0IGdlb21ldHJ5LCBzaGFwZTtcclxuICAgIGlmIChjb3JuZXJzKSB7XHJcbiAgICAgIGNvbnN0IHBvaW50cyA9IGNvcm5lcnMubWFwKGNvcm5lciA9PlxyXG4gICAgICAgIG5ldyBWZWN0b3IyKGNvcm5lci54LCBjb3JuZXIueSkpO1xyXG4gICAgICBzaGFwZSA9IG5ldyBTaGFwZShwb2ludHMpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIGhvbGVzIGZvciBuZXN0ZWQgcm9vbXNcclxuICAgICAgaWYgKG5lc3RlZFJvb21zKSB7XHJcbiAgICAgICAgbmVzdGVkUm9vbXNcclxuICAgICAgICAgIC5tYXAoKG5lc3RlZFJvb20pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5lc3RlZFJvb20uaW50ZXJpb3JDb3JuZXJzLm1hcChjb3JuZXIgPT5cclxuICAgICAgICAgICAgICBuZXcgVmVjdG9yMihjb3JuZXIueCwgY29ybmVyLnkpKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZmlsdGVyKG5lc3RlZFJvb20gPT4gVXRpbHMucG9seWdvbkluc2lkZVBvbHlnb24obmVzdGVkUm9vbSwgcG9pbnRzKSlcclxuICAgICAgICAgIC5maWx0ZXIoKG5lc3RlZFJvb20sIGluZGV4LCBhcnJheSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgICAuc2xpY2UoaW5kZXggKyAxKVxyXG4gICAgICAgICAgICAgIC5ldmVyeShsYXJnZXJOZXN0ZWRSb29tID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAhVXRpbHMucG9seWdvbkluc2lkZVBvbHlnb24obmVzdGVkUm9vbSwgbGFyZ2VyTmVzdGVkUm9vbSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmZvckVhY2goaG9sZVBvaW50ID0+IHNoYXBlLmhvbGVzLnB1c2gobmV3IFBhdGgoaG9sZVBvaW50KSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZmxvb3JHZW9tZXRyeSkge1xyXG4gICAgICBnZW9tZXRyeSA9IGZsb29yR2VvbWV0cnk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnZW9tZXRyeSA9IG5ldyBTaGFwZUdlb21ldHJ5KHNoYXBlKS5jZW50ZXIoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAvLyBmbG9vck1hdGVyaWFsLm1ldGFsbmVzcyA9IDA7XHJcbiAgICBnZW9tZXRyeS5yb3RhdGVYKE1hdGguUEkgLyAyKTtcclxuXHJcbiAgICBjb25zdCBmbG9vck1hdGVyaWFsID0gYXdhaXQgdGhpcy5fY3JlYXRlRmxvb3JNYXRlcmlhbChjb2xvciwgdGV4dHVyZSk7XHJcblxyXG4gICAgY29uc3QgZmxvb3JNZXNoOiBNZXNoID0gbmV3IFRocmVlTWVzaChnZW9tZXRyeSwgZmxvb3JNYXRlcmlhbCk7XHJcbiAgICBjb25zdCBmbG9vclBsYW5lOiBGbG9vclBsYW5lSXRlbSA9IG5ldyBGbG9vclBsYW5lSXRlbSh7aXRlbVR5cGU6IEl0ZW1UeXBlLkZsb29yRGVjb3JhdGlvbn0sIGZsb29yTWVzaCk7XHJcbiAgICBmbG9vclBsYW5lLm5hbWUgPSAnZmxvb3ItcGxhbmUnO1xyXG4gICAgLy8gZmxvb3JQbGFuZS5yb3RhdGlvbi5zZXQoTWF0aC5QSSAvIDIsIDAsIDApO1xyXG4gICAgZmxvb3JQbGFuZS5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICAgIGZsb29yUGxhbmUuY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZmxvb3JDZW50ZXIgPSBjb3JuZXJzID8gdGhpcy5fZ2V0Rmxvb3JDZW50ZXIoY29ybmVycykgOiBuZXcgVmVjdG9yMygwLCAwLCAwKTtcclxuICAgIGZsb29yUGxhbmUucG9zaXRpb24uc2V0KGZsb29yQ2VudGVyLngsIDAuMDAwMSwgZmxvb3JDZW50ZXIueik7XHJcbiAgICB0aGlzLl9hZGRGbG9vcihmbG9vclBsYW5lLCBmYWxzZSk7XHJcbiAgICB0aGlzLl9mbG9vclBsYW5lID0gZmxvb3JQbGFuZTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICByZXR1cm4gZmxvb3JQbGFuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGbG9vclkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ncm91bmRQbGFuZS5wb3NpdGlvbi55O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUZsb29yKGZsb29yOiBGbG9vclBsYW5lSXRlbSwgZm9yY2VSZW5kZXI6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbG9vcnMuc3BsaWNlKHRoaXMuX2Zsb29ycy5pbmRleE9mKGZsb29yKSwgMSk7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UucmVtb3ZlT2JqZWN0KGZsb29yLCBmb3JjZVJlbmRlcik7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKGZsb29yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZEZsb29yKGZsb29yOiBGbG9vclBsYW5lSXRlbSwgZm9yY2VSZW5kZXI6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mbG9vcnMucHVzaChmbG9vcik7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYWRkT2JqZWN0KGZsb29yLCBmb3JjZVJlbmRlcik7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5hZGRJdGVtKGZsb29yLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVGbG9vck1hdGVyaWFsKGZsb29yOiBGbG9vclBsYW5lSXRlbSwgZmxvb3JNYXRlcmlhbDogTWF0ZXJpYWwsIHRleHR1cmU/OiBUZXh0dXJlKTogdm9pZCB7XHJcbiAgICBVdGlscy5EaXNwb3NlTWF0ZXJpYWwoZmxvb3IuZ2V0TWF0ZXJpYWwoKSk7XHJcbiAgICBmbG9vci5mbG9vck1hdGVyaWFsID0gZmxvb3JNYXRlcmlhbDtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UudXBkYXRlUGF0aFRyYWNlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlR3JvdW5kUGxhbmUoKTogdm9pZCB7XHJcbiAgICAvLyBncm91bmQgcGxhbmUgdXNlZCB0byBmaW5kIGludGVyc2VjdGlvbnNcclxuICAgIGNvbnN0IHNpemUgPSAxMDAwO1xyXG4gICAgdGhpcy5fZ3JvdW5kUGxhbmUgPSBuZXcgTWVzaChcclxuICAgICAgbmV3IFBsYW5lR2VvbWV0cnkoc2l6ZSwgc2l6ZSksXHJcbiAgICAgIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7dmlzaWJsZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlLCBvcGFjaXR5OiAwfSkpO1xyXG4gICAgdGhpcy5fZ3JvdW5kUGxhbmUucm90YXRpb24ueCA9IC1NYXRoLlBJIC8gMjtcclxuICAgIHRoaXMuX2dyb3VuZFBsYW5lLm5hbWUgPSAnZ3JvdW5kLXBsYW5lJztcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5hZGRPYmplY3QodGhpcy5fZ3JvdW5kUGxhbmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlRmxvb3JNYXRlcmlhbChjb2xvcjogQ29sb3IgfCBzdHJpbmcgfCBudW1iZXIsIHRleHR1cmU/OiBUZXh0dXJlKTogUHJvbWlzZTxNZXNoU3RhbmRhcmRNYXRlcmlhbD4ge1xyXG4gICAgY29uc3Qgb3B0aW9uczogYW55ID0ge1xyXG4gICAgICBzaWRlOiBEb3VibGVTaWRlXHJcbiAgICB9O1xyXG4gICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgIG9wdGlvbnMuY29sb3IgPSBjb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmbG9vck1hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKG9wdGlvbnMpOyAvLyBUT0RPOiBUeXBlIG9mIG1hdGVyaWFsIHNob3VsZCBiZSBiYXNlZCBvbiBhdmFpbGFibGUgbWFwc1xyXG4gICAgZmxvb3JNYXRlcmlhbC5wb2x5Z29uT2Zmc2V0ID0gdHJ1ZTtcclxuICAgIGZsb29yTWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciA9IDAuNTtcclxuICAgIGZsb29yTWF0ZXJpYWwubmFtZSA9ICdkZWZhdWx0X2Zsb29ybWF0ZXJpYWwnO1xyXG4gICAgaWYgKHRleHR1cmUpIHtcclxuICAgICAgYXdhaXQgTWF0ZXJpYWxVdGlscy5HZXRNYXRlcmlhbE1hcHMoZmxvb3JNYXRlcmlhbCwgdGV4dHVyZSk7XHJcbiAgICAgIC8vIFJvdWdobmVzcyB2YWx1ZSBpcyBzZXQgdG8gMC44IGlmIG5vIHZhbHVlIGlzIGRlZmluZWQsIHRoaXMgcHJldmVudHMgaGlnaGx5IHJlZmxlY3RpdmUgZmxvb3JzXHJcbiAgICAgIGlmICh0ZXh0dXJlLmNvbG9yKSB7XHJcbiAgICAgICAgZmxvb3JNYXRlcmlhbC5jb2xvciA9IG5ldyBDb2xvcihwYXJzZUludCh0ZXh0dXJlLmNvbG9yLCAwKSk7XHJcbiAgICAgIH1cclxuICAgICAgZmxvb3JNYXRlcmlhbC5yb3VnaG5lc3MgPSAhaXNOaWxsKHRleHR1cmUucm91Z2huZXNzKSA/IHRleHR1cmUucm91Z2huZXNzIDogMC44O1xyXG4gICAgICBmbG9vck1hdGVyaWFsLm1ldGFsbmVzcyA9ICFpc05pbGwodGV4dHVyZS5tZXRhbG5lc3MpID8gdGV4dHVyZS5tZXRhbG5lc3MgOiAwO1xyXG4gICAgICBmbG9vck1hdGVyaWFsLmJ1bXBTY2FsZSA9ICFpc05pbGwodGV4dHVyZS5idW1wU2NhbGUpID8gdGV4dHVyZS5idW1wU2NhbGUgOiAxO1xyXG4gICAgICBpZiAodGV4dHVyZS5taXJyb3IpIHtcclxuICAgICAgICBmbG9vck1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICBmbG9vck1hdGVyaWFsLm9wYWNpdHkgPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmbG9vck1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIHJldHVybiBmbG9vck1hdGVyaWFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Rmxvb3JDZW50ZXIoY29ybmVyczogQ29ybmVyW10pOiBWZWN0b3IzIHtcclxuICAgIGNvbnN0IHBvaW50cyA9IGNvcm5lcnMubWFwKGNvcm5lciA9PlxyXG4gICAgICBuZXcgVmVjdG9yMyhjb3JuZXIueCwgMCwgY29ybmVyLnkpKTtcclxuICAgIGNvbnN0IGZsb29yQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGZsb29yR2VvID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyhwb2ludHMpO1xyXG4gICAgZmxvb3JHZW8uY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICBmbG9vckdlby5ib3VuZGluZ0JveC5nZXRDZW50ZXIoZmxvb3JDZW50ZXIpO1xyXG4gICAgcmV0dXJuIGZsb29yQ2VudGVyO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -15,7 +15,7 @@ import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
15
15
  import * as TWEEN from '@tweenjs/tween.js';
16
16
  import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass';
17
17
  import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader';
18
- import { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader';
18
+ import { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass';
19
19
  import * as i0 from "@angular/core";
20
20
  import * as i1 from "../../../core/service/homedecorator-app-event.service";
21
21
  export class OutlineService {
@@ -25,7 +25,6 @@ export class OutlineService {
25
25
  this._hideOutlineTimeout = 10000;
26
26
  this._animationDuration = 5000;
27
27
  this._outlinePassAsError = false;
28
- this._useMSAA = false;
29
28
  this._initializing = false;
30
29
  this._subs = [];
31
30
  this.needsRender = false;
@@ -48,16 +47,18 @@ export class OutlineService {
48
47
  this._composer = new EffectComposer(this._renderer, this._renderTarget);
49
48
  this._composer.setPixelRatio(window.devicePixelRatio);
50
49
  const renderPass = new RenderPass(this._scene, this._camera);
51
- this._composer.addPass(renderPass);
50
+ this._outputPass = new OutputPass();
52
51
  this._outlinePass = new OutlinePass(new Vector2(width, height), this._scene, this._camera);
53
- this._composer.addPass(this._outlinePass);
54
52
  this._fxaaPass = new ShaderPass(FXAAShader);
55
53
  this._fxaaPass.material.uniforms['resolution'].value.set(1 / width, 1 / height);
56
- this._composer.addPass(this._fxaaPass);
57
54
  // needed for the sRGBEncoding to work
58
55
  // https://stackoverflow.com/questions/72936071/srgbencoding-in-not-working-in-three-effectcomposer
59
- const gammaCorrectionPass = new ShaderPass(GammaCorrectionShader);
60
- this._composer.addPass(gammaCorrectionPass);
56
+ // const gammaCorrectionPass = new ShaderPass(GammaCorrectionShader);
57
+ this._composer.addPass(renderPass);
58
+ this._composer.addPass(this._outlinePass);
59
+ this._composer.addPass(this._fxaaPass);
60
+ // this._composer.addPass(gammaCorrectionPass);
61
+ this._composer.addPass(this._outputPass);
61
62
  this._setSelectionGlowSettings();
62
63
  this._composer.setSize(width, height);
63
64
  }
@@ -147,4 +148,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
147
148
  providedIn: 'root'
148
149
  }]
149
150
  }], ctorParameters: function () { return [{ type: i1.HomedecoratorAppEventService }]; } });
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0bGluZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9jb3JlM2Qvc2VydmljZS9vdXRsaW5lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFxQixVQUFVLEVBQVMsY0FBYyxFQUFFLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDckksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUNoRixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDeEUsT0FBTyxLQUFLLEtBQUssTUFBTSxtQkFBbUIsQ0FBQztBQUczQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDeEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDOzs7QUFTdkYsTUFBTSxPQUFPLGNBQWM7SUFxQnpCLFlBQ1ksZ0JBQThDO1FBQTlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBOEI7UUFoQmxELGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsd0JBQW1CLEdBQVcsS0FBSyxDQUFDO1FBQ3BDLHVCQUFrQixHQUFXLElBQUksQ0FBQztRQUNsQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDckMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUkvQixVQUFLLEdBQW1CLEVBQUUsQ0FBQztRQUU1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUts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LFlBQVksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQ3RDLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs0R0FySlUsY0FBYztnSEFBZCxjQUFjLGNBRmIsTUFBTTs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtOZWFyZXN0RmlsdGVyLCBQZXJzcGVjdGl2ZUNhbWVyYSwgUkdCQUZvcm1hdCwgU2NlbmUsIFNSR0JDb2xvclNwYWNlLCBWZWN0b3IyLCBXZWJHTFJlbmRlcmVyLCBXZWJHTFJlbmRlclRhcmdldH0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge091dGxpbmVQYXNzfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvT3V0bGluZVBhc3MnO1xyXG5pbXBvcnQge0VmZmVjdENvbXBvc2VyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvRWZmZWN0Q29tcG9zZXInO1xyXG5pbXBvcnQge1JlbmRlclBhc3N9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9SZW5kZXJQYXNzJztcclxuaW1wb3J0ICogYXMgVFdFRU4gZnJvbSAnQHR3ZWVuanMvdHdlZW4uanMnO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gJy4uL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge1RleHR1cmVQYXNzfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvVGV4dHVyZVBhc3MnO1xyXG5pbXBvcnQge1NoYWRlclBhc3N9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9TaGFkZXJQYXNzJztcclxuaW1wb3J0IHtGWEFBU2hhZGVyfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vc2hhZGVycy9GWEFBU2hhZGVyJztcclxuaW1wb3J0IHtHYW1tYUNvcnJlY3Rpb25TaGFkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9zaGFkZXJzL0dhbW1hQ29ycmVjdGlvblNoYWRlcic7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItYXBwLWV2ZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7RnVybml0dXJlfSBmcm9tICcuLi9pdGVtcy9mdXJuaXR1cmUnO1xyXG5pbXBvcnQge0N1c3RvbU9iamVjdDNEfSBmcm9tICcuLi9pdGVtcy9jdXN0b20tb2JqZWN0cyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgX291dGxpbmVQYXNzOiBPdXRsaW5lUGFzcztcclxuICBwcml2YXRlIF90ZXh0dXJlUGFzczogVGV4dHVyZVBhc3M7XHJcbiAgcHJpdmF0ZSBfZnhhYVBhc3M6IFNoYWRlclBhc3M7XHJcbiAgcHJpdmF0ZSBfY29tcG9zZXI6IEVmZmVjdENvbXBvc2VyO1xyXG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2hpZGVPdXRsaW5lVGltZXI6IGFueTtcclxuICBwcml2YXRlIF9oaWRlT3V0bGluZVRpbWVvdXQ6IG51bWJlciA9IDEwMDAwO1xyXG4gIHByaXZhdGUgX2FuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXIgPSA1MDAwO1xyXG4gIHByaXZhdGUgX291dGxpbmVQYXNzQXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3VzZU1TQUE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yZW5kZXJUYXJnZXQ6IFdlYkdMUmVuZGVyVGFyZ2V0O1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3NjZW5lOiBTY2VuZTtcclxuICBwcml2YXRlIF9yZW5kZXJlcjogV2ViR0xSZW5kZXJlcjtcclxuICBwcml2YXRlIF9jYW1lcmE6IFBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHB1YmxpYyBuZWVkc1JlbmRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSBfYXBwRXZlbnRTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLnNob3dPdXRsaW5lLnN1YnNjcmliZSgob2JqZWN0OiBJdGVtKSA9PiB0aGlzLnNob3dPdXRsaW5lKG9iamVjdCkpLFxyXG4gICAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5oaWRlT3V0bGluZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlT3V0bGluZSgpKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUsIGNhbWVyYTogUGVyc3BlY3RpdmVDYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG4gICAgdGhpcy5fc2NlbmUgPSBzY2VuZTtcclxuICAgIHRoaXMuX2NhbWVyYSA9IGNhbWVyYTtcclxuXHJcbiAgICB0aGlzLl9yZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQod2lkdGgsIGhlaWdodCwge1xyXG4gICAgICBtaW5GaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsXHJcbiAgICAgIG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlcixcclxuICAgICAgZm9ybWF0OiBSR0JBRm9ybWF0LFxyXG4gICAgICBjb2xvclNwYWNlOiBTUkdCQ29sb3JTcGFjZVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJUYXJnZXQuc2FtcGxlcyA9IDQ7XHJcblxyXG4gICAgdGhpcy5fY29tcG9zZXIgPSBuZXcgRWZmZWN0Q29tcG9zZXIodGhpcy5fcmVuZGVyZXIsIHRoaXMuX3JlbmRlclRhcmdldCk7XHJcbiAgICB0aGlzLl9jb21wb3Nlci5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcclxuXHJcbiAgICBjb25zdCByZW5kZXJQYXNzID0gbmV3IFJlbmRlclBhc3ModGhpcy5fc2NlbmUsIHRoaXMuX2NhbWVyYSk7XHJcbiAgICB0aGlzLl9jb21wb3Nlci5hZGRQYXNzKHJlbmRlclBhc3MpO1xyXG5cclxuICAgIHRoaXMuX291dGxpbmVQYXNzID0gbmV3IE91dGxpbmVQYXNzKG5ldyBWZWN0b3IyKHdpZHRoLCBoZWlnaHQpLCB0aGlzLl9zY2VuZSwgdGhpcy5fY2FtZXJhKTtcclxuICAgIHRoaXMuX2NvbXBvc2VyLmFkZFBhc3ModGhpcy5fb3V0bGluZVBhc3MpO1xyXG5cclxuICAgIHRoaXMuX2Z4YWFQYXNzID0gbmV3IFNoYWRlclBhc3MoRlhBQVNoYWRlcik7XHJcbiAgICB0aGlzLl9meGFhUGFzcy5tYXRlcmlhbC51bmlmb3Jtc1sncmVzb2x1dGlvbiddLnZhbHVlLnNldCgxIC8gd2lkdGgsIDEgLyBoZWlnaHQpO1xyXG4gICAgdGhpcy5fY29tcG9zZXIuYWRkUGFzcyh0aGlzLl9meGFhUGFzcyk7XHJcblxyXG4gICAgLy8gbmVlZGVkIGZvciB0aGUgc1JHQkVuY29kaW5nIHRvIHdvcmtcclxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyOTM2MDcxL3NyZ2JlbmNvZGluZy1pbi1ub3Qtd29ya2luZy1pbi10aHJlZS1lZmZlY3Rjb21wb3NlclxyXG4gICAgY29uc3QgZ2FtbWFDb3JyZWN0aW9uUGFzcyA9IG5ldyBTaGFkZXJQYXNzKEdhbW1hQ29ycmVjdGlvblNoYWRlcik7XHJcbiAgICB0aGlzLl9jb21wb3Nlci5hZGRQYXNzKGdhbW1hQ29ycmVjdGlvblBhc3MpO1xyXG5cclxuICAgIHRoaXMuX3NldFNlbGVjdGlvbkdsb3dTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5fY29tcG9zZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW5kZXJUYXJnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIHRoaXMuX2NvbXBvc2VyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcG9zZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9yY2VSZW5kZXJDYW52YXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dFcnJvck91dGxpbmUoaXRlbTogRnVybml0dXJlKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX291dGxpbmVQYXNzQXNFcnJvcikge1xyXG4gICAgICB0aGlzLl9zZXRFcnJvckdsb3dTZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLl9vdXRsaW5lUGFzc0FzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3V0bGluZVBhc3Muc2VsZWN0ZWRPYmplY3RzID0gW2l0ZW1dO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNob3dPdXRsaW5lKGl0ZW06IEZ1cm5pdHVyZSB8IEN1c3RvbU9iamVjdDNEKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAoaXRlbSAmJiAoaXRlbSBpbnN0YW5jZW9mIEZsb29yUGluIHx8IGl0ZW0gaW5zdGFuY2VvZiBXYWxsUGluKSkge1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faGlkZU91dGxpbmVUaW1lcik7XHJcbiAgICBpZiAodGhpcy5fb3V0bGluZVBhc3NBc0Vycm9yKSB7XHJcbiAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkdsb3dTZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLl9vdXRsaW5lUGFzc0FzRXJyb3IgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX291dGxpbmVQYXNzLnNlbGVjdGVkT2JqZWN0cyA9IFtpdGVtXTtcclxuICAgIC8vIGF3YWl0IHRoaXMuX2FuaW1hdGVkT3V0bGluZVN0cmVuZ3RoKDAsIDMwMCk7XHJcbiAgICAvLyByZW1vdmUgYWZ0ZXIgeCBhbW91bnQgb2YgbXNcclxuICAgIHRoaXMuX2hpZGVPdXRsaW5lVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5oaWRlT3V0bGluZSgpO1xyXG4gICAgfSwgdGhpcy5faGlkZU91dGxpbmVUaW1lb3V0KTtcclxuICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhpZGVPdXRsaW5lKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX291dGxpbmVQYXNzLnNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMuX2FuaW1hdGVkT3V0bGluZVN0cmVuZ3RoKDMwMCwgMCk7XHJcbiAgICAgIHRoaXMuX291dGxpbmVQYXNzLnNlbGVjdGVkT2JqZWN0cyA9IFtdO1xyXG4gICAgICB0aGlzLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FuaW1hdGVkT3V0bGluZVN0cmVuZ3RoKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBzdHJlbmd0aDogbnVtYmVyID0gZnJvbTtcclxuICAgICAgbmV3IFRXRUVOLlR3ZWVuKHN0cmVuZ3RoKVxyXG4gICAgICAgIC50byh0bywgdGhpcy5fYW5pbWF0aW9uRHVyYXRpb24pXHJcbiAgICAgICAgLmVhc2luZyhUV0VFTi5FYXNpbmcuQ2lyY3VsYXIuSW4pXHJcbiAgICAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VTdHJlbmd0aCA9IHN0cmVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAub25Db21wbGV0ZSgoKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3RhcnQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RXJyb3JHbG93U2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vdXRsaW5lUGFzcy52aXNpYmxlRWRnZUNvbG9yLnNldCgnI2U2MDAwMicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuaGlkZGVuRWRnZUNvbG9yLnNldCgnI2U2MDAwMicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuZWRnZVN0cmVuZ3RoID0gNDtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VHbG93ID0gMTtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VUaGlja25lc3MgPSAxO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MucHVsc2VQZXJpb2QgPSAxLjU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRTZWxlY3Rpb25HbG93U2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vdXRsaW5lUGFzcy52aXNpYmxlRWRnZUNvbG9yLnNldCgnI2ZmZmZmZicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuaGlkZGVuRWRnZUNvbG9yLnNldCgnI2ZmZmZmZicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuZWRnZVN0cmVuZ3RoID0gMjtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VHbG93ID0gMC41O1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuZWRnZVRoaWNrbmVzcyA9IDEuNTtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLnB1bHNlUGVyaW9kID0gMDtcclxuICB9XHJcbn1cclxuIl19
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0bGluZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy9jb3JlM2Qvc2VydmljZS9vdXRsaW5lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFxQixVQUFVLEVBQVMsY0FBYyxFQUFFLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDckksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUNoRixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDeEUsT0FBTyxLQUFLLEtBQUssTUFBTSxtQkFBbUIsQ0FBQztBQUczQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDeEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBTWpFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQzs7O0FBS3hFLE1BQU0sT0FBTyxjQUFjO0lBb0J6QixZQUNZLGdCQUE4QztRQUE5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQThCO1FBZmxELGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsd0JBQW1CLEdBQVcsS0FBSyxDQUFDO1FBQ3BDLHVCQUFrQixHQUFXLElBQUksQ0FBQztRQUNsQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFckMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFJL0IsVUFBSyxHQUFtQixFQUFFLENBQUM7UUFFNUIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFLbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENB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WSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFDdEMsQ0FBQztJQUVPLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7OzRHQXRKVSxjQUFjO2dIQUFkLGNBQWMsY0FGYixNQUFNOzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05lYXJlc3RGaWx0ZXIsIFBlcnNwZWN0aXZlQ2FtZXJhLCBSR0JBRm9ybWF0LCBTY2VuZSwgU1JHQkNvbG9yU3BhY2UsIFZlY3RvcjIsIFdlYkdMUmVuZGVyZXIsIFdlYkdMUmVuZGVyVGFyZ2V0fSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7T3V0bGluZVBhc3N9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9PdXRsaW5lUGFzcyc7XHJcbmltcG9ydCB7RWZmZWN0Q29tcG9zZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9FZmZlY3RDb21wb3Nlcic7XHJcbmltcG9ydCB7UmVuZGVyUGFzc30gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL3Bvc3Rwcm9jZXNzaW5nL1JlbmRlclBhc3MnO1xyXG5pbXBvcnQgKiBhcyBUV0VFTiBmcm9tICdAdHdlZW5qcy90d2Vlbi5qcyc7XHJcbmltcG9ydCB7SXRlbX0gZnJvbSAnLi4vaXRlbXMvaXRlbSc7XHJcbmltcG9ydCB7VGV4dHVyZVBhc3N9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9wb3N0cHJvY2Vzc2luZy9UZXh0dXJlUGFzcyc7XHJcbmltcG9ydCB7U2hhZGVyUGFzc30gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL3Bvc3Rwcm9jZXNzaW5nL1NoYWRlclBhc3MnO1xyXG5pbXBvcnQge0ZYQUFTaGFkZXJ9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9zaGFkZXJzL0ZYQUFTaGFkZXInO1xyXG5pbXBvcnQge0dhbW1hQ29ycmVjdGlvblNoYWRlcn0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL3NoYWRlcnMvR2FtbWFDb3JyZWN0aW9uU2hhZGVyJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtGdXJuaXR1cmV9IGZyb20gJy4uL2l0ZW1zL2Z1cm5pdHVyZSc7XHJcbmltcG9ydCB7Q3VzdG9tT2JqZWN0M0R9IGZyb20gJy4uL2l0ZW1zL2N1c3RvbS1vYmplY3RzJztcclxuaW1wb3J0IHtPdXRwdXRQYXNzfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvT3V0cHV0UGFzcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgX291dGxpbmVQYXNzOiBPdXRsaW5lUGFzcztcclxuICBwcml2YXRlIF9meGFhUGFzczogU2hhZGVyUGFzcztcclxuICBwcml2YXRlIF9vdXRwdXRQYXNzOiBPdXRwdXRQYXNzO1xyXG4gIHByaXZhdGUgX2NvbXBvc2VyOiBFZmZlY3RDb21wb3NlcjtcclxuICBwcml2YXRlIF9lbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9oaWRlT3V0bGluZVRpbWVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBfaGlkZU91dGxpbmVUaW1lb3V0OiBudW1iZXIgPSAxMDAwMDtcclxuICBwcml2YXRlIF9hbmltYXRpb25EdXJhdGlvbjogbnVtYmVyID0gNTAwMDtcclxuICBwcml2YXRlIF9vdXRsaW5lUGFzc0FzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yZW5kZXJUYXJnZXQ6IFdlYkdMUmVuZGVyVGFyZ2V0O1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3NjZW5lOiBTY2VuZTtcclxuICBwcml2YXRlIF9yZW5kZXJlcjogV2ViR0xSZW5kZXJlcjtcclxuICBwcml2YXRlIF9jYW1lcmE6IFBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHB1YmxpYyBuZWVkc1JlbmRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSBfYXBwRXZlbnRTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLnNob3dPdXRsaW5lLnN1YnNjcmliZSgob2JqZWN0OiBJdGVtKSA9PiB0aGlzLnNob3dPdXRsaW5lKG9iamVjdCkpLFxyXG4gICAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5oaWRlT3V0bGluZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlT3V0bGluZSgpKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUsIGNhbWVyYTogUGVyc3BlY3RpdmVDYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG4gICAgdGhpcy5fc2NlbmUgPSBzY2VuZTtcclxuICAgIHRoaXMuX2NhbWVyYSA9IGNhbWVyYTtcclxuXHJcbiAgICB0aGlzLl9yZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQod2lkdGgsIGhlaWdodCwge1xyXG4gICAgICBtaW5GaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsXHJcbiAgICAgIG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlcixcclxuICAgICAgZm9ybWF0OiBSR0JBRm9ybWF0LFxyXG4gICAgICBjb2xvclNwYWNlOiBTUkdCQ29sb3JTcGFjZVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJUYXJnZXQuc2FtcGxlcyA9IDQ7XHJcblxyXG4gICAgdGhpcy5fY29tcG9zZXIgPSBuZXcgRWZmZWN0Q29tcG9zZXIodGhpcy5fcmVuZGVyZXIsIHRoaXMuX3JlbmRlclRhcmdldCk7XHJcbiAgICB0aGlzLl9jb21wb3Nlci5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcclxuXHJcbiAgICBjb25zdCByZW5kZXJQYXNzID0gbmV3IFJlbmRlclBhc3ModGhpcy5fc2NlbmUsIHRoaXMuX2NhbWVyYSk7XHJcbiAgICB0aGlzLl9vdXRwdXRQYXNzID0gbmV3IE91dHB1dFBhc3MoKTtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzID0gbmV3IE91dGxpbmVQYXNzKG5ldyBWZWN0b3IyKHdpZHRoLCBoZWlnaHQpLCB0aGlzLl9zY2VuZSwgdGhpcy5fY2FtZXJhKTtcclxuICAgIHRoaXMuX2Z4YWFQYXNzID0gbmV3IFNoYWRlclBhc3MoRlhBQVNoYWRlcik7XHJcbiAgICB0aGlzLl9meGFhUGFzcy5tYXRlcmlhbC51bmlmb3Jtc1sncmVzb2x1dGlvbiddLnZhbHVlLnNldCgxIC8gd2lkdGgsIDEgLyBoZWlnaHQpO1xyXG5cclxuICAgIC8vIG5lZWRlZCBmb3IgdGhlIHNSR0JFbmNvZGluZyB0byB3b3JrXHJcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83MjkzNjA3MS9zcmdiZW5jb2RpbmctaW4tbm90LXdvcmtpbmctaW4tdGhyZWUtZWZmZWN0Y29tcG9zZXJcclxuICAgIC8vIGNvbnN0IGdhbW1hQ29ycmVjdGlvblBhc3MgPSBuZXcgU2hhZGVyUGFzcyhHYW1tYUNvcnJlY3Rpb25TaGFkZXIpO1xyXG5cclxuXHJcbiAgICB0aGlzLl9jb21wb3Nlci5hZGRQYXNzKHJlbmRlclBhc3MpO1xyXG4gICAgdGhpcy5fY29tcG9zZXIuYWRkUGFzcyh0aGlzLl9vdXRsaW5lUGFzcyk7XHJcbiAgICB0aGlzLl9jb21wb3Nlci5hZGRQYXNzKHRoaXMuX2Z4YWFQYXNzKTtcclxuICAgIC8vIHRoaXMuX2NvbXBvc2VyLmFkZFBhc3MoZ2FtbWFDb3JyZWN0aW9uUGFzcyk7XHJcbiAgICB0aGlzLl9jb21wb3Nlci5hZGRQYXNzKHRoaXMuX291dHB1dFBhc3MpO1xyXG5cclxuICAgIHRoaXMuX3NldFNlbGVjdGlvbkdsb3dTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5fY29tcG9zZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW5kZXJUYXJnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIHRoaXMuX2NvbXBvc2VyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcG9zZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9yY2VSZW5kZXJDYW52YXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dFcnJvck91dGxpbmUoaXRlbTogRnVybml0dXJlKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX291dGxpbmVQYXNzQXNFcnJvcikge1xyXG4gICAgICB0aGlzLl9zZXRFcnJvckdsb3dTZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLl9vdXRsaW5lUGFzc0FzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3V0bGluZVBhc3Muc2VsZWN0ZWRPYmplY3RzID0gW2l0ZW1dO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNob3dPdXRsaW5lKGl0ZW06IEZ1cm5pdHVyZSB8IEN1c3RvbU9iamVjdDNEKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAoaXRlbSAmJiAoaXRlbSBpbnN0YW5jZW9mIEZsb29yUGluIHx8IGl0ZW0gaW5zdGFuY2VvZiBXYWxsUGluKSkge1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faGlkZU91dGxpbmVUaW1lcik7XHJcbiAgICBpZiAodGhpcy5fb3V0bGluZVBhc3NBc0Vycm9yKSB7XHJcbiAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkdsb3dTZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLl9vdXRsaW5lUGFzc0FzRXJyb3IgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX291dGxpbmVQYXNzLnNlbGVjdGVkT2JqZWN0cyA9IFtpdGVtXTtcclxuICAgIC8vIGF3YWl0IHRoaXMuX2FuaW1hdGVkT3V0bGluZVN0cmVuZ3RoKDAsIDMwMCk7XHJcbiAgICAvLyByZW1vdmUgYWZ0ZXIgeCBhbW91bnQgb2YgbXNcclxuICAgIHRoaXMuX2hpZGVPdXRsaW5lVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5oaWRlT3V0bGluZSgpO1xyXG4gICAgfSwgdGhpcy5faGlkZU91dGxpbmVUaW1lb3V0KTtcclxuICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhpZGVPdXRsaW5lKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX291dGxpbmVQYXNzLnNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMuX2FuaW1hdGVkT3V0bGluZVN0cmVuZ3RoKDMwMCwgMCk7XHJcbiAgICAgIHRoaXMuX291dGxpbmVQYXNzLnNlbGVjdGVkT2JqZWN0cyA9IFtdO1xyXG4gICAgICB0aGlzLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FuaW1hdGVkT3V0bGluZVN0cmVuZ3RoKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBzdHJlbmd0aDogbnVtYmVyID0gZnJvbTtcclxuICAgICAgbmV3IFRXRUVOLlR3ZWVuKHN0cmVuZ3RoKVxyXG4gICAgICAgIC50byh0bywgdGhpcy5fYW5pbWF0aW9uRHVyYXRpb24pXHJcbiAgICAgICAgLmVhc2luZyhUV0VFTi5FYXNpbmcuQ2lyY3VsYXIuSW4pXHJcbiAgICAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VTdHJlbmd0aCA9IHN0cmVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAub25Db21wbGV0ZSgoKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3RhcnQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RXJyb3JHbG93U2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vdXRsaW5lUGFzcy52aXNpYmxlRWRnZUNvbG9yLnNldCgnI2U2MDAwMicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuaGlkZGVuRWRnZUNvbG9yLnNldCgnI2U2MDAwMicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuZWRnZVN0cmVuZ3RoID0gNDtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VHbG93ID0gMTtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VUaGlja25lc3MgPSAxO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MucHVsc2VQZXJpb2QgPSAxLjU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRTZWxlY3Rpb25HbG93U2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vdXRsaW5lUGFzcy52aXNpYmxlRWRnZUNvbG9yLnNldCgnI2ZmZmZmZicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuaGlkZGVuRWRnZUNvbG9yLnNldCgnI2ZmZmZmZicpO1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuZWRnZVN0cmVuZ3RoID0gMjtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLmVkZ2VHbG93ID0gMC41O1xyXG4gICAgdGhpcy5fb3V0bGluZVBhc3MuZWRnZVRoaWNrbmVzcyA9IDEuNTtcclxuICAgIHRoaXMuX291dGxpbmVQYXNzLnB1bHNlUGVyaW9kID0gMDtcclxuICB9XHJcbn1cclxuIl19