@dcl/sdk 7.0.6-4197739270.commit-db87ed8 → 7.0.6-4218076982.commit-7ba834d
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/package.json +6 -30
- package/cli/commands/build/helpers.d.ts +0 -21
- package/cli/commands/build/helpers.js +0 -50
- package/cli/commands/build/helpers.ts +0 -89
- package/cli/commands/build/index.d.ts +0 -19
- package/cli/commands/build/index.js +0 -69
- package/cli/commands/build/index.ts +0 -91
- package/cli/commands/init/index.d.ts +0 -17
- package/cli/commands/init/index.js +0 -51
- package/cli/commands/init/index.ts +0 -67
- package/cli/commands/init/repos.d.ts +0 -9
- package/cli/commands/init/repos.js +0 -12
- package/cli/commands/init/repos.ts +0 -17
- package/cli/commands/preview/bff.d.ts +0 -3
- package/cli/commands/preview/bff.js +0 -54
- package/cli/commands/preview/bff.ts +0 -63
- package/cli/commands/preview/catalyst.d.ts +0 -5
- package/cli/commands/preview/catalyst.js +0 -24
- package/cli/commands/preview/catalyst.ts +0 -31
- package/cli/commands/preview/coordinates.d.ts +0 -20
- package/cli/commands/preview/coordinates.js +0 -90
- package/cli/commands/preview/coordinates.ts +0 -146
- package/cli/commands/preview/endpoints.d.ts +0 -10
- package/cli/commands/preview/endpoints.js +0 -455
- package/cli/commands/preview/endpoints.ts +0 -568
- package/cli/commands/preview/eth.d.ts +0 -2
- package/cli/commands/preview/eth.js +0 -6
- package/cli/commands/preview/eth.ts +0 -3
- package/cli/commands/preview/index.d.ts +0 -20
- package/cli/commands/preview/index.js +0 -100
- package/cli/commands/preview/index.ts +0 -98
- package/cli/commands/preview/port.d.ts +0 -1
- package/cli/commands/preview/port.js +0 -21
- package/cli/commands/preview/port.ts +0 -15
- package/cli/commands/preview/project.d.ts +0 -14
- package/cli/commands/preview/project.js +0 -77
- package/cli/commands/preview/project.ts +0 -112
- package/cli/commands/preview/types.d.ts +0 -18
- package/cli/commands/preview/types.js +0 -3
- package/cli/commands/preview/types.ts +0 -26
- package/cli/commands/preview/wire.d.ts +0 -2
- package/cli/commands/preview/wire.js +0 -66
- package/cli/commands/preview/wire.ts +0 -70
- package/cli/commands/preview/ws.d.ts +0 -7
- package/cli/commands/preview/ws.js +0 -16
- package/cli/commands/preview/ws.ts +0 -24
- package/cli/commands/start/index.d.ts +0 -29
- package/cli/commands/start/index.js +0 -126
- package/cli/commands/start/index.ts +0 -145
- package/cli/components/fetch.d.ts +0 -5
- package/cli/components/fetch.js +0 -34
- package/cli/components/fetch.ts +0 -11
- package/cli/components/fs.d.ts +0 -12
- package/cli/components/fs.js +0 -69
- package/cli/components/fs.ts +0 -62
- package/cli/components/index.d.ts +0 -7
- package/cli/components/index.js +0 -13
- package/cli/components/index.ts +0 -14
- package/cli/index.d.ts +0 -7
- package/cli/index.js +0 -76
- package/cli/index.ts +0 -85
- package/cli/utils/args.d.ts +0 -10
- package/cli/utils/args.js +0 -16
- package/cli/utils/args.ts +0 -18
- package/cli/utils/commands.d.ts +0 -3
- package/cli/utils/commands.js +0 -24
- package/cli/utils/commands.ts +0 -28
- package/cli/utils/dcl-ignore.d.ts +0 -4
- package/cli/utils/dcl-ignore.js +0 -44
- package/cli/utils/dcl-ignore.ts +0 -45
- package/cli/utils/error.d.ts +0 -2
- package/cli/utils/error.js +0 -7
- package/cli/utils/error.ts +0 -1
- package/cli/utils/exec.d.ts +0 -8
- package/cli/utils/exec.js +0 -32
- package/cli/utils/exec.ts +0 -42
- package/cli/utils/fs.d.ts +0 -10
- package/cli/utils/fs.js +0 -26
- package/cli/utils/fs.ts +0 -41
- package/cli/utils/log.d.ts +0 -5
- package/cli/utils/log.js +0 -29
- package/cli/utils/log.ts +0 -39
- package/cli/utils/object.d.ts +0 -9
- package/cli/utils/object.js +0 -45
- package/cli/utils/object.ts +0 -62
- package/cli/utils/out-messages.d.ts +0 -1
- package/cli/utils/out-messages.js +0 -8
- package/cli/utils/out-messages.ts +0 -3
@@ -1,455 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
-
if (k2 === undefined) k2 = k;
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
-
}
|
8
|
-
Object.defineProperty(o, k2, desc);
|
9
|
-
}) : (function(o, m, k, k2) {
|
10
|
-
if (k2 === undefined) k2 = k;
|
11
|
-
o[k2] = m[k];
|
12
|
-
}));
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
-
}) : function(o, v) {
|
16
|
-
o["default"] = v;
|
17
|
-
});
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
-
if (mod && mod.__esModule) return mod;
|
20
|
-
var result = {};
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
-
__setModuleDefault(result, mod);
|
23
|
-
return result;
|
24
|
-
};
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
-
};
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
-
exports.getFilesFromFolder = exports.setupEcs6Endpoints = void 0;
|
30
|
-
const path = __importStar(require("path"));
|
31
|
-
const glob_1 = require("glob");
|
32
|
-
const sdk_1 = require("@dcl/schemas/dist/sdk");
|
33
|
-
const schemas_1 = require("@dcl/schemas");
|
34
|
-
const ignore_1 = __importDefault(require("ignore"));
|
35
|
-
const node_fetch_1 = __importStar(require("node-fetch"));
|
36
|
-
const catalyst_1 = require("./catalyst");
|
37
|
-
const fs_1 = require("fs");
|
38
|
-
const dcl_ignore_1 = require("../../utils/dcl-ignore");
|
39
|
-
function getCatalystUrl() {
|
40
|
-
return new URL('https://peer.decentraland.org');
|
41
|
-
}
|
42
|
-
function smartWearableNameToId(name) {
|
43
|
-
return name.toLocaleLowerCase().replace(/ /g, '-');
|
44
|
-
}
|
45
|
-
function setupEcs6Endpoints(components, dir, router) {
|
46
|
-
const baseFolders = [dir];
|
47
|
-
router.get('/scene.json', async () => {
|
48
|
-
return {
|
49
|
-
headers: { 'content-type': 'application/json' },
|
50
|
-
body: components.fs.createReadStream(path.join(dir, 'scene.json'))
|
51
|
-
};
|
52
|
-
});
|
53
|
-
router.get('/lambdas/explore/realms', async (ctx) => {
|
54
|
-
return {
|
55
|
-
body: [
|
56
|
-
{
|
57
|
-
serverName: 'localhost',
|
58
|
-
url: `http://${ctx.url.host}`,
|
59
|
-
layer: 'stub',
|
60
|
-
usersCount: 0,
|
61
|
-
maxUsers: 100,
|
62
|
-
userParcels: []
|
63
|
-
}
|
64
|
-
]
|
65
|
-
};
|
66
|
-
});
|
67
|
-
router.get('/lambdas/contracts/servers', async (ctx) => {
|
68
|
-
return {
|
69
|
-
body: [
|
70
|
-
{
|
71
|
-
address: `http://${ctx.url.host}`,
|
72
|
-
owner: '0x0000000000000000000000000000000000000000',
|
73
|
-
id: '0x0000000000000000000000000000000000000000000000000000000000000000'
|
74
|
-
}
|
75
|
-
]
|
76
|
-
};
|
77
|
-
});
|
78
|
-
router.get('/lambdas/profiles', async (ctx, next) => {
|
79
|
-
const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
|
80
|
-
try {
|
81
|
-
const previewWearables = await getAllPreviewWearables(components, {
|
82
|
-
baseFolders,
|
83
|
-
baseUrl
|
84
|
-
});
|
85
|
-
if (previewWearables.length === 1) {
|
86
|
-
const catalystUrl = getCatalystUrl();
|
87
|
-
const u = new URL(ctx.url.toString());
|
88
|
-
u.host = catalystUrl.host;
|
89
|
-
u.protocol = catalystUrl.protocol;
|
90
|
-
u.port = catalystUrl.port;
|
91
|
-
const req = await (0, node_fetch_1.default)(u.toString(), {
|
92
|
-
headers: {
|
93
|
-
connection: 'close'
|
94
|
-
},
|
95
|
-
method: ctx.request.method,
|
96
|
-
body: ctx.request.method === 'get' ? undefined : ctx.request.body
|
97
|
-
});
|
98
|
-
const deployedProfile = (await req.json());
|
99
|
-
if ((deployedProfile === null || deployedProfile === void 0 ? void 0 : deployedProfile.length) === 1) {
|
100
|
-
deployedProfile[0].avatars[0].avatar.wearables.push(...previewWearables.map(($) => $.id));
|
101
|
-
return {
|
102
|
-
headers: {
|
103
|
-
'content-type': req.headers.get('content-type') || 'application/binary'
|
104
|
-
},
|
105
|
-
body: deployedProfile
|
106
|
-
};
|
107
|
-
}
|
108
|
-
}
|
109
|
-
}
|
110
|
-
catch (err) {
|
111
|
-
console.warn(`Failed to catch profile and fill with preview wearables.`, err);
|
112
|
-
}
|
113
|
-
return next();
|
114
|
-
});
|
115
|
-
router.all('/lambdas/:path+', async (ctx) => {
|
116
|
-
const catalystUrl = getCatalystUrl();
|
117
|
-
const u = new URL(ctx.url.toString());
|
118
|
-
u.host = catalystUrl.host;
|
119
|
-
u.protocol = catalystUrl.protocol;
|
120
|
-
u.port = catalystUrl.port;
|
121
|
-
const req = await (0, node_fetch_1.default)(u.toString(), {
|
122
|
-
headers: {
|
123
|
-
connection: 'close'
|
124
|
-
},
|
125
|
-
method: ctx.request.method,
|
126
|
-
body: ctx.request.method === 'get' ? undefined : ctx.request.body
|
127
|
-
});
|
128
|
-
return {
|
129
|
-
headers: {
|
130
|
-
'content-type': req.headers.get('content-type') || 'application/binary'
|
131
|
-
},
|
132
|
-
body: req.body
|
133
|
-
};
|
134
|
-
});
|
135
|
-
router.post('/content/entities', async (ctx) => {
|
136
|
-
const catalystUrl = getCatalystUrl();
|
137
|
-
const headers = new node_fetch_1.Headers();
|
138
|
-
console.log(ctx.request.headers);
|
139
|
-
const res = await (0, node_fetch_1.default)(`${catalystUrl.toString()}/content/entities`, {
|
140
|
-
method: 'post',
|
141
|
-
headers,
|
142
|
-
body: ctx.request.body
|
143
|
-
});
|
144
|
-
return res;
|
145
|
-
});
|
146
|
-
serveStatic(components, dir, router);
|
147
|
-
serveFolders(components, router, baseFolders);
|
148
|
-
}
|
149
|
-
exports.setupEcs6Endpoints = setupEcs6Endpoints;
|
150
|
-
function serveFolders(components, router, baseFolders) {
|
151
|
-
router.get('/content/contents/:hash', async (ctx, next) => {
|
152
|
-
if (ctx.params.hash && ctx.params.hash.startsWith('b64-')) {
|
153
|
-
const fullPath = path.resolve(Buffer.from(ctx.params.hash.replace(/^b64-/, ''), 'base64').toString('utf8'));
|
154
|
-
if (!baseFolders.find((folder) => fullPath.startsWith(folder))) {
|
155
|
-
return next();
|
156
|
-
}
|
157
|
-
return {
|
158
|
-
headers: {
|
159
|
-
'x-timestamp': Date.now(),
|
160
|
-
'x-sent': true,
|
161
|
-
'cache-control': 'no-cache,private,max-age=1'
|
162
|
-
},
|
163
|
-
body: components.fs.createReadStream(fullPath)
|
164
|
-
};
|
165
|
-
}
|
166
|
-
return next();
|
167
|
-
});
|
168
|
-
async function pointerRequestHandler(pointers) {
|
169
|
-
if (!pointers || pointers.length === 0) {
|
170
|
-
return [];
|
171
|
-
}
|
172
|
-
const requestedPointers = new Set(pointers && typeof pointers === 'string' ? [pointers] : pointers);
|
173
|
-
const resultEntities = await getSceneJson(components, {
|
174
|
-
baseFolders,
|
175
|
-
pointers: Array.from(requestedPointers)
|
176
|
-
});
|
177
|
-
const catalystUrl = getCatalystUrl();
|
178
|
-
const remote = (0, catalyst_1.fetchEntityByPointer)(catalystUrl.toString(), pointers.filter(($) => !$.match(/-?\d+,-?\d+/)));
|
179
|
-
const serverEntities = Array.isArray(remote) ? remote : [];
|
180
|
-
return [...resultEntities, ...serverEntities];
|
181
|
-
}
|
182
|
-
router.get('/content/entities/scene', async (ctx) => {
|
183
|
-
return {
|
184
|
-
body: await pointerRequestHandler(ctx.url.searchParams.getAll('pointer'))
|
185
|
-
};
|
186
|
-
});
|
187
|
-
router.post('/content/entities/active', async (ctx) => {
|
188
|
-
const body = await ctx.request.json();
|
189
|
-
return {
|
190
|
-
body: await pointerRequestHandler(body.pointers)
|
191
|
-
};
|
192
|
-
});
|
193
|
-
router.get('/preview-wearables/:id', async (ctx) => {
|
194
|
-
const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
|
195
|
-
const wearables = await getAllPreviewWearables(components, {
|
196
|
-
baseUrl,
|
197
|
-
baseFolders
|
198
|
-
});
|
199
|
-
const wearableId = ctx.params.id;
|
200
|
-
return {
|
201
|
-
body: {
|
202
|
-
ok: true,
|
203
|
-
data: wearables.filter((wearable) => smartWearableNameToId(wearable === null || wearable === void 0 ? void 0 : wearable.name) === wearableId)
|
204
|
-
}
|
205
|
-
};
|
206
|
-
});
|
207
|
-
router.get('/preview-wearables', async (ctx) => {
|
208
|
-
const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
|
209
|
-
return {
|
210
|
-
body: {
|
211
|
-
ok: true,
|
212
|
-
data: await getAllPreviewWearables(components, { baseUrl, baseFolders })
|
213
|
-
}
|
214
|
-
};
|
215
|
-
});
|
216
|
-
}
|
217
|
-
const defaultHashMaker = (str) => 'b64-' + Buffer.from(str).toString('base64');
|
218
|
-
async function getAllPreviewWearables(components, { baseFolders, baseUrl }) {
|
219
|
-
const wearablePathArray = [];
|
220
|
-
for (const wearableDir of baseFolders) {
|
221
|
-
const wearableJsonPath = path.resolve(wearableDir, 'wearable.json');
|
222
|
-
if (await components.fs.fileExists(wearableJsonPath)) {
|
223
|
-
wearablePathArray.push(wearableJsonPath);
|
224
|
-
}
|
225
|
-
}
|
226
|
-
const ret = [];
|
227
|
-
for (const wearableJsonPath of wearablePathArray) {
|
228
|
-
try {
|
229
|
-
ret.push(await serveWearable(components, { wearableJsonPath, baseUrl }));
|
230
|
-
}
|
231
|
-
catch (err) {
|
232
|
-
console.error(`Couldn't mock the wearable ${wearableJsonPath}. Please verify the correct format and scheme.`, err);
|
233
|
-
}
|
234
|
-
}
|
235
|
-
return ret;
|
236
|
-
}
|
237
|
-
async function serveWearable(components, { wearableJsonPath, baseUrl }) {
|
238
|
-
var _a;
|
239
|
-
const wearableDir = path.dirname(wearableJsonPath);
|
240
|
-
const wearableJson = JSON.parse((await components.fs.readFile(wearableJsonPath)).toString());
|
241
|
-
if (!sdk_1.WearableJson.validate(wearableJson)) {
|
242
|
-
const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
|
243
|
-
console.error(`Unable to validate wearable.json properly, please check it.`, errors);
|
244
|
-
throw new Error(`Invalid wearable.json (${wearableJsonPath})`);
|
245
|
-
}
|
246
|
-
const hashedFiles = await getFilesFromFolder(components, {
|
247
|
-
folder: wearableDir,
|
248
|
-
addOriginalPath: false
|
249
|
-
});
|
250
|
-
const thumbnailFiltered = hashedFiles.filter(($) => ($ === null || $ === void 0 ? void 0 : $.file) === 'thumbnail.png');
|
251
|
-
const thumbnail = thumbnailFiltered.length > 0 && ((_a = thumbnailFiltered[0]) === null || _a === void 0 ? void 0 : _a.hash) && `${baseUrl}/${thumbnailFiltered[0].hash}`;
|
252
|
-
const wearableId = 'urn:8dc2d7ad-97e3-44d0-ba89-e8305d795a6a';
|
253
|
-
const representations = wearableJson.data.representations.map((representation) => (Object.assign(Object.assign({}, representation), { mainFile: `male/${representation.mainFile}`, contents: hashedFiles.map(($) => ({
|
254
|
-
key: `male/${$ === null || $ === void 0 ? void 0 : $.file}`,
|
255
|
-
url: `${baseUrl}/${$ === null || $ === void 0 ? void 0 : $.hash}`,
|
256
|
-
hash: $ === null || $ === void 0 ? void 0 : $.hash
|
257
|
-
})) })));
|
258
|
-
return {
|
259
|
-
id: wearableId,
|
260
|
-
rarity: wearableJson.rarity,
|
261
|
-
i18n: [{ code: 'en', text: wearableJson.name }],
|
262
|
-
description: wearableJson.description,
|
263
|
-
thumbnail: thumbnail || '',
|
264
|
-
image: thumbnail || '',
|
265
|
-
collectionAddress: '0x0',
|
266
|
-
baseUrl: `${baseUrl}/`,
|
267
|
-
name: wearableJson.name || '',
|
268
|
-
data: {
|
269
|
-
category: wearableJson.data.category,
|
270
|
-
replaces: [],
|
271
|
-
hides: [],
|
272
|
-
tags: [],
|
273
|
-
representations: representations
|
274
|
-
}
|
275
|
-
};
|
276
|
-
}
|
277
|
-
async function getSceneJson(components, { baseFolders, pointers, customHashMaker }) {
|
278
|
-
const requestedPointers = new Set(pointers);
|
279
|
-
const resultEntities = [];
|
280
|
-
const allDeployments = await Promise.all(baseFolders.map(async (folder) => {
|
281
|
-
return entityV3FromFolder(components, {
|
282
|
-
folder,
|
283
|
-
addOriginalPath: false,
|
284
|
-
customHashMaker
|
285
|
-
});
|
286
|
-
}));
|
287
|
-
for (const pointer of Array.from(requestedPointers)) {
|
288
|
-
const theDeployment = allDeployments.find(($) => $ && $.pointers.includes(pointer));
|
289
|
-
if (theDeployment) {
|
290
|
-
theDeployment.pointers.forEach(($) => requestedPointers.delete($));
|
291
|
-
resultEntities.push(theDeployment);
|
292
|
-
}
|
293
|
-
}
|
294
|
-
return resultEntities;
|
295
|
-
}
|
296
|
-
function serveStatic(components, dir, router) {
|
297
|
-
const sdkPath = path.dirname(require.resolve('@dcl/sdk/package.json', {
|
298
|
-
paths: [dir]
|
299
|
-
}));
|
300
|
-
const dclExplorerJsonPath = path.dirname(require.resolve('@dcl/explorer/package.json', {
|
301
|
-
paths: [dir, sdkPath]
|
302
|
-
}));
|
303
|
-
const dclKernelDefaultProfilePath = path.resolve(dclExplorerJsonPath, 'default-profile');
|
304
|
-
const dclKernelImagesDecentralandConnect = path.resolve(dclExplorerJsonPath, 'images', 'decentraland-connect');
|
305
|
-
const routes = [
|
306
|
-
{
|
307
|
-
route: '/',
|
308
|
-
path: path.resolve(dclExplorerJsonPath, 'preview.html'),
|
309
|
-
type: 'text/html'
|
310
|
-
},
|
311
|
-
{
|
312
|
-
route: '/favicon.ico',
|
313
|
-
path: path.resolve(dclExplorerJsonPath, 'favicon.ico'),
|
314
|
-
type: 'text/html'
|
315
|
-
},
|
316
|
-
{
|
317
|
-
route: '/@/explorer/index.js',
|
318
|
-
path: path.resolve(dclExplorerJsonPath, 'index.js'),
|
319
|
-
type: 'text/javascript'
|
320
|
-
}
|
321
|
-
];
|
322
|
-
for (const route of routes) {
|
323
|
-
router.get(route.route, async (_ctx) => {
|
324
|
-
return {
|
325
|
-
headers: { 'Content-Type': route.type },
|
326
|
-
body: components.fs.createReadStream(route.path)
|
327
|
-
};
|
328
|
-
});
|
329
|
-
}
|
330
|
-
function createStaticRoutes(components, route, folder, transform = (str) => str) {
|
331
|
-
router.get(route, async (ctx, next) => {
|
332
|
-
const file = ctx.params.path;
|
333
|
-
const fullPath = path.resolve(folder, transform(file));
|
334
|
-
if (!(await components.fs.fileExists(fullPath))) {
|
335
|
-
return next();
|
336
|
-
}
|
337
|
-
const headers = {
|
338
|
-
'x-timestamp': Date.now(),
|
339
|
-
'x-sent': true,
|
340
|
-
'cache-control': 'no-cache,private,max-age=1'
|
341
|
-
};
|
342
|
-
if (fullPath.endsWith('.wasm')) {
|
343
|
-
headers['content-type'] = 'application/wasm';
|
344
|
-
}
|
345
|
-
return {
|
346
|
-
headers,
|
347
|
-
body: components.fs.createReadStream(fullPath)
|
348
|
-
};
|
349
|
-
});
|
350
|
-
}
|
351
|
-
createStaticRoutes(components, '/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
|
352
|
-
createStaticRoutes(components, '/default-profile/:path+', dclKernelDefaultProfilePath);
|
353
|
-
createStaticRoutes(components, '/@/explorer/:path+', dclExplorerJsonPath, (filePath) => filePath.replace(/.br+$/, ''));
|
354
|
-
router.get('/feature-flags/:file', async (ctx) => {
|
355
|
-
const res = await (0, node_fetch_1.default)(`https://feature-flags.decentraland.zone/${ctx.params.file}`, {
|
356
|
-
headers: {
|
357
|
-
connection: 'close'
|
358
|
-
}
|
359
|
-
});
|
360
|
-
return {
|
361
|
-
body: await res.arrayBuffer()
|
362
|
-
};
|
363
|
-
});
|
364
|
-
}
|
365
|
-
async function entityV3FromFolder(components, { folder, addOriginalPath, customHashMaker }) {
|
366
|
-
const sceneJsonPath = path.resolve(folder, './scene.json');
|
367
|
-
let isParcelScene = true;
|
368
|
-
const wearableJsonPath = path.resolve(folder, './wearable.json');
|
369
|
-
if (await components.fs.fileExists(wearableJsonPath)) {
|
370
|
-
try {
|
371
|
-
const wearableJson = JSON.parse(await components.fs.readFile(wearableJsonPath, 'utf-8'));
|
372
|
-
if (!sdk_1.WearableJson.validate(wearableJson)) {
|
373
|
-
const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
|
374
|
-
console.error(`Unable to validate wearable.json properly, please check it.`, errors);
|
375
|
-
console.error(`Invalid wearable.json (${wearableJsonPath})`);
|
376
|
-
}
|
377
|
-
else {
|
378
|
-
isParcelScene = false;
|
379
|
-
}
|
380
|
-
}
|
381
|
-
catch (err) {
|
382
|
-
console.error(`Unable to load wearable.json properly`, err);
|
383
|
-
}
|
384
|
-
}
|
385
|
-
const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
|
386
|
-
if ((await components.fs.fileExists(sceneJsonPath)) && isParcelScene) {
|
387
|
-
const sceneJson = JSON.parse(await components.fs.readFile(sceneJsonPath, 'utf-8'));
|
388
|
-
const { base, parcels } = sceneJson.scene;
|
389
|
-
const pointers = new Set();
|
390
|
-
pointers.add(base);
|
391
|
-
parcels.forEach(($) => pointers.add($));
|
392
|
-
const mappedFiles = await getFilesFromFolder(components, {
|
393
|
-
folder,
|
394
|
-
addOriginalPath,
|
395
|
-
customHashMaker
|
396
|
-
});
|
397
|
-
return {
|
398
|
-
version: 'v3',
|
399
|
-
type: schemas_1.EntityType.SCENE,
|
400
|
-
id: hashMaker(folder),
|
401
|
-
pointers: Array.from(pointers),
|
402
|
-
timestamp: Date.now(),
|
403
|
-
metadata: sceneJson,
|
404
|
-
content: mappedFiles
|
405
|
-
};
|
406
|
-
}
|
407
|
-
return null;
|
408
|
-
}
|
409
|
-
async function getFilesFromFolder(components, { folder, addOriginalPath, customHashMaker }) {
|
410
|
-
const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
|
411
|
-
const ignorePatterns = await (0, dcl_ignore_1.getDCLIgnorePatterns)(components, folder);
|
412
|
-
const allFiles = (0, glob_1.sync)('**/*', {
|
413
|
-
ignore: ignorePatterns,
|
414
|
-
cwd: folder,
|
415
|
-
dot: false,
|
416
|
-
absolute: true
|
417
|
-
})
|
418
|
-
.map((file) => {
|
419
|
-
try {
|
420
|
-
if (!(0, fs_1.statSync)(file).isFile())
|
421
|
-
return;
|
422
|
-
}
|
423
|
-
catch (err) {
|
424
|
-
return;
|
425
|
-
}
|
426
|
-
const _folder = folder.replace(/\\/gi, '/');
|
427
|
-
const key = file.replace(_folder, '').replace(/^\/+/, '');
|
428
|
-
return key;
|
429
|
-
})
|
430
|
-
.filter(($) => !!$);
|
431
|
-
const ig = (0, ignore_1.default)().add(ignorePatterns);
|
432
|
-
const filteredFiles = ig.filter(allFiles);
|
433
|
-
const ret = [];
|
434
|
-
for (const file of filteredFiles) {
|
435
|
-
const absolutePath = path.resolve(folder, file);
|
436
|
-
try {
|
437
|
-
if (!(0, fs_1.statSync)(absolutePath).isFile())
|
438
|
-
continue;
|
439
|
-
}
|
440
|
-
catch (err) {
|
441
|
-
console.error(err);
|
442
|
-
continue;
|
443
|
-
}
|
444
|
-
const absoluteFolder = folder.replace(/\\/gi, '/');
|
445
|
-
const relativeFilePathToFolder = file.replace(absoluteFolder, '').replace(/^\/+/, '');
|
446
|
-
ret.push({
|
447
|
-
file: relativeFilePathToFolder.toLowerCase(),
|
448
|
-
original_path: addOriginalPath ? absolutePath : undefined,
|
449
|
-
hash: hashMaker(absolutePath)
|
450
|
-
});
|
451
|
-
}
|
452
|
-
return ret;
|
453
|
-
}
|
454
|
-
exports.getFilesFromFolder = getFilesFromFolder;
|
455
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLCtCQUF1QztBQUN2QywrQ0FBb0Q7QUFDcEQsMENBQW1GO0FBQ25GLG9EQUEyQjtBQUMzQix5REFBMkM7QUFDM0MseUNBQWlEO0FBRWpELDJCQUE2QjtBQUM3Qix1REFBNkQ7QUFFN0QsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sSUFBSSxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxJQUFZO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUNwRCxDQUFDO0FBTUQsU0FBZ0Isa0JBQWtCLENBQUMsVUFBeUIsRUFBRSxHQUFXLEVBQUUsTUFBaUM7SUFDMUcsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ25FLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xELE9BQU87WUFDTCxJQUFJLEVBQUU7Z0JBQ0o7b0JBQ0UsVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLEdBQUcsRUFBRSxVQUFVLEdBQUcsQ0FBQyxHQUFHLENB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LElBQUEsYUFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxTQUFRO1NBQy9DO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLFNBQVE7U0FDVDtRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRWxELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVyRixHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1AsSUFBSSxFQUFFLHdCQUF3QixDQUFDLFdBQVcsRUFBRTtZQUM1QyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUM7U0FDOUIsQ0FBQyxDQUFBO0tBQ0g7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUEzREQsZ0RBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQHdlbGwta25vd24tY29tcG9uZW50cy9odHRwLXNlcnZlcidcbmltcG9ydCB7IFByZXZpZXdDb21wb25lbnRzIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHN5bmMgYXMgZ2xvYlN5bmMgfSBmcm9tICdnbG9iJ1xuaW1wb3J0IHsgV2VhcmFibGVKc29uIH0gZnJvbSAnQGRjbC9zY2hlbWFzL2Rpc3Qvc2RrJ1xuaW1wb3J0IHsgQ29udGVudE1hcHBpbmcsIEVudGl0eSwgRW50aXR5VHlwZSwgTG9jYWxlLCBXZWFyYWJsZSB9IGZyb20gJ0BkY2wvc2NoZW1hcydcbmltcG9ydCBpZ25vcmUgZnJvbSAnaWdub3JlJ1xuaW1wb3J0IGZldGNoLCB7IEhlYWRlcnMgfSBmcm9tICdub2RlLWZldGNoJ1xuaW1wb3J0IHsgZmV0Y2hFbnRpdHlCeVBvaW50ZXIgfSBmcm9tICcuL2NhdGFseXN0J1xuaW1wb3J0IHsgQ2xpQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnXG5pbXBvcnQgeyBzdGF0U3luYyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgZ2V0RENMSWdub3JlUGF0dGVybnMgfSBmcm9tICcuLi8uLi91dGlscy9kY2wtaWdub3JlJ1xuXG5mdW5jdGlvbiBnZXRDYXRhbHlzdFVybCgpOiBVUkwge1xuICByZXR1cm4gbmV3IFVSTCgnaHR0cHM6Ly9wZWVyLmRlY2VudHJhbGFuZC5vcmcnKVxufVxuXG5mdW5jdGlvbiBzbWFydFdlYXJhYmxlTmFtZVRvSWQobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpXG59XG5cbnR5cGUgTGFtYmRhc1dlYXJhYmxlID0gV2VhcmFibGUgJiB7XG4gIGJhc2VVcmw6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBFY3M2RW5kcG9pbnRzKGNvbXBvbmVudHM6IENsaUNvbXBvbmVudHMsIGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgYmFzZUZvbGRlcnMgPSBbZGlyXVxuICAvLyBoYW5kbGUgb2xkIHByZXZpZXcgc2NlbmUuanNvblxuICByb3V0ZXIuZ2V0KCcvc2NlbmUuanNvbicsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBjb21wb25lbnRzLmZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKGRpciwgJ3NjZW5lLmpzb24nKSlcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL2xhbWJkYXMvZXhwbG9yZS9yZWFsbXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlcnZlck5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIGxheWVyOiAnc3R1YicsXG4gICAgICAgICAgdXNlcnNDb3VudDogMCxcbiAgICAgICAgICBtYXhVc2VyczogMTAwLFxuICAgICAgICAgIHVzZXJQYXJjZWxzOiBbXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2NvbnRyYWN0cy9zZXJ2ZXJzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBgaHR0cDovLyR7Y3R4LnVybC5ob3N0fWAsXG4gICAgICAgICAgb3duZXI6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIGlkOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL3Byb2ZpbGVzJywgYXN5bmMgKGN0eCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlld1dlYXJhYmxlcyA9IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywge1xuICAgICAgICBiYXNlRm9sZGVycyxcbiAgICAgICAgYmFzZVVybFxuICAgICAgfSlcblxuICAgICAgaWYgKHByZXZpZXdXZWFyYWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuXG4gICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKGN0eC51cmwudG9TdHJpbmcoKSlcbiAgICAgICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgICAgICB1LnByb3RvY29sID0gY2F0YWx5c3RVcmwucHJvdG9jb2xcbiAgICAgICAgdS5wb3J0ID0gY2F0YWx5c3RVcmwucG9ydFxuICAgICAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXRob2Q6IGN0eC5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBib2R5OiBjdHgucmVxdWVzdC5tZXRob2QgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogY3R4LnJlcXVlc3QuYm9keVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGRlcGxveWVkUHJvZmlsZSA9IChhd2FpdCByZXEuanNvbigpKSBhcyBhbnlbXVxuXG4gICAgICAgIGlmIChkZXBsb3llZFByb2ZpbGU/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRlcGxveWVkUHJvZmlsZVswXS5hdmF0YXJzWzBdLmF2YXRhci53ZWFyYWJsZXMucHVzaCguLi5wcmV2aWV3V2VhcmFibGVzLm1hcCgoJCkgPT4gJC5pZCkpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBkZXBsb3llZFByb2ZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGNhdGNoIHByb2ZpbGUgYW5kIGZpbGwgd2l0aCBwcmV2aWV3IHdlYXJhYmxlcy5gLCBlcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIHJvdXRlci5hbGwoJy9sYW1iZGFzLzpwYXRoKycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgdS5ob3N0ID0gY2F0YWx5c3RVcmwuaG9zdFxuICAgIHUucHJvdG9jb2wgPSBjYXRhbHlzdFVybC5wcm90b2NvbFxuICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICBjb25zdCByZXEgPSBhd2FpdCBmZXRjaCh1LnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfSxcbiAgICAgIG1ldGhvZDogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6IHJlcS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL2JpbmFyeSdcbiAgICAgIH0sXG4gICAgICBib2R5OiByZXEuYm9keVxuICAgIH1cbiAgfSlcblxuICByb3V0ZXIucG9zdCgnL2NvbnRlbnQvZW50aXRpZXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgY2F0YWx5c3RVcmwgPSBnZXRDYXRhbHlzdFVybCgpXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgICBjb25zb2xlLmxvZyhjdHgucmVxdWVzdC5oZWFkZXJzKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2NhdGFseXN0VXJsLnRvU3RyaW5nKCl9L2NvbnRlbnQvZW50aXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5ib2R5XG4gICAgfSlcblxuICAgIHJldHVybiByZXNcbiAgfSlcblxuICBzZXJ2ZVN0YXRpYyhjb21wb25lbnRzLCBkaXIsIHJvdXRlcilcblxuICAvLyBUT0RPOiBnZXQgd29ya3NwYWNlIHNjZW5lcyAmIHdlYXJhYmxlcy4uLlxuXG4gIHNlcnZlRm9sZGVycyhjb21wb25lbnRzLCByb3V0ZXIsIGJhc2VGb2xkZXJzKVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUZvbGRlcnMoY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPiwgcm91dGVyOiBSb3V0ZXI8UHJldmlld0NvbXBvbmVudHM+LCBiYXNlRm9sZGVyczogc3RyaW5nW10pIHtcbiAgcm91dGVyLmdldCgnL2NvbnRlbnQvY29udGVudHMvOmhhc2gnLCBhc3luYyAoY3R4OiBhbnksIG5leHQ6IGFueSkgPT4ge1xuICAgIGlmIChjdHgucGFyYW1zLmhhc2ggJiYgY3R4LnBhcmFtcy5oYXNoLnN0YXJ0c1dpdGgoJ2I2NC0nKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoQnVmZmVyLmZyb20oY3R4LnBhcmFtcy5oYXNoLnJlcGxhY2UoL15iNjQtLywgJycpLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSlcblxuICAgICAgLy8gb25seSByZXR1cm4gZmlsZXMgSUYgdGhlIGZpbGUgaXMgd2l0aGluIGEgYmFzZUZvbGRlclxuICAgICAgaWYgKCFiYXNlRm9sZGVycy5maW5kKChmb2xkZXI6IHN0cmluZykgPT4gZnVsbFBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC10aW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBjb21wb25lbnRzLmZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihwb2ludGVyczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXBvaW50ZXJzIHx8IHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdGVkUG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICBwb2ludGVycyAmJiB0eXBlb2YgcG9pbnRlcnMgPT09ICdzdHJpbmcnID8gW3BvaW50ZXJzIGFzIHN0cmluZ10gOiAocG9pbnRlcnMgYXMgc3RyaW5nW10pXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0RW50aXRpZXMgPSBhd2FpdCBnZXRTY2VuZUpzb24oY29tcG9uZW50cywge1xuICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICBwb2ludGVyczogQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycylcbiAgICB9KVxuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHJlbW90ZSA9IGZldGNoRW50aXR5QnlQb2ludGVyKFxuICAgICAgY2F0YWx5c3RVcmwudG9TdHJpbmcoKSxcbiAgICAgIHBvaW50ZXJzLmZpbHRlcigoJDogc3RyaW5nKSA9PiAhJC5tYXRjaCgvLT9cXGQrLC0/XFxkKy8pKVxuICAgIClcblxuICAgIGNvbnN0IHNlcnZlckVudGl0aWVzID0gQXJyYXkuaXNBcnJheShyZW1vdGUpID8gcmVtb3RlIDogW11cblxuICAgIHJldHVybiBbLi4ucmVzdWx0RW50aXRpZXMsIC4uLnNlcnZlckVudGl0aWVzXVxuICB9XG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIuZ2V0KCcvY29udGVudC9lbnRpdGllcy9zY2VuZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGN0eC51cmwuc2VhcmNoUGFyYW1zLmdldEFsbCgncG9pbnRlcicpKVxuICAgIH1cbiAgfSlcblxuICAvLyBSRVZJRVcgUkVTUE9OU0UgRk9STUFUXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcy9hY3RpdmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0Lmpzb24oKVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCBwb2ludGVyUmVxdWVzdEhhbmRsZXIoYm9keS5wb2ludGVycylcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzLzppZCcsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIGNvbnN0IHdlYXJhYmxlcyA9IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywge1xuICAgICAgYmFzZVVybCxcbiAgICAgIGJhc2VGb2xkZXJzXG4gICAgfSlcbiAgICBjb25zdCB3ZWFyYWJsZUlkID0gY3R4LnBhcmFtcy5pZFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiB3ZWFyYWJsZXMuZmlsdGVyKCh3ZWFyYWJsZSkgPT4gc21hcnRXZWFyYWJsZU5hbWVUb0lkKHdlYXJhYmxlPy5uYW1lKSA9PT0gd2VhcmFibGVJZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGRhdGE6IGF3YWl0IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoY29tcG9uZW50cywgeyBiYXNlVXJsLCBiYXNlRm9sZGVycyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZGVmYXVsdEhhc2hNYWtlciA9IChzdHI6IHN0cmluZykgPT4gJ2I2NC0nICsgQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0JylcblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUHJldmlld1dlYXJhYmxlcyhcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgeyBiYXNlRm9sZGVycywgYmFzZVVybCB9OiB7IGJhc2VGb2xkZXJzOiBzdHJpbmdbXTsgYmFzZVVybDogc3RyaW5nIH1cbikge1xuICBjb25zdCB3ZWFyYWJsZVBhdGhBcnJheTogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHdlYXJhYmxlRGlyIG9mIGJhc2VGb2xkZXJzKSB7XG4gICAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJ3dlYXJhYmxlLmpzb24nKVxuICAgIGlmIChhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMod2VhcmFibGVKc29uUGF0aCkpIHtcbiAgICAgIHdlYXJhYmxlUGF0aEFycmF5LnB1c2god2VhcmFibGVKc29uUGF0aClcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXQ6IExhbWJkYXNXZWFyYWJsZVtdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZUpzb25QYXRoIG9mIHdlYXJhYmxlUGF0aEFycmF5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldC5wdXNoKGF3YWl0IHNlcnZlV2VhcmFibGUoY29tcG9uZW50cywgeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH0pKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGRuJ3QgbW9jayB0aGUgd2VhcmFibGUgJHt3ZWFyYWJsZUpzb25QYXRofS4gUGxlYXNlIHZlcmlmeSB0aGUgY29ycmVjdCBmb3JtYXQgYW5kIHNjaGVtZS5gLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VydmVXZWFyYWJsZShcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH06IHsgd2VhcmFibGVKc29uUGF0aDogc3RyaW5nOyBiYXNlVXJsOiBzdHJpbmcgfVxuKTogUHJvbWlzZTxMYW1iZGFzV2VhcmFibGU+IHtcbiAgY29uc3Qgd2VhcmFibGVEaXIgPSBwYXRoLmRpcm5hbWUod2VhcmFibGVKc29uUGF0aClcbiAgY29uc3Qgd2VhcmFibGVKc29uID0gSlNPTi5wYXJzZSgoYXdhaXQgY29tcG9uZW50cy5mcy5yZWFkRmlsZSh3ZWFyYWJsZUpzb25QYXRoKSkudG9TdHJpbmcoKSlcblxuICBpZiAoIVdlYXJhYmxlSnNvbi52YWxpZGF0ZSh3ZWFyYWJsZUpzb24pKSB7XG4gICAgY29uc3QgZXJyb3JzID0gKFdlYXJhYmxlSnNvbi52YWxpZGF0ZS5lcnJvcnMgfHwgW10pLm1hcCgoYSkgPT4gYCR7YS5kYXRhfSAke2EubWVzc2FnZX1gKS5qb2luKCcnKVxuXG4gICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIHZhbGlkYXRlIHdlYXJhYmxlLmpzb24gcHJvcGVybHksIHBsZWFzZSBjaGVjayBpdC5gLCBlcnJvcnMpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYXJhYmxlLmpzb24gKCR7d2VhcmFibGVKc29uUGF0aH0pYClcbiAgfVxuXG4gIGNvbnN0IGhhc2hlZEZpbGVzID0gYXdhaXQgZ2V0RmlsZXNGcm9tRm9sZGVyKGNvbXBvbmVudHMsIHtcbiAgICBmb2xkZXI6IHdlYXJhYmxlRGlyLFxuICAgIGFkZE9yaWdpbmFsUGF0aDogZmFsc2VcbiAgfSlcblxuICBjb25zdCB0aHVtYm5haWxGaWx0ZXJlZCA9IGhhc2hlZEZpbGVzLmZpbHRlcigoJCkgPT4gJD8uZmlsZSA9PT0gJ3RodW1ibmFpbC5wbmcnKVxuICBjb25zdCB0aHVtYm5haWwgPVxuICAgIHRodW1ibmFpbEZpbHRlcmVkLmxlbmd0aCA+IDAgJiYgdGh1bWJuYWlsRmlsdGVyZWRbMF0/Lmhhc2ggJiYgYCR7YmFzZVVybH0vJHt0aHVtYm5haWxGaWx0ZXJlZFswXS5oYXNofWBcblxuICBjb25zdCB3ZWFyYWJsZUlkID0gJ3Vybjo4ZGMyZDdhZC05N2UzLTQ0ZDAtYmE4OS1lODMwNWQ3OTVhNmEnXG5cbiAgY29uc3QgcmVwcmVzZW50YXRpb25zID0gd2VhcmFibGVKc29uLmRhdGEucmVwcmVzZW50YXRpb25zLm1hcCgocmVwcmVzZW50YXRpb24pID0+ICh7XG4gICAgLi4ucmVwcmVzZW50YXRpb24sXG4gICAgbWFpbkZpbGU6IGBtYWxlLyR7cmVwcmVzZW50YXRpb24ubWFpbkZpbGV9YCxcbiAgICBjb250ZW50czogaGFzaGVkRmlsZXMubWFwKCgkKSA9PiAoe1xuICAgICAga2V5OiBgbWFsZS8keyQ/LmZpbGV9YCxcbiAgICAgIHVybDogYCR7YmFzZVVybH0vJHskPy5oYXNofWAsXG4gICAgICBoYXNoOiAkPy5oYXNoXG4gICAgfSkpXG4gIH0pKVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHdlYXJhYmxlSWQsXG4gICAgcmFyaXR5OiB3ZWFyYWJsZUpzb24ucmFyaXR5LFxuICAgIGkxOG46IFt7IGNvZGU6ICdlbicgYXMgTG9jYWxlLCB0ZXh0OiB3ZWFyYWJsZUpzb24ubmFtZSB9XSxcbiAgICBkZXNjcmlwdGlvbjogd2VhcmFibGVKc29uLmRlc2NyaXB0aW9uLFxuICAgIHRodW1ibmFpbDogdGh1bWJuYWlsIHx8ICcnLFxuICAgIGltYWdlOiB0aHVtYm5haWwgfHwgJycsXG4gICAgY29sbGVjdGlvbkFkZHJlc3M6ICcweDAnLFxuICAgIGJhc2VVcmw6IGAke2Jhc2VVcmx9L2AsXG4gICAgbmFtZTogd2VhcmFibGVKc29uLm5hbWUgfHwgJycsXG4gICAgZGF0YToge1xuICAgICAgY2F0ZWdvcnk6IHdlYXJhYmxlSnNvbi5kYXRhLmNhdGVnb3J5LFxuICAgICAgcmVwbGFjZXM6IFtdLFxuICAgICAgaGlkZXM6IFtdLFxuICAgICAgdGFnczogW10sXG4gICAgICByZXByZXNlbnRhdGlvbnM6IHJlcHJlc2VudGF0aW9ucyBhcyBhbnlcbiAgICAgIC8vIHNjZW5lOiBoYXNoZWRGaWxlcyBhcyBhbnksXG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNjZW5lSnNvbihcbiAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAge1xuICAgIGJhc2VGb2xkZXJzLFxuICAgIHBvaW50ZXJzLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgYmFzZUZvbGRlcnM6IHN0cmluZ1tdXG4gICAgcG9pbnRlcnM6IHN0cmluZ1tdXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxFbnRpdHlbXT4ge1xuICBjb25zdCByZXF1ZXN0ZWRQb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPihwb2ludGVycylcbiAgY29uc3QgcmVzdWx0RW50aXRpZXM6IEVudGl0eVtdID0gW11cblxuICBjb25zdCBhbGxEZXBsb3ltZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGJhc2VGb2xkZXJzLm1hcChhc3luYyAoZm9sZGVyKSA9PiB7XG4gICAgICByZXR1cm4gZW50aXR5VjNGcm9tRm9sZGVyKGNvbXBvbmVudHMsIHtcbiAgICAgICAgZm9sZGVyLFxuICAgICAgICBhZGRPcmlnaW5hbFBhdGg6IGZhbHNlLFxuICAgICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICAgIH0pXG4gICAgfSlcbiAgKVxuXG4gIGZvciAoY29uc3QgcG9pbnRlciBvZiBBcnJheS5mcm9tKHJlcXVlc3RlZFBvaW50ZXJzKSkge1xuICAgIC8vIGdldCBkZXBsb3ltZW50IGJ5IHBvaW50ZXJcbiAgICBjb25zdCB0aGVEZXBsb3ltZW50ID0gYWxsRGVwbG95bWVudHMuZmluZCgoJCkgPT4gJCAmJiAkLnBvaW50ZXJzLmluY2x1ZGVzKHBvaW50ZXIpKVxuICAgIGlmICh0aGVEZXBsb3ltZW50KSB7XG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSByZXF1aXJlZCBwb2ludGVycyBmcm9tIHRoZSByZXF1ZXN0ZWRQb2ludGVycyBzZXRcbiAgICAgIC8vIHRvIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGVkIGVudGl0aWVzXG4gICAgICB0aGVEZXBsb3ltZW50LnBvaW50ZXJzLmZvckVhY2goKCQpID0+IHJlcXVlc3RlZFBvaW50ZXJzLmRlbGV0ZSgkKSlcblxuICAgICAgLy8gYWRkIHRoZSBkZXBsb3ltZW50IHRvIHRoZSByZXN1bHRzXG4gICAgICByZXN1bHRFbnRpdGllcy5wdXNoKHRoZURlcGxveW1lbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdEVudGl0aWVzXG59XG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljKGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sIGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3Qgc2RrUGF0aCA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvc2RrL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbZGlyXVxuICAgIH0pXG4gIClcbiAgY29uc3QgZGNsRXhwbG9yZXJKc29uUGF0aCA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvZXhwbG9yZXIvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtkaXIsIHNka1BhdGhdXG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0IGRjbEtlcm5lbERlZmF1bHRQcm9maWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnZGVmYXVsdC1wcm9maWxlJylcbiAgY29uc3QgZGNsS2VybmVsSW1hZ2VzRGVjZW50cmFsYW5kQ29ubmVjdCA9IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAnaW1hZ2VzJywgJ2RlY2VudHJhbGFuZC1jb25uZWN0JylcblxuICBjb25zdCByb3V0ZXMgPSBbXG4gICAge1xuICAgICAgcm91dGU6ICcvJyxcbiAgICAgIHBhdGg6IHBhdGgucmVzb2x2ZShkY2xFeHBsb3Jlckpzb25QYXRoLCAncHJldmlldy5odG1sJyksXG4gICAgICB0eXBlOiAndGV4dC9odG1sJ1xuICAgIH0sXG4gICAge1xuICAgICAgcm91dGU6ICcvZmF2aWNvbi5pY28nLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEV4cGxvcmVySnNvblBhdGgsICdmYXZpY29uLmljbycpLFxuICAgICAgdHlwZTogJ3RleHQvaHRtbCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvdXRlOiAnL0AvZXhwbG9yZXIvaW5kZXguanMnLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEV4cGxvcmVySnNvblBhdGgsICdpbmRleC5qcycpLFxuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9XG4gIF1cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIHJvdXRlci5nZXQocm91dGUucm91dGUsIGFzeW5jIChfY3R4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiByb3V0ZS50eXBlIH0sXG4gICAgICAgIGJvZHk6IGNvbXBvbmVudHMuZnMuY3JlYXRlUmVhZFN0cmVhbShyb3V0ZS5wYXRoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdGF0aWNSb3V0ZXMoXG4gICAgY29tcG9uZW50czogUGljazxDbGlDb21wb25lbnRzLCAnZnMnPixcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIGZvbGRlcjogc3RyaW5nLFxuICAgIHRyYW5zZm9ybSA9IChzdHI6IHN0cmluZykgPT4gc3RyXG4gICkge1xuICAgIHJvdXRlci5nZXQocm91dGUsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBjdHgucGFyYW1zLnBhdGhcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgdHJhbnNmb3JtKGZpbGUpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIShhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMoZnVsbFBhdGgpKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICd4LXNlbnQnOiB0cnVlLFxuICAgICAgICAnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZSxwcml2YXRlLG1heC1hZ2U9MSdcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bGxQYXRoLmVuZHNXaXRoKCcud2FzbScpKSB7XG4gICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3dhc20nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IGNvbXBvbmVudHMuZnMuY3JlYXRlUmVhZFN0cmVhbShmdWxsUGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlU3RhdGljUm91dGVzKGNvbXBvbmVudHMsICcvaW1hZ2VzL2RlY2VudHJhbGFuZC1jb25uZWN0LzpwYXRoKycsIGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcyhjb21wb25lbnRzLCAnL2RlZmF1bHQtcHJvZmlsZS86cGF0aCsnLCBkY2xLZXJuZWxEZWZhdWx0UHJvZmlsZVBhdGgpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcyhjb21wb25lbnRzLCAnL0AvZXhwbG9yZXIvOnBhdGgrJywgZGNsRXhwbG9yZXJKc29uUGF0aCwgKGZpbGVQYXRoKSA9PiBmaWxlUGF0aC5yZXBsYWNlKC8uYnIrJC8sICcnKSlcblxuICByb3V0ZXIuZ2V0KCcvZmVhdHVyZS1mbGFncy86ZmlsZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9mZWF0dXJlLWZsYWdzLmRlY2VudHJhbGFuZC56b25lLyR7Y3R4LnBhcmFtcy5maWxlfWAsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpXG4gICAgfVxuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbnRpdHlWM0Zyb21Gb2xkZXIoXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sXG4gIHtcbiAgICBmb2xkZXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgZm9sZGVyOiBzdHJpbmdcbiAgICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxFbnRpdHkgfCBudWxsPiB7XG4gIGNvbnN0IHNjZW5lSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCAnLi9zY2VuZS5qc29uJylcbiAgbGV0IGlzUGFyY2VsU2NlbmUgPSB0cnVlXG5cbiAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3dlYXJhYmxlLmpzb24nKVxuICBpZiAoYXdhaXQgY29tcG9uZW50cy5mcy5maWxlRXhpc3RzKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgY29tcG9uZW50cy5mcy5yZWFkRmlsZSh3ZWFyYWJsZUpzb25QYXRoLCAndXRmLTgnKSlcbiAgICAgIGlmICghV2VhcmFibGVKc29uLnZhbGlkYXRlKHdlYXJhYmxlSnNvbikpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gKFdlYXJhYmxlSnNvbi52YWxpZGF0ZS5lcnJvcnMgfHwgW10pLm1hcCgoYSkgPT4gYCR7YS5kYXRhfSAke2EubWVzc2FnZX1gKS5qb2luKCcnKVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byB2YWxpZGF0ZSB3ZWFyYWJsZS5qc29uIHByb3Blcmx5LCBwbGVhc2UgY2hlY2sgaXQuYCwgZXJyb3JzKVxuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIHdlYXJhYmxlLmpzb24gKCR7d2VhcmFibGVKc29uUGF0aH0pYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzUGFyY2VsU2NlbmUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIGxvYWQgd2VhcmFibGUuanNvbiBwcm9wZXJseWAsIGVycilcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYXNoTWFrZXIgPSBjdXN0b21IYXNoTWFrZXIgPyBjdXN0b21IYXNoTWFrZXIgOiBkZWZhdWx0SGFzaE1ha2VyXG5cbiAgaWYgKChhd2FpdCBjb21wb25lbnRzLmZzLmZpbGVFeGlzdHMoc2NlbmVKc29uUGF0aCkpICYmIGlzUGFyY2VsU2NlbmUpIHtcbiAgICBjb25zdCBzY2VuZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGNvbXBvbmVudHMuZnMucmVhZEZpbGUoc2NlbmVKc29uUGF0aCwgJ3V0Zi04JykpXG4gICAgY29uc3QgeyBiYXNlLCBwYXJjZWxzIH06IHsgYmFzZTogc3RyaW5nOyBwYXJjZWxzOiBzdHJpbmdbXSB9ID0gc2NlbmVKc29uLnNjZW5lXG4gICAgY29uc3QgcG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIHBvaW50ZXJzLmFkZChiYXNlKVxuICAgIHBhcmNlbHMuZm9yRWFjaCgoJCkgPT4gcG9pbnRlcnMuYWRkKCQpKVxuXG4gICAgY29uc3QgbWFwcGVkRmlsZXMgPSBhd2FpdCBnZXRGaWxlc0Zyb21Gb2xkZXIoY29tcG9uZW50cywge1xuICAgICAgZm9sZGVyLFxuICAgICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndjMnLFxuICAgICAgdHlwZTogRW50aXR5VHlwZS5TQ0VORSxcbiAgICAgIGlkOiBoYXNoTWFrZXIoZm9sZGVyKSxcbiAgICAgIHBvaW50ZXJzOiBBcnJheS5mcm9tKHBvaW50ZXJzKSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1ldGFkYXRhOiBzY2VuZUpzb24sXG4gICAgICBjb250ZW50OiBtYXBwZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaWxlc0Zyb21Gb2xkZXIoXG4gIGNvbXBvbmVudHM6IFBpY2s8Q2xpQ29tcG9uZW50cywgJ2ZzJz4sXG4gIHtcbiAgICBmb2xkZXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoLFxuICAgIGN1c3RvbUhhc2hNYWtlclxuICB9OiB7XG4gICAgZm9sZGVyOiBzdHJpbmdcbiAgICBhZGRPcmlnaW5hbFBhdGg/OiBib29sZWFuXG4gICAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxDb250ZW50TWFwcGluZ1tdPiB7XG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcbiAgY29uc3QgaWdub3JlUGF0dGVybnMgPSBhd2FpdCBnZXREQ0xJZ25vcmVQYXR0ZXJucyhjb21wb25lbnRzLCBmb2xkZXIpXG5cbiAgY29uc3QgYWxsRmlsZXMgPSBnbG9iU3luYygnKiovKicsIHtcbiAgICBpZ25vcmU6IGlnbm9yZVBhdHRlcm5zLFxuICAgIGN3ZDogZm9sZGVyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfSlcbiAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IF9mb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuICAgICAgY29uc3Qga2V5ID0gZmlsZS5yZXBsYWNlKF9mb2xkZXIsICcnKS5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgcmV0dXJuIGtleVxuICAgIH0pXG4gICAgLmZpbHRlcigoJCkgPT4gISEkKSBhcyBzdHJpbmdbXVxuXG4gIGNvbnN0IGlnID0gaWdub3JlKCkuYWRkKGlnbm9yZVBhdHRlcm5zKVxuICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gaWcuZmlsdGVyKGFsbEZpbGVzKVxuXG4gIGNvbnN0IHJldDogKENvbnRlbnRNYXBwaW5nICYgeyBvcmlnaW5hbF9wYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfSlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbHRlcmVkRmlsZXMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCBmaWxlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXN0YXRTeW5jKGFic29sdXRlUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYWJzb2x1dGVGb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuXG4gICAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aFRvRm9sZGVyID0gZmlsZS5yZXBsYWNlKGFic29sdXRlRm9sZGVyLCAnJykucmVwbGFjZSgvXlxcLysvLCAnJylcblxuICAgIHJldC5wdXNoKHtcbiAgICAgIGZpbGU6IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlci50b0xvd2VyQ2FzZSgpLFxuICAgICAgb3JpZ2luYWxfcGF0aDogYWRkT3JpZ2luYWxQYXRoID8gYWJzb2x1dGVQYXRoIDogdW5kZWZpbmVkLFxuICAgICAgaGFzaDogaGFzaE1ha2VyKGFic29sdXRlUGF0aClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuIl19
|