@colijnit/configurator 1.0.20 → 1.0.21

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 (158) hide show
  1. package/.idea/Configurator.iml +12 -0
  2. package/.idea/codeStyles/Project.xml +21 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. package/.idea/misc.xml +9 -0
  6. package/.idea/modules.xml +8 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/angular.json +193 -0
  9. package/configurator.iml +11 -0
  10. package/dist/configurator/index.html +14 -0
  11. package/dist/configurator/main-es2015.js +3129 -0
  12. package/dist/configurator/main-es2015.js.map +1 -0
  13. package/dist/configurator/main-es5.js +5482 -0
  14. package/dist/configurator/main-es5.js.map +1 -0
  15. package/dist/configurator/polyfills-es2015.js +4520 -0
  16. package/dist/configurator/polyfills-es2015.js.map +1 -0
  17. package/dist/configurator/polyfills-es5.js +18375 -0
  18. package/dist/configurator/polyfills-es5.js.map +1 -0
  19. package/dist/configurator/runtime-es2015.js +155 -0
  20. package/dist/configurator/runtime-es2015.js.map +1 -0
  21. package/dist/configurator/runtime-es5.js +155 -0
  22. package/dist/configurator/runtime-es5.js.map +1 -0
  23. package/dist/configurator/styles-es2015.js +450 -0
  24. package/dist/configurator/styles-es2015.js.map +1 -0
  25. package/dist/configurator/styles-es5.js +432 -0
  26. package/dist/configurator/styles-es5.js.map +1 -0
  27. package/dist/configurator/vendor-es2015.js +155551 -0
  28. package/dist/configurator/vendor-es2015.js.map +1 -0
  29. package/dist/configurator/vendor-es5.js +183588 -0
  30. package/dist/configurator/vendor-es5.js.map +1 -0
  31. package/ng-package.json +9 -0
  32. package/package.json +47 -14
  33. package/src/app/app.component.ts +222 -0
  34. package/src/app/app.module.ts +34 -0
  35. package/src/app/builder.ts +480 -0
  36. package/src/app/components/answers/answer/answer.component.ts +61 -0
  37. package/src/app/components/answers/answers.component.ts +41 -0
  38. package/src/app/components/answers/answers.module.ts +26 -0
  39. package/src/app/components/selections/selections.component.ts +131 -0
  40. package/src/app/components/selections/selections.module.ts +20 -0
  41. package/src/app/components/shared/loader/loader.component.scss +33 -0
  42. package/src/app/components/shared/loader/loader.component.ts +20 -0
  43. package/src/app/components/shared/shared.module.ts +16 -0
  44. package/src/app/directives/visibility-observer-master.directive.ts +71 -0
  45. package/src/app/directives/visibility-observer.directive.ts +74 -0
  46. package/src/app/services/configurator.service.ts +86 -0
  47. package/src/app/services/image-cache.service.ts +56 -0
  48. package/src/app/services/locator.service.ts +6 -0
  49. package/src/environments/environment.prod.ts +3 -0
  50. package/src/environments/environment.ts +8 -0
  51. package/src/helper/variation-helper.ts +220 -0
  52. package/src/index.html +14 -0
  53. package/src/main.ts +11 -0
  54. package/src/model/material.ts +22 -0
  55. package/src/model/variation-settings.ts +14 -0
  56. package/src/model/variation.ts +11 -0
  57. package/src/polyfills.ts +73 -0
  58. package/{public_api.d.ts → src/public_api.ts} +6 -6
  59. package/src/style/shared.scss +173 -0
  60. package/src/style/styles.scss +45 -0
  61. package/src/tsconfig.app.json +16 -0
  62. package/src/tsconfig.spec.json +19 -0
  63. package/src/utils/asset.utils.ts +88 -0
  64. package/src/utils/file.utils.ts +156 -0
  65. package/src/utils/file.utils.unit.test.ts +8 -0
  66. package/src/utils/image.utils.ts +54 -0
  67. package/src/utils/object.utils.ts +52 -0
  68. package/src/utils/scene-utils.ts +119 -0
  69. package/src/utils/threed.utils.ts +219 -0
  70. package/src/utils/variation-utils.ts +216 -0
  71. package/tsconfig.json +23 -0
  72. package/tslint.json +132 -0
  73. package/app/builder.d.ts +0 -53
  74. package/app/components/answers/answer/answer.component.d.ts +0 -11
  75. package/app/components/answers/answers.component.d.ts +0 -8
  76. package/app/components/answers/answers.module.d.ts +0 -2
  77. package/app/components/selections/selections.component.d.ts +0 -22
  78. package/app/components/selections/selections.module.d.ts +0 -2
  79. package/app/components/shared/loader/loader.component.d.ts +0 -2
  80. package/app/components/shared/shared.module.d.ts +0 -2
  81. package/app/directives/visibility-observer-master.directive.d.ts +0 -9
  82. package/app/directives/visibility-observer.directive.d.ts +0 -13
  83. package/app/services/configurator.service.d.ts +0 -22
  84. package/app/services/image-cache.service.d.ts +0 -10
  85. package/app/services/locator.service.d.ts +0 -4
  86. package/bundles/colijnit-configurator.umd.js +0 -2745
  87. package/bundles/colijnit-configurator.umd.js.map +0 -1
  88. package/bundles/colijnit-configurator.umd.min.js +0 -17
  89. package/bundles/colijnit-configurator.umd.min.js.map +0 -1
  90. package/colijnit-configurator.d.ts +0 -10
  91. package/colijnit-configurator.metadata.json +0 -1
  92. package/esm2015/app/builder.js +0 -477
  93. package/esm2015/app/components/answers/answer/answer.component.js +0 -69
  94. package/esm2015/app/components/answers/answers.component.js +0 -43
  95. package/esm2015/app/components/answers/answers.module.js +0 -29
  96. package/esm2015/app/components/selections/selections.component.js +0 -134
  97. package/esm2015/app/components/selections/selections.module.js +0 -23
  98. package/esm2015/app/components/shared/loader/loader.component.js +0 -24
  99. package/esm2015/app/components/shared/shared.module.js +0 -21
  100. package/esm2015/app/directives/visibility-observer-master.directive.js +0 -51
  101. package/esm2015/app/directives/visibility-observer.directive.js +0 -57
  102. package/esm2015/app/services/configurator.service.js +0 -94
  103. package/esm2015/app/services/image-cache.service.js +0 -66
  104. package/esm2015/app/services/locator.service.js +0 -10
  105. package/esm2015/colijnit-configurator.js +0 -11
  106. package/esm2015/helper/variation-helper.js +0 -216
  107. package/esm2015/model/material.js +0 -11
  108. package/esm2015/model/variation-settings.js +0 -6
  109. package/esm2015/model/variation.js +0 -3
  110. package/esm2015/public_api.js +0 -7
  111. package/esm2015/utils/asset.utils.js +0 -74
  112. package/esm2015/utils/file.utils.js +0 -139
  113. package/esm2015/utils/image.utils.js +0 -52
  114. package/esm2015/utils/object.utils.js +0 -49
  115. package/esm2015/utils/scene-utils.js +0 -94
  116. package/esm2015/utils/threed.utils.js +0 -222
  117. package/esm2015/utils/variation-utils.js +0 -224
  118. package/esm5/app/builder.js +0 -591
  119. package/esm5/app/components/answers/answer/answer.component.js +0 -64
  120. package/esm5/app/components/answers/answers.component.js +0 -27
  121. package/esm5/app/components/answers/answers.module.js +0 -32
  122. package/esm5/app/components/selections/selections.component.js +0 -104
  123. package/esm5/app/components/selections/selections.module.js +0 -26
  124. package/esm5/app/components/shared/loader/loader.component.js +0 -16
  125. package/esm5/app/components/shared/shared.module.js +0 -24
  126. package/esm5/app/directives/visibility-observer-master.directive.js +0 -64
  127. package/esm5/app/directives/visibility-observer.directive.js +0 -59
  128. package/esm5/app/services/configurator.service.js +0 -160
  129. package/esm5/app/services/image-cache.service.js +0 -69
  130. package/esm5/app/services/locator.service.js +0 -13
  131. package/esm5/colijnit-configurator.js +0 -11
  132. package/esm5/helper/variation-helper.js +0 -268
  133. package/esm5/model/material.js +0 -13
  134. package/esm5/model/variation-settings.js +0 -8
  135. package/esm5/model/variation.js +0 -7
  136. package/esm5/public_api.js +0 -7
  137. package/esm5/utils/asset.utils.js +0 -106
  138. package/esm5/utils/file.utils.js +0 -151
  139. package/esm5/utils/image.utils.js +0 -56
  140. package/esm5/utils/object.utils.js +0 -56
  141. package/esm5/utils/scene-utils.js +0 -98
  142. package/esm5/utils/threed.utils.js +0 -279
  143. package/esm5/utils/variation-utils.js +0 -327
  144. package/fesm2015/colijnit-configurator.js +0 -2109
  145. package/fesm2015/colijnit-configurator.js.map +0 -1
  146. package/fesm5/colijnit-configurator.js +0 -2527
  147. package/fesm5/colijnit-configurator.js.map +0 -1
  148. package/helper/variation-helper.d.ts +0 -14
  149. package/model/material.d.ts +0 -17
  150. package/model/variation-settings.d.ts +0 -14
  151. package/model/variation.d.ts +0 -10
  152. package/utils/asset.utils.d.ts +0 -13
  153. package/utils/file.utils.d.ts +0 -27
  154. package/utils/image.utils.d.ts +0 -8
  155. package/utils/object.utils.d.ts +0 -7
  156. package/utils/scene-utils.d.ts +0 -7
  157. package/utils/threed.utils.d.ts +0 -16
  158. package/utils/variation-utils.d.ts +0 -12
