@colijnit/configurator 1.0.16 → 1.0.18

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 (88) hide show
  1. package/app/builder.d.ts +53 -53
  2. package/app/components/answers/answer/answer.component.d.ts +11 -11
  3. package/app/components/answers/answers.component.d.ts +8 -8
  4. package/app/components/answers/answers.module.d.ts +2 -2
  5. package/app/components/selections/selections.component.d.ts +22 -22
  6. package/app/components/selections/selections.module.d.ts +2 -2
  7. package/app/components/shared/loader/loader.component.d.ts +2 -2
  8. package/app/components/shared/shared.module.d.ts +2 -2
  9. package/app/directives/visibility-observer-master.directive.d.ts +9 -9
  10. package/app/directives/visibility-observer.directive.d.ts +13 -13
  11. package/app/services/configurator.service.d.ts +22 -22
  12. package/app/services/image-cache.service.d.ts +10 -10
  13. package/app/services/locator.service.d.ts +4 -4
  14. package/bundles/colijnit-configurator.umd.js +2455 -2455
  15. package/bundles/colijnit-configurator.umd.js.map +1 -1
  16. package/bundles/colijnit-configurator.umd.min.js +2 -2
  17. package/bundles/colijnit-configurator.umd.min.js.map +1 -1
  18. package/colijnit-configurator.d.ts +10 -10
  19. package/colijnit-configurator.metadata.json +1 -1
  20. package/esm2015/app/builder.js +477 -477
  21. package/esm2015/app/components/answers/answer/answer.component.js +66 -61
  22. package/esm2015/app/components/answers/answers.component.js +40 -37
  23. package/esm2015/app/components/answers/answers.module.js +28 -28
  24. package/esm2015/app/components/selections/selections.component.js +128 -108
  25. package/esm2015/app/components/selections/selections.module.js +22 -22
  26. package/esm2015/app/components/shared/loader/loader.component.js +12 -12
  27. package/esm2015/app/components/shared/shared.module.js +20 -20
  28. package/esm2015/app/directives/visibility-observer-master.directive.js +50 -50
  29. package/esm2015/app/directives/visibility-observer.directive.js +56 -56
  30. package/esm2015/app/services/configurator.service.js +94 -94
  31. package/esm2015/app/services/image-cache.service.js +66 -66
  32. package/esm2015/app/services/locator.service.js +9 -9
  33. package/esm2015/colijnit-configurator.js +10 -10
  34. package/esm2015/helper/variation-helper.js +215 -215
  35. package/esm2015/model/material.js +10 -10
  36. package/esm2015/model/variation-settings.js +5 -5
  37. package/esm2015/model/variation.js +2 -2
  38. package/esm2015/public_api.js +6 -6
  39. package/esm2015/utils/asset.utils.js +73 -73
  40. package/esm2015/utils/file.utils.js +138 -138
  41. package/esm2015/utils/image.utils.js +51 -51
  42. package/esm2015/utils/object.utils.js +48 -48
  43. package/esm2015/utils/scene-utils.js +93 -93
  44. package/esm2015/utils/threed.utils.js +221 -221
  45. package/esm2015/utils/variation-utils.js +223 -223
  46. package/esm5/app/builder.js +591 -591
  47. package/esm5/app/components/answers/answer/answer.component.js +64 -64
  48. package/esm5/app/components/answers/answers.component.js +27 -27
  49. package/esm5/app/components/answers/answers.module.js +31 -31
  50. package/esm5/app/components/selections/selections.component.js +104 -104
  51. package/esm5/app/components/selections/selections.module.js +25 -25
  52. package/esm5/app/components/shared/loader/loader.component.js +15 -15
  53. package/esm5/app/components/shared/shared.module.js +23 -23
  54. package/esm5/app/directives/visibility-observer-master.directive.js +63 -63
  55. package/esm5/app/directives/visibility-observer.directive.js +58 -58
  56. package/esm5/app/services/configurator.service.js +160 -160
  57. package/esm5/app/services/image-cache.service.js +69 -69
  58. package/esm5/app/services/locator.service.js +12 -12
  59. package/esm5/colijnit-configurator.js +10 -10
  60. package/esm5/helper/variation-helper.js +267 -267
  61. package/esm5/model/material.js +12 -12
  62. package/esm5/model/variation-settings.js +7 -7
  63. package/esm5/model/variation.js +6 -6
  64. package/esm5/public_api.js +6 -6
  65. package/esm5/utils/asset.utils.js +105 -105
  66. package/esm5/utils/file.utils.js +150 -150
  67. package/esm5/utils/image.utils.js +55 -55
  68. package/esm5/utils/object.utils.js +55 -55
  69. package/esm5/utils/scene-utils.js +97 -97
  70. package/esm5/utils/threed.utils.js +278 -278
  71. package/esm5/utils/variation-utils.js +326 -326
  72. package/fesm2015/colijnit-configurator.js +2016 -1988
  73. package/fesm2015/colijnit-configurator.js.map +1 -1
  74. package/fesm5/colijnit-configurator.js +2457 -2457
  75. package/fesm5/colijnit-configurator.js.map +1 -1
  76. package/helper/variation-helper.d.ts +14 -14
  77. package/model/material.d.ts +17 -17
  78. package/model/variation-settings.d.ts +14 -14
  79. package/model/variation.d.ts +10 -10
  80. package/package.json +3 -2
  81. package/public_api.d.ts +6 -6
  82. package/utils/asset.utils.d.ts +13 -13
  83. package/utils/file.utils.d.ts +27 -27
  84. package/utils/image.utils.d.ts +8 -8
  85. package/utils/object.utils.d.ts +7 -7
  86. package/utils/scene-utils.d.ts +7 -7
  87. package/utils/threed.utils.d.ts +16 -16
  88. package/utils/variation-utils.d.ts +12 -12
