@colijnit/configurator 1.0.15 → 12.0.2

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 (75) hide show
  1. package/app/builder.d.ts +25 -11
  2. package/app/components/answers/answer/answer.component.d.ts +3 -4
  3. package/app/components/selections/selections.component.d.ts +5 -6
  4. package/app/services/configurator.service.d.ts +6 -15
  5. package/app/utils/object.utils.d.ts +7 -0
  6. package/bundles/colijnit-configurator.umd.js +1203 -608
  7. package/bundles/colijnit-configurator.umd.js.map +1 -1
  8. package/colijnit-configurator.d.ts +2 -3
  9. package/colijnit-configurator.metadata.json +1 -1
  10. package/esm2015/app/builder.js +179 -60
  11. package/esm2015/app/components/answers/answer/answer.component.js +51 -45
  12. package/esm2015/app/components/answers/answers.component.js +30 -32
  13. package/esm2015/app/components/answers/answers.module.js +20 -22
  14. package/esm2015/app/components/selections/selections.component.js +72 -57
  15. package/esm2015/app/components/selections/selections.module.js +17 -19
  16. package/esm2015/app/components/shared/loader/loader.component.js +10 -12
  17. package/esm2015/app/components/shared/shared.module.js +16 -18
  18. package/esm2015/app/directives/visibility-observer-master.directive.js +9 -10
  19. package/esm2015/app/directives/visibility-observer.directive.js +13 -15
  20. package/esm2015/app/services/configurator.service.js +28 -40
  21. package/esm2015/app/services/image-cache.service.js +12 -13
  22. package/esm2015/app/services/locator.service.js +6 -8
  23. package/esm2015/app/utils/object.utils.js +49 -0
  24. package/esm2015/colijnit-configurator.js +3 -4
  25. package/esm2015/helper/variation-helper.js +174 -41
  26. package/esm2015/model/material.js +1 -1
  27. package/esm2015/model/variation-settings.js +4 -1
  28. package/esm2015/model/variation.js +1 -1
  29. package/esm2015/public_api.js +1 -1
  30. package/esm2015/utils/asset.utils.js +64 -12
  31. package/esm2015/utils/file.utils.js +4 -1
  32. package/esm2015/utils/image.utils.js +1 -1
  33. package/esm2015/utils/object.utils.js +1 -1
  34. package/esm2015/utils/scene-utils.js +1 -1
  35. package/esm2015/utils/threed.utils.js +3 -3
  36. package/esm2015/utils/variation-utils.js +99 -29
  37. package/fesm2015/colijnit-configurator.js +861 -480
  38. package/fesm2015/colijnit-configurator.js.map +1 -1
  39. package/helper/variation-helper.d.ts +1 -1
  40. package/model/material.d.ts +16 -0
  41. package/model/variation-settings.d.ts +21 -0
  42. package/package.json +17 -20
  43. package/utils/asset.utils.d.ts +3 -0
  44. package/utils/threed.utils.d.ts +1 -1
  45. package/utils/variation-utils.d.ts +1 -0
  46. package/bundles/colijnit-configurator.umd.min.js +0 -17
  47. package/bundles/colijnit-configurator.umd.min.js.map +0 -1
  48. package/esm5/app/builder.js +0 -514
  49. package/esm5/app/components/answers/answer/answer.component.js +0 -54
  50. package/esm5/app/components/answers/answers.component.js +0 -27
  51. package/esm5/app/components/answers/answers.module.js +0 -32
  52. package/esm5/app/components/selections/selections.component.js +0 -104
  53. package/esm5/app/components/selections/selections.module.js +0 -26
  54. package/esm5/app/components/shared/loader/loader.component.js +0 -16
  55. package/esm5/app/components/shared/shared.module.js +0 -24
  56. package/esm5/app/directives/visibility-observer-master.directive.js +0 -64
  57. package/esm5/app/directives/visibility-observer.directive.js +0 -59
  58. package/esm5/app/services/configurator.service.js +0 -135
  59. package/esm5/app/services/image-cache.service.js +0 -67
  60. package/esm5/app/services/locator.service.js +0 -13
  61. package/esm5/colijnit-configurator.js +0 -11
  62. package/esm5/helper/variation-helper.js +0 -268
  63. package/esm5/model/material.js +0 -13
  64. package/esm5/model/variation-settings.js +0 -8
  65. package/esm5/model/variation.js +0 -7
  66. package/esm5/public_api.js +0 -7
  67. package/esm5/utils/asset.utils.js +0 -106
  68. package/esm5/utils/file.utils.js +0 -151
  69. package/esm5/utils/image.utils.js +0 -56
  70. package/esm5/utils/object.utils.js +0 -56
  71. package/esm5/utils/scene-utils.js +0 -98
  72. package/esm5/utils/threed.utils.js +0 -279
  73. package/esm5/utils/variation-utils.js +0 -327
  74. package/fesm5/colijnit-configurator.js +0 -2412
  75. package/fesm5/colijnit-configurator.js.map +0 -1