@@ -1,327 +0,0 @@
1
- import { __awaiter, __generator } from "tslib";
2
- import * as JSZip from 'jszip';
3
- import { VariationSettings } from "../model/variation-settings";
4
- // @dynamic
5
- var VariationUtils = /** @class */ (function () {
6
- function VariationUtils() {
7
- }
8
- VariationUtils.LoadVariation = function (assetPath, fileName) {
9
- return __awaiter(this, void 0, void 0, function () {
10
- var id, file, err_1, mute;
11
- return __generator(this, function (_a) {
12
- switch (_a.label) {
13
- case 0:
14
- if (!fileName) {
15
- return [2 /*return*/, null];
16
- }
17
- if (fileName.indexOf('ione3d') < 0) {
18
- fileName = fileName.concat('.ione3d');
19
- }
20
- id = fileName.substr(0, fileName.lastIndexOf('.ione3d'));
21
- _a.label = 1;
22
- case 1:
23
- _a.trys.push([1, 4, , 5]);
24
- if (!assetPath.endsWith('/')) {
25
- assetPath += '/';
26
- }
27
- if (!window.hasOwnProperty('downloadVariation')) {
28
- console.error('downloadVariation not defined in window global');
29
- return [2 /*return*/, null];
30
- }
31
- return [4 /*yield*/, window.downloadVariation(assetPath.replace('https://cdn1.colijn-it.nl/', '') + "variation/" + fileName)];
32
- case 2:
33
- file = _a.sent();
34
- return [4 /*yield*/, VariationUtils.GetVariationSettingsFromFile(id, file)];
35
- case 3: return [2 /*return*/, _a.sent()];
36
- case 4:
37
- err_1 = _a.sent();
38
- mute = err_1;
39
- return [2 /*return*/, null];
40
- case 5: return [2 /*return*/];
41
- }
42
- });
43
- });
44
- };
45
- // public static GetMaterialFromName(variationFolder: string, material: any): Promise<MeshStandardMaterial> {
46
- // return new Promise((resolve: Function) => {
47
- // if (!material) {
48
- // resolve(null);
49
- // }
50
- // if (this.MaterialCache.has(material.name)) {
51
- // resolve(this.MaterialCache.get(material.name).clone());
52
- // } else {
53
- // VariationUtils.LoadVariation(variationFolder, material.name, false).then((settings: VariationSettings) => {
54
- // if (settings) {
55
- // AssetUtils.CreateMaterialFromAsset(settings).then((materialObj: Material) => {
56
- // const materialParams: MeshStandardMaterialParameters = {};
57
- // materialParams.name = material.name;
58
- // materialParams.map = materialObj.texture;
59
- // materialParams.normalMap = materialObj.normal;
60
- // materialParams.aoMap = materialObj.ao;
61
- // materialParams.roughnessMap = materialObj.roughness;
62
- // materialParams.metalnessMap = materialObj.metalness;
63
- // materialParams.roughness = 1;
64
- // materialParams.metalness = 1;
65
- // const pbrMat: MeshStandardMaterial = new MeshStandardMaterial(materialParams);
66
- // this.MaterialCache.set(material.name, pbrMat);
67
- // resolve(pbrMat.clone());
68
- // });
69
- // } else {
70
- // resolve(material);
71
- // }
72
- // });
73
- // }
74
- // });
75
- // }
76
- VariationUtils.GetVariationSettingsFromFile = function (id, compressedFile) {
77
- return __awaiter(this, void 0, void 0, function () {
78
- var zipContent, variationSettings, index, indexFile;
79
- return __generator(this, function (_a) {
80
- switch (_a.label) {
81
- case 0:
82
- if (!compressedFile) {
83
- return [2 /*return*/, null];
84
- }
85
- return [4 /*yield*/, VariationUtils.GetZipContent(compressedFile)];
86
- case 1:
87
- zipContent = _a.sent();
88
- variationSettings = new VariationSettings();
89
- variationSettings.id = id;
90
- if (!zipContent.files['index.json']) return [3 /*break*/, 3];
91
- return [4 /*yield*/, zipContent.files['index.json'].async('string')];
92
- case 2:
93
- indexFile = _a.sent();
94
- index = JSON.parse(indexFile);
95
- _a.label = 3;
96
- case 3:
97
- if (!index) return [3 /*break*/, 5];
98
- return [4 /*yield*/, VariationUtils.CreateSettingsBasedOnIndex(index, variationSettings, zipContent)];
99
- case 4:
100
- _a.sent();
101
- return [3 /*break*/, 7];
102
- case 5: return [4 /*yield*/, VariationUtils.CreateSettingsBasedOnFileName(variationSettings, zipContent)];
103
- case 6:
104
- _a.sent();
105
- _a.label = 7;
106
- case 7: return [2 /*return*/, variationSettings];
107
- }
108
- });
109
- });
110
- };
111
- VariationUtils.CreateSettingsBasedOnIndex = function (index, variationSettings, zipContent) {
112
- return __awaiter(this, void 0, void 0, function () {
113
- var _a, _b, _c, _d, _e, _f;
114
- return __generator(this, function (_g) {
115
- switch (_g.label) {
116
- case 0:
117
- if (!index.normalFile) return [3 /*break*/, 2];
118
- _a = variationSettings;
119
- return [4 /*yield*/, VariationUtils.LoadFileContentFromZip(zipContent.files[index.normalFile], index.normalFile)];
120
- case 1:
121
- _a.normal = _g.sent();
122
- variationSettings.normalFilename = index.normalFile;
123
- _g.label = 2;
124
- case 2:
125
- if (!index.aoFile) return [3 /*break*/, 4];
126
- _b = variationSettings;
127
- return [4 /*yield*/, VariationUtils.LoadFileContentFromZip(zipContent.files[index.aoFile], index.aoFile)];
128
- case 3:
129
- _b.ao = _g.sent();
130
- variationSettings.aoFilename = index.aoFile;
131
- _g.label = 4;
132
- case 4:
133
- if (!index.metalnessFile) return [3 /*break*/, 6];
134
- _c = variationSettings;
135
- return [4 /*yield*/, VariationUtils.LoadFileContentFromZip(zipContent.files[index.metalnessFile], index.metalnessFile)];
136
- case 5:
137
- _c.metalness = _g.sent();
138
- variationSettings.metalnessFilename = index.metalnessFile;
139
- _g.label = 6;
140
- case 6:
141
- if (!index.roughnessFile) return [3 /*break*/, 8];
142
- _d = variationSettings;
143
- return [4 /*yield*/, VariationUtils.LoadFileContentFromZip(zipContent.files[index.roughnessFile], index.roughnessFile)];
144
- case 7:
145
- _d.roughness = _g.sent();
146
- variationSettings.roughnessFilename = index.roughnessFile;
147
- _g.label = 8;
148
- case 8:
149
- if (!index.diffuseFile) return [3 /*break*/, 10];
150
- _e = variationSettings;
151
- return [4 /*yield*/, VariationUtils.LoadFileContentFromZip(zipContent.files[index.diffuseFile], index.diffuseFile)];
152
- case 9:
153
- _e.texture = _g.sent();
154
- variationSettings.textureFilename = index.diffuseFile;
155
- _g.label = 10;
156
- case 10:
157
- _f = variationSettings;
158
- return [4 /*yield*/, VariationUtils.LoadFileContentFromZip(zipContent.files['repeat.json'], 'repeat.json', false)];
159
- case 11:
160
- _f.settings =
161
- (_g.sent()) || {};
162
- Object.assign(variationSettings.settings, index.repeat);
163
- variationSettings.settings.metalness = index.metalness;
164
- variationSettings.settings.roughness = index.roughness;
165
- return [2 /*return*/];
166
- }
167
- });
168
- });
169
- };
170
- VariationUtils.CreateSettingsBasedOnFileName = function (variationSettings, zipContent) {
171
- return __awaiter(this, void 0, void 0, function () {
172
- var allLoaded, _loop_1, this_1, _a, _b, _i, fileName;
173
- var _this = this;
174
- return __generator(this, function (_c) {
175
- switch (_c.label) {
176
- case 0:
177
- allLoaded = [];
178
- _loop_1 = function (fileName) {
179
- var file_1;
180
- return __generator(this, function (_a) {
181
- switch (_a.label) {
182
- case 0:
183
- if (!zipContent.files[fileName]) return [3 /*break*/, 2];
184
- return [4 /*yield*/, zipContent.files[fileName]];
185
- case 1:
186
- file_1 = _a.sent();
187
- if (file_1.name.toLowerCase().indexOf('normal') > -1 && this_1.FileIsImage(file_1.name)) {
188
- allLoaded.push(zipContent.files[fileName].async('base64').then(function (normalFile) {
189
- variationSettings.normal = "data:image/" + _this.GetBase64FileType(file_1.name) + ";base64," + normalFile;
190
- variationSettings.normalFilename = fileName;
191
- }));
192
- }
193
- else if (file_1.name.toLowerCase().indexOf('ao') > -1 && this_1.FileIsImage(file_1.name)) {
194
- allLoaded.push(zipContent.files[fileName].async('base64').then(function (aoFile) {
195
- variationSettings.ao = "data:image/" + _this.GetBase64FileType(file_1.name) + ";base64," + aoFile;
196
- variationSettings.aoFilename = fileName;
197
- }));
198
- }
199
- else if (file_1.name.toLowerCase().indexOf('metalness') > -1 && this_1.FileIsImage(file_1.name)) {
200
- allLoaded.push(zipContent.files[fileName].async('base64').then(function (metalnessFile) {
201
- variationSettings.metalness = "data:image/" + _this.GetBase64FileType(file_1.name) + ";base64," + metalnessFile;
202
- variationSettings.metalnessFilename = fileName;
203
- }));
204
- }
205
- else if (file_1.name.toLowerCase().indexOf('roughness') > -1 && this_1.FileIsImage(file_1.name)) {
206
- allLoaded.push(zipContent.files[fileName].async('base64').then(function (roughnessFile) {
207
- variationSettings.roughness = "data:image/" + _this.GetBase64FileType(file_1.name) + ";base64," + roughnessFile;
208
- variationSettings.roughnessFilename = fileName;
209
- }));
210
- }
211
- else if (file_1.name.toLowerCase().indexOf('diffuse') > -1 && this_1.FileIsImage(file_1.name)) {
212
- allLoaded.push(zipContent.files[fileName].async('base64').then(function (diffuseFile) {
213
- variationSettings.texture = "data:image/" + _this.GetBase64FileType(file_1.name) + ";base64," + diffuseFile;
214
- variationSettings.textureFilename = fileName;
215
- }));
216
- }
217
- else if (file_1.name.indexOf('.jp') > -1) {
218
- allLoaded.push(zipContent.files[fileName].async('base64').then(function (textureFile) {
219
- variationSettings.texture = 'data:image/jpeg;base64,' + textureFile;
220
- variationSettings.textureFilename = fileName;
221
- }));
222
- }
223
- else if (file_1.name.indexOf('.json') > -1) {
224
- allLoaded.push(zipContent.files[fileName].async('string').then(function (settingsFile) {
225
- var settingsFileObj = JSON.parse(settingsFile);
226
- for (var key in settingsFileObj) {
227
- if (settingsFileObj[key]) {
228
- variationSettings.settings[key] = settingsFileObj[key];
229
- }
230
- }
231
- }));
232
- }
233
- _a.label = 2;
234
- case 2: return [2 /*return*/];
235
- }
236
- });
237
- };
238
- this_1 = this;
239
- _a = [];
240
- for (_b in zipContent.files)
241
- _a.push(_b);
242
- _i = 0;
243
- _c.label = 1;
244
- case 1:
245
- if (!(_i < _a.length)) return [3 /*break*/, 4];
246
- fileName = _a[_i];
247
- return [5 /*yield**/, _loop_1(fileName)];
248
- case 2:
249
- _c.sent();
250
- _c.label = 3;
251
- case 3:
252
- _i++;
253
- return [3 /*break*/, 1];
254
- case 4: return [4 /*yield*/, Promise.all(allLoaded)];
255
- case 5:
256
- _c.sent();
257
- return [2 /*return*/];
258
- }
259
- });
260
- });
261
- };
262
- VariationUtils.LoadFileContentFromZip = function (zip, fileName, base64) {
263
- var _this = this;
264
- if (base64 === void 0) { base64 = true; }
265
- return new Promise(function (resolve) {
266
- if (zip && fileName) {
267
- zip.async(base64 ? 'base64' : 'string').then(function (fileContent) {
268
- if (base64) {
269
- resolve("data:image/" + _this.GetBase64FileType(fileName) + ";base64," + fileContent);
270
- }
271
- else {
272
- resolve(fileContent);
273
- }
274
- });
275
- }
276
- else {
277
- resolve(undefined);
278
- }
279
- });
280
- };
281
- VariationUtils.FileIsImage = function (fileName) {
282
- var ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
283
- switch (ext) {
284
- case 'jpg':
285
- case 'jpeg':
286
- case 'png':
287
- case 'bmp':
288
- return true;
289
- default:
290
- return false;
291
- }
292
- };
293
- VariationUtils.GetBase64FileType = function (fileName) {
294
- var ext = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();
295
- switch (ext) {
296
- case 'jpg':
297
- case 'jpeg':
298
- return 'jpeg';
299
- case 'png':
300
- return 'png';
301
- case 'bmp':
302
- return 'bmp';
303
- default:
304
- return 'jpeg';
305
- }
306
- };
307
- // Get the content
308
- VariationUtils.GetZipContent = function (file) {
309
- return __awaiter(this, void 0, void 0, function () {
310
- var jszip, content;
311
- return __generator(this, function (_a) {
312
- switch (_a.label) {
313
- case 0:
314
- jszip = new JSZip();
315
- return [4 /*yield*/, jszip.loadAsync(file)];
316
- case 1:
317
- content = _a.sent();
318
- return [2 /*return*/, content];
319
- }
320
- });
321
- });
322
- };
323
- VariationUtils.MaterialCache = new Map();
324
- return VariationUtils;
325
- }());
326
- export { VariationUtils };
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWF0aW9uLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL3ZhcmlhdGlvbi11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFHL0IsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFHOUQsV0FBVztBQUNYO0lBQUE7SUFnTkEsQ0FBQztJQTdNcUIsNEJBQWEsR0FBakMsVUFBa0MsU0FBaUIsRUFBRSxRQUFnQjs7Ozs7O3dCQUNuRSxJQUFJLENBQUMsUUFBUSxFQUFFOzRCQUNiLHNCQUFPLElBQUksRUFBQzt5QkFDYjt3QkFDRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFOzRCQUNsQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzt5QkFDdkM7d0JBQ0ssRUFBRSxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7Ozt3QkFFckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQzVCLFNBQVMsSUFBSSxHQUFHLENBQUM7eUJBQ2xCO3dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7NEJBQy9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQzs0QkFDaEUsc0JBQU8sSUFBSSxFQUFDO3lCQUNiO3dCQUNpQixxQkFBTyxNQUFjLENBQUMsaUJBQWlCLENBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLENBQUMsa0JBQWEsUUFBVSxDQUFDLEVBQUE7O3dCQUFsSSxJQUFJLEdBQVEsU0FBc0g7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QUNWLHFCQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUE7O3dCQUFyQyxPQUFPLEdBQUcsU0FBMkI7d0JBQzNDLHNCQUFPLE9BQU8sRUFBQzs7OztLQUNoQjtJQTlNYyw0QkFBYSxHQUE0QyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBK01wRixxQkFBQztDQUFBLEFBaE5ELElBZ05DO1NBaE5ZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBKU1ppcCBmcm9tICdqc3ppcCc7XHJcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gXCIuL2ZpbGUudXRpbHNcIjtcclxuaW1wb3J0IHtWYXJpYXRpb25TZXR0aW5nc30gZnJvbSBcIi4uL21vZGVsL3ZhcmlhdGlvbi1zZXR0aW5nc1wiO1xyXG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgVmFyaWF0aW9uVXRpbHMge1xyXG4gIHByaXZhdGUgc3RhdGljIE1hdGVyaWFsQ2FjaGU6IE1hcDxzdHJpbmcsIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBhc3luYyBMb2FkVmFyaWF0aW9uKGFzc2V0UGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxWYXJpYXRpb25TZXR0aW5ncz4ge1xyXG4gICAgaWYgKCFmaWxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCdpb25lM2QnKSA8IDApIHtcclxuICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5jb25jYXQoJy5pb25lM2QnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBmaWxlTmFtZS5zdWJzdHIoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy5pb25lM2QnKSk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIWFzc2V0UGF0aC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZG93bmxvYWRWYXJpYXRpb24nKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Rvd25sb2FkVmFyaWF0aW9uIG5vdCBkZWZpbmVkIGluIHdpbmRvdyBnbG9iYWwnKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBmaWxlOiBhbnkgPSBhd2FpdCAod2luZG93IGFzIGFueSkuZG93bmxvYWRWYXJpYXRpb24oYCR7YXNzZXRQYXRoLnJlcGxhY2UoJ2h0dHBzOi8vY2RuMS5jb2xpam4taXQubmwvJywgJycpfXZhcmlhdGlvbi8ke2ZpbGVOYW1lfWApO1xyXG4gICAgICByZXR1cm4gYXdhaXQgVmFyaWF0aW9uVXRpbHMuR2V0VmFyaWF0aW9uU2V0dGluZ3NGcm9tRmlsZShpZCwgZmlsZSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc3QgbXV0ZSA9IGVycjtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIEdldE1hdGVyaWFsRnJvbU5hbWUodmFyaWF0aW9uRm9sZGVyOiBzdHJpbmcsIG1hdGVyaWFsOiBhbnkpOiBQcm9taXNlPE1lc2hTdGFuZGFyZE1hdGVyaWFsPiB7XHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgLy8gICAgIGlmICghbWF0ZXJpYWwpIHtcclxuICAvLyAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmICh0aGlzLk1hdGVyaWFsQ2FjaGUuaGFzKG1hdGVyaWFsLm5hbWUpKSB7XHJcbiAgLy8gICAgICAgcmVzb2x2ZSh0aGlzLk1hdGVyaWFsQ2FjaGUuZ2V0KG1hdGVyaWFsLm5hbWUpLmNsb25lKCkpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIFZhcmlhdGlvblV0aWxzLkxvYWRWYXJpYXRpb24odmFyaWF0aW9uRm9sZGVyLCBtYXRlcmlhbC5uYW1lLCBmYWxzZSkudGhlbigoc2V0dGluZ3M6IFZhcmlhdGlvblNldHRpbmdzKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoc2V0dGluZ3MpIHtcclxuICAvLyAgICAgICAgICAgQXNzZXRVdGlscy5DcmVhdGVNYXRlcmlhbEZyb21Bc3NldChzZXR0aW5ncykudGhlbigobWF0ZXJpYWxPYmo6IE1hdGVyaWFsKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWxQYXJhbXM6IE1lc2hTdGFuZGFyZE1hdGVyaWFsUGFyYW1ldGVycyA9IHt9O1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm5hbWUgPSBtYXRlcmlhbC5uYW1lO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1hcCA9IG1hdGVyaWFsT2JqLnRleHR1cmU7XHJcbiAgLy8gICAgICAgICAgICAgbWF0ZXJpYWxQYXJhbXMubm9ybWFsTWFwID0gbWF0ZXJpYWxPYmoubm9ybWFsO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLmFvTWFwID0gbWF0ZXJpYWxPYmouYW87XHJcbiAgLy8gICAgICAgICAgICAgbWF0ZXJpYWxQYXJhbXMucm91Z2huZXNzTWFwID0gbWF0ZXJpYWxPYmoucm91Z2huZXNzO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzc01hcCA9IG1hdGVyaWFsT2JqLm1ldGFsbmVzcztcclxuICAvLyAgICAgICAgICAgICBtYXRlcmlhbFBhcmFtcy5yb3VnaG5lc3MgPSAxO1xyXG4gIC8vICAgICAgICAgICAgIG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzcyA9IDE7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgcGJyTWF0OiBNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IG5ldyBNZXNoU3RhbmRhcmRNYXRlcmlhbChtYXRlcmlhbFBhcmFtcyk7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5NYXRlcmlhbENhY2hlLnNldChtYXRlcmlhbC5uYW1lLCBwYnJNYXQpO1xyXG4gIC8vICAgICAgICAgICAgIHJlc29sdmUocGJyTWF0LmNsb25lKCkpO1xyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIHJlc29sdmUobWF0ZXJpYWwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEdldFZhcmlhdGlvblNldHRpbmdzRnJvbUZpbGUoaWQ6IHN0cmluZywgY29tcHJlc3NlZEZpbGU6IGFueSk6IFByb21pc2U8VmFyaWF0aW9uU2V0dGluZ3M+IHtcclxuICAgIGlmICghY29tcHJlc3NlZEZpbGUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCB6aXBDb250ZW50ID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuR2V0WmlwQ29udGVudChjb21wcmVzc2VkRmlsZSk7XHJcbiAgICBjb25zdCB2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MgPSBuZXcgVmFyaWF0aW9uU2V0dGluZ3MoKTtcclxuICAgIGxldCBpbmRleDtcclxuICAgIHZhcmlhdGlvblNldHRpbmdzLmlkID0gaWQ7XHJcblxyXG4gICAgaWYgKHppcENvbnRlbnQuZmlsZXNbJ2luZGV4Lmpzb24nXSkge1xyXG4gICAgICBjb25zdCBpbmRleEZpbGU6IHN0cmluZyA9IGF3YWl0IHppcENvbnRlbnQuZmlsZXNbJ2luZGV4Lmpzb24nXS5hc3luYygnc3RyaW5nJyk7XHJcbiAgICAgIGluZGV4ID0gSlNPTi5wYXJzZShpbmRleEZpbGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4KSB7XHJcbiAgICAgIGF3YWl0IFZhcmlhdGlvblV0aWxzLkNyZWF0ZVNldHRpbmdzQmFzZWRPbkluZGV4KGluZGV4LCB2YXJpYXRpb25TZXR0aW5ncywgemlwQ29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCBWYXJpYXRpb25VdGlscy5DcmVhdGVTZXR0aW5nc0Jhc2VkT25GaWxlTmFtZSh2YXJpYXRpb25TZXR0aW5ncywgemlwQ29udGVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFyaWF0aW9uU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBDcmVhdGVTZXR0aW5nc0Jhc2VkT25JbmRleChpbmRleDogYW55LCB2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MsIHppcENvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGluZGV4Lm5vcm1hbEZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mubm9ybWFsID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4Lm5vcm1hbEZpbGVdLCBpbmRleC5ub3JtYWxGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mubm9ybWFsRmlsZW5hbWUgPSBpbmRleC5ub3JtYWxGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LmFvRmlsZSkge1xyXG4gICAgICB2YXJpYXRpb25TZXR0aW5ncy5hbyA9IGF3YWl0IFZhcmlhdGlvblV0aWxzLkxvYWRGaWxlQ29udGVudEZyb21aaXAoemlwQ29udGVudC5maWxlc1tpbmRleC5hb0ZpbGVdLCBpbmRleC5hb0ZpbGUpO1xyXG4gICAgICB2YXJpYXRpb25TZXR0aW5ncy5hb0ZpbGVuYW1lID0gaW5kZXguYW9GaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4Lm1ldGFsbmVzc0ZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3MubWV0YWxuZXNzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4Lm1ldGFsbmVzc0ZpbGVdLCBpbmRleC5tZXRhbG5lc3NGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3MubWV0YWxuZXNzRmlsZW5hbWUgPSBpbmRleC5tZXRhbG5lc3NGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LnJvdWdobmVzc0ZpbGUpIHtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mucm91Z2huZXNzID0gYXdhaXQgVmFyaWF0aW9uVXRpbHMuTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXBDb250ZW50LmZpbGVzW2luZGV4LnJvdWdobmVzc0ZpbGVdLCBpbmRleC5yb3VnaG5lc3NGaWxlKTtcclxuICAgICAgdmFyaWF0aW9uU2V0dGluZ3Mucm91Z2huZXNzRmlsZW5hbWUgPSBpbmRleC5yb3VnaG5lc3NGaWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4LmRpZmZ1c2VGaWxlKSB7XHJcbiAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmUgPSBhd2FpdCBWYXJpYXRpb25VdGlscy5Mb2FkRmlsZUNvbnRlbnRGcm9tWmlwKHppcENvbnRlbnQuZmlsZXNbaW5kZXguZGlmZnVzZUZpbGVdLCBpbmRleC5kaWZmdXNlRmlsZSk7XHJcbiAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGluZGV4LmRpZmZ1c2VGaWxlO1xyXG4gICAgfVxyXG4gICAgdmFyaWF0aW9uU2V0dGluZ3Muc2V0dGluZ3MgPVxyXG4gICAgICBhd2FpdCBWYXJpYXRpb25VdGlscy5Mb2FkRmlsZUNvbnRlbnRGcm9tWmlwKHppcENvbnRlbnQuZmlsZXNbJ3JlcGVhdC5qc29uJ10sICdyZXBlYXQuanNvbicsIGZhbHNlKSB8fCB7fTtcclxuICAgIE9iamVjdC5hc3NpZ24odmFyaWF0aW9uU2V0dGluZ3Muc2V0dGluZ3MsIGluZGV4LnJlcGVhdCk7XHJcbiAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5ncy5tZXRhbG5lc3MgPSBpbmRleC5tZXRhbG5lc3M7XHJcbiAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5ncy5yb3VnaG5lc3MgPSBpbmRleC5yb3VnaG5lc3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBDcmVhdGVTZXR0aW5nc0Jhc2VkT25GaWxlTmFtZSh2YXJpYXRpb25TZXR0aW5nczogVmFyaWF0aW9uU2V0dGluZ3MsIHppcENvbnRlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWxsTG9hZGVkOiBQcm9taXNlPFZhcmlhdGlvblNldHRpbmdzPltdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIGluIHppcENvbnRlbnQuZmlsZXMpIHtcclxuICAgICAgaWYgKHppcENvbnRlbnQuZmlsZXNbZmlsZU5hbWVdKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZTogYW55ID0gYXdhaXQgemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV07XHJcbiAgICAgICAgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ25vcm1hbCcpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigobm9ybWFsRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm5vcm1hbCA9IGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlLm5hbWUpfTtiYXNlNjQsJHtub3JtYWxGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm5vcm1hbEZpbGVuYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdhbycpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigoYW9GaWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdmFyaWF0aW9uU2V0dGluZ3MuYW8gPSBgZGF0YTppbWFnZS8ke3RoaXMuR2V0QmFzZTY0RmlsZVR5cGUoZmlsZS5uYW1lKX07YmFzZTY0LCR7YW9GaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLmFvRmlsZW5hbWUgPSBmaWxlTmFtZTtcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ21ldGFsbmVzcycpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigobWV0YWxuZXNzRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm1ldGFsbmVzcyA9IGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlLm5hbWUpfTtiYXNlNjQsJHttZXRhbG5lc3NGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLm1ldGFsbmVzc0ZpbGVuYW1lID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdyb3VnaG5lc3MnKSA+IC0xICYmIHRoaXMuRmlsZUlzSW1hZ2UoZmlsZS5uYW1lKSkge1xyXG4gICAgICAgICAgYWxsTG9hZGVkLnB1c2goemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV0uYXN5bmMoJ2Jhc2U2NCcpLnRoZW4oKHJvdWdobmVzc0ZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5yb3VnaG5lc3MgPSBgZGF0YTppbWFnZS8ke3RoaXMuR2V0QmFzZTY0RmlsZVR5cGUoZmlsZS5uYW1lKX07YmFzZTY0LCR7cm91Z2huZXNzRmlsZX1gO1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5yb3VnaG5lc3NGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZGlmZnVzZScpID4gLTEgJiYgdGhpcy5GaWxlSXNJbWFnZShmaWxlLm5hbWUpKSB7XHJcbiAgICAgICAgICBhbGxMb2FkZWQucHVzaCh6aXBDb250ZW50LmZpbGVzW2ZpbGVOYW1lXS5hc3luYygnYmFzZTY0JykudGhlbigoZGlmZnVzZUZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy50ZXh0dXJlID0gYGRhdGE6aW1hZ2UvJHt0aGlzLkdldEJhc2U2NEZpbGVUeXBlKGZpbGUubmFtZSl9O2Jhc2U2NCwke2RpZmZ1c2VGaWxlfWA7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLmluZGV4T2YoJy5qcCcpID4gLTEpIHtcclxuICAgICAgICAgIGFsbExvYWRlZC5wdXNoKHppcENvbnRlbnQuZmlsZXNbZmlsZU5hbWVdLmFzeW5jKCdiYXNlNjQnKS50aGVuKCh0ZXh0dXJlRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmUgPSAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgdGV4dHVyZUZpbGU7XHJcbiAgICAgICAgICAgIHZhcmlhdGlvblNldHRpbmdzLnRleHR1cmVGaWxlbmFtZSA9IGZpbGVOYW1lO1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5uYW1lLmluZGV4T2YoJy5qc29uJykgPiAtMSkge1xyXG4gICAgICAgICAgYWxsTG9hZGVkLnB1c2goemlwQ29udGVudC5maWxlc1tmaWxlTmFtZV0uYXN5bmMoJ3N0cmluZycpLnRoZW4oKHNldHRpbmdzRmlsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzRmlsZU9iaiA9IEpTT04ucGFyc2Uoc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2V0dGluZ3NGaWxlT2JqKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzRmlsZU9ialtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICB2YXJpYXRpb25TZXR0aW5ncy5zZXR0aW5nc1trZXldID0gc2V0dGluZ3NGaWxlT2JqW2tleV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChhbGxMb2FkZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgTG9hZEZpbGVDb250ZW50RnJvbVppcCh6aXA6IGFueSwgZmlsZU5hbWU6IHN0cmluZywgYmFzZTY0OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGlmICh6aXAgJiYgZmlsZU5hbWUpIHtcclxuICAgICAgICB6aXAuYXN5bmMoYmFzZTY0ID8gJ2Jhc2U2NCcgOiAnc3RyaW5nJykudGhlbigoZmlsZUNvbnRlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGJhc2U2NCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKGBkYXRhOmltYWdlLyR7dGhpcy5HZXRCYXNlNjRGaWxlVHlwZShmaWxlTmFtZSl9O2Jhc2U2NCwke2ZpbGVDb250ZW50fWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShmaWxlQ29udGVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEZpbGVJc0ltYWdlKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGV4dDogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlICdqcGcnOlxyXG4gICAgICBjYXNlICdqcGVnJzpcclxuICAgICAgY2FzZSAncG5nJzpcclxuICAgICAgY2FzZSAnYm1wJzpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBHZXRCYXNlNjRGaWxlVHlwZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGV4dDogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLCBmaWxlTmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlICdqcGcnOlxyXG4gICAgICBjYXNlICdqcGVnJzpcclxuICAgICAgICByZXR1cm4gJ2pwZWcnO1xyXG4gICAgICBjYXNlICdwbmcnOlxyXG4gICAgICAgIHJldHVybiAncG5nJztcclxuICAgICAgY2FzZSAnYm1wJzpcclxuICAgICAgICByZXR1cm4gJ2JtcCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdqcGVnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdldCB0aGUgY29udGVudFxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEdldFppcENvbnRlbnQoZmlsZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBqc3ppcCA9IG5ldyBKU1ppcCgpO1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGpzemlwLmxvYWRBc3luYyhmaWxlKTtcclxuICAgIHJldHVybiBjb250ZW50O1xyXG4gIH1cclxufVxyXG4iXX0=