@stemy/backend 3.6.0 → 4.0.0
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/commands/fixtures-command.d.ts +9 -0
- package/commands/index.d.ts +2 -0
- package/common-types.d.ts +11 -6
- package/esm2020/commands/clear-command.mjs +17 -0
- package/esm2020/commands/fixtures-command.mjs +23 -0
- package/esm2020/commands/index.mjs +7 -0
- package/esm2020/common-types.mjs +21 -0
- package/esm2020/public_api.mjs +379 -0
- package/esm2020/requests/asset-image-params.mjs +53 -0
- package/esm2020/rest-controllers/assets.controller.mjs +126 -0
- package/esm2020/rest-controllers/auth.controller.mjs +46 -0
- package/esm2020/rest-controllers/gallery.controller.mjs +21 -0
- package/esm2020/rest-controllers/progresses.controller.mjs +29 -0
- package/esm2020/rest-controllers/terminal-styles.mjs +67 -0
- package/esm2020/rest-controllers/terminal.controller.mjs +125 -0
- package/esm2020/rest-middlewares/container.middleware.mjs +20 -0
- package/esm2020/rest-middlewares/error-handler.middleware.mjs +74 -0
- package/esm2020/rest-middlewares/language.middleware.mjs +18 -0
- package/esm2020/rest-middlewares/request-ended.middleware.mjs +23 -0
- package/esm2020/rest-middlewares/request-started.middleware.mjs +22 -0
- package/esm2020/services/asset-processor.mjs +90 -0
- package/esm2020/services/asset-resolver.mjs +31 -0
- package/esm2020/services/assets.mjs +140 -0
- package/esm2020/services/backend-provider.mjs +22 -0
- package/esm2020/services/cache-processor.mjs +16 -0
- package/esm2020/services/cache.mjs +62 -0
- package/{esm2015/services/configuration.js → esm2020/services/configuration.mjs} +3 -15
- package/esm2020/services/endpoint-provider.mjs +13 -0
- package/esm2020/services/entities/asset.mjs +43 -0
- package/esm2020/services/entities/base-entity.mjs +26 -0
- package/esm2020/services/entities/lazy-asset.mjs +73 -0
- package/esm2020/services/entities/progress.mjs +176 -0
- package/esm2020/services/entities/temp-asset.mjs +45 -0
- package/esm2020/services/fixtures.mjs +26 -0
- package/esm2020/services/gallery-cache.mjs +27 -0
- package/esm2020/services/gallery-image.mjs +37 -0
- package/esm2020/services/gallery.mjs +116 -0
- package/esm2020/services/id-generator.mjs +42 -0
- package/esm2020/services/job-manager.mjs +187 -0
- package/esm2020/services/lazy-assets.mjs +48 -0
- package/esm2020/services/logger.mjs +21 -0
- package/esm2020/services/mail-sender.mjs +36 -0
- package/esm2020/services/memory-cache.mjs +57 -0
- package/esm2020/services/mongo-connector.mjs +37 -0
- package/esm2020/services/open-api.mjs +114 -0
- package/esm2020/services/progresses.mjs +86 -0
- package/esm2020/services/template-renderer.mjs +64 -0
- package/esm2020/services/terminal-manager.mjs +77 -0
- package/esm2020/services/token-generator.mjs +35 -0
- package/esm2020/services/translation-provider.mjs +34 -0
- package/esm2020/services/translator.mjs +63 -0
- package/esm2020/services/user-manager.mjs +27 -0
- package/esm2020/socket-controllers/progress.controller.mjs +52 -0
- package/esm2020/socket-controllers/terminal.controller.mjs +48 -0
- package/esm2020/socket-controllers/terminal.mjs +85 -0
- package/esm2020/socket-middlewares/compression.middleware.mjs +14 -0
- package/esm2020/static.mjs +23 -0
- package/esm2020/utilities/decorators.mjs +52 -0
- package/esm2020/utilities/di-container.mjs +83 -0
- package/esm2020/utilities/empty-job.mjs +13 -0
- package/esm2020/utilities/lazy-asset-generator.mjs +35 -0
- package/esm2020/utilities/mongoose.mjs +216 -0
- package/esm2020/utils.mjs +693 -0
- package/esm2020/validators.mjs +46 -0
- package/fesm2015/{stemy-backend.js → stemy-backend.mjs} +1638 -2403
- package/fesm2015/stemy-backend.mjs.map +1 -0
- package/fesm2020/stemy-backend.mjs +4202 -0
- package/fesm2020/stemy-backend.mjs.map +1 -0
- package/{stemy-backend.d.ts → index.d.ts} +1 -0
- package/package.json +35 -23
- package/public_api.d.ts +2 -2
- package/rest-controllers/terminal-styles.d.ts +2 -0
- package/rest-controllers/terminal.controller.d.ts +2 -0
- package/services/assets.d.ts +1 -0
- package/services/entities/asset.d.ts +1 -0
- package/services/entities/temp-asset.d.ts +1 -0
- package/services/fixtures.d.ts +2 -2
- package/utils.d.ts +3 -0
- package/bundles/stemy-backend.umd.js +0 -7553
- package/bundles/stemy-backend.umd.js.map +0 -1
- package/esm2015/common-types.js +0 -20
- package/esm2015/public_api.js +0 -380
- package/esm2015/requests/asset-image-params.js +0 -70
- package/esm2015/rest-controllers/assets.controller.js +0 -180
- package/esm2015/rest-controllers/auth.controller.js +0 -76
- package/esm2015/rest-controllers/gallery.controller.js +0 -37
- package/esm2015/rest-controllers/progresses.controller.js +0 -57
- package/esm2015/rest-controllers/terminal.controller.js +0 -151
- package/esm2015/rest-middlewares/container.middleware.js +0 -32
- package/esm2015/rest-middlewares/error-handler.middleware.js +0 -99
- package/esm2015/rest-middlewares/language.middleware.js +0 -28
- package/esm2015/rest-middlewares/request-ended.middleware.js +0 -33
- package/esm2015/rest-middlewares/request-started.middleware.js +0 -32
- package/esm2015/rest-openapi.js +0 -44
- package/esm2015/services/asset-processor.js +0 -108
- package/esm2015/services/asset-resolver.js +0 -53
- package/esm2015/services/assets.js +0 -181
- package/esm2015/services/backend-provider.js +0 -32
- package/esm2015/services/cache-processor.js +0 -34
- package/esm2015/services/cache.js +0 -93
- package/esm2015/services/endpoint-provider.js +0 -29
- package/esm2015/services/entities/asset.js +0 -60
- package/esm2015/services/entities/base-entity.js +0 -37
- package/esm2015/services/entities/lazy-asset.js +0 -90
- package/esm2015/services/entities/progress.js +0 -213
- package/esm2015/services/entities/temp-asset.js +0 -64
- package/esm2015/services/fixtures.js +0 -45
- package/esm2015/services/gallery-cache.js +0 -36
- package/esm2015/services/gallery-image.js +0 -48
- package/esm2015/services/gallery.js +0 -138
- package/esm2015/services/id-generator.js +0 -63
- package/esm2015/services/job-manager.js +0 -221
- package/esm2015/services/lazy-assets.js +0 -83
- package/esm2015/services/logger.js +0 -31
- package/esm2015/services/mail-sender.js +0 -58
- package/esm2015/services/memory-cache.js +0 -84
- package/esm2015/services/mongo-connector.js +0 -58
- package/esm2015/services/open-api.js +0 -140
- package/esm2015/services/progresses.js +0 -118
- package/esm2015/services/template-renderer.js +0 -88
- package/esm2015/services/terminal-manager.js +0 -94
- package/esm2015/services/token-generator.js +0 -55
- package/esm2015/services/translation-provider.js +0 -54
- package/esm2015/services/translator.js +0 -84
- package/esm2015/services/user-manager.js +0 -47
- package/esm2015/socket-controllers/progress.controller.js +0 -82
- package/esm2015/socket-controllers/terminal.controller.js +0 -83
- package/esm2015/socket-controllers/terminal.js +0 -98
- package/esm2015/socket-middlewares/compression.middleware.js +0 -19
- package/esm2015/static.js +0 -33
- package/esm2015/utilities/clear-command.js +0 -33
- package/esm2015/utilities/decorators.js +0 -54
- package/esm2015/utilities/di-container.js +0 -84
- package/esm2015/utilities/empty-job.js +0 -29
- package/esm2015/utilities/lazy-asset-generator.js +0 -46
- package/esm2015/utilities/mongoose.js +0 -225
- package/esm2015/utils.js +0 -699
- package/esm2015/validators.js +0 -51
- package/fesm2015/stemy-backend.js.map +0 -1
- package/rest-openapi.d.ts +0 -3
- package/stemy-backend.metadata.json +0 -1
- /package/{utilities → commands}/clear-command.d.ts +0 -0
- /package/{esm2015/stemy-backend.js → esm2020/stemy-backend.mjs} +0 -0
- /package/{esm2015/utilities/base-doc.js → esm2020/utilities/base-doc.mjs} +0 -0
- /package/{esm2015/utilities/tree.js → esm2020/utilities/tree.mjs} +0 -0
package/esm2015/utils.js
DELETED
|
@@ -1,699 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { exec as execChildProcess } from "child_process";
|
|
11
|
-
import { createHash } from "crypto";
|
|
12
|
-
import { from, Observable, Subject, Subscription } from "rxjs";
|
|
13
|
-
import { canReportError } from "rxjs/internal/util/canReportError";
|
|
14
|
-
import { mkdir, readFile as fsReadFile, unlink, writeFile as fsWriteFile } from "fs";
|
|
15
|
-
import { basename, dirname } from "path";
|
|
16
|
-
import { ObjectId } from "mongodb";
|
|
17
|
-
import { Types } from "mongoose";
|
|
18
|
-
import { PassThrough, Readable } from "stream";
|
|
19
|
-
import sharp_ from "sharp";
|
|
20
|
-
import { HttpError } from "routing-controllers";
|
|
21
|
-
import { AxiosError } from "axios";
|
|
22
|
-
import { fromBuffer as extractFileType } from "file-type";
|
|
23
|
-
const sharp = sharp_;
|
|
24
|
-
export const diContainers = {
|
|
25
|
-
appContainer: null
|
|
26
|
-
};
|
|
27
|
-
export function isNullOrUndefined(value) {
|
|
28
|
-
return value == null || typeof value == "undefined";
|
|
29
|
-
}
|
|
30
|
-
export function isDefined(value) {
|
|
31
|
-
return !isNullOrUndefined(value);
|
|
32
|
-
}
|
|
33
|
-
export function getType(obj) {
|
|
34
|
-
const regex = new RegExp("\\s([a-zA-Z]+)");
|
|
35
|
-
return Object.prototype.toString.call(obj).match(regex)[1].toLowerCase();
|
|
36
|
-
}
|
|
37
|
-
export function isObject(value) {
|
|
38
|
-
return getType(value) == "object";
|
|
39
|
-
}
|
|
40
|
-
export function isArray(value) {
|
|
41
|
-
return Array.isArray(value);
|
|
42
|
-
}
|
|
43
|
-
export function isBoolean(value) {
|
|
44
|
-
return typeof value === "boolean";
|
|
45
|
-
}
|
|
46
|
-
export function isDate(value) {
|
|
47
|
-
return !!value && value[Symbol.toPrimitive] && !isNaN(value) && "undefined" !== typeof value.getDate;
|
|
48
|
-
}
|
|
49
|
-
export function isPrimitive(value) {
|
|
50
|
-
const type = typeof value;
|
|
51
|
-
return value == null || (type !== "object" && type !== "function");
|
|
52
|
-
}
|
|
53
|
-
export function isString(value) {
|
|
54
|
-
return typeof value === "string";
|
|
55
|
-
}
|
|
56
|
-
export function isFunction(value) {
|
|
57
|
-
return typeof value === "function";
|
|
58
|
-
}
|
|
59
|
-
export function isConstructor(value) {
|
|
60
|
-
return (value && typeof value === "function" && value.prototype && value.prototype.constructor) === value && value.name !== "Object";
|
|
61
|
-
}
|
|
62
|
-
export function isType(value) {
|
|
63
|
-
return isConstructor(value);
|
|
64
|
-
}
|
|
65
|
-
export function isInterface(obj, interFaceObject) {
|
|
66
|
-
if (!obj || typeof obj !== "object" || isArray(obj) || !isObject(interFaceObject))
|
|
67
|
-
return false;
|
|
68
|
-
const keys = Object.keys(interFaceObject);
|
|
69
|
-
for (const key of keys) {
|
|
70
|
-
let type = interFaceObject[key] || "";
|
|
71
|
-
if (type.startsWith("*")) {
|
|
72
|
-
type = type.substr(1);
|
|
73
|
-
if (obj.hasOwnProperty(key) && getType(obj[key]) !== type)
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
else if (!obj.hasOwnProperty(key) || getType(obj[key]) !== type) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
export function ucFirst(value) {
|
|
83
|
-
if (!value)
|
|
84
|
-
return "";
|
|
85
|
-
return value[0].toUpperCase() + value.substr(1);
|
|
86
|
-
}
|
|
87
|
-
export function lcFirst(value) {
|
|
88
|
-
if (!value)
|
|
89
|
-
return "";
|
|
90
|
-
return value[0].toLowerCase() + value.substr(1);
|
|
91
|
-
}
|
|
92
|
-
export function isObjectId(id) {
|
|
93
|
-
return typeof id === "string" && id.length == 24 && !isNaN(Number("0x" + id));
|
|
94
|
-
}
|
|
95
|
-
export function firstItem(value) {
|
|
96
|
-
return value[0];
|
|
97
|
-
}
|
|
98
|
-
export function lastItem(value) {
|
|
99
|
-
return value[value.length - 1];
|
|
100
|
-
}
|
|
101
|
-
export function regroup(value, comparator) {
|
|
102
|
-
const result = [];
|
|
103
|
-
if (!isArray(value) || value.length == 0)
|
|
104
|
-
return result;
|
|
105
|
-
value = Array.from(value);
|
|
106
|
-
result.push([value.shift()]);
|
|
107
|
-
value.forEach(item => {
|
|
108
|
-
const group = result.find(g => g.some(a => comparator(a, item)));
|
|
109
|
-
if (group) {
|
|
110
|
-
group.push(item);
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
result.push([item]);
|
|
114
|
-
});
|
|
115
|
-
return result;
|
|
116
|
-
}
|
|
117
|
-
export function uniqueItems(value) {
|
|
118
|
-
return value.filter((v, ix) => value.indexOf(v) === ix);
|
|
119
|
-
}
|
|
120
|
-
export function getValue(obj, key, defaultValue, treeFallback = false) {
|
|
121
|
-
key = key || "";
|
|
122
|
-
const keys = key.split(".");
|
|
123
|
-
let curKey = "";
|
|
124
|
-
do {
|
|
125
|
-
curKey += keys.shift();
|
|
126
|
-
if (isDefined(obj) && isDefined(obj[curKey]) && (typeof obj[curKey] === "object" || !keys.length)) {
|
|
127
|
-
obj = obj[curKey];
|
|
128
|
-
curKey = "";
|
|
129
|
-
}
|
|
130
|
-
else if (!keys.length) {
|
|
131
|
-
defaultValue = typeof defaultValue == "undefined" ? key.replace(new RegExp(`${curKey}$`), `{${curKey}}`) : defaultValue;
|
|
132
|
-
obj = treeFallback ? obj || defaultValue : defaultValue;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
curKey += ".";
|
|
136
|
-
}
|
|
137
|
-
} while (keys.length);
|
|
138
|
-
return obj;
|
|
139
|
-
}
|
|
140
|
-
export function groupBy(items, cb) {
|
|
141
|
-
return items.reduce((res, item) => {
|
|
142
|
-
const group = cb(item);
|
|
143
|
-
res[group] = res[group] || [];
|
|
144
|
-
res[group].push(item);
|
|
145
|
-
return res;
|
|
146
|
-
}, {});
|
|
147
|
-
}
|
|
148
|
-
export function convertValue(value, type) {
|
|
149
|
-
switch (type) {
|
|
150
|
-
case "boolean":
|
|
151
|
-
value = typeof value == "string" ? value.toLowerCase() : value;
|
|
152
|
-
return (value == "no" || value == "false" || value == "0") ? false : !!value;
|
|
153
|
-
case "number":
|
|
154
|
-
const val = parseFloat(value);
|
|
155
|
-
return isNaN(val) ? 0 : val;
|
|
156
|
-
case "array":
|
|
157
|
-
try {
|
|
158
|
-
return JSON.parse(value);
|
|
159
|
-
}
|
|
160
|
-
catch (e) {
|
|
161
|
-
return `${value}`.split(", ");
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return value;
|
|
165
|
-
}
|
|
166
|
-
const cropInterface = {
|
|
167
|
-
x: "number",
|
|
168
|
-
y: "number",
|
|
169
|
-
w: "number",
|
|
170
|
-
h: "number"
|
|
171
|
-
};
|
|
172
|
-
function toCropRegion(cropInfo) {
|
|
173
|
-
let crop = cropInfo;
|
|
174
|
-
if (isString(cropInfo)) {
|
|
175
|
-
try {
|
|
176
|
-
crop = JSON.parse(cropInfo);
|
|
177
|
-
}
|
|
178
|
-
catch (e) {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (!isInterface(crop, cropInterface))
|
|
183
|
-
return null;
|
|
184
|
-
return {
|
|
185
|
-
width: Math.round(crop.w),
|
|
186
|
-
height: Math.round(crop.h),
|
|
187
|
-
top: Math.round(crop.y),
|
|
188
|
-
left: Math.round(crop.x)
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
export function toImage(src, params, meta) {
|
|
192
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
-
// Default params and meta
|
|
194
|
-
params = params || {};
|
|
195
|
-
meta = meta || {};
|
|
196
|
-
// Get default crop info
|
|
197
|
-
const crop = toCropRegion(meta.crop);
|
|
198
|
-
// Return the src if there are no params and no default crop exists
|
|
199
|
-
if (meta.extension === "svg" || (Object.keys(params).length == 0 && !crop)) {
|
|
200
|
-
return src;
|
|
201
|
-
}
|
|
202
|
-
// Parse params
|
|
203
|
-
params.rotation = isNaN(params.rotation) ? 0 : Math.round(params.rotation / 90) * 90;
|
|
204
|
-
params.canvasScaleX = isNaN(params.canvasScaleX) ? 1 : Number(params.canvasScaleX);
|
|
205
|
-
params.canvasScaleY = isNaN(params.canvasScaleY) ? 1 : Number(params.canvasScaleY);
|
|
206
|
-
params.scaleX = isNaN(params.scaleX) ? 1 : Number(params.scaleX);
|
|
207
|
-
params.scaleY = isNaN(params.scaleY) ? 1 : Number(params.scaleY);
|
|
208
|
-
params.crop = isBoolean(params.crop) ? params.crop : params.crop == "true";
|
|
209
|
-
let buffer = src instanceof Readable ? yield streamToBuffer(src) : src;
|
|
210
|
-
try {
|
|
211
|
-
// Get crop info
|
|
212
|
-
const cropBefore = toCropRegion(params.cropBefore || (params.crop ? meta.cropBefore : null));
|
|
213
|
-
const cropAfter = toCropRegion(params.cropAfter || (params.crop ? meta.cropAfter : null));
|
|
214
|
-
// Get metadata
|
|
215
|
-
let img = sharp(buffer);
|
|
216
|
-
let { width, height } = yield img.metadata();
|
|
217
|
-
// Crop before resize
|
|
218
|
-
if (cropBefore) {
|
|
219
|
-
width = cropBefore.width;
|
|
220
|
-
height = cropBefore.height;
|
|
221
|
-
img = img.extract(cropBefore);
|
|
222
|
-
}
|
|
223
|
-
else if (crop) {
|
|
224
|
-
width = crop.width;
|
|
225
|
-
height = crop.height;
|
|
226
|
-
img = img.extract(crop);
|
|
227
|
-
}
|
|
228
|
-
// Resize canvas
|
|
229
|
-
const canvasScaleX = (meta === null || meta === void 0 ? void 0 : meta.canvasScaleX) || 1;
|
|
230
|
-
const canvasScaleY = (meta === null || meta === void 0 ? void 0 : meta.canvasScaleY) || 1;
|
|
231
|
-
if (params.canvasScaleX !== canvasScaleX || params.canvasScaleY !== canvasScaleY) {
|
|
232
|
-
width = Math.round(width * params.canvasScaleX);
|
|
233
|
-
height = Math.round(height * params.canvasScaleY);
|
|
234
|
-
img = img.resize({ width, height, background: "#00000000", fit: "contain" });
|
|
235
|
-
}
|
|
236
|
-
// Resize image
|
|
237
|
-
if (params.scaleX !== 1 || params.scaleY !== 1) {
|
|
238
|
-
width = Math.round(width * params.scaleX);
|
|
239
|
-
height = Math.round(height * params.scaleY);
|
|
240
|
-
img = img.resize({ width, height, background: "#00000000", fit: "fill" });
|
|
241
|
-
}
|
|
242
|
-
// Crop after resize
|
|
243
|
-
if (cropAfter) {
|
|
244
|
-
img = img.extract(cropAfter);
|
|
245
|
-
}
|
|
246
|
-
// Rotate
|
|
247
|
-
if (params.rotation !== 0) {
|
|
248
|
-
buffer = yield img.toBuffer();
|
|
249
|
-
img = sharp(buffer).rotate(params.rotation);
|
|
250
|
-
}
|
|
251
|
-
buffer = yield img.toBuffer();
|
|
252
|
-
src = src instanceof Readable ? bufferToStream(buffer) : buffer;
|
|
253
|
-
return src;
|
|
254
|
-
}
|
|
255
|
-
catch (e) {
|
|
256
|
-
console.log("Image conversion error", e);
|
|
257
|
-
src = src instanceof Readable ? bufferToStream(buffer) : buffer;
|
|
258
|
-
return src;
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
export function bufferToStream(buffer) {
|
|
263
|
-
const readStream = new PassThrough();
|
|
264
|
-
readStream.end(buffer);
|
|
265
|
-
return readStream;
|
|
266
|
-
}
|
|
267
|
-
export function streamToBuffer(stream) {
|
|
268
|
-
return new Promise((resolve, reject) => {
|
|
269
|
-
const concat = [];
|
|
270
|
-
stream.on("data", data => {
|
|
271
|
-
concat.push(data);
|
|
272
|
-
});
|
|
273
|
-
stream.on("error", reject);
|
|
274
|
-
stream.on("end", () => resolve(Buffer.concat(concat)));
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
class ReadableStreamClone extends Readable {
|
|
278
|
-
constructor(readableStream, opts) {
|
|
279
|
-
super(opts);
|
|
280
|
-
readableStream === null || readableStream === void 0 ? void 0 : readableStream.on("data", chunk => {
|
|
281
|
-
this.push(chunk);
|
|
282
|
-
});
|
|
283
|
-
readableStream === null || readableStream === void 0 ? void 0 : readableStream.on("end", () => {
|
|
284
|
-
this.push(null);
|
|
285
|
-
});
|
|
286
|
-
readableStream === null || readableStream === void 0 ? void 0 : readableStream.on("error", err => {
|
|
287
|
-
this.emit("error", err);
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
_read(size) {
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
export function copyStream(stream, opts) {
|
|
294
|
-
return new ReadableStreamClone(stream, opts);
|
|
295
|
-
}
|
|
296
|
-
export function mkdirRecursive(path, mode = null) {
|
|
297
|
-
return new Promise((resolve, reject) => {
|
|
298
|
-
mkdir(path, { mode: mode || 0o777, recursive: true }, err => {
|
|
299
|
-
if (err) {
|
|
300
|
-
reject(err);
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
resolve();
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
export function deleteFile(path) {
|
|
308
|
-
return new Promise((resolve, reject) => {
|
|
309
|
-
unlink(path, err => {
|
|
310
|
-
if (err) {
|
|
311
|
-
reject(err);
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
resolve();
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
export function readFile(path) {
|
|
319
|
-
return new Promise((res, rej) => {
|
|
320
|
-
fsReadFile(path, (err, data) => {
|
|
321
|
-
if (err) {
|
|
322
|
-
rej(err);
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
res(data);
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
export function readAndDeleteFile(path, timeout = 5000) {
|
|
330
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
331
|
-
const data = yield readFile(path);
|
|
332
|
-
setTimeout(() => {
|
|
333
|
-
unlink(path, () => {
|
|
334
|
-
});
|
|
335
|
-
}, timeout);
|
|
336
|
-
return data;
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
export function writeFile(path, data) {
|
|
340
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
341
|
-
yield mkdirRecursive(dirname(path));
|
|
342
|
-
return new Promise((res, rej) => {
|
|
343
|
-
fsWriteFile(path, data, err => {
|
|
344
|
-
if (err) {
|
|
345
|
-
rej(err);
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
res(data);
|
|
349
|
-
});
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
export function valueToPromise(value) {
|
|
354
|
-
return value instanceof Promise ? value : Promise.resolve(value);
|
|
355
|
-
}
|
|
356
|
-
export function promiseTimeout(timeout = 1000, error = false) {
|
|
357
|
-
return new Promise((resolve, reject) => {
|
|
358
|
-
setTimeout(() => {
|
|
359
|
-
if (error) {
|
|
360
|
-
reject(`Timeout exceeded: ${timeout}ms`);
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
resolve(`Timeout: ${timeout}ms`);
|
|
364
|
-
}, timeout);
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
export function getConstructorName(type) {
|
|
368
|
-
return type.prototype.constructor.name;
|
|
369
|
-
}
|
|
370
|
-
export function getFunctionParams(func) {
|
|
371
|
-
// Remove comments of the form /* ... */
|
|
372
|
-
// Removing comments of the form //
|
|
373
|
-
// Remove body of the function { ... }
|
|
374
|
-
// removing "=>" if func is arrow function
|
|
375
|
-
const str = func.toString()
|
|
376
|
-
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
377
|
-
.replace(/\/\/(.)*/g, "")
|
|
378
|
-
.replace(/{[\s\S]*}/, "")
|
|
379
|
-
.replace(/=>/g, "")
|
|
380
|
-
.trim();
|
|
381
|
-
// Start parameter names after first "("
|
|
382
|
-
const start = str.indexOf("(") + 1;
|
|
383
|
-
// End parameter names is just before last ")"
|
|
384
|
-
const end = str.length - 1;
|
|
385
|
-
const result = str.substring(start, end).split(", ");
|
|
386
|
-
const params = [];
|
|
387
|
-
result.forEach(element => {
|
|
388
|
-
// Removing any default value
|
|
389
|
-
element = element.replace(/=[\s\S]*/g, "").trim();
|
|
390
|
-
if (element.length > 0)
|
|
391
|
-
params.push(element);
|
|
392
|
-
});
|
|
393
|
-
return params;
|
|
394
|
-
}
|
|
395
|
-
export function getFileName(path, withExtension = false) {
|
|
396
|
-
const name = basename(path || "");
|
|
397
|
-
return withExtension ? name : name.split(".").slice(0, -1).join(".");
|
|
398
|
-
}
|
|
399
|
-
export function getExtension(path) {
|
|
400
|
-
const name = basename(path || "");
|
|
401
|
-
return name.split(".").pop();
|
|
402
|
-
}
|
|
403
|
-
export function createIdString() {
|
|
404
|
-
return new ObjectId().toHexString();
|
|
405
|
-
}
|
|
406
|
-
export function idToString(value) {
|
|
407
|
-
if (Array.isArray(value)) {
|
|
408
|
-
return value.map(idToString);
|
|
409
|
-
}
|
|
410
|
-
return value instanceof ObjectId || value instanceof Types.ObjectId
|
|
411
|
-
? value.toHexString()
|
|
412
|
-
: (isString(value) ? value : value || null);
|
|
413
|
-
}
|
|
414
|
-
export function createTransformer(transform) {
|
|
415
|
-
return (doc, ret, options) => {
|
|
416
|
-
ret.id = idToString(ret.id) || ret.id;
|
|
417
|
-
if (doc._id) {
|
|
418
|
-
ret._id = idToString(doc._id);
|
|
419
|
-
ret.id = ret.id || ret._id;
|
|
420
|
-
}
|
|
421
|
-
delete ret.__v;
|
|
422
|
-
return isFunction(transform) ? transform(doc, ret, options) || ret : ret;
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
export function broadcast(socketServer, cb) {
|
|
426
|
-
Array.from(Object.values(socketServer.sockets.sockets)).forEach(cb);
|
|
427
|
-
}
|
|
428
|
-
export function rand(min, max) {
|
|
429
|
-
return Math.round(random(min, max));
|
|
430
|
-
}
|
|
431
|
-
export function random(min, max) {
|
|
432
|
-
return min + Math.random() * (max - min);
|
|
433
|
-
}
|
|
434
|
-
export function multiSubscription(...subscriptions) {
|
|
435
|
-
return new Subscription(() => {
|
|
436
|
-
subscriptions.forEach(s => {
|
|
437
|
-
s.unsubscribe();
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
export function observableFromFunction(callbackFunc) {
|
|
442
|
-
let subject;
|
|
443
|
-
return new Observable((subscriber) => {
|
|
444
|
-
if (!subject) {
|
|
445
|
-
subject = new Subject();
|
|
446
|
-
try {
|
|
447
|
-
subject = from(callbackFunc());
|
|
448
|
-
}
|
|
449
|
-
catch (err) {
|
|
450
|
-
if (canReportError(subject)) {
|
|
451
|
-
subject.error(err);
|
|
452
|
-
}
|
|
453
|
-
else {
|
|
454
|
-
console.warn(err);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
return subject.subscribe(subscriber);
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
export function padLeft(value, count = 3, padWith = "0") {
|
|
462
|
-
return `${value}`.padStart(count, padWith);
|
|
463
|
-
}
|
|
464
|
-
export function padRight(value, count = 3, padWith = "0") {
|
|
465
|
-
return `${value}`.padEnd(count, padWith);
|
|
466
|
-
}
|
|
467
|
-
export function camelCaseToDash(str) {
|
|
468
|
-
return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
469
|
-
}
|
|
470
|
-
export function deleteFromBucket(bucket, fileId) {
|
|
471
|
-
return new Promise(((resolve, reject) => {
|
|
472
|
-
bucket.delete(fileId, error => {
|
|
473
|
-
let err = error;
|
|
474
|
-
if (error) {
|
|
475
|
-
err = error.message || error || "";
|
|
476
|
-
if (!isString(err) || !err.startsWith("FileNotFound")) {
|
|
477
|
-
reject(err);
|
|
478
|
-
return;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
resolve(fileId.toHexString());
|
|
482
|
-
});
|
|
483
|
-
}));
|
|
484
|
-
}
|
|
485
|
-
const defaultPredicate = () => true;
|
|
486
|
-
const ɵ0 = defaultPredicate;
|
|
487
|
-
function copyRecursive(target, source, predicate) {
|
|
488
|
-
predicate = predicate || defaultPredicate;
|
|
489
|
-
if (isPrimitive(source) || isDate(source) || isFunction(source))
|
|
490
|
-
return source;
|
|
491
|
-
if (isArray(source)) {
|
|
492
|
-
target = isArray(target) ? Array.from(target) : [];
|
|
493
|
-
source.forEach((item, index) => {
|
|
494
|
-
if (!predicate(item, index, target, source))
|
|
495
|
-
return;
|
|
496
|
-
if (target.length > index)
|
|
497
|
-
target[index] = copyRecursive(target[index], item, predicate);
|
|
498
|
-
else
|
|
499
|
-
target.push(copyRecursive(null, item, predicate));
|
|
500
|
-
});
|
|
501
|
-
return target;
|
|
502
|
-
}
|
|
503
|
-
const shouldCopy = isFunction(source.__shouldCopy) ? source.__shouldCopy : () => true;
|
|
504
|
-
if (isConstructor(source.constructor)) {
|
|
505
|
-
if (source.__shouldCopy === false)
|
|
506
|
-
return source;
|
|
507
|
-
if (!target) {
|
|
508
|
-
try {
|
|
509
|
-
target = new source.constructor();
|
|
510
|
-
}
|
|
511
|
-
catch (e) {
|
|
512
|
-
const proto = source.constructor.prototype || source.prototype;
|
|
513
|
-
target = Object.create(proto);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
else {
|
|
518
|
-
target = Object.assign({}, target || {});
|
|
519
|
-
}
|
|
520
|
-
// Copy map entries
|
|
521
|
-
if (target instanceof Map) {
|
|
522
|
-
if (source instanceof Map) {
|
|
523
|
-
for (let [key, value] of source.entries()) {
|
|
524
|
-
if (!predicate(value, key, target, source))
|
|
525
|
-
continue;
|
|
526
|
-
target.set(key, !shouldCopy(key, value) ? value : copyRecursive(target.get(key), value, predicate));
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
return target;
|
|
530
|
-
}
|
|
531
|
-
// Copy object members
|
|
532
|
-
let keys = Object.keys(source);
|
|
533
|
-
target = keys.reduce((result, key) => {
|
|
534
|
-
if (!predicate(source[key], key, result, source))
|
|
535
|
-
return result;
|
|
536
|
-
result[key] = !shouldCopy(key, source[key]) ? source[key] : copyRecursive(result[key], source[key], predicate);
|
|
537
|
-
return result;
|
|
538
|
-
}, target);
|
|
539
|
-
// Copy object properties
|
|
540
|
-
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
541
|
-
keys = Object.keys(descriptors).filter(k => keys.indexOf(k) < 0);
|
|
542
|
-
keys.forEach(key => {
|
|
543
|
-
Object.defineProperty(target, key, descriptors[key]);
|
|
544
|
-
});
|
|
545
|
-
return target;
|
|
546
|
-
}
|
|
547
|
-
export function filter(obj, predicate) {
|
|
548
|
-
return copyRecursive(null, obj, predicate);
|
|
549
|
-
}
|
|
550
|
-
export function copy(obj) {
|
|
551
|
-
return copyRecursive(null, obj);
|
|
552
|
-
}
|
|
553
|
-
export function assign(target, source, predicate) {
|
|
554
|
-
return copyRecursive(target, source, predicate);
|
|
555
|
-
}
|
|
556
|
-
export function md5(data) {
|
|
557
|
-
if (isObject(data)) {
|
|
558
|
-
data = JSON.stringify(data);
|
|
559
|
-
}
|
|
560
|
-
if (!isString(data)) {
|
|
561
|
-
throw `Can't md5 other that raw object or string`;
|
|
562
|
-
}
|
|
563
|
-
return createHash("md5").update(data).digest("hex");
|
|
564
|
-
}
|
|
565
|
-
export function runCommand(scriptPath, expectedCode = 0) {
|
|
566
|
-
return new Promise((resolve, reject) => {
|
|
567
|
-
const cp = execChildProcess(scriptPath, (error, stdout) => {
|
|
568
|
-
if (error && expectedCode !== error.code) {
|
|
569
|
-
console.log(error);
|
|
570
|
-
reject(error);
|
|
571
|
-
return;
|
|
572
|
-
}
|
|
573
|
-
const lines = (stdout || "").split("\n");
|
|
574
|
-
let line = null;
|
|
575
|
-
while (!line && lines.length > 0) {
|
|
576
|
-
line = lines.pop();
|
|
577
|
-
}
|
|
578
|
-
resolve(line);
|
|
579
|
-
});
|
|
580
|
-
cp.stdout.on("data", function (data) {
|
|
581
|
-
console.log(data.toString());
|
|
582
|
-
});
|
|
583
|
-
cp.stderr.on("data", function (data) {
|
|
584
|
-
console.error(data.toString());
|
|
585
|
-
});
|
|
586
|
-
});
|
|
587
|
-
}
|
|
588
|
-
export var ConsoleColor;
|
|
589
|
-
(function (ConsoleColor) {
|
|
590
|
-
ConsoleColor["Reset"] = "\u001B[0m";
|
|
591
|
-
ConsoleColor["Bright"] = "\u001B[1m";
|
|
592
|
-
ConsoleColor["Dim"] = "\u001B[2m";
|
|
593
|
-
ConsoleColor["Underscore"] = "\u001B[4m";
|
|
594
|
-
ConsoleColor["Blink"] = "\u001B[5m";
|
|
595
|
-
ConsoleColor["Reverse"] = "\u001B[7m";
|
|
596
|
-
ConsoleColor["Hidden"] = "\u001B[8m";
|
|
597
|
-
ConsoleColor["FgBlack"] = "\u001B[30m";
|
|
598
|
-
ConsoleColor["FgRed"] = "\u001B[31m";
|
|
599
|
-
ConsoleColor["FgGreen"] = "\u001B[32m";
|
|
600
|
-
ConsoleColor["FgYellow"] = "\u001B[33m";
|
|
601
|
-
ConsoleColor["FgBlue"] = "\u001B[34m";
|
|
602
|
-
ConsoleColor["FgMagenta"] = "\u001B[35m";
|
|
603
|
-
ConsoleColor["FgCyan"] = "\u001B[36m";
|
|
604
|
-
ConsoleColor["FgWhite"] = "\u001B[37m";
|
|
605
|
-
ConsoleColor["FgDefault"] = "\u001B[38m";
|
|
606
|
-
ConsoleColor["BgBlack"] = "\u001B[40m";
|
|
607
|
-
ConsoleColor["BgRed"] = "\u001B[41m";
|
|
608
|
-
ConsoleColor["BgGreen"] = "\u001B[42m";
|
|
609
|
-
ConsoleColor["BgYellow"] = "\u001B[43m";
|
|
610
|
-
ConsoleColor["BgBlue"] = "\u001B[44m";
|
|
611
|
-
ConsoleColor["BgMagenta"] = "\u001B[45m";
|
|
612
|
-
ConsoleColor["BgCyan"] = "\u001B[46m";
|
|
613
|
-
ConsoleColor["BgWhite"] = "\u001B[47m";
|
|
614
|
-
ConsoleColor["BgDefault"] = "\u001B[48m";
|
|
615
|
-
})(ConsoleColor || (ConsoleColor = {}));
|
|
616
|
-
const defaultColors = {
|
|
617
|
-
keyColor: ConsoleColor.FgWhite,
|
|
618
|
-
numberColor: ConsoleColor.FgBlue,
|
|
619
|
-
stringColor: ConsoleColor.FgYellow,
|
|
620
|
-
trueColor: ConsoleColor.FgGreen,
|
|
621
|
-
falseColor: ConsoleColor.FgRed,
|
|
622
|
-
nullColor: ConsoleColor.BgMagenta
|
|
623
|
-
};
|
|
624
|
-
export function colorize(input, color) {
|
|
625
|
-
return `${color}${input}${ConsoleColor.Reset}`;
|
|
626
|
-
}
|
|
627
|
-
export function jsonHighlight(input, colorOptions) {
|
|
628
|
-
const colors = Object.assign({}, defaultColors, colorOptions);
|
|
629
|
-
const json = (isString(input) ? input : JSON.stringify(input, null, 2)).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
630
|
-
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+]?\d+)?)/g, (match) => {
|
|
631
|
-
let color = colors.numberColor;
|
|
632
|
-
if (/^"/.test(match)) {
|
|
633
|
-
if (/:$/.test(match)) {
|
|
634
|
-
color = colors.keyColor;
|
|
635
|
-
}
|
|
636
|
-
else {
|
|
637
|
-
color = colors.stringColor;
|
|
638
|
-
match = '"' + match.substr(1, match.length - 2) + '"';
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
else {
|
|
642
|
-
color = /true/.test(match)
|
|
643
|
-
? colors.trueColor
|
|
644
|
-
: /false/.test(match)
|
|
645
|
-
? colors.falseColor
|
|
646
|
-
: /null/.test(match)
|
|
647
|
-
? colors.nullColor
|
|
648
|
-
: color;
|
|
649
|
-
}
|
|
650
|
-
return `${color}${match}${ConsoleColor.Reset}`;
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
export function replaceSpecialChars(str, to = "-") {
|
|
654
|
-
return `${str}`.replace(/[&\/\\#, +()$~%.@'":*?<>{}]/g, to);
|
|
655
|
-
}
|
|
656
|
-
export function regexEscape(str) {
|
|
657
|
-
return `${str}`.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
658
|
-
}
|
|
659
|
-
export function flatten(arr) {
|
|
660
|
-
return arr.reduce((flat, toFlatten) => {
|
|
661
|
-
return flat.concat(isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
|
|
662
|
-
}, []);
|
|
663
|
-
}
|
|
664
|
-
export function wrapError(e, message, httpCode = 500) {
|
|
665
|
-
if (e instanceof AxiosError) {
|
|
666
|
-
e.message = message;
|
|
667
|
-
return e;
|
|
668
|
-
}
|
|
669
|
-
return new HttpError(httpCode, `${message}: ${e}`);
|
|
670
|
-
}
|
|
671
|
-
export function prepareUrl(ending = "/") {
|
|
672
|
-
return url => {
|
|
673
|
-
return url ? `${url.replace(/\/+$/, "")}${ending}` : ending;
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
export const prepareUrlSlash = prepareUrl("/");
|
|
677
|
-
export const prepareUrlEmpty = prepareUrl("");
|
|
678
|
-
function checkTextFileType(type) {
|
|
679
|
-
return type.mime.indexOf("text") >= 0 || type.mime.indexOf("xml") >= 0;
|
|
680
|
-
}
|
|
681
|
-
function fixTextFileType(type, buffer) {
|
|
682
|
-
const text = buffer.toString("utf8");
|
|
683
|
-
if (text.indexOf("<svg") >= 0) {
|
|
684
|
-
return { ext: "svg", mime: "image/svg+xml" };
|
|
685
|
-
}
|
|
686
|
-
return type;
|
|
687
|
-
}
|
|
688
|
-
export function fileTypeFromBuffer(buffer) {
|
|
689
|
-
var _a;
|
|
690
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
691
|
-
const type = ((_a = yield extractFileType(buffer)) !== null && _a !== void 0 ? _a : { ext: "txt", mime: "text/plain" });
|
|
692
|
-
if (checkTextFileType(type)) {
|
|
693
|
-
return fixTextFileType(type, buffer);
|
|
694
|
-
}
|
|
695
|
-
return type;
|
|
696
|
-
});
|
|
697
|
-
}
|
|
698
|
-
export { ɵ0 };
|
|
699
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRWpFLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLElBQUksQ0FBQztBQUNuRixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQWUsUUFBUSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQy9DLE9BQU8sRUFBVyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQzlELE9BQU8sTUFBZ0IsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFDLFVBQVUsSUFBSSxlQUFlLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFXeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBTXJCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBa0I7SUFDdkMsWUFBWSxFQUFFLElBQUk7Q0FDckIsQ0FBQztBQUlGLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFVO0lBQ3hDLE9BQU8s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Q3hFLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7UUFFRCxlQUFlO1FBQ2YsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckYsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztRQUUzRSxJQUFJLE1BQU0sR0FBRyxHQUFHLFlBQVksUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMs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LENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBZ0Isa0JBQWtCLENBQUMsTUFBYzs7O1FBQ25ELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBQSxNQUFNLGVBQWUsQ0FBQyxNQUFNLENBQUMsbUNBQUksRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBYyxDQUFDO1FBQzlGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsT0FBTyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFJLENBQUM7O0NBQ2YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2V4ZWMgYXMgZXhlY0NoaWxkUHJvY2Vzc30gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcclxuaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tIFwiY3J5cHRvXCI7XHJcbmltcG9ydCB7RGVwZW5kZW5jeUNvbnRhaW5lcn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7ZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2NhblJlcG9ydEVycm9yfSBmcm9tIFwicnhqcy9pbnRlcm5hbC91dGlsL2NhblJlcG9ydEVycm9yXCI7XHJcbmltcG9ydCB7U2VydmVyfSBmcm9tIFwic29ja2V0LmlvXCI7XHJcbmltcG9ydCB7bWtkaXIsIHJlYWRGaWxlIGFzIGZzUmVhZEZpbGUsIHVubGluaywgd3JpdGVGaWxlIGFzIGZzV3JpdGVGaWxlfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHtiYXNlbmFtZSwgZGlybmFtZX0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHtHcmlkRlNCdWNrZXQsIE9iamVjdElkfSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge0RvY3VtZW50LCBUeXBlc30gZnJvbSBcIm1vbmdvb3NlXCI7XHJcbmltcG9ydCB7UGFzc1Rocm91Z2gsIFJlYWRhYmxlLCBSZWFkYWJsZU9wdGlvbnN9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHNoYXJwXywge1JlZ2lvbn0gZnJvbSBcInNoYXJwXCI7XHJcbmltcG9ydCB7SHR0cEVycm9yfSBmcm9tIFwicm91dGluZy1jb250cm9sbGVyc1wiO1xyXG5pbXBvcnQge0F4aW9zRXJyb3J9IGZyb20gXCJheGlvc1wiO1xyXG5pbXBvcnQge2Zyb21CdWZmZXIgYXMgZXh0cmFjdEZpbGVUeXBlfSBmcm9tIFwiZmlsZS10eXBlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJQXNzZXRDcm9wSW5mbyxcclxuICAgIElBc3NldEltYWdlUGFyYW1zLFxyXG4gICAgSUFzc2V0TWV0YSxcclxuICAgIElDbGllbnRTb2NrZXQsXHJcbiAgICBJRmlsZVR5cGUsXHJcbiAgICBQYXJhbVJlc29sdmVyLFxyXG4gICAgVHlwZVxyXG59IGZyb20gXCIuL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuY29uc3Qgc2hhcnAgPSBzaGFycF87XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElESUNvbnRhaW5lcnMge1xyXG4gICAgYXBwQ29udGFpbmVyOiBEZXBlbmRlbmN5Q29udGFpbmVyXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkaUNvbnRhaW5lcnM6IElESUNvbnRhaW5lcnMgPSB7XHJcbiAgICBhcHBDb250YWluZXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEZpbHRlclByZWRpY2F0ZSA9ICh2YWx1ZTogYW55LCBrZXk/OiBhbnksIHRhcmdldD86IGFueSwgc291cmNlPzogYW55KSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PSBcInVuZGVmaW5lZFwiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZShvYmo6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXCJcXFxccyhbYS16QS1aXSspXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKHJlZ2V4KVsxXS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGdldFR5cGUodmFsdWUpID09IFwib2JqZWN0XCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBcnJheTxhbnk+IHtcclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogYW55KTogdmFsdWUgaXMgYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgRGF0ZSB7XHJcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdICYmICFpc05hTih2YWx1ZSkgJiYgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIHZhbHVlLmdldERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWU6IGFueSk6IHZhbHVlIGlzIEZ1bmN0aW9uIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgJiYgdmFsdWUucHJvdG90eXBlLmNvbnN0cnVjdG9yKSA9PT0gdmFsdWUgJiYgdmFsdWUubmFtZSAhPT0gXCJPYmplY3RcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgVHlwZTxhbnk+IHtcclxuICAgIHJldHVybiBpc0NvbnN0cnVjdG9yKHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJmYWNlKG9iajogYW55LCBpbnRlckZhY2VPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBib29sZWFuIHtcclxuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgaXNBcnJheShvYmopIHx8ICFpc09iamVjdChpbnRlckZhY2VPYmplY3QpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW50ZXJGYWNlT2JqZWN0KTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgICBsZXQgdHlwZSA9IGludGVyRmFjZU9iamVjdFtrZXldIHx8IFwiXCI7XHJcbiAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aChcIipcIikpIHtcclxuICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgZ2V0VHlwZShvYmpba2V5XSkgIT09IHR5cGUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSB8fCBnZXRUeXBlKG9ialtrZXldKSAhPT0gdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1Y0ZpcnN0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XHJcbiAgICByZXR1cm4gdmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cigxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxjRmlyc3QodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIjtcclxuICAgIHJldHVybiB2YWx1ZVswXS50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc3Vic3RyKDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmxlbmd0aCA9PSAyNCAmJiAhaXNOYU4oTnVtYmVyKFwiMHhcIiArIGlkKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xyXG4gICAgcmV0dXJuIHZhbHVlWzBdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGFzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xyXG4gICAgcmV0dXJuIHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVncm91cDxUPih2YWx1ZTogVFtdLCBjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbik6IEFycmF5PFRbXT4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxUW10+ID0gW107XHJcbiAgICBpZiAoIWlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PSAwKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgdmFsdWUgPSBBcnJheS5mcm9tKHZhbHVlKTtcclxuICAgIHJlc3VsdC5wdXNoKFt2YWx1ZS5zaGlmdCgpXSk7XHJcbiAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gcmVzdWx0LmZpbmQoZyA9PiBnLnNvbWUoYSA9PiBjb21wYXJhdG9yKGEsIGl0ZW0pKSk7XHJcbiAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0LnB1c2goW2l0ZW1dKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUl0ZW1zPFQ+KHZhbHVlOiBUW10pOiBUW10ge1xyXG4gICAgcmV0dXJuIHZhbHVlLmZpbHRlcigodiwgaXgpID0+IHZhbHVlLmluZGV4T2YodikgPT09IGl4KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlKG9iajogYW55LCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55LCB0cmVlRmFsbGJhY2s6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICBrZXkgPSBrZXkgfHwgXCJcIjtcclxuICAgIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoXCIuXCIpO1xyXG4gICAgbGV0IGN1cktleSA9IFwiXCI7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgY3VyS2V5ICs9IGtleXMuc2hpZnQoKTtcclxuICAgICAgICBpZiAoaXNEZWZpbmVkKG9iaikgJiYgaXNEZWZpbmVkKG9ialtjdXJLZXldKSAmJiAodHlwZW9mIG9ialtjdXJLZXldID09PSBcIm9iamVjdFwiIHx8ICFrZXlzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgb2JqID0gb2JqW2N1cktleV07XHJcbiAgICAgICAgICAgIGN1cktleSA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICgha2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PSBcInVuZGVmaW5lZFwiID8ga2V5LnJlcGxhY2UobmV3IFJlZ0V4cChgJHtjdXJLZXl9JGApLCBgeyR7Y3VyS2V5fX1gKSA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgb2JqID0gdHJlZUZhbGxiYWNrID8gb2JqIHx8IGRlZmF1bHRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJLZXkgKz0gXCIuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfSB3aGlsZSAoa2V5cy5sZW5ndGgpO1xyXG4gICAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnk8VD4oaXRlbXM6IFRbXSwgY2I6IChpdGVtOiBUKSA9PiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gY2IoaXRlbSk7XHJcbiAgICAgICAgcmVzW2dyb3VwXSA9IHJlc1tncm91cF0gfHwgW107XHJcbiAgICAgICAgcmVzW2dyb3VwXS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9LCB7fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWU6IGFueSwgdHlwZTogc3RyaW5nKTogYW55IHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gXCJub1wiIHx8IHZhbHVlID09IFwiZmFsc2VcIiB8fCB2YWx1ZSA9PSBcIjBcIikgPyBmYWxzZSA6ICEhdmFsdWU7XHJcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUZsb2F0KHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHZhbCkgPyAwIDogdmFsO1xyXG4gICAgICAgIGNhc2UgXCJhcnJheVwiOlxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YC5zcGxpdChcIiwgXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbmNvbnN0IGNyb3BJbnRlcmZhY2UgPSB7XHJcbiAgICB4OiBcIm51bWJlclwiLFxyXG4gICAgeTogXCJudW1iZXJcIixcclxuICAgIHc6IFwibnVtYmVyXCIsXHJcbiAgICBoOiBcIm51bWJlclwiXHJcbn07XHJcblxyXG5mdW5jdGlvbiB0b0Nyb3BSZWdpb24oY3JvcEluZm86IHN0cmluZyB8IGJvb2xlYW4gfCBJQXNzZXRDcm9wSW5mbyk6IFJlZ2lvbiB7XHJcbiAgICBsZXQgY3JvcCA9IGNyb3BJbmZvIGFzIElBc3NldENyb3BJbmZvO1xyXG4gICAgaWYgKGlzU3RyaW5nKGNyb3BJbmZvKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNyb3AgPSBKU09OLnBhcnNlKGNyb3BJbmZvIGFzIHN0cmluZyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzSW50ZXJmYWNlKGNyb3AsIGNyb3BJbnRlcmZhY2UpKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgd2lkdGg6IE1hdGgucm91bmQoY3JvcC53KSxcclxuICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoY3JvcC5oKSxcclxuICAgICAgICB0b3A6IE1hdGgucm91bmQoY3JvcC55KSxcclxuICAgICAgICBsZWZ0OiBNYXRoLnJvdW5kKGNyb3AueClcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0ltYWdlPFQgPSBCdWZmZXIgfCBSZWFkYWJsZT4oc3JjOiBULCBwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcywgbWV0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFQ+IHtcclxuXHJcbiAgICAvLyBEZWZhdWx0IHBhcmFtcyBhbmQgbWV0YVxyXG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xyXG4gICAgbWV0YSA9IG1ldGEgfHwge307XHJcblxyXG4gICAgLy8gR2V0IGRlZmF1bHQgY3JvcCBpbmZvXHJcbiAgICBjb25zdCBjcm9wID0gdG9Dcm9wUmVnaW9uKG1ldGEuY3JvcCk7XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBzcmMgaWYgdGhlcmUgYXJlIG5vIHBhcmFtcyBhbmQgbm8gZGVmYXVsdCBjcm9wIGV4aXN0c1xyXG4gICAgaWYgKG1ldGEuZXh0ZW5zaW9uID09PSBcInN2Z1wiIHx8IChPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PSAwICYmICFjcm9wKSkge1xyXG4gICAgICAgIHJldHVybiBzcmM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGFyc2UgcGFyYW1zXHJcbiAgICBwYXJhbXMucm90YXRpb24gPSBpc05hTihwYXJhbXMucm90YXRpb24pID8gMCA6IE1hdGgucm91bmQocGFyYW1zLnJvdGF0aW9uIC8gOTApICogOTA7XHJcbiAgICBwYXJhbXMuY2FudmFzU2NhbGVYID0gaXNOYU4ocGFyYW1zLmNhbnZhc1NjYWxlWCkgPyAxIDogTnVtYmVyKHBhcmFtcy5jYW52YXNTY2FsZVgpO1xyXG4gICAgcGFyYW1zLmNhbnZhc1NjYWxlWSA9IGlzTmFOKHBhcmFtcy5jYW52YXNTY2FsZVkpID8gMSA6IE51bWJlcihwYXJhbXMuY2FudmFzU2NhbGVZKTtcclxuICAgIHBhcmFtcy5zY2FsZVggPSBpc05hTihwYXJhbXMuc2NhbGVYKSA/IDEgOiBOdW1iZXIocGFyYW1zLnNjYWxlWCk7XHJcbiAgICBwYXJhbXMuc2NhbGVZID0gaXNOYU4ocGFyYW1zLnNjYWxlWSkgPyAxIDogTnVtYmVyKHBhcmFtcy5zY2FsZVkpO1xyXG4gICAgcGFyYW1zLmNyb3AgPSBpc0Jvb2xlYW4ocGFyYW1zLmNyb3ApID8gcGFyYW1zLmNyb3AgOiBwYXJhbXMuY3JvcCA9PSBcInRydWVcIjtcclxuXHJcbiAgICBsZXQgYnVmZmVyID0gc3JjIGluc3RhbmNlb2YgUmVhZGFibGUgPyBhd2FpdCBzdHJlYW1Ub0J1ZmZlcihzcmMpIDogc3JjIGFzIGFueTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgLy8gR2V0IGNyb3AgaW5mb1xyXG4gICAgICAgIGNvbnN0IGNyb3BCZWZvcmUgPSB0b0Nyb3BSZWdpb24ocGFyYW1zLmNyb3BCZWZvcmUgfHwgKHBhcmFtcy5jcm9wID8gbWV0YS5jcm9wQmVmb3JlIDogbnVsbCkpO1xyXG4gICAgICAgIGNvbnN0IGNyb3BBZnRlciA9IHRvQ3JvcFJlZ2lvbihwYXJhbXMuY3JvcEFmdGVyIHx8IChwYXJhbXMuY3JvcCA/IG1ldGEuY3JvcEFmdGVyIDogbnVsbCkpO1xyXG4gICAgICAgIC8vIEdldCBtZXRhZGF0YVxyXG4gICAgICAgIGxldCBpbWcgPSBzaGFycChidWZmZXIpO1xyXG4gICAgICAgIGxldCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCBpbWcubWV0YWRhdGEoKTtcclxuICAgICAgICAvLyBDcm9wIGJlZm9yZSByZXNpemVcclxuICAgICAgICBpZiAoY3JvcEJlZm9yZSkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IGNyb3BCZWZvcmUud2lkdGg7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IGNyb3BCZWZvcmUuaGVpZ2h0O1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wQmVmb3JlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNyb3ApIHtcclxuICAgICAgICAgICAgd2lkdGggPSBjcm9wLndpZHRoO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBjcm9wLmhlaWdodDtcclxuICAgICAgICAgICAgaW1nID0gaW1nLmV4dHJhY3QoY3JvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlc2l6ZSBjYW52YXNcclxuICAgICAgICBjb25zdCBjYW52YXNTY2FsZVggPSBtZXRhPy5jYW52YXNTY2FsZVggfHwgMTtcclxuICAgICAgICBjb25zdCBjYW52YXNTY2FsZVkgPSBtZXRhPy5jYW52YXNTY2FsZVkgfHwgMTtcclxuICAgICAgICBpZiAocGFyYW1zLmNhbnZhc1NjYWxlWCAhPT0gY2FudmFzU2NhbGVYIHx8IHBhcmFtcy5jYW52YXNTY2FsZVkgIT09IGNhbnZhc1NjYWxlWSkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBwYXJhbXMuY2FudmFzU2NhbGVYKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBwYXJhbXMuY2FudmFzU2NhbGVZKTtcclxuICAgICAgICAgICAgaW1nID0gaW1nLnJlc2l6ZSh7d2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZDogXCIjMDAwMDAwMDBcIiwgZml0OiBcImNvbnRhaW5cIn0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZXNpemUgaW1hZ2VcclxuICAgICAgICBpZiAocGFyYW1zLnNjYWxlWCAhPT0gMSB8fCBwYXJhbXMuc2NhbGVZICE9PSAxKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHBhcmFtcy5zY2FsZVgpO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHBhcmFtcy5zY2FsZVkpO1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcucmVzaXplKHt3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kOiBcIiMwMDAwMDAwMFwiLCBmaXQ6IFwiZmlsbFwifSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENyb3AgYWZ0ZXIgcmVzaXplXHJcbiAgICAgICAgaWYgKGNyb3BBZnRlcikge1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wQWZ0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSb3RhdGVcclxuICAgICAgICBpZiAocGFyYW1zLnJvdGF0aW9uICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGF3YWl0IGltZy50b0J1ZmZlcigpO1xyXG4gICAgICAgICAgICBpbWcgPSBzaGFycChidWZmZXIpLnJvdGF0ZShwYXJhbXMucm90YXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBidWZmZXIgPSBhd2FpdCBpbWcudG9CdWZmZXIoKTtcclxuICAgICAgICBzcmMgPSBzcmMgaW5zdGFuY2VvZiBSZWFkYWJsZSA/IGJ1ZmZlclRvU3RyZWFtKGJ1ZmZlcikgOiBidWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHNyYztcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkltYWdlIGNvbnZlcnNpb24gZXJyb3JcIiwgZSk7XHJcbiAgICAgICAgc3JjID0gc3JjIGluc3RhbmNlb2YgUmVhZGFibGUgPyBidWZmZXJUb1N0cmVhbShidWZmZXIpIDogYnVmZmVyO1xyXG4gICAgICAgIHJldHVybiBzcmM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb1N0cmVhbShidWZmZXI6IEJ1ZmZlcik6IFJlYWRhYmxlIHtcclxuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcclxuICAgIHJlYWRTdHJlYW0uZW5kKGJ1ZmZlcik7XHJcbiAgICByZXR1cm4gcmVhZFN0cmVhbVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtVG9CdWZmZXIoc3RyZWFtOiBSZWFkYWJsZSk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8QnVmZmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29uY2F0ID0gW107XHJcbiAgICAgICAgc3RyZWFtLm9uKFwiZGF0YVwiLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgY29uY2F0LnB1c2goZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcclxuICAgICAgICBzdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNvbmNhdCkpKTtcclxuICAgIH0pXHJcbn1cclxuXHJcbmNsYXNzIFJlYWRhYmxlU3RyZWFtQ2xvbmUgZXh0ZW5kcyBSZWFkYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZGFibGVTdHJlYW06IFJlYWRhYmxlLCBvcHRzPzogUmVhZGFibGVPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgcmVhZGFibGVTdHJlYW0/Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChjaHVuayk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVhZGFibGVTdHJlYW0/Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlYWRhYmxlU3RyZWFtPy5vbihcImVycm9yXCIsIGVyciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3JlYWQoc2l6ZTogbnVtYmVyKSB7XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29weVN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBvcHRzPzogUmVhZGFibGVPcHRpb25zKTogUmVhZGFibGUge1xyXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbUNsb25lKHN0cmVhbSwgb3B0cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBta2RpclJlY3Vyc2l2ZShwYXRoOiBzdHJpbmcsIG1vZGU6IG51bWJlciA9IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgbWtkaXIocGF0aCwge21vZGU6IG1vZGUgfHwgMG83NzcsIHJlY3Vyc2l2ZTogdHJ1ZX0sIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdW5saW5rKHBhdGgsIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgIGZzUmVhZEZpbGUocGF0aCwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICByZWooZXJyKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXMoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBbmREZWxldGVGaWxlKHBhdGg6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNTAwMCk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUocGF0aCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB1bmxpbmsocGF0aCwgKCkgPT4ge1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgdGltZW91dCk7XHJcbiAgICByZXR1cm4gZGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICBhd2FpdCBta2RpclJlY3Vyc2l2ZShkaXJuYW1lKHBhdGgpKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgIGZzV3JpdGVGaWxlKHBhdGgsIGRhdGEsIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlaihlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlcyhkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVUb1Byb21pc2UodmFsdWU6IGFueSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlID8gdmFsdWUgOiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZVRpbWVvdXQodGltZW91dDogbnVtYmVyID0gMTAwMCwgZXJyb3I6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGBUaW1lb3V0IGV4Y2VlZGVkOiAke3RpbWVvdXR9bXNgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGBUaW1lb3V0OiAke3RpbWVvdXR9bXNgKTtcclxuICAgICAgICB9LCB0aW1lb3V0KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGU6IFR5cGU8YW55Pik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdHlwZS5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uUGFyYW1zKGZ1bmM6IEZ1bmN0aW9uKTogc3RyaW5nW10ge1xyXG4gICAgLy8gUmVtb3ZlIGNvbW1lbnRzIG9mIHRoZSBmb3JtIC8qIC4uLiAqL1xyXG4gICAgLy8gUmVtb3ZpbmcgY29tbWVudHMgb2YgdGhlIGZvcm0gLy9cclxuICAgIC8vIFJlbW92ZSBib2R5IG9mIHRoZSBmdW5jdGlvbiB7IC4uLiB9XHJcbiAgICAvLyByZW1vdmluZyBcIj0+XCIgaWYgZnVuYyBpcyBhcnJvdyBmdW5jdGlvblxyXG4gICAgY29uc3Qgc3RyID0gZnVuYy50b1N0cmluZygpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgXCJcIilcclxuICAgICAgICAucmVwbGFjZSgvXFwvXFwvKC4pKi9nLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKC97W1xcc1xcU10qfS8sIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoLz0+L2csIFwiXCIpXHJcbiAgICAgICAgLnRyaW0oKTtcclxuXHJcbiAgICAvLyBTdGFydCBwYXJhbWV0ZXIgbmFtZXMgYWZ0ZXIgZmlyc3QgXCIoXCJcclxuICAgIGNvbnN0IHN0YXJ0ID0gc3RyLmluZGV4T2YoXCIoXCIpICsgMTtcclxuXHJcbiAgICAvLyBFbmQgcGFyYW1ldGVyIG5hbWVzIGlzIGp1c3QgYmVmb3JlIGxhc3QgXCIpXCJcclxuICAgIGNvbnN0IGVuZCA9IHN0ci5sZW5ndGggLSAxO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKS5zcGxpdChcIiwgXCIpO1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcblxyXG4gICAgcmVzdWx0LmZvckVhY2goZWxlbWVudCA9PiB7XHJcblxyXG4gICAgICAgIC8vIFJlbW92aW5nIGFueSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucmVwbGFjZSgvPVtcXHNcXFNdKi9nLCBcIlwiKS50cmltKCk7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGVsZW1lbnQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVOYW1lKHBhdGg6IHN0cmluZywgd2l0aEV4dGVuc2lvbjogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShwYXRoIHx8IFwiXCIpO1xyXG4gICAgcmV0dXJuIHdpdGhFeHRlbnNpb24gPyBuYW1lIDogbmFtZS5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUocGF0aCB8fCBcIlwiKTtcclxuICAgIHJldHVybiBuYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkU3RyaW5nKCk6IGFueSB7XHJcbiAgICByZXR1cm4gbmV3IE9iamVjdElkKCkudG9IZXhTdHJpbmcoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlkVG9TdHJpbmcodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUubWFwKGlkVG9TdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0SWQgfHwgdmFsdWUgaW5zdGFuY2VvZiBUeXBlcy5PYmplY3RJZFxyXG4gICAgICAgID8gdmFsdWUudG9IZXhTdHJpbmcoKVxyXG4gICAgICAgIDogKGlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgfHwgbnVsbCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm0/OiAoZG9jOiBEb2N1bWVudCwgcmV0OiBhbnksIG9wdGlvbnM/OiBhbnkpID0+IGFueSkge1xyXG4gICAgcmV0dXJuIChkb2M6IERvY3VtZW50LCByZXQ6IGFueSwgb3B0aW9ucz86IGFueSkgPT4ge1xyXG4gICAgICAgIHJldC5pZCA9IGlkVG9TdHJpbmcocmV0LmlkKSB8fCByZXQuaWQ7XHJcbiAgICAgICAgaWYgKGRvYy5faWQpIHtcclxuICAgICAgICAgICAgcmV0Ll9pZCA9IGlkVG9TdHJpbmcoZG9jLl9pZCk7XHJcbiAgICAgICAgICAgIHJldC5pZCA9IHJldC5pZCB8fCByZXQuX2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgcmV0Ll9fdjtcclxuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbih0cmFuc2Zvcm0pID8gdHJhbnNmb3JtKGRvYywgcmV0LCBvcHRpb25zKSB8fCByZXQgOiByZXQ7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0KHNvY2tldFNlcnZlcjogU2VydmVyLCBjYjogKGNsaWVudDogSUNsaWVudFNvY2tldCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKHNvY2tldFNlcnZlci5zb2NrZXRzLnNvY2tldHMpKS5mb3JFYWNoKGNiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhbmQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKHJhbmRvbShtaW4sIG1heCkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbWluICsgTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlTdWJzY3JpcHRpb24oLi4uc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10pOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKCkgPT4ge1xyXG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgcy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZhYmxlRnJvbUZ1bmN0aW9uKGNhbGxiYWNrRnVuYzogKCkgPT4gYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBzdWJqZWN0OiBhbnk7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8YW55Pigoc3Vic2NyaWJlcikgPT4ge1xyXG4gICAgICAgIGlmICghc3ViamVjdCkge1xyXG4gICAgICAgICAgICBzdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN1YmplY3QgPSBmcm9tKGNhbGxiYWNrRnVuYygpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FuUmVwb3J0RXJyb3Ioc3ViamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdWJqZWN0LnN1YnNjcmliZShzdWJzY3JpYmVyKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFkTGVmdCh2YWx1ZTogYW55LCBjb3VudDogbnVtYmVyID0gMywgcGFkV2l0aDogc3RyaW5nID0gXCIwXCIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfWAucGFkU3RhcnQoY291bnQsIHBhZFdpdGgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFkUmlnaHQodmFsdWU6IGFueSwgY291bnQ6IG51bWJlciA9IDMsIHBhZFdpdGg6IHN0cmluZyA9IFwiMFwiKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZX1gLnBhZEVuZChjb3VudCwgcGFkV2l0aCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2VUb0Rhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpLnRvTG93ZXJDYXNlKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGcm9tQnVja2V0KGJ1Y2tldDogR3JpZEZTQnVja2V0LCBmaWxlSWQ6IE9iamVjdElkKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgYnVja2V0LmRlbGV0ZShmaWxlSWQsIGVycm9yID0+IHtcclxuICAgICAgICAgICAgbGV0IGVyciA9IGVycm9yIGFzIGFueTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBlcnIgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yIHx8IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nKGVycikgfHwgIWVyci5zdGFydHNXaXRoKFwiRmlsZU5vdEZvdW5kXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoZmlsZUlkLnRvSGV4U3RyaW5nKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSkpO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0UHJlZGljYXRlOiBGaWx0ZXJQcmVkaWNhdGUgPSAoKSA9PiB0cnVlO1xyXG5cclxuZnVuY3Rpb24gY29weVJlY3Vyc2l2ZSh0YXJnZXQ6IGFueSwgc291cmNlOiBhbnksIHByZWRpY2F0ZT86IEZpbHRlclByZWRpY2F0ZSk6IGFueSB7XHJcbiAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUgfHwgZGVmYXVsdFByZWRpY2F0ZTtcclxuICAgIGlmIChpc1ByaW1pdGl2ZShzb3VyY2UpIHx8IGlzRGF0ZShzb3VyY2UpIHx8IGlzRnVuY3Rpb24oc291cmNlKSkgcmV0dXJuIHNvdXJjZTtcclxuICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcclxuICAgICAgICB0YXJnZXQgPSBpc0FycmF5KHRhcmdldCkgPyBBcnJheS5mcm9tKHRhcmdldCkgOiBbXTtcclxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIHRhcmdldCwgc291cmNlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA+IGluZGV4KVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2luZGV4XSA9IGNvcHlSZWN1cnNpdmUodGFyZ2V0W2luZGV4XSwgaXRlbSwgcHJlZGljYXRlKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weVJlY3Vyc2l2ZShudWxsLCBpdGVtLCBwcmVkaWNhdGUpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2hvdWxkQ29weSA9IGlzRnVuY3Rpb24oc291cmNlLl9fc2hvdWxkQ29weSkgPyBzb3VyY2UuX19zaG91bGRDb3B5IDogKCkgPT4gdHJ1ZTtcclxuICAgIGlmIChpc0NvbnN0cnVjdG9yKHNvdXJjZS5jb25zdHJ1Y3RvcikpIHtcclxuICAgICAgICBpZiAoc291cmNlLl9fc2hvdWxkQ29weSA9PT0gZmFsc2UpIHJldHVybiBzb3VyY2U7XHJcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3IoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBzb3VyY2UuY29uc3RydWN0b3IucHJvdG90eXBlIHx8IHNvdXJjZS5wcm90b3R5cGU7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0IHx8IHt9KTtcclxuICAgIH1cclxuICAgIC8vIENvcHkgbWFwIGVudHJpZXNcclxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNYXApIHtcclxuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwga2V5LCB0YXJnZXQsIHNvdXJjZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNldChrZXksICFzaG91bGRDb3B5KGtleSwgdmFsdWUpID8gdmFsdWUgOiBjb3B5UmVjdXJzaXZlKHRhcmdldC5nZXQoa2V5KSwgdmFsdWUsIHByZWRpY2F0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29weSBvYmplY3QgbWVtYmVyc1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xyXG4gICAgdGFyZ2V0ID0ga2V5cy5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFwcmVkaWNhdGUoc291cmNlW2tleV0sIGtleSwgcmVzdWx0LCBzb3VyY2UpKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gIXNob3VsZENvcHkoa2V5LCBzb3VyY2Vba2V5XSkgPyBzb3VyY2Vba2V5XSA6IGNvcHlSZWN1cnNpdmUocmVzdWx0W2tleV0sIHNvdXJjZVtrZXldLCBwcmVkaWNhdGUpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LCB0YXJnZXQpO1xyXG5cclxuICAgIC8vIENvcHkgb2JqZWN0IHByb3BlcnRpZXNcclxuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKTtcclxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhkZXNjcmlwdG9ycykuZmlsdGVyKGsgPT4ga2V5cy5pbmRleE9mKGspIDwgMCk7XHJcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3JzW2tleV0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KG9iajogVCwgcHJlZGljYXRlOiBGaWx0ZXJQcmVkaWNhdGUpOiBQYXJ0aWFsPFQ+IHtcclxuICAgIHJldHVybiBjb3B5UmVjdXJzaXZlKG51bGwsIG9iaiwgcHJlZGljYXRlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvcHk8VD4ob2JqOiBUKTogVCB7XHJcbiAgICByZXR1cm4gY29weVJlY3Vyc2l2ZShudWxsLCBvYmopO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduPFQ+KHRhcmdldDogVCwgc291cmNlOiBhbnksIHByZWRpY2F0ZT86IEZpbHRlclByZWRpY2F0ZSk6IFQge1xyXG4gICAgcmV0dXJuIGNvcHlSZWN1cnNpdmUodGFyZ2V0LCBzb3VyY2UsIHByZWRpY2F0ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZDUoZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmIChpc09iamVjdChkYXRhKSkge1xyXG4gICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICAgIH1cclxuICAgIGlmICghaXNTdHJpbmcoZGF0YSkpIHtcclxuICAgICAgICB0aHJvdyBgQ2FuJ3QgbWQ1IG90aGVyIHRoYXQgcmF3IG9iamVjdCBvciBzdHJpbmdgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGRhdGEpLmRpZ2VzdChcImhleFwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbW1hbmQoc2NyaXB0UGF0aDogc3RyaW5nLCBleHBlY3RlZENvZGU6IG51bWJlciA9IDApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCBjcCA9IGV4ZWNDaGlsZFByb2Nlc3Moc2NyaXB0UGF0aCwgKGVycm9yLCBzdGRvdXQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yICYmIGV4cGVjdGVkQ29kZSAhPT0gZXJyb3IuY29kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IChzdGRvdXQgfHwgXCJcIikuc3BsaXQoXCJcXG5cIik7XHJcbiAgICAgICAgICAgIGxldCBsaW5lID0gbnVsbDtcclxuICAgICAgICAgICAgd2hpbGUgKCFsaW5lICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lcy5wb3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGxpbmUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNwLnN0ZG91dC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjcC5zdGRlcnIub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBDb25zb2xlQ29sb3Ige1xyXG4gICAgUmVzZXQgPSBcIlxceDFiWzBtXCIsXHJcbiAgICBCcmlnaHQgPSBcIlxceDFiWzFtXCIsXHJcbiAgICBEaW0gPSBcIlxceDFiWzJtXCIsXHJcbiAgICBVbmRlcnNjb3JlID0gXCJcXHgxYls0bVwiLFxyXG4gICAgQmxpbmsgPSBcIlxceDFiWzVtXCIsXHJcbiAgICBSZXZlcnNlID0gXCJcXHgxYls3bVwiLFxyXG4gICAgSGlkZGVuID0gXCJcXHgxYls4bVwiLFxyXG5cclxuICAgIEZnQmxhY2sgPSBcIlxceDFiWzMwbVwiLFxyXG4gICAgRmdSZWQgPSBcIlxceDFiWzMxbVwiLFxyXG4gICAgRmdHcmVlbiA9IFwiXFx4MWJbMzJtXCIsXHJcbiAgICBGZ1llbGxvdyA9IFwiXFx4MWJbMzNtXCIsXHJcbiAgICBGZ0JsdWUgPSBcIlxceDFiWzM0bVwiLFxyXG4gICAgRmdNYWdlbnRhID0gXCJcXHgxYlszNW1cIixcclxuICAgIEZnQ3lhbiA9IFwiXFx4MWJbMzZtXCIsXHJcbiAgICBGZ1doaXRlID0gXCJcXHgxYlszN21cIixcclxuICAgIEZnRGVmYXVsdCA9IFwiXFx4MWJbMzhtXCIsXHJcblxyXG4gICAgQmdCbGFjayA9IFwiXFx4MWJbNDBtXCIsXHJcbiAgICBCZ1JlZCA9IFwiXFx4MWJbNDFtXCIsXHJcbiAgICBCZ0dyZWVuID0gXCJcXHgxYls0Mm1cIixcclxuICAgIEJnWWVsbG93ID0gXCJcXHgxYls0M21cIixcclxuICAgIEJnQmx1ZSA9IFwiXFx4MWJbNDRtXCIsXHJcbiAgICBCZ01hZ2VudGEgPSBcIlxceDFiWzQ1bVwiLFxyXG4gICAgQmdDeWFuID0gXCJcXHgxYls0Nm1cIixcclxuICAgIEJnV2hpdGUgPSBcIlxceDFiWzQ3bVwiLFxyXG4gICAgQmdEZWZhdWx0ID0gXCJcXHgxYls0OG1cIlxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElKc29uQ29sb3JzIHtcclxuICAgIGtleUNvbG9yPzogQ29uc29sZUNvbG9yO1xyXG4gICAgbnVtYmVyQ29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbiAgICBzdHJpbmdDb2xvcj86IENvbnNvbGVDb2xvcjtcclxuICAgIHRydWVDb2xvcj86IENvbnNvbGVDb2xvcjtcclxuICAgIGZhbHNlQ29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbiAgICBudWxsQ29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRDb2xvcnM6IElKc29uQ29sb3JzID0ge1xyXG4gICAga2V5Q29sb3I6IENvbnNvbGVDb2xvci5GZ1doaXRlLFxyXG4gICAgbnVtYmVyQ29sb3I6IENvbnNvbGVDb2xvci5GZ0JsdWUsXHJcbiAgICBzdHJpbmdDb2xvcjogQ29uc29sZUNvbG9yLkZnWWVsbG93LFxyXG4gICAgdHJ1ZUNvbG9yOiBDb25zb2xlQ29sb3IuRmdHcmVlbixcclxuICAgIGZhbHNlQ29sb3I6IENvbnNvbGVDb2xvci5GZ1JlZCxcclxuICAgIG51bGxDb2xvcjogQ29uc29sZUNvbG9yLkJnTWFnZW50YVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29sb3JpemUoaW5wdXQ6IGFueSwgY29sb3I6IENvbnNvbGVDb2xvcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7Y29sb3J9JHtpbnB1dH0ke0NvbnNvbGVDb2xvci5SZXNldH1gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24ganNvbkhpZ2hsaWdodChpbnB1dDogc3RyaW5nIHwgb2JqZWN0LCBjb2xvck9wdGlvbnM/OiBJSnNvbkNvbG9ycyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjb2xvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29sb3JzLCBjb2xvck9wdGlvbnMpXHJcbiAgICBjb25zdCBqc29uID0gKGlzU3RyaW5nKGlucHV0KSA/IGlucHV0IDogSlNPTi5zdHJpbmdpZnkoaW5wdXQsIG51bGwsIDIpKS5yZXBsYWNlKC8mL2csICcmJykucmVwbGFjZSgvPC9nLCAnPCcpLnJlcGxhY2UoLz4vZywgJz4nKVxyXG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvKFwiKFxcXFx1W2EtekEtWjAtOV17NH18XFxcXFtedV18W15cXFxcXCJdKSpcIihcXHMqOik/fFxcYih0cnVlfGZhbHNlfG51bGwpXFxifC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bK10/XFxkKyk/KS9nLCAobWF0Y2gpID0+IHtcclxuICAgICAgICBsZXQgY29sb3IgPSBjb2xvcnMubnVtYmVyQ29sb3JcclxuICAgICAgICBpZiAoL15cIi8udGVzdChtYXRjaCkpIHtcclxuICAgICAgICAgICAgaWYgKC86JC8udGVzdChtYXRjaCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JzLmtleUNvbG9yXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9ycy5zdHJpbmdDb2xvcjtcclxuICAgICAgICAgICAgICAgIG1hdGNoID0gJ1wiJyArIG1hdGNoLnN1YnN0cigxLCBtYXRjaC5sZW5ndGggLSAyKSArICdcIic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2xvciA9IC90cnVlLy50ZXN0KG1hdGNoKVxyXG4gICAgICAgICAgICAgICAgPyBjb2xvcnMudHJ1ZUNvbG9yXHJcbiAgICAgICAgICAgICAgICA6IC9mYWxzZS8udGVzdChtYXRjaClcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbG9ycy5mYWxzZUNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgOiAvbnVsbC8udGVzdChtYXRjaClcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2xvcnMubnVsbENvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY29sb3JcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke2NvbG9yfSR7bWF0Y2h9JHtDb25zb2xlQ29sb3IuUmVzZXR9YFxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VTcGVjaWFsQ2hhcnMoc3RyOiBzdHJpbmcsIHRvOiBzdHJpbmcgPSBcIi1cIik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7c3RyfWAucmVwbGFjZSgvWyZcXC9cXFxcIywgKygpJH4lLkAnXCI6Kj88Pnt9XS9nLCB0byk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWdleEVzY2FwZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7c3RyfWAucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFycjogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gYXJyLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZsYXQuY29uY2F0KGlzQXJyYXkodG9GbGF0dGVuKSA/IGZsYXR0ZW4odG9GbGF0dGVuKSA6IHRvRmxhdHRlbik7XHJcbiAgICB9LCBbXSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB3cmFwRXJyb3IoZTogYW55LCBtZXNzYWdlOiBzdHJpbmcsIGh0dHBDb2RlOiBudW1iZXIgPSA1MDApOiBFcnJvciB7XHJcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcclxuICAgICAgICBlLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHJldHVybiBlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBIdHRwRXJyb3IoaHR0cENvZGUsIGAke21lc3NhZ2V9OiAke2V9YCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlVXJsKGVuZGluZzogc3RyaW5nID0gXCIvXCIpOiBQYXJhbVJlc29sdmVyIHtcclxuICAgIHJldHVybiB1cmwgPT4ge1xyXG4gICAgICAgIHJldHVybiB1cmwgPyBgJHt1cmwucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0ke2VuZGluZ31gIDogZW5kaW5nO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcHJlcGFyZVVybFNsYXNoID0gcHJlcGFyZVVybChcIi9cIik7XHJcblxyXG5leHBvcnQgY29uc3QgcHJlcGFyZVVybEVtcHR5ID0gcHJlcGFyZVVybChcIlwiKTtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrVGV4dEZpbGVUeXBlKHR5cGU6IElGaWxlVHlwZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGUubWltZS5pbmRleE9mKFwidGV4dFwiKSA+PSAwIHx8IHR5cGUubWltZS5pbmRleE9mKFwieG1sXCIpID49IDA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZpeFRleHRGaWxlVHlwZSh0eXBlOiBJRmlsZVR5cGUsIGJ1ZmZlcjogQnVmZmVyKTogSUZpbGVUeXBlIHtcclxuICAgIGNvbnN0IHRleHQgPSBidWZmZXIudG9TdHJpbmcoXCJ1dGY4XCIpO1xyXG4gICAgaWYgKHRleHQuaW5kZXhPZihcIjxzdmdcIikgPj0gMCkge1xyXG4gICAgICAgIHJldHVybiB7ZXh0OiBcInN2Z1wiLCBtaW1lOiBcImltYWdlL3N2Zyt4bWxcIn07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVUeXBlRnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8SUZpbGVUeXBlPiB7XHJcbiAgICBjb25zdCB0eXBlID0gKGF3YWl0IGV4dHJhY3RGaWxlVHlwZShidWZmZXIpID8/IHtleHQ6IFwidHh0XCIsIG1pbWU6IFwidGV4dC9wbGFpblwifSkgYXMgSUZpbGVUeXBlO1xyXG4gICAgaWYgKGNoZWNrVGV4dEZpbGVUeXBlKHR5cGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpeFRleHRGaWxlVHlwZSh0eXBlLCBidWZmZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHR5cGU7XHJcbn1cclxuIl19
|