@@ -1,514 +0,0 @@
1
- import { __awaiter, __decorate, __generator } from "tslib";
2
- import * as THREE from "three";
3
- import { Options } from "@colijnit/configuratorapi/build/model/options";
4
- import { DecoNode } from "@colijnit/configuratorapi/build/model/deco-node";
5
- import { BusinessObjectFactory } from "@colijnit/configuratorapi/build/service/business-object-factory";
6
- import { Selection } from "@colijnit/configuratorapi/build/model/selection";
7
- import { DecoNodeType } from "@colijnit/configuratorapi/build/enum/deco-node-type.enum";
8
- import { ThreedUtils } from "../utils/threed.utils";
9
- import { DecoNodeKind } from "@colijnit/configuratorapi/build/enum/deco-node-kind.enum";
10
- import { SceneUtils } from "../utils/scene-utils";
11
- import { VariationHelper } from "../helper/variation-helper";
12
- import { Article } from "@colijnit/configuratorapi/build/model/article";
13
- import { ConfiguratorService } from './services/configurator.service';
14
- import { Scene } from 'three';
15
- import { Injectable } from '@angular/core';
16
- import { BehaviorSubject } from 'rxjs';
17
- import { ServiceLocator } from './services/locator.service';
18
- var Builder = /** @class */ (function () {
19
- function Builder(scene, options, useInAngular) {
20
- var _this = this;
21
- this.selectionsReceived = new BehaviorSubject([]);
22
- this.answersReceived = new BehaviorSubject([]);
23
- this.questionReceived = new BehaviorSubject(undefined);
24
- this._selections = [];
25
- this._decos = [];
26
- this._placedAdjustables = [];
27
- this._placedAddables = [];
28
- this._adjustables = [];
29
- this._addables = [];
30
- this._articleCache = new Map();
31
- this._subs = [];
32
- this._boFactory = new BusinessObjectFactory();
33
- this._threedUtils = new ThreedUtils();
34
- this._variationHelper = new VariationHelper();
35
- if (!scene) {
36
- throw 'No scene object provided!';
37
- }
38
- if (!options) {
39
- throw 'No connection options provided!';
40
- }
41
- if (useInAngular) {
42
- this._configuratorService = ServiceLocator.injector.get(ConfiguratorService);
43
- }
44
- else {
45
- this._configuratorService = new ConfiguratorService(null);
46
- }
47
- this._configuratorService.initApi(options);
48
- this._scene = scene;
49
- this._subs.push(this._configuratorService.selectionsReceived.subscribe(function (selections) { return _this.selectionsReceived.next(selections); }), this._configuratorService.answersReceived.subscribe(function (answers) { return _this.answersReceived.next(answers); }), this._configuratorService.questionReceived.subscribe(function (question) { return _this.questionReceived.next(question); }));
50
- }
51
- Builder.prototype.buildModel = function (instanceId, sku, goodId) {
52
- return __awaiter(this, void 0, void 0, function () {
53
- var promises, e_1;
54
- return __generator(this, function (_a) {
55
- switch (_a.label) {
56
- case 0:
57
- if (!this._scene && !instanceId) {
58
- return [2 /*return*/];
59
- }
60
- _a.label = 1;
61
- case 1:
62
- _a.trys.push([1, 7, , 8]);
63
- return [4 /*yield*/, this._prepareConfiguration(sku, goodId)];
64
- case 2:
65
- _a.sent();
66
- if (!this._source) return [3 /*break*/, 5];
67
- return [4 /*yield*/, this._configuratorService.setInstanceToConfigure(instanceId)];
68
- case 3:
69
- _a.sent();
70
- promises = [];
71
- promises.push(this._getSelections(instanceId));
72
- promises.push(this._getDecos());
73
- return [4 /*yield*/, Promise.all(promises)];
74
- case 4:
75
- _a.sent();
76
- this._linkSelectionsAndDecos();
77
- return [2 /*return*/, this._build(instanceId)];
78
- case 5: throw 'GLB source not found!';
79
- case 6: return [3 /*break*/, 8];
80
- case 7:
81
- e_1 = _a.sent();
82
- throw e_1;
83
- case 8: return [2 /*return*/];
84
- }
85
- });
86
- });
87
- };
88
- Builder.prototype.initNodeInstance = function (goodId) {
89
- return this._configuratorService.initNodeInstance(goodId);
90
- };
91
- Builder.prototype.destroy = function () {
92
- this._threedUtils.clearCache();
93
- this._variationHelper.clearCache();
94
- };
95
- Builder.prototype.selectSelection = function (selection) {
96
- this._configuratorService.selectSelection(selection, false);
97
- };
98
- Builder.prototype.getQuestionAndAnswers = function () {
99
- return __awaiter(this, void 0, void 0, function () {
100
- return __generator(this, function (_a) {
101
- return [2 /*return*/, this._configuratorService.getQuestionAndAnswers(false)];
102
- });
103
- });
104
- };
105
- Builder.prototype.selectAnswer = function (answer) {
106
- this._configuratorService.selectAnswer(answer, false);
107
- };
108
- Builder.prototype._prepareConfiguration = function (sku, goodId) {
109
- return __awaiter(this, void 0, void 0, function () {
110
- var article, _a;
111
- return __generator(this, function (_b) {
112
- switch (_b.label) {
113
- case 0: return [4 /*yield*/, this._getArticle(sku, goodId)];
114
- case 1:
115
- article = _b.sent();
116
- if (!(article && article.assetUrl)) return [3 /*break*/, 3];
117
- _a = this;
118
- return [4 /*yield*/, this._threedUtils.download3DSource(article.assetUrl)
119
- .catch(function (error) {
120
- throw error;
121
- })];
122
- case 2:
123
- _a._source = _b.sent();
124
- if (article.contentDeliveryUrl) {
125
- this._variationHelper.assetPath =
126
- article.contentDeliveryUrl +
127
- (article.contentDeliveryUrl.endsWith('/') ? '' : '/') +
128
- (article.distSchema ? article.distSchema : 'UP_DBA');
129
- }
130
- _b.label = 3;
131
- case 3: return [2 /*return*/];
132
- }
133
- });
134
- });
135
- };
136
- Builder.prototype._build = function (instanceId) {
137
- return __awaiter(this, void 0, void 0, function () {
138
- var adjustables, obj, connected, i, len, adjustable, ii, lenii;
139
- return __generator(this, function (_a) {
140
- switch (_a.label) {
141
- case 0:
142
- this._reset();
143
- adjustables = this._getAdjustables();
144
- if (!(adjustables && adjustables.length > 0)) return [3 /*break*/, 2];
145
- obj = new THREE.Object3D();
146
- obj.visible = false; // no need to render visualy
147
- this._scene.add(obj);
148
- connected = false;
149
- for (i = 0, len = adjustables.length; i < len; i++) {
150
- adjustable = this._createAdjustable(obj, adjustables[i]);
151
- if (adjustable) {
152
- for (ii = 0, lenii = this._placedAdjustables.length; ii < lenii; ii++) {
153
- if (SceneUtils.TrySelectorConnection(this._scene, obj, this._placedAdjustables[ii], adjustable)) {
154
- this._placedAdjustables[ii].visible = true;
155
- adjustable.visible = true;
156
- connected = true;
157
- break;
158
- }
159
- connected = false;
160
- }
161
- }
162
- if (!connected && this._placedAdjustables.length > 1) {
163
- console.warn('No connection found for: ', adjustable.name);
164
- }
165
- }
166
- this._placeAddables(obj);
167
- this._updatePivot(obj);
168
- return [4 /*yield*/, this._loadVariations(obj, instanceId)];
169
- case 1:
170
- _a.sent();
171
- this._scene.remove(obj);
172
- return [2 /*return*/, obj];
173
- case 2: throw 'No adjustables found!';
174
- }
175
- });
176
- });
177
- };
178
- Builder.prototype._prepareTheSelections = function () {
179
- var _this = this;
180
- // get generic variations
181
- var globalVariations = this._selections
182
- .filter(function (s) { return s.generic && s.decoNode.variation && !s.decoNode.type; })
183
- .map(function (value, index, array) {
184
- // find selection of variation
185
- var sel = _this._selections.find(function (s) { return s.artNodeIdDeco === value.decoNode.variation.id; });
186
- if (sel) {
187
- value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
188
- }
189
- value.decoNode.variation.materialId = value.hdecoGameObject;
190
- return value.decoNode.variation;
191
- });
192
- // const usedVariations: FurniturePartVariation[] = [];
193
- var globalVariationsRewrite = true;
194
- var len = this._selections.length;
195
- var lastAdded;
196
- var lastAdjustable;
197
- var newPart = false;
198
- var previousPresLevel = -1;
199
- var positioning;
200
- for (var i = 0; i < len; i++) {
201
- var selection = this._selections[i];
202
- if (selection.presentationLevel === 1) {
203
- positioning = selection.hdecoPositioning;
204
- }
205
- if (selection.presentationLevel > previousPresLevel) {
206
- selection.hdecoPositioning = selection.hdecoPositioning || positioning;
207
- }
208
- if (selection.decoNode) {
209
- if (selection.decoNode.type === DecoNodeType.Variation) {
210
- if (lastAdded) {
211
- if (newPart) {
212
- lastAdded.variations = [selection.decoNode];
213
- }
214
- else {
215
- lastAdded.variations.push(selection.decoNode);
216
- }
217
- newPart = false;
218
- }
219
- else {
220
- if (globalVariationsRewrite) {
221
- globalVariations.length = 0;
222
- globalVariationsRewrite = false;
223
- }
224
- globalVariations.push(selection.decoNode);
225
- }
226
- // const variation: FurniturePartVariation = new FurniturePartVariation();
227
- // variation.BrandId = selection.decoNode.brandId;
228
- // variation.Description = selection.decoNode.gameObjectName;
229
- // variation.MaterialId = (selection.decoNode as any).materialId;
230
- // variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
231
- // usedVariations.push(variation);
232
- // this._upsertFurniture(this.activeInstance, {
233
- // Variation: selection.decoNode.brandId,
234
- // VariationDescription: selection.decoNode.gameObjectName,
235
- // SupplierArticleNr: (selection.decoNode as any).supplierArticleNr
236
- // });
237
- }
238
- else if (selection.decoNode.type === DecoNodeType.Part &&
239
- typeof selection.decoNode.gameObjectName === 'string' &&
240
- selection.decoNode.gameObjectName.length) {
241
- if (selection.decoNode.kind === DecoNodeKind.Adjustable) {
242
- selection.variations = globalVariations;
243
- this._adjustables.push(selection);
244
- if (!lastAdded || lastAdded.nodeId !== selection.nodeId) {
245
- newPart = true;
246
- }
247
- lastAdded = selection;
248
- lastAdjustable = selection;
249
- }
250
- else if (selection.decoNode.kind === DecoNodeKind.Addable) {
251
- selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
252
- if (lastAdjustable) {
253
- lastAdjustable.addables.push(selection);
254
- }
255
- this._addables.push(selection);
256
- if (!lastAdded || lastAdded.nodeId !== selection.nodeId) {
257
- newPart = true;
258
- }
259
- lastAdded = selection;
260
- }
261
- }
262
- }
263
- previousPresLevel = selection.presentationLevel;
264
- }
265
- // this._upsertFurniture(this.activeInstance,
266
- // {Variations: usedVariations});
267
- };
268
- Builder.prototype._createAdjustable = function (parent, adj) {
269
- var obj = this._source ? this._source.getObjectByName(adj.decoNode.gameObjectName) : null;
270
- if (!obj) {
271
- // in case of glb files, the importer removes dots from names
272
- var name_1 = adj.decoNode.gameObjectName.replace(/[.]/g, '');
273
- obj = this._source ? this._source.getObjectByName(name_1) : null;
274
- if (!obj) {
275
- // console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
276
- return null;
277
- }
278
- }
279
- var adjustable = obj.clone();
280
- adjustable.name = this._createUniqueName(parent, obj);
281
- adjustable.userData.selection = adj;
282
- adjustable.position.set(0, 0, 0);
283
- adjustable.visible = true;
284
- parent.add(adjustable);
285
- // the object being added to the customFloorGroup is being recreated so we loose the reference
286
- // therefor we need to retrieve the created object again
287
- // adjustable = parent.getObjectByName(adjustable.name);
288
- this._placedAdjustables.push(adjustable);
289
- return adjustable;
290
- };
291
- Builder.prototype._createAddable = function (parent, add, part2, part1) {
292
- var obj = this._source.getObjectByName(add.decoNode.gameObjectName);
293
- if (!obj) {
294
- return null;
295
- }
296
- // const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
297
- var addable = obj.clone();
298
- addable.name = this._createUniqueName(parent, obj);
299
- addable.userData.selection = add;
300
- addable.position.set(0, 0, 0);
301
- addable.visible = true;
302
- if (part1 && part2) {
303
- parent.add(addable);
304
- this._placedAddables.push(addable);
305
- return addable;
306
- }
307
- return addable;
308
- };
309
- Builder.prototype._placeAddables = function (parent) {
310
- var _this = this;
311
- var len = this._placedAdjustables.length;
312
- for (var i = 0; i < len; i++) {
313
- if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
314
- var adjustableSelection = this._placedAdjustables[i].userData.selection;
315
- if (adjustableSelection) {
316
- var lena = adjustableSelection.addables.length;
317
- var conAddable = void 0;
318
- for (var ia = 0; ia < lena; ia++) {
319
- SceneUtils.TrySelectorConnection(this._scene, parent, this._placedAdjustables[i], adjustableSelection.addables[ia], function (add, part2, part1) { return _this._createAddable(parent, add, part2, part1); });
320
- if (conAddable) {
321
- SceneUtils.TrySelectorConnection(this._scene, parent, conAddable, adjustableSelection.addables[ia], function (add, part2, part1) { return _this._createAddable(parent, add, part2, part1); });
322
- }
323
- conAddable = this._placedAddables[this._placedAddables.length - 1];
324
- }
325
- }
326
- }
327
- }
328
- };
329
- Builder.prototype._createUniqueName = function (parent, obj) {
330
- var iteration = 0;
331
- var name = obj.name;
332
- var existingObj = parent.getObjectByName(name);
333
- while (existingObj) {
334
- iteration++;
335
- name = obj.name + (iteration !== 0 ? ('_' + iteration) : '');
336
- existingObj = parent.getObjectByName(name);
337
- }
338
- return name;
339
- };
340
- Builder.prototype._getGoodIdFromSku = function (sku) {
341
- return __awaiter(this, void 0, void 0, function () {
342
- var response;
343
- return __generator(this, function (_a) {
344
- switch (_a.label) {
345
- case 0: return [4 /*yield*/, this._configuratorService.getGoodIdFromSku(sku, false)];
346
- case 1:
347
- response = _a.sent();
348
- if (response.validationResult.success && response.resultObject) {
349
- return [2 /*return*/, response.resultObject];
350
- }
351
- return [2 /*return*/];
352
- }
353
- });
354
- });
355
- };
356
- Builder.prototype._getArticle = function (sku, goodId) {
357
- return __awaiter(this, void 0, void 0, function () {
358
- var article, articleResponse, obj;
359
- return __generator(this, function (_a) {
360
- switch (_a.label) {
361
- case 0:
362
- if (this._articleCache.has(sku)) {
363
- return [2 /*return*/, this._articleCache.get(sku)];
364
- }
365
- if (!!goodId) return [3 /*break*/, 2];
366
- return [4 /*yield*/, this._getGoodIdFromSku(sku)
367
- .catch(function (error) {
368
- throw "Article with sku " + sku + " not found!";
369
- })];
370
- case 1:
371
- goodId = _a.sent();
372
- _a.label = 2;
373
- case 2: return [4 /*yield*/, this._configuratorService.getArticleQuickSel(goodId, false)];
374
- case 3:
375
- articleResponse = _a.sent();
376
- if (articleResponse.validationResult.success && articleResponse.resultObject) {
377
- if (articleResponse.resultObject.hasOwnProperty('oArticle')) {
378
- obj = Array.isArray(articleResponse.resultObject['oArticle']) ? articleResponse.resultObject['oArticle'][0] : articleResponse.resultObject['oArticle'];
379
- article = this._boFactory.makeWithRawBackendData(Article, obj);
380
- }
381
- else {
382
- article = this._boFactory.makeWithRawBackendData(Article, articleResponse.resultObject);
383
- }
384
- }
385
- this._articleCache.set(sku, article);
386
- return [2 /*return*/, article];
387
- }
388
- });
389
- });
390
- };
391
- Builder.prototype._getSelections = function (instanceId) {
392
- return __awaiter(this, void 0, void 0, function () {
393
- var selectionResponse;
394
- return __generator(this, function (_a) {
395
- switch (_a.label) {
396
- case 0:
397
- this._selections.length = 0;
398
- return [4 /*yield*/, this._configuratorService.getSelections(false)];
399
- case 1:
400
- selectionResponse = _a.sent();
401
- if (selectionResponse.resultObjects && selectionResponse.resultObjects.length > 0) {
402
- this._selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, selectionResponse.resultObjects);
403
- this._selections.forEach(function (s) { return s.instanceId = instanceId; });
404
- }
405
- else {
406
- throw 'No selections found!';
407
- }
408
- return [2 /*return*/];
409
- }
410
- });
411
- });
412
- };
413
- Builder.prototype._getDecos = function () {
414
- return __awaiter(this, void 0, void 0, function () {
415
- var decosResponse;
416
- return __generator(this, function (_a) {
417
- switch (_a.label) {
418
- case 0:
419
- this._decos.length = 0;
420
- return [4 /*yield*/, this._configuratorService.getDecos(false)];
421
- case 1:
422
- decosResponse = _a.sent();
423
- if (decosResponse.resultObjects && decosResponse.resultObjects.length > 0) {
424
- this._decos = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, decosResponse.resultObjects);
425
- }
426
- else {
427
- throw 'No deconodes found!';
428
- }
429
- return [2 /*return*/];
430
- }
431
- });
432
- });
433
- };
434
- Builder.prototype._linkSelectionsAndDecos = function () {
435
- var _this = this;
436
- var len = this._selections.length;
437
- var _loop_1 = function (i) {
438
- var id = this_1._selections[i].artNodeIdDeco;
439
- // if (this._useNodeIdToLink) {
440
- // id = `${this._selections[i].node}_${this._selections[i].artNodeIdDeco}`;
441
- // }
442
- var deco = this_1._decos.find(function (d) { return d.id === id; });
443
- if (!deco) {
444
- deco = new DecoNode();
445
- }
446
- var variation = this_1._getVariations().find(function (v) { return v.parentId === _this._selections[i].artNodeIdDeco; });
447
- if (variation) {
448
- deco.variation = variation;
449
- }
450
- this_1._selections[i].decoNode = deco;
451
- };
452
- var this_1 = this;
453
- for (var i = 0; i < len; i++) {
454
- _loop_1(i);
455
- }
456
- };
457
- Builder.prototype._getVariations = function () {
458
- return this._decos.filter(function (deco) {
459
- return deco.type === DecoNodeType.Variation;
460
- });
461
- };
462
- Builder.prototype._loadVariations = function (obj, instanceId) {
463
- return __awaiter(this, void 0, void 0, function () {
464
- return __generator(this, function (_a) {
465
- switch (_a.label) {
466
- case 0: return [4 /*yield*/, this._variationHelper.loadPart(obj, this._adjustables, true)];
467
- case 1:
468
- _a.sent();
469
- return [4 /*yield*/, this._variationHelper.loadVariation(instanceId, obj, this._adjustables, true)];
470
- case 2:
471
- _a.sent();
472
- return [4 /*yield*/, this._variationHelper.loadVariation(instanceId, obj, this._addables, true)];
473
- case 3:
474
- _a.sent();
475
- return [2 /*return*/];
476
- }
477
- });
478
- });
479
- };
480
- Builder.prototype._getAdjustables = function () {
481
- return this._selections.filter(function (s) {
482
- var node = s.decoNode;
483
- return node && node.gameObjectName && node.type === DecoNodeType.Part && node.kind === DecoNodeKind.Adjustable;
484
- });
485
- };
486
- Builder.prototype._updatePivot = function (obj) {
487
- var boundingBox = new THREE.Box3().setFromObject(obj);
488
- var bbCenterPivot = new THREE.Vector3();
489
- boundingBox.getCenter(bbCenterPivot);
490
- var delta = new THREE.Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
491
- obj.children.forEach(function (child) {
492
- child.position.add(delta);
493
- });
494
- obj.updateWorldMatrix(false, true);
495
- };
496
- Builder.prototype._reset = function () {
497
- this._placedAddables.length = 0;
498
- this._placedAdjustables.length = 0;
499
- this._adjustables.length = 0;
500
- this._addables.length = 0;
501
- this._prepareTheSelections();
502
- };
503
- Builder.ctorParameters = function () { return [
504
- { type: Scene },
505
- { type: Options },
506
- { type: Boolean }
507
- ]; };
508
- Builder = __decorate([
509
- Injectable()
510
- ], Builder);
511
- return Builder;
512
- }());
513
- export { Builder };
514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJhcHAvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBRXRFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpRUFBaUUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDMUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUM1QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxlQUFlLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRzFEO0lBc0JJLGlCQUFZLEtBQVksRUFBRSxPQUFnQixFQUFFLFlBQXFCO1FBQWpFLGlCQXdCQztRQTVDTSx1QkFBa0IsR0FBaUMsSUFBSSxlQUFlLENBQWMs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LENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ILEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBVTtZQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLHdCQUFNLEdBQWQ7UUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztnQkF2WmtCLEtBQUs7Z0JBQVcsT0FBTzs7O0lBdEJqQyxPQUFPO1FBRG5CLFVBQVUsRUFBRTtPQUNBLE9BQU8sQ0E4YW5CO0lBQUQsY0FBQztDQUFBLEFBOWFELElBOGFDO1NBOWFZLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHtPcHRpb25zfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9vcHRpb25zXCI7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhXCI7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gXCJAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZVwiO1xyXG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvc2VydmljZS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeVwiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uXCI7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2RlY28tbm9kZS10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtUaHJlZWRVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3RocmVlZC51dGlsc1wiO1xyXG5pbXBvcnQge0RlY29Ob2RlS2luZH0gZnJvbSBcIkBjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUta2luZC5lbnVtXCI7XHJcbmltcG9ydCB7U2NlbmVVdGlsc30gZnJvbSBcIi4uL3V0aWxzL3NjZW5lLXV0aWxzXCI7XHJcbmltcG9ydCB7VmFyaWF0aW9uSGVscGVyfSBmcm9tIFwiLi4vaGVscGVyL3ZhcmlhdGlvbi1oZWxwZXJcIjtcclxuaW1wb3J0IHtBcnRpY2xlfSBmcm9tIFwiQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24nO1xyXG5pbXBvcnQge1NlcnZpY2VMb2NhdG9yfSBmcm9tICcuL3NlcnZpY2VzL2xvY2F0b3Iuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0aW9uc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25bXT4oW10pO1xyXG4gICAgcHVibGljIGFuc3dlcnNSZWNlaXZlZDogQmVoYXZpb3JTdWJqZWN0PEFuc3dlcltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QW5zd2VyW10+KFtdKTtcclxuICAgIHB1YmxpYyBxdWVzdGlvblJlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8UXVlc3Rpb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVzdGlvbj4odW5kZWZpbmVkKTtcclxuXHJcbiAgICBwcml2YXRlIF9zY2VuZTogVEhSRUUuU2NlbmU7XHJcbiAgICBwcml2YXRlIF9zZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfZGVjb3M6IERlY29Ob2RlW10gPSBbXTtcclxuICAgIHByaXZhdGUgX3BsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfcGxhY2VkQWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9hZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgX2FkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5O1xyXG4gICAgcHJpdmF0ZSBfc291cmNlOiBUSFJFRS5PYmplY3QzRDtcclxuICAgIHByaXZhdGUgX3RocmVlZFV0aWxzOiBUaHJlZWRVdGlscztcclxuICAgIHByaXZhdGUgX3ZhcmlhdGlvbkhlbHBlcjogVmFyaWF0aW9uSGVscGVyO1xyXG4gICAgcHJpdmF0ZSBfYXJ0aWNsZUNhY2hlOiBNYXA8c3RyaW5nLCBBcnRpY2xlPiA9IG5ldyBNYXAoKTtcclxuICAgIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgICBwcml2YXRlIF9jb25maWd1cmF0b3JTZXJ2aWNlOiBDb25maWd1cmF0b3JTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHNjZW5lOiBTY2VuZSwgb3B0aW9uczogT3B0aW9ucywgdXNlSW5Bbmd1bGFyOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fYm9GYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG4gICAgICAgIHRoaXMuX3RocmVlZFV0aWxzID0gbmV3IFRocmVlZFV0aWxzKCk7XHJcbiAgICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyID0gbmV3IFZhcmlhdGlvbkhlbHBlcigpO1xyXG5cclxuICAgICAgICBpZiAoIXNjZW5lKSB7XHJcbiAgICAgICAgICAgIHRocm93ICdObyBzY2VuZSBvYmplY3QgcHJvdmlkZWQhJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHRocm93ICdObyBjb25uZWN0aW9uIG9wdGlvbnMgcHJvdmlkZWQhJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVzZUluQW5ndWxhcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlID0gU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KENvbmZpZ3VyYXRvclNlcnZpY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UgPSBuZXcgQ29uZmlndXJhdG9yU2VydmljZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5pbml0QXBpKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuX3NjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3Rpb25zUmVjZWl2ZWQuc3Vic2NyaWJlKHNlbGVjdGlvbnMgPT4gdGhpcy5zZWxlY3Rpb25zUmVjZWl2ZWQubmV4dChzZWxlY3Rpb25zKSksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuYW5zd2Vyc1JlY2VpdmVkLnN1YnNjcmliZShhbnN3ZXJzID0+IHRoaXMuYW5zd2Vyc1JlY2VpdmVkLm5leHQoYW5zd2VycykpLFxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnF1ZXN0aW9uUmVjZWl2ZWQuc3Vic2NyaWJlKHF1ZXN0aW9uID0+IHRoaXMucXVlc3Rpb25SZWNlaXZlZC5uZXh0KHF1ZXN0aW9uKSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsKGluc3RhbmNlSWQ6IHN0cmluZywgc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX3NjZW5lICYmICFpbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1LCBnb29kSWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNldEluc3RhbmNlVG9Db25maWd1cmUoaW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0U2VsZWN0aW9ucyhpbnN0YW5jZUlkKSk7XHJcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldERlY29zKCkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkKGluc3RhbmNlSWQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ0dMQiBzb3VyY2Ugbm90IGZvdW5kISc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0Tm9kZUluc3RhbmNlKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5pbml0Tm9kZUluc3RhbmNlKGdvb2RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGhyZWVkVXRpbHMuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2Uuc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRRdWVzdGlvbkFuZEFuc3dlcnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IGFydGljbGU6IEFydGljbGUgPSBhd2FpdCB0aGlzLl9nZXRBcnRpY2xlKHNrdSwgZ29vZElkKTtcclxuICAgICAgICBpZiAoYXJ0aWNsZSAmJiBhcnRpY2xlLmFzc2V0VXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZSA9IGF3YWl0IHRoaXMuX3RocmVlZFV0aWxzLmRvd25sb2FkM0RTb3VyY2UoYXJ0aWNsZS5hc3NldFVybClcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5hc3NldFBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsICtcclxuICAgICAgICAgICAgICAgICAgICAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwuZW5kc1dpdGgoJy8nKSA/ICcnIDogJy8nKSArXHJcbiAgICAgICAgICAgICAgICAgICAgKGFydGljbGUuZGlzdFNjaGVtYSA/IGFydGljbGUuZGlzdFNjaGVtYSA6ICdVUF9EQkEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9idWlsZChpbnN0YW5jZUlkOiBzdHJpbmcpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlczogU2VsZWN0aW9uW10gPSB0aGlzLl9nZXRBZGp1c3RhYmxlcygpO1xyXG4gICAgICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgICAgICAgICAgb2JqLnZpc2libGUgPSBmYWxzZTsgLy8gbm8gbmVlZCB0byByZW5kZXIgdmlzdWFseVxyXG4gICAgICAgICAgICB0aGlzLl9zY2VuZS5hZGQob2JqKTtcclxuICAgICAgICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSBhZGp1c3RhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0YWJsZTogVEhSRUUuT2JqZWN0M0QgPSB0aGlzLl9jcmVhdGVBZGp1c3RhYmxlKG9iaiwgYWRqdXN0YWJsZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpaSA9IDAsIGxlbmlpOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7IGlpIDwgbGVuaWk7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0sIGFkanVzdGFibGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY29ubmVjdGVkICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGNvbm5lY3Rpb24gZm91bmQgZm9yOiAnLCBhZGp1c3RhYmxlLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3BsYWNlQWRkYWJsZXMob2JqKTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGl2b3Qob2JqKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZFZhcmlhdGlvbnMob2JqLCBpbnN0YW5jZUlkKTtcclxuICAgICAgICAgICAgdGhpcy5fc2NlbmUucmVtb3ZlKG9iaik7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIGFkanVzdGFibGVzIGZvdW5kISc7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2J1aWxkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPUycsIGRlc2NyaXB0aW9uOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJ30pO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zfSk7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy5kZWNvcy5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lcnJvclNlcnZpY2UuYWRkRXJyb3IodGhpcy5hY3RpdmVJbnN0YW5jZSwge21lc3NhZ2U6ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TJywgZGVzY3JpcHRpb246ICdOT19TRUxFQ1RJT05TX09SX0RFQ09TX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob0RlY29Ob2Rlc30pO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fQURKVVNUQUJMRVMnLCBkZXNjcmlwdGlvbjogJ05PX0FESlVTVEFCTEVTX0lORk8nfSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dCh7aW5zdGFuY2VJZDogdGhpcy5hY3RpdmVJbnN0YW5jZSwgcmVzdWx0VHlwZTogUmVzdWx0VHlwZS5Ob0FkanVzdGFibGVzfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gZ2V0IGdlbmVyaWMgdmFyaWF0aW9uc1xyXG4gICAgICAgIGNvbnN0IGdsb2JhbFZhcmlhdGlvbnM6IERlY29Ob2RlW10gPSB0aGlzLl9zZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmdlbmVyaWMgJiYgKHMuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24gJiYgIXMuZGVjb05vZGUudHlwZSlcclxuICAgICAgICAgICAgLm1hcCgodmFsdWU6IFNlbGVjdGlvbiwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uaWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5tYXRlcmlhbElkID0gdmFsdWUuaGRlY29HYW1lT2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgICAgICBsZXQgZ2xvYmFsVmFyaWF0aW9uc1Jld3JpdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgbGFzdEFkanVzdGFibGU6IFNlbGVjdGlvbjtcclxuICAgICAgICBsZXQgbmV3UGFydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uaW5nOiBhbnk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3NlbGVjdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWwgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA+IHByZXZpb3VzUHJlc0xldmVsKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0QWRkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zID0gW3NlbGVjdGlvbi5kZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucy5wdXNoKHNlbGVjdGlvbi5kZWNvTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9uc1Jld3JpdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zLnB1c2goc2VsZWN0aW9uLmRlY29Ob2RlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgdmFyaWF0aW9uOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24uQnJhbmRJZCA9IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5EZXNjcmlwdGlvbiA9IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYXRpb24uTWF0ZXJpYWxJZCA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhdGlvbi5TdXBwbGllckFydGljbGVOciA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICAgICAgICAvLyB1c2VkVmFyaWF0aW9ucy5wdXNoKHZhcmlhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdXBzZXJ0RnVybml0dXJlKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgVmFyaWF0aW9uOiBzZWxlY3Rpb24uZGVjb05vZGUuYnJhbmRJZCxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgVmFyaWF0aW9uRGVzY3JpcHRpb246IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgU3VwcGxpZXJBcnRpY2xlTnI6IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOclxyXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCBsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RBZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCBsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZpb3VzUHJlc0xldmVsID0gc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSxcclxuICAgICAgICAvLyAgIHtWYXJpYXRpb25zOiB1c2VkVmFyaWF0aW9uc30pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NyZWF0ZUFkanVzdGFibGUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgYWRqOiBTZWxlY3Rpb24pOiBUSFJFRS5PYmplY3QzRCB7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpIDogbnVsbDtcclxuICAgICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgICAgICAgb2JqID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShuYW1lKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oYE5vIG9iamVjdCB3aXRoIG5hbWUgJHthZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWV9IGZvdW5kIWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgICAgIGFkanVzdGFibGUubmFtZSA9IHRoaXMuX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50LCBvYmopO1xyXG4gICAgICAgIGFkanVzdGFibGUudXNlckRhdGEuc2VsZWN0aW9uID0gYWRqO1xyXG4gICAgICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgcGFyZW50LmFkZChhZGp1c3RhYmxlKTtcclxuICAgICAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAgICAgLy8gdGhlcmVmb3Igd2UgbmVlZCB0byByZXRyaWV2ZSB0aGUgY3JlYXRlZCBvYmplY3QgYWdhaW5cclxuICAgICAgICAvLyBhZGp1c3RhYmxlID0gcGFyZW50LmdldE9iamVjdEJ5TmFtZShhZGp1c3RhYmxlLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICAgICAgcmV0dXJuIGFkanVzdGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlQWRkYWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGQ6IFNlbGVjdGlvbiwgcGFydDI/OiBhbnksIHBhcnQxPzogYW55KTogVEhSRUUuT2JqZWN0M0Qge1xyXG4gICAgICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgY29uc3QgYWRkYWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICAgICAgYWRkYWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICAgICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICAgICAgYWRkYWJsZS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgYWRkYWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgICAgICAgcGFyZW50LmFkZChhZGRhYmxlKTtcclxuICAgICAgICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMucHVzaChhZGRhYmxlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhZGRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3BsYWNlQWRkYWJsZXMocGFyZW50OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLmhhc093blByb3BlcnR5KCdzZWxlY3Rpb24nKSAmJiB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGFibGVTZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChhZGp1c3RhYmxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVuYTogbnVtYmVyID0gYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbkFkZGFibGU6IGFueTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpYSA9IDA7IGlhIDwgbGVuYTsgaWErKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0sIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUocGFyZW50LCBhZGQsIHBhcnQyLCBwYXJ0MSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uQWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBjb25BZGRhYmxlLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVVbmlxdWVOYW1lKHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIG9iajogVEhSRUUuT2JqZWN0M0QpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIGxldCBuYW1lID0gb2JqLm5hbWU7XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nT2JqID0gcGFyZW50LmdldE9iamVjdEJ5TmFtZShuYW1lKTtcclxuICAgICAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgICAgICAgIG5hbWUgPSBvYmoubmFtZSArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgICAgICAgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRHb29kSWRGcm9tU2t1KHNrdTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEdvb2RJZEZyb21Ta3Uoc2t1LCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0QXJ0aWNsZShza3U6IHN0cmluZywgZ29vZElkOiBudW1iZXIpOiBQcm9taXNlPEFydGljbGU+IHtcclxuICAgICAgICBpZiAodGhpcy5fYXJ0aWNsZUNhY2hlLmhhcyhza3UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlQ2FjaGUuZ2V0KHNrdSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZ29vZElkKSB7XHJcbiAgICAgICAgICAgIGdvb2RJZCA9IGF3YWl0IHRoaXMuX2dldEdvb2RJZEZyb21Ta3Uoc2t1KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGBBcnRpY2xlIHdpdGggc2t1ICR7c2t1fSBub3QgZm91bmQhYDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYXJ0aWNsZTogQXJ0aWNsZTtcclxuICAgICAgICBjb25zdCBhcnRpY2xlUmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGFydGljbGVSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MgJiYgYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAoYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb0FydGljbGUnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gQXJyYXkuaXNBcnJheShhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddKSA/IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ11bMF0gOiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddO1xyXG4gICAgICAgICAgICAgICAgYXJ0aWNsZSA9IDxBcnRpY2xlPnRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGUsIG9iaik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhcnRpY2xlID0gPEFydGljbGU+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZSwgYXJ0aWNsZVJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYXJ0aWNsZUNhY2hlLnNldChza3UsIGFydGljbGUpO1xyXG4gICAgICAgIHJldHVybiBhcnRpY2xlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2dldFNlbGVjdGlvbnMoaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0U2VsZWN0aW9ucyhmYWxzZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnMgPSA8U2VsZWN0aW9uW10+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU2VsZWN0aW9uLCBzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHMgPT4gcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgJ05vIHNlbGVjdGlvbnMgZm91bmQhJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fZGVjb3MubGVuZ3RoID0gMDtcclxuICAgICAgICBjb25zdCBkZWNvc1Jlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0RGVjb3MoZmFsc2UpO1xyXG4gICAgICAgIGlmIChkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMgJiYgZGVjb3NSZXNwb25zZS5yZXN1bHRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVjb3MgPSA8RGVjb05vZGVbXT50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShEZWNvTm9kZSwgZGVjb3NSZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyAnTm8gZGVjb25vZGVzIGZvdW5kISc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xpbmtTZWxlY3Rpb25zQW5kRGVjb3MoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpZDogc3RyaW5nID0gdGhpcy5fc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvO1xyXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5fdXNlTm9kZUlkVG9MaW5rKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBpZCA9IGAke3RoaXMuX3NlbGVjdGlvbnNbaV0ubm9kZX1fJHt0aGlzLl9zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY299YDtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICBsZXQgZGVjbzogYW55ID0gdGhpcy5fZGVjb3MuZmluZChkID0+IGQuaWQgPT09IGlkKTtcclxuICAgICAgICAgICAgaWYgKCFkZWNvKSB7XHJcbiAgICAgICAgICAgICAgICBkZWNvID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSB0aGlzLl9nZXRWYXJpYXRpb25zKCkuZmluZCh2ID0+IHYucGFyZW50SWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgICAgIGlmICh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGRlY28udmFyaWF0aW9uID0gdmFyaWF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbnNbaV0uZGVjb05vZGUgPSBkZWNvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRWYXJpYXRpb25zKCk6IERlY29Ob2RlW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvcy5maWx0ZXIoKGRlY286IERlY29Ob2RlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWNvLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfbG9hZFZhcmlhdGlvbnMob2JqOiBUSFJFRS5PYmplY3QzRCwgaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRQYXJ0KG9iaiwgdGhpcy5fYWRqdXN0YWJsZXMsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5sb2FkVmFyaWF0aW9uKGluc3RhbmNlSWQsIG9iaiwgdGhpcy5fYWRqdXN0YWJsZXMsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5sb2FkVmFyaWF0aW9uKGluc3RhbmNlSWQsIG9iaiwgdGhpcy5fYWRkYWJsZXMsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldEFkanVzdGFibGVzKCk6IFNlbGVjdGlvbltdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IERlY29Ob2RlID0gcy5kZWNvTm9kZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5nYW1lT2JqZWN0TmFtZSAmJiBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmIG5vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlUGl2b3Qob2JqOiBUSFJFRS5PYmplY3QzRCkge1xyXG4gICAgICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XHJcbiAgICAgICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xyXG4gICAgICAgIGNvbnN0IGRlbHRhOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5zdWIoYmJDZW50ZXJQaXZvdCkuc2V0WShNYXRoLmFicyhNYXRoLm1pbihib3VuZGluZ0JveC5taW4ueSwgMCkpKTtcclxuXHJcbiAgICAgICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQucG9zaXRpb24uYWRkKGRlbHRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBvYmoudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Jlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgIH1cclxufVxyXG4iXX0=