@@ -1,224 +1,224 @@
1
- import { __awaiter } from "tslib";
2
- import * as JSZip from 'jszip';
3
- import { VariationSettings } from "../model/variation-settings";
4
- // @dynamic
5
- export class VariationUtils {
6
- static LoadVariation(assetPath, fileName) {
7
- return __awaiter(this, void 0, void 0, function* () {
8
- if (!fileName) {
9
- return null;
10
- }
11
- if (fileName.indexOf('ione3d') < 0) {
12
- fileName = fileName.concat('.ione3d');
13
- }
14
- const id = fileName.substr(0, fileName.lastIndexOf('.ione3d'));
15
- try {
16
- if (!assetPath.endsWith('/')) {
17
- assetPath += '/';
18
- }
19
- if (!window.hasOwnProperty('downloadVariation')) {
20
- console.error('downloadVariation not defined in window global');
21
- return null;
22
- }
23
- const file = yield window.downloadVariation(`${assetPath.replace('https://cdn1.colijn-it.nl/', '')}variation/${fileName}`);
24
- return yield VariationUtils.GetVariationSettingsFromFile(id, file);
25
- }
26
- catch (err) {
27
- const mute = err;
28
- return null;
29
- }
30
- });
31
- }
32
- // public static GetMaterialFromName(variationFolder: string, material: any): Promise<MeshStandardMaterial> {
33
- // return new Promise((resolve: Function) => {
34
- // if (!material) {
35
- // resolve(null);
36
- // }
37
- // if (this.MaterialCache.has(material.name)) {
38
- // resolve(this.MaterialCache.get(material.name).clone());
39
- // } else {
40
- // VariationUtils.LoadVariation(variationFolder, material.name, false).then((settings: VariationSettings) => {
41
- // if (settings) {
42
- // AssetUtils.CreateMaterialFromAsset(settings).then((materialObj: Material) => {
43
- // const materialParams: MeshStandardMaterialParameters = {};
44
- // materialParams.name = material.name;
45
- // materialParams.map = materialObj.texture;
46
- // materialParams.normalMap = materialObj.normal;
47
- // materialParams.aoMap = materialObj.ao;
48
- // materialParams.roughnessMap = materialObj.roughness;
49
- // materialParams.metalnessMap = materialObj.metalness;
50
- // materialParams.roughness = 1;
51
- // materialParams.metalness = 1;
52
- // const pbrMat: MeshStandardMaterial = new MeshStandardMaterial(materialParams);
53
- // this.MaterialCache.set(material.name, pbrMat);
54
- // resolve(pbrMat.clone());
55
- // });
56
- // } else {
57
- // resolve(material);
58
- // }
59
- // });
60
- // }
61
- // });
62
- // }
63
- static GetVariationSettingsFromFile(id, compressedFile) {
64
- return __awaiter(this, void 0, void 0, function* () {
65
- if (!compressedFile) {
66
- return null;
67
- }
68
- const zipContent = yield VariationUtils.GetZipContent(compressedFile);
69
- const variationSettings = new VariationSettings();
70
- let index;
71
- variationSettings.id = id;
72
- if (zipContent.files['index.json']) {
73
- const indexFile = yield zipContent.files['index.json'].async('string');
74
- index = JSON.parse(indexFile);
75
- }
76
- if (index) {
77
- yield VariationUtils.CreateSettingsBasedOnIndex(index, variationSettings, zipContent);
78
- }
79
- else {
80
- yield VariationUtils.CreateSettingsBasedOnFileName(variationSettings, zipContent);
81
- }
82
- return variationSettings;
83
- });
84
- }
85
- static CreateSettingsBasedOnIndex(index, variationSettings, zipContent) {
86
- return __awaiter(this, void 0, void 0, function* () {
87
- if (index.normalFile) {
88
- variationSettings.normal = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.normalFile], index.normalFile);
89
- variationSettings.normalFilename = index.normalFile;
90
- }
91
- if (index.aoFile) {
92
- variationSettings.ao = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.aoFile], index.aoFile);
93
- variationSettings.aoFilename = index.aoFile;
94
- }
95
- if (index.metalnessFile) {
96
- variationSettings.metalness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.metalnessFile], index.metalnessFile);
97
- variationSettings.metalnessFilename = index.metalnessFile;
98
- }
99
- if (index.roughnessFile) {
100
- variationSettings.roughness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.roughnessFile], index.roughnessFile);
101
- variationSettings.roughnessFilename = index.roughnessFile;
102
- }
103
- if (index.diffuseFile) {
104
- variationSettings.texture = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.diffuseFile], index.diffuseFile);
105
- variationSettings.textureFilename = index.diffuseFile;
106
- }
107
- variationSettings.settings =
108
- (yield VariationUtils.LoadFileContentFromZip(zipContent.files['repeat.json'], 'repeat.json', false)) || {};
109
- Object.assign(variationSettings.settings, index.repeat);
110
- variationSettings.settings.metalness = index.metalness;
111
- variationSettings.settings.roughness = index.roughness;
112
- });
113
- }
114
- static CreateSettingsBasedOnFileName(variationSettings, zipContent) {
115
- return __awaiter(this, void 0, void 0, function* () {
116
- const allLoaded = [];
117
- for (const fileName in zipContent.files) {
118
- if (zipContent.files[fileName]) {
119
- const file = yield zipContent.files[fileName];
120
- if (file.name.toLowerCase().indexOf('normal') > -1 && this.FileIsImage(file.name)) {
121
- allLoaded.push(zipContent.files[fileName].async('base64').then((normalFile) => {
122
- variationSettings.normal = `data:image/${this.GetBase64FileType(file.name)};base64,${normalFile}`;
123
- variationSettings.normalFilename = fileName;
124
- }));
125
- }
126
- else if (file.name.toLowerCase().indexOf('ao') > -1 && this.FileIsImage(file.name)) {
127
- allLoaded.push(zipContent.files[fileName].async('base64').then((aoFile) => {
128
- variationSettings.ao = `data:image/${this.GetBase64FileType(file.name)};base64,${aoFile}`;
129
- variationSettings.aoFilename = fileName;
130
- }));
131
- }
132
- else if (file.name.toLowerCase().indexOf('metalness') > -1 && this.FileIsImage(file.name)) {
133
- allLoaded.push(zipContent.files[fileName].async('base64').then((metalnessFile) => {
134
- variationSettings.metalness = `data:image/${this.GetBase64FileType(file.name)};base64,${metalnessFile}`;
135
- variationSettings.metalnessFilename = fileName;
136
- }));
137
- }
138
- else if (file.name.toLowerCase().indexOf('roughness') > -1 && this.FileIsImage(file.name)) {
139
- allLoaded.push(zipContent.files[fileName].async('base64').then((roughnessFile) => {
140
- variationSettings.roughness = `data:image/${this.GetBase64FileType(file.name)};base64,${roughnessFile}`;
141
- variationSettings.roughnessFilename = fileName;
142
- }));
143
- }
144
- else if (file.name.toLowerCase().indexOf('diffuse') > -1 && this.FileIsImage(file.name)) {
145
- allLoaded.push(zipContent.files[fileName].async('base64').then((diffuseFile) => {
146
- variationSettings.texture = `data:image/${this.GetBase64FileType(file.name)};base64,${diffuseFile}`;
147
- variationSettings.textureFilename = fileName;
148
- }));
149
- }
150
- else if (file.name.indexOf('.jp') > -1) {
151
- allLoaded.push(zipContent.files[fileName].async('base64').then((textureFile) => {
152
- variationSettings.texture = 'data:image/jpeg;base64,' + textureFile;
153
- variationSettings.textureFilename = fileName;
154
- }));
155
- }
156
- else if (file.name.indexOf('.json') > -1) {
157
- allLoaded.push(zipContent.files[fileName].async('string').then((settingsFile) => {
158
- const settingsFileObj = JSON.parse(settingsFile);
159
- for (const key in settingsFileObj) {
160
- if (settingsFileObj[key]) {
161
- variationSettings.settings[key] = settingsFileObj[key];
162
- }
163
- }
164
- }));
165
- }
166
- }
167
- }
168
- yield Promise.all(allLoaded);
169
- });
170
- }
171
- static LoadFileContentFromZip(zip, fileName, base64 = true) {
172
- return new Promise((resolve) => {
173
- if (zip && fileName) {
174
- zip.async(base64 ? 'base64' : 'string').then((fileContent) => {
175
- if (base64) {
176
- resolve(`data:image/${this.GetBase64FileType(fileName)};base64,${fileContent}`);
177
- }
178
- else {
179
- resolve(fileContent);
180
- }
181
- });
182
- }
183
- else {
184
- resolve(undefined);
185
- }
186
- });
187
- }
188
- static FileIsImage(fileName) {
189
- const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
190
- switch (ext) {
191
- case 'jpg':
192
- case 'jpeg':
193
- case 'png':
194
- case 'bmp':
195
- return true;
196
- default:
197
- return false;
198
- }
199
- }
200
- static GetBase64FileType(fileName) {
201
- const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
202
- switch (ext) {
203
- case 'jpg':
204
- case 'jpeg':
205
- return 'jpeg';
206
- case 'png':
207
- return 'png';
208
- case 'bmp':
209
- return 'bmp';
210
- default:
211
- return 'jpeg';
212
- }
213
- }
214
- // Get the content
215
- static GetZipContent(file) {
216
- return __awaiter(this, void 0, void 0, function* () {
217
- const jszip = new JSZip();
218
- const content = yield jszip.loadAsync(file);
219
- return content;
220
- });
221
- }
222
- }
223
- VariationUtils.MaterialCache = new Map();
1
+ import { __awaiter } from "tslib";
2
+ import * as JSZip from 'jszip';
3
+ import { VariationSettings } from "../model/variation-settings";
4
+ // @dynamic
5
+ export class VariationUtils {
6
+ static LoadVariation(assetPath, fileName) {
7
+ return __awaiter(this, void 0, void 0, function* () {
8
+ if (!fileName) {
9
+ return null;
10
+ }
11
+ if (fileName.indexOf('ione3d') < 0) {
12
+ fileName = fileName.concat('.ione3d');
13
+ }
14
+ const id = fileName.substr(0, fileName.lastIndexOf('.ione3d'));
15
+ try {
16
+ if (!assetPath.endsWith('/')) {
17
+ assetPath += '/';
18
+ }
19
+ if (!window.hasOwnProperty('downloadVariation')) {
20
+ console.error('downloadVariation not defined in window global');
21
+ return null;
22
+ }
23
+ const file = yield window.downloadVariation(`${assetPath.replace('https://cdn1.colijn-it.nl/', '')}variation/${fileName}`);
24
+ return yield VariationUtils.GetVariationSettingsFromFile(id, file);
25
+ }
26
+ catch (err) {
27
+ const mute = err;
28
+ return null;
29
+ }
30
+ });
31
+ }
32
+ // public static GetMaterialFromName(variationFolder: string, material: any): Promise<MeshStandardMaterial> {
33
+ // return new Promise((resolve: Function) => {
34
+ // if (!material) {
35
+ // resolve(null);
36
+ // }
37
+ // if (this.MaterialCache.has(material.name)) {
38
+ // resolve(this.MaterialCache.get(material.name).clone());
39
+ // } else {
40
+ // VariationUtils.LoadVariation(variationFolder, material.name, false).then((settings: VariationSettings) => {
41
+ // if (settings) {
42
+ // AssetUtils.CreateMaterialFromAsset(settings).then((materialObj: Material) => {
43
+ // const materialParams: MeshStandardMaterialParameters = {};
44
+ // materialParams.name = material.name;
45
+ // materialParams.map = materialObj.texture;
46
+ // materialParams.normalMap = materialObj.normal;
47
+ // materialParams.aoMap = materialObj.ao;
48
+ // materialParams.roughnessMap = materialObj.roughness;
49
+ // materialParams.metalnessMap = materialObj.metalness;
50
+ // materialParams.roughness = 1;
51
+ // materialParams.metalness = 1;
52
+ // const pbrMat: MeshStandardMaterial = new MeshStandardMaterial(materialParams);
53
+ // this.MaterialCache.set(material.name, pbrMat);
54
+ // resolve(pbrMat.clone());
55
+ // });
56
+ // } else {
57
+ // resolve(material);
58
+ // }
59
+ // });
60
+ // }
61
+ // });
62
+ // }
63
+ static GetVariationSettingsFromFile(id, compressedFile) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ if (!compressedFile) {
66
+ return null;
67
+ }
68
+ const zipContent = yield VariationUtils.GetZipContent(compressedFile);
69
+ const variationSettings = new VariationSettings();
70
+ let index;
71
+ variationSettings.id = id;
72
+ if (zipContent.files['index.json']) {
73
+ const indexFile = yield zipContent.files['index.json'].async('string');
74
+ index = JSON.parse(indexFile);
75
+ }
76
+ if (index) {
77
+ yield VariationUtils.CreateSettingsBasedOnIndex(index, variationSettings, zipContent);
78
+ }
79
+ else {
80
+ yield VariationUtils.CreateSettingsBasedOnFileName(variationSettings, zipContent);
81
+ }
82
+ return variationSettings;
83
+ });
84
+ }
85
+ static CreateSettingsBasedOnIndex(index, variationSettings, zipContent) {
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ if (index.normalFile) {
88
+ variationSettings.normal = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.normalFile], index.normalFile);
89
+ variationSettings.normalFilename = index.normalFile;
90
+ }
91
+ if (index.aoFile) {
92
+ variationSettings.ao = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.aoFile], index.aoFile);
93
+ variationSettings.aoFilename = index.aoFile;
94
+ }
95
+ if (index.metalnessFile) {
96
+ variationSettings.metalness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.metalnessFile], index.metalnessFile);
97
+ variationSettings.metalnessFilename = index.metalnessFile;
98
+ }
99
+ if (index.roughnessFile) {
100
+ variationSettings.roughness = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.roughnessFile], index.roughnessFile);
101
+ variationSettings.roughnessFilename = index.roughnessFile;
102
+ }
103
+ if (index.diffuseFile) {
104
+ variationSettings.texture = yield VariationUtils.LoadFileContentFromZip(zipContent.files[index.diffuseFile], index.diffuseFile);
105
+ variationSettings.textureFilename = index.diffuseFile;
106
+ }
107
+ variationSettings.settings =
108
+ (yield VariationUtils.LoadFileContentFromZip(zipContent.files['repeat.json'], 'repeat.json', false)) || {};
109
+ Object.assign(variationSettings.settings, index.repeat);
110
+ variationSettings.settings.metalness = index.metalness;
111
+ variationSettings.settings.roughness = index.roughness;
112
+ });
113
+ }
114
+ static CreateSettingsBasedOnFileName(variationSettings, zipContent) {
115
+ return __awaiter(this, void 0, void 0, function* () {
116
+ const allLoaded = [];
117
+ for (const fileName in zipContent.files) {
118
+ if (zipContent.files[fileName]) {
119
+ const file = yield zipContent.files[fileName];
120
+ if (file.name.toLowerCase().indexOf('normal') > -1 && this.FileIsImage(file.name)) {
121
+ allLoaded.push(zipContent.files[fileName].async('base64').then((normalFile) => {
122
+ variationSettings.normal = `data:image/${this.GetBase64FileType(file.name)};base64,${normalFile}`;
123
+ variationSettings.normalFilename = fileName;
124
+ }));
125
+ }
126
+ else if (file.name.toLowerCase().indexOf('ao') > -1 && this.FileIsImage(file.name)) {
127
+ allLoaded.push(zipContent.files[fileName].async('base64').then((aoFile) => {
128
+ variationSettings.ao = `data:image/${this.GetBase64FileType(file.name)};base64,${aoFile}`;
129
+ variationSettings.aoFilename = fileName;
130
+ }));
131
+ }
132
+ else if (file.name.toLowerCase().indexOf('metalness') > -1 && this.FileIsImage(file.name)) {
133
+ allLoaded.push(zipContent.files[fileName].async('base64').then((metalnessFile) => {
134
+ variationSettings.metalness = `data:image/${this.GetBase64FileType(file.name)};base64,${metalnessFile}`;
135
+ variationSettings.metalnessFilename = fileName;
136
+ }));
137
+ }
138
+ else if (file.name.toLowerCase().indexOf('roughness') > -1 && this.FileIsImage(file.name)) {
139
+ allLoaded.push(zipContent.files[fileName].async('base64').then((roughnessFile) => {
140
+ variationSettings.roughness = `data:image/${this.GetBase64FileType(file.name)};base64,${roughnessFile}`;
141
+ variationSettings.roughnessFilename = fileName;
142
+ }));
143
+ }
144
+ else if (file.name.toLowerCase().indexOf('diffuse') > -1 && this.FileIsImage(file.name)) {
145
+ allLoaded.push(zipContent.files[fileName].async('base64').then((diffuseFile) => {
146
+ variationSettings.texture = `data:image/${this.GetBase64FileType(file.name)};base64,${diffuseFile}`;
147
+ variationSettings.textureFilename = fileName;
148
+ }));
149
+ }
150
+ else if (file.name.indexOf('.jp') > -1) {
151
+ allLoaded.push(zipContent.files[fileName].async('base64').then((textureFile) => {
152
+ variationSettings.texture = 'data:image/jpeg;base64,' + textureFile;
153
+ variationSettings.textureFilename = fileName;
154
+ }));
155
+ }
156
+ else if (file.name.indexOf('.json') > -1) {
157
+ allLoaded.push(zipContent.files[fileName].async('string').then((settingsFile) => {
158
+ const settingsFileObj = JSON.parse(settingsFile);
159
+ for (const key in settingsFileObj) {
160
+ if (settingsFileObj[key]) {
161
+ variationSettings.settings[key] = settingsFileObj[key];
162
+ }
163
+ }
164
+ }));
165
+ }
166
+ }
167
+ }
168
+ yield Promise.all(allLoaded);
169
+ });
170
+ }
171
+ static LoadFileContentFromZip(zip, fileName, base64 = true) {
172
+ return new Promise((resolve) => {
173
+ if (zip && fileName) {
174
+ zip.async(base64 ? 'base64' : 'string').then((fileContent) => {
175
+ if (base64) {
176
+ resolve(`data:image/${this.GetBase64FileType(fileName)};base64,${fileContent}`);
177
+ }
178
+ else {
179
+ resolve(fileContent);
180
+ }
181
+ });
182
+ }
183
+ else {
184
+ resolve(undefined);
185
+ }
186
+ });
187
+ }
188
+ static FileIsImage(fileName) {
189
+ const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
190
+ switch (ext) {
191
+ case 'jpg':
192
+ case 'jpeg':
193
+ case 'png':
194
+ case 'bmp':
195
+ return true;
196
+ default:
197
+ return false;
198
+ }
199
+ }
200
+ static GetBase64FileType(fileName) {
201
+ const ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
202
+ switch (ext) {
203
+ case 'jpg':
204
+ case 'jpeg':
205
+ return 'jpeg';
206
+ case 'png':
207
+ return 'png';
208
+ case 'bmp':
209
+ return 'bmp';
210
+ default:
211
+ return 'jpeg';
212
+ }
213
+ }
214
+ // Get the content
215
+ static GetZipContent(file) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ const jszip = new JSZip();
218
+ const content = yield jszip.loadAsync(file);
219
+ return content;
220
+ });
221
+ }
222
+ }
223
+ VariationUtils.MaterialCache = new Map();
224
224
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWF0aW9uLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL3ZhcmlhdGlvbi11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFHL0IsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFHOUQsV0FBVztBQUNYLE1BQU0sT0FBTyxjQUFjO0lBR2xCLE1BQU0sQ0FBTyxhQUFhLENBQUMsU0FBaUIsRUFBRSxRQUFnQjs7WUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDYixPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdkM7WUFDRCxNQUFNLEVBQUUsR0FBVyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsSUFBSTtnQkFDRixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUIsU0FBUyxJQUFJLEdBQUcsQ0FBQztpQkFDbEI7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtvQkFDL0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO29CQUNoRSxPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxNQUFNLElBQUksR0FBUSxNQUFPLE1BQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDLGFBQWEsUUFBUSxFQUFFLENBQUMsQ0FBQztn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bXBvcnQgKiBhcyBKU1ppcCBmcm9tICdqc3ppcCc7XHJcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gXCIuL2ZpbGUudXRpbHNcIjtcclxuaW1wb3J0IHtWYXJpYXRpb25TZXR0aW5nc30gZnJvbSBcIi4uL21vZGVsL3ZhcmlhdGlvbi1zZXR0aW5nc1wiO1xyXG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgVmFyaWF0aW9uVXRpbHMge1xyXG4gIHByaXZhdGUgc3RhdGljIE1hdGVyaWFsQ2FjaGU6IE1hcDxzdHJpbmcsIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBhc3luYyBMb2FkVmFyaWF0aW9uKGFzc2V0UGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxWYXJpYXRpb25TZXR0aW5ncz4ge1xyXG4gICAgaWYgKCFmaWxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCdpb25lM2QnKSA8IDApIHtcclxuICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5jb25jYXQoJy5pb25lM2QnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBmaWxlTmFtZS5zdWJzdHIoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy5pb25lM2QnKSk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIWFzc2V0UGF0aC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZG93bmxvYWRWYXJpYXRpb24nKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Rvd25sb2FkVmFyaWF0aW9uIG5vdCBkZWZpbmVkIGluIHdpbmRvdyBnbG9iYWwnKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBmaWxlOiBhbnkgPSBhd2FpdCAod2luZG93IGFzIGFueSkuZG93bmxvYWRWYXJpYXRpb24oYCR7YXNzZXRQYXRoLnJlcGxhY2UoJ2h0dHBzOi8vY2RuMS5jb2xpam4taXQubmwvJywgJycpfXZhcmlhdGlvbi8ke2ZpbGVOYW1lfWApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgVmFyaWF0aW9uVXRpbHMuR2V0VmFyaWF0aW9uU2V0dGluZ3NGcm9tRmlsZShpZCwgZmlsZSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc3QgbXV0ZSA9IGVycjtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIEdldE1hdGVyaWFsRnJvbU5hbWUodmFyaWF0aW9uRm9sZGVyOiBzdHJpbmcsIG1hdGVyaWFsOiBhbnkpOiBQcm9taXNlPE1lc2hTdGFuZGFyZE1hdGVyaWFsPiB7XHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgLy8gICAgIGlmICghbWF0ZXJpYWwpIHtcclxuICAvLyAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmICh0aGlzLk1hdGVyaWFsQ2FjaGUuaGFzKG1hdGVyaWFsLm5hbWUpKSB7XHJcbiAgLy8gICAgICAgcmVzb2x2ZSh0aGlzLk1hdGVyaWFsQ2FjaGUuZ2V0KG1hdGVyaWFsLm5hbWUpLmNsb25lKCkpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb24odmFyaWF0aW9uRm9sZGVyLCBtYXRlcmlhbC5uYW1lLCBmYWxzZSkudGhlbigoc2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoc2V0dGluZ3MpIHtcclxuICAvLyAgICAgICAgICAgQXNzZXRVdGlscy5DcmVhdGVNYXRlcmlhbEZyb21Bc3NldChzZXR0aW5ncykudGhlbigobWF0ZXJpYWxPYmo6IE1hdGVyaWFsKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWxQYXJhbXM6IE1lc2hTdGFuZGFyZE1hdGVyaWFsUGFyYW1ldGVycyA9IHt9O1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm5hbWUgPSBtYXRlcmlhbC5uYW1lO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1hcCA9IG1hdGVyaWFsT2JqLnRleHR1cmU7XHJcbiAgLy8gICAgICAgICAgICAgbWF0ZXJpYWxQYXJhbXMubm9ybWFsTWFwID0gbWF0ZXJpYWxPYmoubm9ybWFsO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLmFvTWFwID0gbWF0ZXJpYWxPYmouYW87XHJcbiAgLy8gICAgICAgICAgICAgbWF0ZXJpYWxQYXJhbXMucm91Z2huZXNzTWFwID0gbWF0ZXJpYWxPYmoucm91Z2huZXNzO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzc01hcCA9IG1hdGVyaWFsT2JqLm1ldGFsbmVzcztcclxuICAvLyAgICAgICAgICAgICBtYXRlcmlhbFBhcmFtcy5yb3VnaG5lc3MgPSAxO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzcyA9IDE7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgcGJyTWF0OiBNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IG5ldyBNZXNoU3RhbmRhcmRNYXRlcmlhbChtYXRlcmlhbFBhcmFtcyk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5NYXRlcmlhbENhY2hlLnNldChtYXRlcmlhbC5uYW1lLCBwYnJNYXQpO1xyXG4gIC8vICAgICAgICAgICAgIHJlc29sdmUocGJyTWF0LmNsb25lKCkpO1xyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIHJlc29sdmUobWF0ZXJpYWwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEdldFZhcmlhdGlvblNldHRpbmdzRnJvbUZpbGUoaWQ6IHN0cmluZywgY29tcHJlc3NlZEZpbGU6IGFueSk6IFByb21pc2U8VmFyaWF0aW9uU2V0dGluZ3M+IHtcclxuICAgIGlmICghY29tcHJlc3NlZEZpbGUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCB6aXBDb250ZW50ID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuR2V0WmlwQ29udGVudChjb21wcmVzc2VkRmlsZSk7XHJcbiAgICBjb25zdCB2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MgPSBuZXcgVmFyaWF0aW9uU2V0dGluZ3MoKTtcclxuICAgIGxldCBpbmRleDtcclxuICAgIHZhcmlhdGlvblNldHRpbmdzLmlkID0gaWQ7XHJcblxyXG4gICAgaWYgKHppcENvbnRlbnQuZmlsZXNbJ2luZGV4Lmpzb24nXSkge1xyXG4gICAgICBjb25zdCBpbmRleEZpbGU6IHN0cmluZyA9IGF3YWl0IHppcENvbnRlbnQuZmlsZXNbJ2luZGV4Lmpzb24nXS5hc3luYygnc3RyaW5nJyk7XHJcbiAgICAgIGluZGV4ID0gSlNPTi5wYXJzZShpbmRleEZpbGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4KSB7XHJcbiAgICAgIGF3YWl0IFZhcmlhdGlvblV0aWxzLkNyZWF0ZVNldHRpbmdzQmFzZWRPbkluZGV4KGluZGV4LCB2YXJpYXRpb25TZXR0aW5ncywgemlwQ29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCBWYXJpYXRpb25VdGlscy5DcmVhdGVTZXR0aW5nc0Jhc2VkT25GaWxlTmFtZSh2YXJpYXRpb25TZXR0aW5ncywgemlwQ29udGVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFyaWF0aW9uU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBDcmVhdGVTZXR0aW5nc0Jhc2VkT25JbmRleChpbmRleDogYW55LCB2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MsIHppcENvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGluZGV4Lm5vcm1hbEZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mubm9ybWFsID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4Lm5vcm1hbEZpbGVdLCBpbmRleC5ub3JtYWxGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mubm9ybWFsRmlsZW5hbWUgPSBpbmRleC5ub3JtYWxGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LmFvRmlsZSkge1xyXG4gICAgICB2YXJpYXRpb25TZXR0aW5ncy5hbyA9IGF3YWl0IFZhcmlhdGlvblV0aWxzLkxvYWRGaWxlQ29udGVudEZyb21aaXAoemlwQ29udGVudC5maWxlc1tpbmRleC5hb0ZpbGVdLCBpbmRleC5hb0ZpbGUpO1xyXG4gICAgICB2YXJpYXRpb25TZXR0aW5ncy5hb0ZpbGVuYW1lID0gaW5kZXguYW9GaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4Lm1ldGFsbmVzc0ZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3MubWV0YWxuZXNzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4Lm1ldGFsbmVzc0ZpbGVdLCBpbmRleC5tZXRhbG5lc3NGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3MubWV0YWxuZXNzRmlsZW5hbWUgPSBpbmRleC5tZXRhbG5lc3NGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LnJvdWdobmVzc0ZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mucm91Z2huZXNzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4LnJvdWdobmVzc0ZpbGVdLCBpbmRleC5yb3VnaG5lc3NGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mucm91Z2huZXNzRmlsZW5hbWUgPSBpbmRleC5yb3VnaG5lc3NGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LmRpZmZ1c2VGaWxlKSB7XHJcbiAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmUgPSBhd2FpdCBWYXJpYXRpb25VdGlscy5Mb2FkRmlsZUNvbnRlbnRGcm9tWmlwKHppcENvbnRlbnQuZmlsZXNbaW5kZXguZGlmZnVzZUZpbGVdLCBpbmRleC5kaWZmdXNlRmlsZSk7XHJcbiAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGluZGV4LmRpZmZ1c2VGaWxlO1xyXG4gICAgfVxyXG4gICAgdmFyaWF0aW9uU2V0dGluZ3Muc2V0dGluZ3MgPVxyXG4gICAgICBhd2FpdCBWYXJpYXRpb25VdGlscy5Mb2FkRmlsZUNvbnRlbnRGcm9tWmlwKHppcENvbnRlbnQuZmlsZXNbJ3JlcGVhdC5qc29uJ10sICdyZXBlYXQuanNvbicsIGZhbHNlKSB8fCB7fTtcclxuICAgIE9iamVjdC5hc3NpZ24odmFyaWF0aW9uU2V0dGluZ3Muc2V0dGluZ3MsIGluZGV4LnJlcGVhdCk7XHJcbiAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5ncy5tZXRhbG5lc3MgPSBpbmRleC5tZXRhbG5lc3M7XHJcbiAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5ncy5yb3VnaG5lc3MgPSBpbmRleC5yb3VnaG5lc3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBDcmVhdGVTZXR0aW5nc0Jhc2VkT25GaWxlTmFtZSh2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MsIHppcENvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWxsTG9hZGVkOiBQcm9taXNlPFZhcmlhdGlvblNldHRpbmdzPltdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIGluIHppcENvbnRlbnQuZmlsZXMpIHtcclxuICAgICAgaWYgKHppcENvbnRlbnQuZmlsZXNbZmlsZU5hbWVdKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZTogYW55ID0gYXdhaXQgemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV07XHJcbiAgICAgICAgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ25vcm1hbCcpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigobm9ybWFsRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm5vcm1hbCA9IGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlLm5hbWUpfTtiYXNlNjQsJHtub3JtYWxGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm5vcm1hbEZpbGVuYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdhbycpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigoYW9GaWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdmFyaWF0aW9uU2V0dGluZ3MuYW8gPSBgZGF0YTppbWFnZS8ke3RoaXMuR2V0QmFzZTY0RmlsZVR5cGUoZmlsZS5uYW1lKX07YmFzZTY0LCR7YW9GaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLmFvRmlsZW5hbWUgPSBmaWxlTmFtZTtcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ21ldGFsbmVzcycpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigobWV0YWxuZXNzRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm1ldGFsbmVzcyA9IGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlLm5hbWUpfTtiYXNlNjQsJHttZXRhbG5lc3NGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm1ldGFsbmVzc0ZpbGVuYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdyb3VnaG5lc3MnKSA+IC0xICYmIHRoaXMuRmlsZUlzSW1hZ2UoZmlsZS5uYW1lKSkge1xyXG4gICAgICAgICAgYWxsTG9hZGVkLnB1c2goemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV0uYXN5bmMoJ2Jhc2U2NCcpLnRoZW4oKHJvdWdobmVzc0ZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5yb3VnaG5lc3MgPSBgZGF0YTppbWFnZS8ke3RoaXMuR2V0QmFzZTY0RmlsZVR5cGUoZmlsZS5uYW1lKX07YmFzZTY0LCR7cm91Z2huZXNzRmlsZX1gO1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5yb3VnaG5lc3NGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZGlmZnVzZScpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigoZGlmZnVzZUZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy50ZXh0dXJlID0gYGRhdGE6aW1hZ2UvJHt0aGlzLkdldEJhc2U2NEZpbGVUeXBlKGZpbGUubmFtZSl9O2Jhc2U2NCwke2RpZmZ1c2VGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLmluZGV4T2YoJy5qcCcpID4gLTEpIHtcclxuICAgICAgICAgIGFsbExvYWRlZC5wdXNoKHppcENvbnRlbnQuZmlsZXNbZmlsZU5hbWVdLmFzeW5jKCdiYXNlNjQnKS50aGVuKCh0ZXh0dXJlRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmUgPSAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgdGV4dHVyZUZpbGU7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLmluZGV4T2YoJy5qc29uJykgPiAtMSkge1xyXG4gICAgICAgICAgYWxsTG9hZGVkLnB1c2goemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV0uYXN5bmMoJ3N0cmluZycpLnRoZW4oKHNldHRpbmdzRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzRmlsZU9iaiA9IEpTT04ucGFyc2Uoc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2V0dGluZ3NGaWxlT2JqKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzRmlsZU9ialtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5nc1trZXldID0gc2V0dGluZ3NGaWxlT2JqW2tleV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChhbGxMb2FkZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXA6IGFueSwgZmlsZU5hbWU6IHN0cmluZywgYmFzZTY0OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGlmICh6aXAgJiYgZmlsZU5hbWUpIHtcclxuICAgICAgICB6aXAuYXN5bmMoYmFzZTY0ID8gJ2Jhc2U2NCcgOiAnc3RyaW5nJykudGhlbigoZmlsZUNvbnRlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGJhc2U2NCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlTmFtZSl9O2Jhc2U2NCwke2ZpbGVDb250ZW50fWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShmaWxlQ29udGVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEZpbGVJc0ltYWdlKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGV4dDogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlICdqcGcnOlxyXG4gICAgICBjYXNlICdqcGVnJzpcclxuICAgICAgY2FzZSAncG5nJzpcclxuICAgICAgY2FzZSAnYm1wJzpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBHZXRCYXNlNjRGaWxlVHlwZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGV4dDogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlICdqcGcnOlxyXG4gICAgICBjYXNlICdqcGVnJzpcclxuICAgICAgICByZXR1cm4gJ2pwZWcnO1xyXG4gICAgICBjYXNlICdwbmcnOlxyXG4gICAgICAgIHJldHVybiAncG5nJztcclxuICAgICAgY2FzZSAnYm1wJzpcclxuICAgICAgICByZXR1cm4gJ2JtcCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdqcGVnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdldCB0aGUgY29udGVudFxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEdldFppcENvbnRlbnQoZmlsZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBqc3ppcCA9IG5ldyBKU1ppcCgpO1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGpzemlwLmxvYWRBc3luYyhmaWxlKTtcclxuICAgIHJldHVybiBjb250ZW50O1xyXG4gIH1cclxufVxyXG4iXX0=