@colijnit/configurator 1.0.21 → 1.0.22
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.
- package/app/builder.d.ts +53 -0
- package/app/components/answers/answer/answer.component.d.ts +11 -0
- package/app/components/answers/answers.component.d.ts +8 -0
- package/app/components/answers/answers.module.d.ts +2 -0
- package/app/components/selections/selections.component.d.ts +22 -0
- package/app/components/selections/selections.module.d.ts +2 -0
- package/app/components/shared/loader/loader.component.d.ts +2 -0
- package/app/components/shared/shared.module.d.ts +2 -0
- package/app/directives/visibility-observer-master.directive.d.ts +9 -0
- package/app/directives/visibility-observer.directive.d.ts +13 -0
- package/app/services/configurator.service.d.ts +22 -0
- package/app/services/image-cache.service.d.ts +10 -0
- package/app/services/locator.service.d.ts +4 -0
- package/bundles/colijnit-configurator.umd.js +2745 -0
- package/bundles/colijnit-configurator.umd.js.map +1 -0
- package/bundles/colijnit-configurator.umd.min.js +17 -0
- package/bundles/colijnit-configurator.umd.min.js.map +1 -0
- package/colijnit-configurator.d.ts +10 -0
- package/colijnit-configurator.metadata.json +1 -0
- package/esm2015/app/builder.js +477 -0
- package/esm2015/app/components/answers/answer/answer.component.js +69 -0
- package/esm2015/app/components/answers/answers.component.js +43 -0
- package/esm2015/app/components/answers/answers.module.js +29 -0
- package/esm2015/app/components/selections/selections.component.js +134 -0
- package/esm2015/app/components/selections/selections.module.js +23 -0
- package/esm2015/app/components/shared/loader/loader.component.js +24 -0
- package/esm2015/app/components/shared/shared.module.js +21 -0
- package/esm2015/app/directives/visibility-observer-master.directive.js +51 -0
- package/esm2015/app/directives/visibility-observer.directive.js +57 -0
- package/esm2015/app/services/configurator.service.js +94 -0
- package/esm2015/app/services/image-cache.service.js +66 -0
- package/esm2015/app/services/locator.service.js +10 -0
- package/esm2015/colijnit-configurator.js +11 -0
- package/esm2015/helper/variation-helper.js +216 -0
- package/esm2015/model/material.js +11 -0
- package/esm2015/model/variation-settings.js +6 -0
- package/esm2015/model/variation.js +3 -0
- package/esm2015/public_api.js +7 -0
- package/esm2015/utils/asset.utils.js +74 -0
- package/esm2015/utils/file.utils.js +139 -0
- package/esm2015/utils/image.utils.js +52 -0
- package/esm2015/utils/object.utils.js +49 -0
- package/esm2015/utils/scene-utils.js +94 -0
- package/esm2015/utils/threed.utils.js +222 -0
- package/esm2015/utils/variation-utils.js +224 -0
- package/esm5/app/builder.js +591 -0
- package/esm5/app/components/answers/answer/answer.component.js +64 -0
- package/esm5/app/components/answers/answers.component.js +27 -0
- package/esm5/app/components/answers/answers.module.js +32 -0
- package/esm5/app/components/selections/selections.component.js +104 -0
- package/esm5/app/components/selections/selections.module.js +26 -0
- package/esm5/app/components/shared/loader/loader.component.js +16 -0
- package/esm5/app/components/shared/shared.module.js +24 -0
- package/esm5/app/directives/visibility-observer-master.directive.js +64 -0
- package/esm5/app/directives/visibility-observer.directive.js +59 -0
- package/esm5/app/services/configurator.service.js +160 -0
- package/esm5/app/services/image-cache.service.js +69 -0
- package/esm5/app/services/locator.service.js +13 -0
- package/esm5/colijnit-configurator.js +11 -0
- package/esm5/helper/variation-helper.js +268 -0
- package/esm5/model/material.js +13 -0
- package/esm5/model/variation-settings.js +8 -0
- package/esm5/model/variation.js +7 -0
- package/esm5/public_api.js +7 -0
- package/esm5/utils/asset.utils.js +106 -0
- package/esm5/utils/file.utils.js +151 -0
- package/esm5/utils/image.utils.js +56 -0
- package/esm5/utils/object.utils.js +56 -0
- package/esm5/utils/scene-utils.js +98 -0
- package/esm5/utils/threed.utils.js +279 -0
- package/esm5/utils/variation-utils.js +327 -0
- package/fesm2015/colijnit-configurator.js +2109 -0
- package/fesm2015/colijnit-configurator.js.map +1 -0
- package/fesm5/colijnit-configurator.js +2527 -0
- package/fesm5/colijnit-configurator.js.map +1 -0
- package/helper/variation-helper.d.ts +14 -0
- package/model/material.d.ts +17 -0
- package/model/variation-settings.d.ts +14 -0
- package/model/variation.d.ts +10 -0
- package/package.json +12 -45
- package/{src/public_api.ts → public_api.d.ts} +6 -6
- package/utils/asset.utils.d.ts +13 -0
- package/utils/file.utils.d.ts +27 -0
- package/utils/image.utils.d.ts +8 -0
- package/utils/object.utils.d.ts +7 -0
- package/utils/scene-utils.d.ts +7 -0
- package/utils/threed.utils.d.ts +16 -0
- package/utils/variation-utils.d.ts +12 -0
- package/.idea/Configurator.iml +0 -12
- package/.idea/codeStyles/Project.xml +0 -21
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/misc.xml +0 -9
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/angular.json +0 -193
- package/configurator.iml +0 -11
- package/dist/configurator/index.html +0 -14
- package/dist/configurator/main-es2015.js +0 -3129
- package/dist/configurator/main-es2015.js.map +0 -1
- package/dist/configurator/main-es5.js +0 -5482
- package/dist/configurator/main-es5.js.map +0 -1
- package/dist/configurator/polyfills-es2015.js +0 -4520
- package/dist/configurator/polyfills-es2015.js.map +0 -1
- package/dist/configurator/polyfills-es5.js +0 -18375
- package/dist/configurator/polyfills-es5.js.map +0 -1
- package/dist/configurator/runtime-es2015.js +0 -155
- package/dist/configurator/runtime-es2015.js.map +0 -1
- package/dist/configurator/runtime-es5.js +0 -155
- package/dist/configurator/runtime-es5.js.map +0 -1
- package/dist/configurator/styles-es2015.js +0 -450
- package/dist/configurator/styles-es2015.js.map +0 -1
- package/dist/configurator/styles-es5.js +0 -432
- package/dist/configurator/styles-es5.js.map +0 -1
- package/dist/configurator/vendor-es2015.js +0 -155551
- package/dist/configurator/vendor-es2015.js.map +0 -1
- package/dist/configurator/vendor-es5.js +0 -183588
- package/dist/configurator/vendor-es5.js.map +0 -1
- package/ng-package.json +0 -9
- package/src/app/app.component.ts +0 -222
- package/src/app/app.module.ts +0 -34
- package/src/app/builder.ts +0 -480
- package/src/app/components/answers/answer/answer.component.ts +0 -61
- package/src/app/components/answers/answers.component.ts +0 -41
- package/src/app/components/answers/answers.module.ts +0 -26
- package/src/app/components/selections/selections.component.ts +0 -131
- package/src/app/components/selections/selections.module.ts +0 -20
- package/src/app/components/shared/loader/loader.component.scss +0 -33
- package/src/app/components/shared/loader/loader.component.ts +0 -20
- package/src/app/components/shared/shared.module.ts +0 -16
- package/src/app/directives/visibility-observer-master.directive.ts +0 -71
- package/src/app/directives/visibility-observer.directive.ts +0 -74
- package/src/app/services/configurator.service.ts +0 -86
- package/src/app/services/image-cache.service.ts +0 -56
- package/src/app/services/locator.service.ts +0 -6
- package/src/environments/environment.prod.ts +0 -3
- package/src/environments/environment.ts +0 -8
- package/src/helper/variation-helper.ts +0 -220
- package/src/index.html +0 -14
- package/src/main.ts +0 -11
- package/src/model/material.ts +0 -22
- package/src/model/variation-settings.ts +0 -14
- package/src/model/variation.ts +0 -11
- package/src/polyfills.ts +0 -73
- package/src/style/shared.scss +0 -173
- package/src/style/styles.scss +0 -45
- package/src/tsconfig.app.json +0 -16
- package/src/tsconfig.spec.json +0 -19
- package/src/utils/asset.utils.ts +0 -88
- package/src/utils/file.utils.ts +0 -156
- package/src/utils/file.utils.unit.test.ts +0 -8
- package/src/utils/image.utils.ts +0 -54
- package/src/utils/object.utils.ts +0 -52
- package/src/utils/scene-utils.ts +0 -119
- package/src/utils/threed.utils.ts +0 -219
- package/src/utils/variation-utils.ts +0 -216
- package/tsconfig.json +0 -23
- package/tslint.json +0 -132
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
import { ObjectUtils } from "./object.utils";
|
|
4
|
+
import { FileUtils } from "./file.utils";
|
|
5
|
+
var ThreedUtils = /** @class */ (function () {
|
|
6
|
+
function ThreedUtils() {
|
|
7
|
+
this._objectCache = new Map();
|
|
8
|
+
}
|
|
9
|
+
ThreedUtils.prototype.clearCache = function () {
|
|
10
|
+
var objs = Array.from(this._objectCache.values());
|
|
11
|
+
objs.forEach(function (o) { return ObjectUtils.DisposeObject(o); });
|
|
12
|
+
this._objectCache.clear();
|
|
13
|
+
};
|
|
14
|
+
ThreedUtils.prototype.download3DSource = function (fileName) {
|
|
15
|
+
var _this = this;
|
|
16
|
+
return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
17
|
+
var lookupFileName;
|
|
18
|
+
var _this = this;
|
|
19
|
+
return __generator(this, function (_a) {
|
|
20
|
+
switch (_a.label) {
|
|
21
|
+
case 0:
|
|
22
|
+
fileName = fileName.replace('.unity3d', '');
|
|
23
|
+
lookupFileName = fileName + (fileName.indexOf('.glb') < 0 ? '.glb' : '');
|
|
24
|
+
if (this._objectCache.has(lookupFileName)) {
|
|
25
|
+
resolve(this._objectCache.get(lookupFileName));
|
|
26
|
+
return [2 /*return*/];
|
|
27
|
+
}
|
|
28
|
+
return [4 /*yield*/, FileUtils.FileExists(lookupFileName, 'https://cdn1.colijn-it.nl/content43/')];
|
|
29
|
+
case 1:
|
|
30
|
+
if (_a.sent()) {
|
|
31
|
+
this.loadGlbSource(lookupFileName).then(function (obj) {
|
|
32
|
+
_this._objectCache.set(lookupFileName, obj);
|
|
33
|
+
resolve(obj);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
reject("GLB source not found! (" + lookupFileName + ")");
|
|
38
|
+
}
|
|
39
|
+
return [2 /*return*/];
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}); });
|
|
43
|
+
};
|
|
44
|
+
ThreedUtils.prototype.readFileAsText = function (file) {
|
|
45
|
+
var fileReader = new FileReader();
|
|
46
|
+
return new Promise(function (resolve, reject) {
|
|
47
|
+
fileReader.onload = function (e) { return resolve(e.target.result); };
|
|
48
|
+
fileReader.onerror = function (error) { return reject(error); };
|
|
49
|
+
fileReader.readAsText(file);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
ThreedUtils.prototype.loadJsonModel = function (filePath) {
|
|
53
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
54
|
+
var json, loader;
|
|
55
|
+
var _this = this;
|
|
56
|
+
return __generator(this, function (_a) {
|
|
57
|
+
switch (_a.label) {
|
|
58
|
+
case 0:
|
|
59
|
+
if (this._objectCache.has(filePath)) {
|
|
60
|
+
return [2 /*return*/, Promise.resolve(this._objectCache.get(filePath))];
|
|
61
|
+
}
|
|
62
|
+
return [4 /*yield*/, this._readJsonFile(filePath)];
|
|
63
|
+
case 1:
|
|
64
|
+
json = _a.sent();
|
|
65
|
+
loader = new THREE.ObjectLoader();
|
|
66
|
+
loader.crossOrigin = 'Anonymous';
|
|
67
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
68
|
+
try {
|
|
69
|
+
var obj = loader.parse(json);
|
|
70
|
+
_this._objectCache.set(filePath, obj);
|
|
71
|
+
resolve(obj);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
reject(null);
|
|
75
|
+
}
|
|
76
|
+
})];
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
ThreedUtils.prototype.loadJsonObjectModel = function (filePath) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
83
|
+
var loader;
|
|
84
|
+
var _this = this;
|
|
85
|
+
return __generator(this, function (_a) {
|
|
86
|
+
if (this._objectCache.has(filePath)) {
|
|
87
|
+
return [2 /*return*/, Promise.resolve(this._objectCache.get(filePath))];
|
|
88
|
+
}
|
|
89
|
+
loader = new THREE.ObjectLoader();
|
|
90
|
+
loader.setCrossOrigin('Anonymous');
|
|
91
|
+
loader.setResourcePath('');
|
|
92
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
93
|
+
loader.load(filePath, function (object) {
|
|
94
|
+
var obj = (object.type === 'Scene' && object.children[0].type === 'Object3D') ? object.children[0] : object;
|
|
95
|
+
_this._objectCache.set(filePath, obj);
|
|
96
|
+
resolve(obj);
|
|
97
|
+
}, function (xhr) { return null; }, function (error) { return reject(error); });
|
|
98
|
+
})];
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
ThreedUtils.prototype.loadGlbModel = function (file, cleanUp) {
|
|
103
|
+
if (cleanUp === void 0) { cleanUp = true; }
|
|
104
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
105
|
+
var obj;
|
|
106
|
+
return __generator(this, function (_a) {
|
|
107
|
+
switch (_a.label) {
|
|
108
|
+
case 0:
|
|
109
|
+
if (this._objectCache.has(file)) {
|
|
110
|
+
return [2 /*return*/, Promise.resolve(this._objectCache.get(file))];
|
|
111
|
+
}
|
|
112
|
+
if (!window.hasOwnProperty('loadGLTF')) {
|
|
113
|
+
console.error('loadGLTF not defined in window global');
|
|
114
|
+
return [2 /*return*/, null];
|
|
115
|
+
}
|
|
116
|
+
return [4 /*yield*/, window.loadGLTF(file)];
|
|
117
|
+
case 1:
|
|
118
|
+
obj = _a.sent();
|
|
119
|
+
if (obj) {
|
|
120
|
+
this._cleanedUpObjects(obj, cleanUp);
|
|
121
|
+
this._objectCache.set(file, obj);
|
|
122
|
+
return [2 /*return*/, obj];
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
return [2 /*return*/, null];
|
|
126
|
+
}
|
|
127
|
+
return [2 /*return*/];
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
ThreedUtils.prototype.loadGlbSource = function (file) {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
134
|
+
var obj, children;
|
|
135
|
+
return __generator(this, function (_a) {
|
|
136
|
+
switch (_a.label) {
|
|
137
|
+
case 0: return [4 /*yield*/, this.loadGlbModel(file, false)];
|
|
138
|
+
case 1:
|
|
139
|
+
obj = _a.sent();
|
|
140
|
+
if (obj) {
|
|
141
|
+
obj.children = obj.children.filter(function (c) { return !(c instanceof THREE.Camera); });
|
|
142
|
+
obj.children.sort(function (a, b) { return a['name'] < b['name'] ? 1 : -1; });
|
|
143
|
+
obj.children.forEach(function (c) {
|
|
144
|
+
c.traverse(function (t) {
|
|
145
|
+
t.visible = !t.name.toLowerCase().startsWith('c_');
|
|
146
|
+
});
|
|
147
|
+
c.visible = false;
|
|
148
|
+
});
|
|
149
|
+
if (obj.children.length === 1 && obj.children[0] instanceof THREE.Group) { // flatten children
|
|
150
|
+
children = obj.children[0].children.slice();
|
|
151
|
+
obj.children.length = 0;
|
|
152
|
+
obj.children = children;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return [2 /*return*/, obj];
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
ThreedUtils.prototype.textureFromUrl = function (url) {
|
|
161
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
162
|
+
return __generator(this, function (_a) {
|
|
163
|
+
// url = this._includeBaseUrl(url);
|
|
164
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
165
|
+
var textureLoader = new THREE.TextureLoader();
|
|
166
|
+
// textureLoader.setBaseU(this._settingsService.settings.assetPath);
|
|
167
|
+
textureLoader.load(url, function (texture) {
|
|
168
|
+
texture.wrapT = THREE.RepeatWrapping;
|
|
169
|
+
texture.wrapS = THREE.RepeatWrapping;
|
|
170
|
+
texture.repeat.set(1, 1);
|
|
171
|
+
texture.needsUpdate = true;
|
|
172
|
+
return resolve(texture);
|
|
173
|
+
}, null, reject);
|
|
174
|
+
})];
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
ThreedUtils.prototype._cleanedUpObjects = function (object, cleanUp) {
|
|
179
|
+
var _this = this;
|
|
180
|
+
if (cleanUp === void 0) { cleanUp = true; }
|
|
181
|
+
var obj = new THREE.Object3D();
|
|
182
|
+
object.children.forEach(function (c) {
|
|
183
|
+
if (!(c instanceof THREE.Camera)) {
|
|
184
|
+
if (cleanUp && c instanceof THREE.Group || (c.children.length === 1 && c.children[0] instanceof THREE.Group)) {
|
|
185
|
+
_this._addGroupChildrenToObject(c, obj);
|
|
186
|
+
}
|
|
187
|
+
else if ((cleanUp && !(c instanceof THREE.Mesh)) || (!(c instanceof THREE.Mesh) && !c.name && c.children.length > 0)) {
|
|
188
|
+
c.children.forEach(function (child) {
|
|
189
|
+
child.translateY(c.position.y);
|
|
190
|
+
});
|
|
191
|
+
c.translateY(-c.position.y);
|
|
192
|
+
if (obj.children.length > 0) {
|
|
193
|
+
obj.add(c.clone());
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
obj = c.clone();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// if (c.position.y > 0 || c.position.y < 0) {
|
|
201
|
+
// c.children.forEach((child) => {
|
|
202
|
+
// child.translateY(c.position.y);
|
|
203
|
+
// });
|
|
204
|
+
// c.translateY(-c.position.y);
|
|
205
|
+
// }
|
|
206
|
+
obj.add(c.clone());
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
var boundingBox = new THREE.Box3().setFromObject(obj);
|
|
211
|
+
var bbCenterPivot = new THREE.Vector3();
|
|
212
|
+
boundingBox.getCenter(bbCenterPivot);
|
|
213
|
+
var delta = new THREE.Vector3().add(bbCenterPivot).negate();
|
|
214
|
+
obj.children.forEach(function (cc) {
|
|
215
|
+
cc.position.add(delta);
|
|
216
|
+
});
|
|
217
|
+
return obj;
|
|
218
|
+
};
|
|
219
|
+
ThreedUtils.prototype._addGroupChildrenToObject = function (group, obj, cleanUp) {
|
|
220
|
+
var _this = this;
|
|
221
|
+
if (cleanUp === void 0) { cleanUp = true; }
|
|
222
|
+
group.children.forEach(function (gc) {
|
|
223
|
+
if (cleanUp && gc instanceof THREE.Group) {
|
|
224
|
+
_this._addGroupChildrenToObject(gc, obj);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// gc.translateX(-group.position.x);
|
|
228
|
+
gc.translateY(group.position.y);
|
|
229
|
+
// gc.translateZ(-group.position.z);
|
|
230
|
+
obj.add(gc.clone());
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
ThreedUtils.prototype._iterateChildren = function (children, callback) {
|
|
235
|
+
for (var i = 0; i < children.length; i++) {
|
|
236
|
+
var child = children[i];
|
|
237
|
+
if (child instanceof THREE.Mesh) {
|
|
238
|
+
callback(child);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this._iterateChildren(child.children, callback);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
ThreedUtils.prototype._readJsonFile = function (filePath) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
247
|
+
var response, empty_1, e_1;
|
|
248
|
+
return __generator(this, function (_a) {
|
|
249
|
+
switch (_a.label) {
|
|
250
|
+
case 0:
|
|
251
|
+
_a.trys.push([0, 5, , 6]);
|
|
252
|
+
return [4 /*yield*/, fetch(filePath)];
|
|
253
|
+
case 1:
|
|
254
|
+
response = _a.sent();
|
|
255
|
+
if (!!response.ok) return [3 /*break*/, 2];
|
|
256
|
+
return [2 /*return*/, ''];
|
|
257
|
+
case 2:
|
|
258
|
+
empty_1 = false;
|
|
259
|
+
return [4 /*yield*/, response.clone().text().then(function (value) {
|
|
260
|
+
if (value === '') {
|
|
261
|
+
empty_1 = true;
|
|
262
|
+
}
|
|
263
|
+
})];
|
|
264
|
+
case 3:
|
|
265
|
+
_a.sent();
|
|
266
|
+
return [2 /*return*/, empty_1 ? {} : response.json()];
|
|
267
|
+
case 4: return [3 /*break*/, 6];
|
|
268
|
+
case 5:
|
|
269
|
+
e_1 = _a.sent();
|
|
270
|
+
return [2 /*return*/, ''];
|
|
271
|
+
case 6: return [2 /*return*/];
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
return ThreedUtils;
|
|
277
|
+
}());
|
|
278
|
+
export { ThreedUtils };
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVkLnV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL3RocmVlZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdkM7SUFBQTtRQUVVLGlCQUFZLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUM7SUFvTmhFLENBQUM7SUFsTlEsZ0NBQVUsR0FBakI7UUFDRSxJQUFNLElBQUksR0FBcUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQTVCLENBQTRCLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxzQ0FBZ0IsR0FBdkIsVUFBd0IsUUFBZ0I7UUFBeEMsaUJBaUJDO1FBaEJDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBTyxPQUFpQixFQUFFLE1BQWdCOzs7Ozs7d0JBQzNELFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDeEMsY0FBYyxHQUFXLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNyRixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FB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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUM7Ozs7d0JBR3RDLHNCQUFPLEVBQUUsRUFBQzs7Ozs7S0FFYjtJQUVILGtCQUFDO0FBQUQsQ0FBQyxBQXRORCxJQXNOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gXCJ0aHJlZVwiO1xuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LnV0aWxzXCI7XG5pbXBvcnQge0ZpbGVVdGlsc30gZnJvbSBcIi4vZmlsZS51dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgVGhyZWVkVXRpbHMge1xuXG4gIHByaXZhdGUgX29iamVjdENhY2hlOiBNYXA8c3RyaW5nLCBUSFJFRS5PYmplY3QzRD4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3Qgb2JqczogVEhSRUUuT2JqZWN0M0RbXSA9IEFycmF5LmZyb20odGhpcy5fb2JqZWN0Q2FjaGUudmFsdWVzKCkpO1xuICAgIG9ianMuZm9yRWFjaChvID0+IE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QobykpO1xuICAgIHRoaXMuX29iamVjdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWQzRFNvdXJjZShmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnLnVuaXR5M2QnLCAnJyk7XG4gICAgICBsZXQgbG9va3VwRmlsZU5hbWU6IHN0cmluZyA9IGZpbGVOYW1lICsgKGZpbGVOYW1lLmluZGV4T2YoJy5nbGInKSA8IDAgPyAnLmdsYicgOiAnJyk7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGxvb2t1cEZpbGVOYW1lKSkge1xuICAgICAgICByZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChsb29rdXBGaWxlTmFtZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoYXdhaXQgRmlsZVV0aWxzLkZpbGVFeGlzdHMobG9va3VwRmlsZU5hbWUsICdodHRwczovL2NkbjEuY29saWpuLWl0Lm5sL2NvbnRlbnQ0My8nKSkge1xuICAgICAgICB0aGlzLmxvYWRHbGJTb3VyY2UobG9va3VwRmlsZU5hbWUpLnRoZW4oKG9iajogVEhSRUUuT2JqZWN0M0QpID0+IHtcbiAgICAgICAgICB0aGlzLl9vYmplY3RDYWNoZS5zZXQobG9va3VwRmlsZU5hbWUsIG9iaik7XG4gICAgICAgICAgcmVzb2x2ZShvYmopO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChgR0xCIHNvdXJjZSBub3QgZm91bmQhICgke2xvb2t1cEZpbGVOYW1lfSlgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkRmlsZUFzVGV4dChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICBmaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRKc29uTW9kZWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGVQYXRoKSk7XG4gICAgfVxuICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGF3YWl0IHRoaXMuX3JlYWRKc29uRmlsZShmaWxlUGF0aCk7XG4gICAgY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLk9iamVjdExvYWRlcigpO1xuICAgIGxvYWRlci5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvYmogPSBsb2FkZXIucGFyc2UoanNvbik7XG4gICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlUGF0aCwgb2JqKTtcbiAgICAgICAgcmVzb2x2ZShvYmopO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEpzb25PYmplY3RNb2RlbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9vYmplY3RDYWNoZS5nZXQoZmlsZVBhdGgpKTtcbiAgICB9XG4gICAgY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLk9iamVjdExvYWRlcigpO1xuICAgIGxvYWRlci5zZXRDcm9zc09yaWdpbignQW5vbnltb3VzJyk7XG4gICAgbG9hZGVyLnNldFJlc291cmNlUGF0aCgnJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKGZpbGVQYXRoLFxuICAgICAgICAob2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBvYmo6IFRIUkVFLk9iamVjdDNEID0gKG9iamVjdC50eXBlID09PSAnU2NlbmUnICYmIG9iamVjdC5jaGlsZHJlblswXS50eXBlID09PSAnT2JqZWN0M0QnKSA/IG9iamVjdC5jaGlsZHJlblswXSA6IG9iamVjdDtcbiAgICAgICAgICB0aGlzLl9vYmplY3RDYWNoZS5zZXQoZmlsZVBhdGgsIG9iaik7XG4gICAgICAgICAgcmVzb2x2ZShvYmogYXMgVEhSRUUuT2JqZWN0M0QpO1xuICAgICAgICB9LFxuICAgICAgICB4aHIgPT4gbnVsbCxcbiAgICAgICAgZXJyb3IgPT4gcmVqZWN0KGVycm9yKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkR2xiTW9kZWwoZmlsZTogc3RyaW5nLCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlKSk7XG4gICAgfVxuICAgIGlmICghd2luZG93Lmhhc093blByb3BlcnR5KCdsb2FkR0xURicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdsb2FkR0xURiBub3QgZGVmaW5lZCBpbiB3aW5kb3cgZ2xvYmFsJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgICAvLyBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xuICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBhd2FpdCAod2luZG93IGFzIGFueSkubG9hZEdMVEYoZmlsZSk7XG4gICAgaWYgKG9iaikge1xuICAgICAgdGhpcy5fY2xlYW5lZFVwT2JqZWN0cyhvYmosIGNsZWFuVXApO1xuICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGUsIG9iaik7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEdsYlNvdXJjZShmaWxlOiBzdHJpbmcpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XG4gICAgY29uc3Qgb2JqID0gYXdhaXQgdGhpcy5sb2FkR2xiTW9kZWwoZmlsZSwgZmFsc2UpO1xuICAgIGlmIChvYmopIHtcbiAgICAgIG9iai5jaGlsZHJlbiA9IG9iai5jaGlsZHJlbi5maWx0ZXIoYyA9PiAhKGMgaW5zdGFuY2VvZiBUSFJFRS5DYW1lcmEpKTtcbiAgICAgIG9iai5jaGlsZHJlbi5zb3J0KChhLCBiKSA9PiBhWyduYW1lJ10gPCBiWyduYW1lJ10gPyAxIDogLTEpO1xuICAgICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGM6IFRIUkVFLk9iamVjdDNEKSA9PiB7XG4gICAgICAgIGMudHJhdmVyc2UoKHQ6IFRIUkVFLk9iamVjdDNEKSA9PiB7XG4gICAgICAgICAgdC52aXNpYmxlID0gIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG9iai5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgb2JqLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVEhSRUUuR3JvdXApIHsgLy8gZmxhdHRlbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjaGlsZHJlbjogYW55ID0gb2JqLmNoaWxkcmVuWzBdLmNoaWxkcmVuLnNsaWNlKCk7XG4gICAgICAgIG9iai5jaGlsZHJlbi5sZW5ndGggPSAwO1xuICAgICAgICBvYmouY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0ZXh0dXJlRnJvbVVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gdXJsID0gdGhpcy5faW5jbHVkZUJhc2VVcmwodXJsKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGV4dHVyZUxvYWRlciA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCk7XG4gICAgICAvLyB0ZXh0dXJlTG9hZGVyLnNldEJhc2VVKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGgpO1xuICAgICAgdGV4dHVyZUxvYWRlci5sb2FkKHVybCxcbiAgICAgICAgKHRleHR1cmU6IFRIUkVFLlRleHR1cmUpID0+IHtcbiAgICAgICAgICB0ZXh0dXJlLndyYXBUID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XG4gICAgICAgICAgdGV4dHVyZS53cmFwUyA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nO1xuICAgICAgICAgIHRleHR1cmUucmVwZWF0LnNldCgxLCAxKTtcbiAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0ZXh0dXJlKTtcbiAgICAgICAgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcmVqZWN0XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYW5lZFVwT2JqZWN0cyhvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IFRIUkVFLk9iamVjdDNEIHtcbiAgICBsZXQgb2JqOiBUSFJFRS5PYmplY3QzRCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICAgIG9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKChjOiBUSFJFRS5PYmplY3QzRCkgPT4ge1xuICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIFRIUkVFLkNhbWVyYSkpIHtcbiAgICAgICAgaWYgKGNsZWFuVXAgJiYgYyBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwIHx8IChjLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBjLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVEhSRUUuR3JvdXApKSB7XG4gICAgICAgICAgdGhpcy5fYWRkR3JvdXBDaGlsZHJlblRvT2JqZWN0KGMsIG9iaik7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNsZWFuVXAgJiYgIShjIGluc3RhbmNlb2YgVEhSRUUuTWVzaCkpIHx8ICghKGMgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSAmJiAhYy5uYW1lICYmIGMuY2hpbGRyZW4ubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICBjLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBjaGlsZC50cmFuc2xhdGVZKGMucG9zaXRpb24ueSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYy50cmFuc2xhdGVZKC1jLnBvc2l0aW9uLnkpO1xuICAgICAgICAgIGlmIChvYmouY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb2JqLmFkZChjLmNsb25lKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmogPSBjLmNsb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIChjLnBvc2l0aW9uLnkgPiAwIHx8IGMucG9zaXRpb24ueSA8IDApIHtcbiAgICAgICAgICAvLyAgIGMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAvLyAgICAgY2hpbGQudHJhbnNsYXRlWShjLnBvc2l0aW9uLnkpO1xuICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgLy8gICBjLnRyYW5zbGF0ZVkoLWMucG9zaXRpb24ueSk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIG9iai5hZGQoYy5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XG4gICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xuICAgIGNvbnN0IGRlbHRhOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5hZGQoYmJDZW50ZXJQaXZvdCkubmVnYXRlKCk7XG4gICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNjKSA9PiB7XG4gICAgICBjYy5wb3NpdGlvbi5hZGQoZGVsdGEpO1xuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwcml2YXRlIF9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoZ3JvdXA6IFRIUkVFLk9iamVjdDNELCBvYmo6IFRIUkVFLk9iamVjdDNELCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKGdjOiBUSFJFRS5PYmplY3QzRCkgPT4ge1xuICAgICAgaWYgKGNsZWFuVXAgJiYgZ2MgaW5zdGFuY2VvZiBUSFJFRS5Hcm91cCkge1xuICAgICAgICB0aGlzLl9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoZ2MsIG9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnYy50cmFuc2xhdGVYKC1ncm91cC5wb3NpdGlvbi54KTtcbiAgICAgICAgZ2MudHJhbnNsYXRlWShncm91cC5wb3NpdGlvbi55KTtcbiAgICAgICAgLy8gZ2MudHJhbnNsYXRlWigtZ3JvdXAucG9zaXRpb24ueik7XG4gICAgICAgIG9iai5hZGQoZ2MuY2xvbmUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pdGVyYXRlQ2hpbGRyZW4oY2hpbGRyZW46IFRIUkVFLk9iamVjdDNEW10sIGNhbGxiYWNrOiAoY2hpbGQ6IFRIUkVFLk1lc2gpID0+IHt9KTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQ6IFRIUkVFLk9iamVjdDNEID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSB7XG4gICAgICAgIGNhbGxiYWNrKGNoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2l0ZXJhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRKc29uRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChmaWxlUGF0aCk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlbXB0eSA9IGZhbHNlO1xuICAgICAgICBhd2FpdCByZXNwb25zZS5jbG9uZSgpLnRleHQoKS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZW1wdHkgPyB7fSA6IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==
|