@stemy/backend 3.5.16 → 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.
Files changed (146) hide show
  1. package/commands/clear-command.d.ts +6 -0
  2. package/commands/fixtures-command.d.ts +9 -0
  3. package/commands/index.d.ts +2 -0
  4. package/common-types.d.ts +29 -7
  5. package/esm2020/commands/clear-command.mjs +17 -0
  6. package/esm2020/commands/fixtures-command.mjs +23 -0
  7. package/esm2020/commands/index.mjs +7 -0
  8. package/esm2020/common-types.mjs +21 -0
  9. package/esm2020/public_api.mjs +379 -0
  10. package/esm2020/requests/asset-image-params.mjs +53 -0
  11. package/esm2020/rest-controllers/assets.controller.mjs +126 -0
  12. package/esm2020/rest-controllers/auth.controller.mjs +46 -0
  13. package/esm2020/rest-controllers/gallery.controller.mjs +21 -0
  14. package/esm2020/rest-controllers/progresses.controller.mjs +29 -0
  15. package/esm2020/rest-controllers/terminal-styles.mjs +67 -0
  16. package/esm2020/rest-controllers/terminal.controller.mjs +125 -0
  17. package/esm2020/rest-middlewares/container.middleware.mjs +20 -0
  18. package/esm2020/rest-middlewares/error-handler.middleware.mjs +74 -0
  19. package/esm2020/rest-middlewares/language.middleware.mjs +18 -0
  20. package/esm2020/rest-middlewares/request-ended.middleware.mjs +23 -0
  21. package/esm2020/rest-middlewares/request-started.middleware.mjs +22 -0
  22. package/esm2020/services/asset-processor.mjs +90 -0
  23. package/esm2020/services/asset-resolver.mjs +31 -0
  24. package/esm2020/services/assets.mjs +140 -0
  25. package/esm2020/services/backend-provider.mjs +22 -0
  26. package/esm2020/services/cache-processor.mjs +16 -0
  27. package/esm2020/services/cache.mjs +62 -0
  28. package/esm2020/services/configuration.mjs +65 -0
  29. package/esm2020/services/endpoint-provider.mjs +13 -0
  30. package/esm2020/services/entities/asset.mjs +43 -0
  31. package/esm2020/services/entities/base-entity.mjs +26 -0
  32. package/esm2020/services/entities/lazy-asset.mjs +73 -0
  33. package/esm2020/services/entities/progress.mjs +176 -0
  34. package/esm2020/services/entities/temp-asset.mjs +45 -0
  35. package/esm2020/services/fixtures.mjs +26 -0
  36. package/esm2020/services/gallery-cache.mjs +27 -0
  37. package/esm2020/services/gallery-image.mjs +37 -0
  38. package/esm2020/services/gallery.mjs +116 -0
  39. package/esm2020/services/id-generator.mjs +42 -0
  40. package/esm2020/services/job-manager.mjs +187 -0
  41. package/esm2020/services/lazy-assets.mjs +48 -0
  42. package/esm2020/services/logger.mjs +21 -0
  43. package/esm2020/services/mail-sender.mjs +36 -0
  44. package/esm2020/services/memory-cache.mjs +57 -0
  45. package/esm2020/services/mongo-connector.mjs +37 -0
  46. package/esm2020/services/open-api.mjs +114 -0
  47. package/esm2020/services/progresses.mjs +86 -0
  48. package/esm2020/services/template-renderer.mjs +64 -0
  49. package/esm2020/services/terminal-manager.mjs +77 -0
  50. package/esm2020/services/token-generator.mjs +35 -0
  51. package/esm2020/services/translation-provider.mjs +34 -0
  52. package/esm2020/services/translator.mjs +63 -0
  53. package/esm2020/services/user-manager.mjs +27 -0
  54. package/esm2020/socket-controllers/progress.controller.mjs +52 -0
  55. package/esm2020/socket-controllers/terminal.controller.mjs +48 -0
  56. package/esm2020/socket-controllers/terminal.mjs +85 -0
  57. package/esm2020/socket-middlewares/compression.middleware.mjs +14 -0
  58. package/esm2020/static.mjs +23 -0
  59. package/esm2020/utilities/decorators.mjs +52 -0
  60. package/esm2020/utilities/di-container.mjs +83 -0
  61. package/esm2020/utilities/empty-job.mjs +13 -0
  62. package/esm2020/utilities/lazy-asset-generator.mjs +35 -0
  63. package/esm2020/utilities/mongoose.mjs +216 -0
  64. package/esm2020/utils.mjs +693 -0
  65. package/esm2020/validators.mjs +46 -0
  66. package/fesm2015/{stemy-backend.js → stemy-backend.mjs} +1923 -2220
  67. package/fesm2015/stemy-backend.mjs.map +1 -0
  68. package/fesm2020/stemy-backend.mjs +4202 -0
  69. package/fesm2020/stemy-backend.mjs.map +1 -0
  70. package/{stemy-backend.d.ts → index.d.ts} +1 -0
  71. package/package.json +36 -23
  72. package/public_api.d.ts +3 -2
  73. package/rest-controllers/terminal-styles.d.ts +2 -0
  74. package/rest-controllers/terminal.controller.d.ts +10 -0
  75. package/services/asset-processor.d.ts +0 -3
  76. package/services/assets.d.ts +1 -0
  77. package/services/configuration.d.ts +2 -1
  78. package/services/entities/asset.d.ts +1 -0
  79. package/services/entities/temp-asset.d.ts +1 -0
  80. package/services/fixtures.d.ts +2 -2
  81. package/services/terminal-manager.d.ts +15 -0
  82. package/socket-controllers/terminal.controller.d.ts +13 -0
  83. package/socket-controllers/terminal.d.ts +20 -0
  84. package/utils.d.ts +7 -1
  85. package/bundles/stemy-backend.umd.js +0 -7081
  86. package/bundles/stemy-backend.umd.js.map +0 -1
  87. package/esm2015/common-types.js +0 -19
  88. package/esm2015/public_api.js +0 -359
  89. package/esm2015/requests/asset-image-params.js +0 -70
  90. package/esm2015/rest-controllers/assets.controller.js +0 -180
  91. package/esm2015/rest-controllers/auth.controller.js +0 -76
  92. package/esm2015/rest-controllers/gallery.controller.js +0 -37
  93. package/esm2015/rest-controllers/progresses.controller.js +0 -57
  94. package/esm2015/rest-middlewares/container.middleware.js +0 -32
  95. package/esm2015/rest-middlewares/error-handler.middleware.js +0 -99
  96. package/esm2015/rest-middlewares/language.middleware.js +0 -28
  97. package/esm2015/rest-middlewares/request-ended.middleware.js +0 -33
  98. package/esm2015/rest-middlewares/request-started.middleware.js +0 -32
  99. package/esm2015/rest-openapi.js +0 -44
  100. package/esm2015/services/asset-processor.js +0 -129
  101. package/esm2015/services/asset-resolver.js +0 -53
  102. package/esm2015/services/assets.js +0 -181
  103. package/esm2015/services/backend-provider.js +0 -32
  104. package/esm2015/services/cache-processor.js +0 -34
  105. package/esm2015/services/cache.js +0 -93
  106. package/esm2015/services/configuration.js +0 -69
  107. package/esm2015/services/endpoint-provider.js +0 -29
  108. package/esm2015/services/entities/asset.js +0 -60
  109. package/esm2015/services/entities/base-entity.js +0 -37
  110. package/esm2015/services/entities/lazy-asset.js +0 -90
  111. package/esm2015/services/entities/progress.js +0 -213
  112. package/esm2015/services/entities/temp-asset.js +0 -64
  113. package/esm2015/services/fixtures.js +0 -45
  114. package/esm2015/services/gallery-cache.js +0 -36
  115. package/esm2015/services/gallery-image.js +0 -48
  116. package/esm2015/services/gallery.js +0 -138
  117. package/esm2015/services/id-generator.js +0 -63
  118. package/esm2015/services/job-manager.js +0 -221
  119. package/esm2015/services/lazy-assets.js +0 -83
  120. package/esm2015/services/logger.js +0 -31
  121. package/esm2015/services/mail-sender.js +0 -58
  122. package/esm2015/services/memory-cache.js +0 -84
  123. package/esm2015/services/mongo-connector.js +0 -58
  124. package/esm2015/services/open-api.js +0 -140
  125. package/esm2015/services/progresses.js +0 -118
  126. package/esm2015/services/template-renderer.js +0 -89
  127. package/esm2015/services/token-generator.js +0 -55
  128. package/esm2015/services/translation-provider.js +0 -54
  129. package/esm2015/services/translator.js +0 -84
  130. package/esm2015/services/user-manager.js +0 -47
  131. package/esm2015/socket-controllers/progress.controller.js +0 -82
  132. package/esm2015/socket-middlewares/compression.middleware.js +0 -19
  133. package/esm2015/static.js +0 -33
  134. package/esm2015/utilities/decorators.js +0 -54
  135. package/esm2015/utilities/di-container.js +0 -84
  136. package/esm2015/utilities/empty-job.js +0 -29
  137. package/esm2015/utilities/lazy-asset-generator.js +0 -46
  138. package/esm2015/utilities/mongoose.js +0 -225
  139. package/esm2015/utils.js +0 -672
  140. package/esm2015/validators.js +0 -51
  141. package/fesm2015/stemy-backend.js.map +0 -1
  142. package/rest-openapi.d.ts +0 -3
  143. package/stemy-backend.metadata.json +0 -1
  144. /package/{esm2015/stemy-backend.js → esm2020/stemy-backend.mjs} +0 -0
  145. /package/{esm2015/utilities/base-doc.js → esm2020/utilities/base-doc.mjs} +0 -0
  146. /package/{esm2015/utilities/tree.js → esm2020/utilities/tree.mjs} +0 -0
@@ -1,225 +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 { model, Types } from "mongoose";
11
- import { getValue as getMongoValue, setValue as setMongoValue } from "mongoose/lib/utils";
12
- import { BadRequestError, createParamDecorator, HttpError } from "routing-controllers";
13
- import { diContainers, isArray, isFunction, isObject, isString, valueToPromise } from "../utils";
14
- const pluginsKey = "typegoose:plugins";
15
- /**
16
- * A mongoose/typegoose plugin to inject services from the main di container to a schema as virtuals
17
- * @param schema
18
- * @param services
19
- */
20
- export function injectServices(schema, services) {
21
- const serviceMap = {};
22
- if (!isObject(services)) {
23
- throw new Error(`services object should be defined to inject services to schema!`);
24
- }
25
- Object.keys(services).forEach(prop => {
26
- schema
27
- .virtual(prop)
28
- .get(() => {
29
- const diContainer = diContainers.appContainer;
30
- serviceMap[prop] = serviceMap[prop] || (!diContainer ? {} : diContainer.resolve(services[prop]));
31
- return serviceMap[prop];
32
- });
33
- });
34
- }
35
- /**
36
- * Decorates a property to inject a service with the help of the injectServices mongoose/typegoose plugin
37
- * @param token optional InjectionToken to use
38
- * @return PropertyDecorator
39
- */
40
- export function service(token) {
41
- return (target, propertyKey) => {
42
- var _a;
43
- const propertyType = Reflect.getOwnMetadata("design:type", target, propertyKey);
44
- const plugins = Array.from((_a = Reflect.getMetadata(pluginsKey, target.constructor)) !== null && _a !== void 0 ? _a : []);
45
- let plugin = plugins.find(t => t.mongoosePlugin === injectServices);
46
- if (!plugin) {
47
- plugin = { mongoosePlugin: injectServices, options: {} };
48
- plugins.push(plugin);
49
- }
50
- plugin.options = Object.assign(plugin.options || {}, { [propertyKey]: token !== null && token !== void 0 ? token : propertyType });
51
- Reflect.defineMetadata(pluginsKey, plugins, target.constructor);
52
- };
53
- }
54
- /**
55
- * Paginate using a typegoose model using a simple where query and pagination params
56
- * @param model Typegoose model
57
- * @param where Simple query to filter the results
58
- * @param params Pagination params
59
- */
60
- export function paginate(model, where, params) {
61
- return model.countDocuments(where).then(count => {
62
- let query = model.find(where);
63
- if (isString(params.sort)) {
64
- query = query.sort(params.sort);
65
- }
66
- if (isArray(params.populate)) {
67
- params.populate.forEach(field => {
68
- query = query.populate(field);
69
- });
70
- }
71
- return (params.limit > 0 ? query.skip(params.page * params.limit).limit(params.limit) : query).then(items => {
72
- const meta = { total: count };
73
- return { count, items, meta };
74
- });
75
- });
76
- }
77
- export function lookupStages(from, localField, as = null, foreignField = "_id", shouldUnwind = true) {
78
- as = as || localField.replace("Id", "");
79
- const stages = [
80
- {
81
- $lookup: {
82
- from,
83
- localField,
84
- foreignField,
85
- as
86
- }
87
- },
88
- {
89
- $unwind: {
90
- path: `$${as}`,
91
- preserveNullAndEmptyArrays: true
92
- }
93
- }
94
- ];
95
- if (!shouldUnwind) {
96
- stages.splice(1, 1);
97
- }
98
- return stages;
99
- }
100
- export function letsLookupStage(from, pipeline, as = null, letFields = null) {
101
- as = as || from;
102
- letFields = letFields || { id: "$_id" };
103
- return {
104
- $lookup: {
105
- from,
106
- let: letFields,
107
- pipeline,
108
- as
109
- }
110
- };
111
- }
112
- export function matchStage(match) {
113
- return { $match: match };
114
- }
115
- export function matchField(field, filter, when) {
116
- return { field, filter, when };
117
- }
118
- export function matchFieldStages(...fields) {
119
- const match = {};
120
- fields.forEach(field => {
121
- if (field.when) {
122
- match[field.field] = field.filter;
123
- }
124
- });
125
- return Object.keys(match).length > 0 ? [matchStage(match)] : [];
126
- }
127
- export function projectStage(fields) {
128
- return { $project: fields };
129
- }
130
- export function unwindStage(fieldOrOpts) {
131
- return { $unwind: fieldOrOpts };
132
- }
133
- export function hydratePopulated(modelType, json) {
134
- let object = modelType.hydrate(json);
135
- for (const [path, obj] of Object.entries(modelType.schema.obj)) {
136
- let { ref, type } = obj;
137
- if (Array.isArray(type) && type.length > 0) {
138
- ref = type[0].ref;
139
- }
140
- if (!ref)
141
- continue;
142
- const value = getMongoValue(path, json);
143
- const hydrateVal = val => {
144
- if (val == null || val instanceof Types.ObjectId)
145
- return val;
146
- return hydratePopulated(model(ref), val);
147
- };
148
- if (Array.isArray(value)) {
149
- setMongoValue(path, value.map(hydrateVal), object);
150
- continue;
151
- }
152
- setMongoValue(path, hydrateVal(value), object);
153
- }
154
- return object;
155
- }
156
- export function paginateAggregations(model, aggregations, params, metaProjection = {}) {
157
- return __awaiter(this, void 0, void 0, function* () {
158
- const sortField = !isString(params.sort) || !params.sort ? null : (params.sort.startsWith("-") ? params.sort.substr(1) : params.sort);
159
- const sortAggregation = !sortField ? [] : [{
160
- $sort: { [sortField]: sortField == params.sort ? 1 : -1 }
161
- }];
162
- const result = yield model.aggregate([
163
- ...aggregations,
164
- ...sortAggregation,
165
- {
166
- $group: {
167
- _id: "results",
168
- result: { $push: "$$CURRENT" }
169
- }
170
- },
171
- {
172
- $project: {
173
- _id: 0,
174
- items: params.limit > 0 ? { $slice: ["$result", params.page * params.limit, params.limit] } : "$result",
175
- count: { $size: "$result" },
176
- meta: Object.assign({ total: { $size: "$result" } }, metaProjection)
177
- }
178
- }
179
- ]);
180
- const pagination = result[0];
181
- if (!pagination) {
182
- return { items: [], count: 0, meta: { total: 0 } };
183
- }
184
- pagination.items = pagination.items.map(i => hydratePopulated(model, i));
185
- return pagination;
186
- });
187
- }
188
- export function ResolveEntity(model, extraCheck) {
189
- const modelName = model.modelName;
190
- const paramName = modelName.toLowerCase();
191
- return createParamDecorator({
192
- required: false,
193
- value: (action) => __awaiter(this, void 0, void 0, function* () {
194
- const req = action.request;
195
- const token = req.header(`x-${paramName}-token`);
196
- const id = req.params[`${paramName}Id`];
197
- if (!id && !token) {
198
- throw new BadRequestError(`${modelName} id or token should be defined!`);
199
- }
200
- const query = !token
201
- ? model.findById(id)
202
- : model.findOne({ token });
203
- let doc = null;
204
- if (isFunction(extraCheck)) {
205
- try {
206
- doc = yield valueToPromise(extraCheck(query, action));
207
- }
208
- catch (e) {
209
- throw new BadRequestError(`${modelName} check error: ${e.message || e}`);
210
- }
211
- }
212
- else {
213
- doc = yield query;
214
- }
215
- if (!doc) {
216
- throw new HttpError(404, !token
217
- ? `${modelName} could not be found with id: ${id}`
218
- : `${modelName} could not be found with token: ${token}`);
219
- }
220
- action.request[paramName] = doc;
221
- return doc;
222
- })
223
- });
224
- }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ29vc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL21vbmdvb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBd0IsS0FBSyxFQUF1QyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbEcsT0FBTyxFQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUUsUUFBUSxJQUFJLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXhGLE9BQU8sRUFBUyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFZN0YsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRS9GLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBT3ZDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQW1CLEVBQUUsUUFBa0Q7SUFDbEcsTUFBTSxVQUFVLEdBQTRCLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQTtLQUNyRjtJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2pDLE1BQU07YUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDOUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcs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LElBQUksZUFBZSxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RTthQUNKO2lCQUFNO2dCQUNILEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQzthQUNyQjtZQUNELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLO29CQUMzQixDQUFDLENBQUMsR0FBRyxTQUFTLGdDQUFnQyxFQUFFLEVBQUU7b0JBQ2xELENBQUMsQ0FBQyxHQUFHLFNBQVMsbUNBQW1DLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDakU7WUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNoQyxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUMsQ0FBQTtLQUNKLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RvY3VtZW50LCBGaWx0ZXJRdWVyeSwgbW9kZWwsIE1vZGVsLCBQaXBlbGluZVN0YWdlLCBRdWVyeSwgU2NoZW1hLCBUeXBlc30gZnJvbSBcIm1vbmdvb3NlXCI7XHJcbmltcG9ydCB7Z2V0VmFsdWUgYXMgZ2V0TW9uZ29WYWx1ZSwgc2V0VmFsdWUgYXMgc2V0TW9uZ29WYWx1ZX0gZnJvbSBcIm1vbmdvb3NlL2xpYi91dGlsc1wiO1xyXG5pbXBvcnQge0RvY3VtZW50VHlwZSwgUmV0dXJuTW9kZWxUeXBlfSBmcm9tIFwiQHR5cGVnb29zZS90eXBlZ29vc2VcIjtcclxuaW1wb3J0IHtBY3Rpb24sIEJhZFJlcXVlc3RFcnJvciwgY3JlYXRlUGFyYW1EZWNvcmF0b3IsIEh0dHBFcnJvcn0gZnJvbSBcInJvdXRpbmctY29udHJvbGxlcnNcIjtcclxuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJTWF0Y2hGaWVsZCxcclxuICAgIEluZmVyR2VuZXJpYyxcclxuICAgIElQYWdpbmF0aW9uQmFzZSxcclxuICAgIElQYWdpbmF0aW9uUGFyYW1zLFxyXG4gICAgSVByb2plY3RPcHRpb25zLFxyXG4gICAgSVJlcXVlc3QsXHJcbiAgICBJVW53aW5kT3B0aW9ucyxcclxuICAgIFR5cGVcclxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7ZGlDb250YWluZXJzLCBpc0FycmF5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNTdHJpbmcsIHZhbHVlVG9Qcm9taXNlfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbmNvbnN0IHBsdWdpbnNLZXkgPSBcInR5cGVnb29zZTpwbHVnaW5zXCI7XHJcblxyXG5pbnRlcmZhY2UgSVBsdWdpbldpdGhPcHRpb25zIHtcclxuICAgIG1vbmdvb3NlUGx1Z2luOiBGdW5jdGlvbjtcclxuICAgIG9wdGlvbnM6IGFueTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbW9uZ29vc2UvdHlwZWdvb3NlIHBsdWdpbiB0byBpbmplY3Qgc2VydmljZXMgZnJvbSB0aGUgbWFpbiBkaSBjb250YWluZXIgdG8gYSBzY2hlbWEgYXMgdmlydHVhbHNcclxuICogQHBhcmFtIHNjaGVtYVxyXG4gKiBAcGFyYW0gc2VydmljZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTZXJ2aWNlcyhzY2hlbWE6IFNjaGVtYTxhbnk+LCBzZXJ2aWNlcz86IHsgW3Byb3A6IHN0cmluZ106IEluamVjdGlvblRva2VuPGFueT4gfSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VydmljZU1hcDogeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgIGlmICghaXNPYmplY3Qoc2VydmljZXMpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZXJ2aWNlcyBvYmplY3Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gaW5qZWN0IHNlcnZpY2VzIHRvIHNjaGVtYSFgKVxyXG4gICAgfVxyXG4gICAgT2JqZWN0LmtleXMoc2VydmljZXMpLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgICAgc2NoZW1hXHJcbiAgICAgICAgICAgIC52aXJ0dWFsKHByb3ApXHJcbiAgICAgICAgICAgIC5nZXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlDb250YWluZXIgPSBkaUNvbnRhaW5lcnMuYXBwQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZU1hcFtwcm9wXSA9IHNlcnZpY2VNYXBbcHJvcF0gfHwgKCFkaUNvbnRhaW5lciA/IHt9IDogZGlDb250YWluZXIucmVzb2x2ZShzZXJ2aWNlc1twcm9wXSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VNYXBbcHJvcF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0ZXMgYSBwcm9wZXJ0eSB0byBpbmplY3QgYSBzZXJ2aWNlIHdpdGggdGhlIGhlbHAgb2YgdGhlIGluamVjdFNlcnZpY2VzIG1vbmdvb3NlL3R5cGVnb29zZSBwbHVnaW5cclxuICogQHBhcmFtIHRva2VuIG9wdGlvbmFsIEluamVjdGlvblRva2VuIHRvIHVzZVxyXG4gKiBAcmV0dXJuIFByb3BlcnR5RGVjb3JhdG9yXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZSh0b2tlbj86IEluamVjdGlvblRva2VuPGFueT4pOiBQcm9wZXJ0eURlY29yYXRvciB7XHJcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlUeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBBcnJheS5mcm9tKFJlZmxlY3QuZ2V0TWV0YWRhdGEocGx1Z2luc0tleSwgdGFyZ2V0LmNvbnN0cnVjdG9yKSA/PyBbXSkgYXMgSVBsdWdpbldpdGhPcHRpb25zW107XHJcbiAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCh0ID0+IHQubW9uZ29vc2VQbHVnaW4gPT09IGluamVjdFNlcnZpY2VzKTtcclxuICAgICAgICBpZiAoIXBsdWdpbikge1xyXG4gICAgICAgICAgICBwbHVnaW4gPSB7IG1vbmdvb3NlUGx1Z2luOiBpbmplY3RTZXJ2aWNlcywgb3B0aW9uczoge30gfTtcclxuICAgICAgICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBsdWdpbi5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihwbHVnaW4ub3B0aW9ucyB8fCB7fSwge1twcm9wZXJ0eUtleV06IHRva2VuID8/IHByb3BlcnR5VHlwZX0pO1xyXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEocGx1Z2luc0tleSwgcGx1Z2lucywgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYWdpbmF0ZSB1c2luZyBhIHR5cGVnb29zZSBtb2RlbCB1c2luZyBhIHNpbXBsZSB3aGVyZSBxdWVyeSBhbmQgcGFnaW5hdGlvbiBwYXJhbXNcclxuICogQHBhcmFtIG1vZGVsIFR5cGVnb29zZSBtb2RlbFxyXG4gKiBAcGFyYW0gd2hlcmUgU2ltcGxlIHF1ZXJ5IHRvIGZpbHRlciB0aGUgcmVzdWx0c1xyXG4gKiBAcGFyYW0gcGFyYW1zIFBhZ2luYXRpb24gcGFyYW1zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFnaW5hdGU8VCBleHRlbmRzIFR5cGU8YW55PiwgVSA9IEluZmVyR2VuZXJpYzxUPj4obW9kZWw6IFJldHVybk1vZGVsVHlwZTxUPiwgd2hlcmU6IEZpbHRlclF1ZXJ5PERvY3VtZW50VHlwZTxVPj4sIHBhcmFtczogSVBhZ2luYXRpb25QYXJhbXMpOiBQcm9taXNlPElQYWdpbmF0aW9uQmFzZTxEb2N1bWVudFR5cGU8VT4+PiB7XHJcbiAgICByZXR1cm4gbW9kZWwuY291bnREb2N1bWVudHMod2hlcmUpLnRoZW4oY291bnQgPT4ge1xyXG4gICAgICAgIGxldCBxdWVyeTogUXVlcnk8YW55LCBhbnk+ID0gbW9kZWwuZmluZCh3aGVyZSk7XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKHBhcmFtcy5zb3J0KSkge1xyXG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnNvcnQocGFyYW1zLnNvcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNBcnJheShwYXJhbXMucG9wdWxhdGUpKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wb3B1bGF0ZS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucG9wdWxhdGUoZmllbGQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChwYXJhbXMubGltaXQgPiAwID8gcXVlcnkuc2tpcChwYXJhbXMucGFnZSAqIHBhcmFtcy5saW1pdCkubGltaXQocGFyYW1zLmxpbWl0KSA6IHF1ZXJ5KS50aGVuKGl0ZW1zID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHt0b3RhbDogY291bnR9O1xyXG4gICAgICAgICAgICByZXR1cm4ge2NvdW50LCBpdGVtcywgbWV0YX07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cFN0YWdlcyhmcm9tOiBzdHJpbmcsIGxvY2FsRmllbGQ6IHN0cmluZywgYXM6IHN0cmluZyA9IG51bGwsIGZvcmVpZ25GaWVsZDogc3RyaW5nID0gXCJfaWRcIiwgc2hvdWxkVW53aW5kOiBib29sZWFuID0gdHJ1ZSk6IFtQaXBlbGluZVN0YWdlLkxvb2t1cCwgUGlwZWxpbmVTdGFnZS5VbndpbmRdIHtcclxuICAgIGFzID0gYXMgfHwgbG9jYWxGaWVsZC5yZXBsYWNlKFwiSWRcIiwgXCJcIik7XHJcbiAgICBjb25zdCBzdGFnZXM6IFtQaXBlbGluZVN0YWdlLkxvb2t1cCwgUGlwZWxpbmVTdGFnZS5VbndpbmRdID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgJGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgICAgZnJvbSxcclxuICAgICAgICAgICAgICAgIGxvY2FsRmllbGQsXHJcbiAgICAgICAgICAgICAgICBmb3JlaWduRmllbGQsXHJcbiAgICAgICAgICAgICAgICBhc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICR1bndpbmQ6IHtcclxuICAgICAgICAgICAgICAgIHBhdGg6IGAkJHthc31gLFxyXG4gICAgICAgICAgICAgICAgcHJlc2VydmVOdWxsQW5kRW1wdHlBcnJheXM6IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIF07XHJcbiAgICBpZiAoIXNob3VsZFVud2luZCkge1xyXG4gICAgICAgIHN0YWdlcy5zcGxpY2UoMSwgMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RhZ2VzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGV0c0xvb2t1cFN0YWdlKGZyb206IHN0cmluZywgcGlwZWxpbmU6IEV4Y2x1ZGU8UGlwZWxpbmVTdGFnZSwgUGlwZWxpbmVTdGFnZS5NZXJnZSB8IFBpcGVsaW5lU3RhZ2UuT3V0IHwgUGlwZWxpbmVTdGFnZS5TZWFyY2g+W10sIGFzOiBzdHJpbmcgPSBudWxsLCBsZXRGaWVsZHM6IGFueSA9IG51bGwpOiBQaXBlbGluZVN0YWdlLkxvb2t1cCB7XHJcbiAgICBhcyA9IGFzIHx8IGZyb207XHJcbiAgICBsZXRGaWVsZHMgPSBsZXRGaWVsZHMgfHwge2lkOiBcIiRfaWRcIn07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgICRsb29rdXA6IHtcclxuICAgICAgICAgICAgZnJvbSxcclxuICAgICAgICAgICAgbGV0OiBsZXRGaWVsZHMsXHJcbiAgICAgICAgICAgIHBpcGVsaW5lLFxyXG4gICAgICAgICAgICBhc1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFN0YWdlKG1hdGNoOiBGaWx0ZXJRdWVyeTxhbnk+KTogUGlwZWxpbmVTdGFnZS5NYXRjaCB7XHJcbiAgICByZXR1cm4geyRtYXRjaDogbWF0Y2h9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZChmaWVsZDogc3RyaW5nLCBmaWx0ZXI6IGFueSwgd2hlbjogYm9vbGVhbik6IElNYXRjaEZpZWxkIHtcclxuICAgIHJldHVybiB7ZmllbGQsIGZpbHRlciwgd2hlbn07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZpZWxkU3RhZ2VzKC4uLmZpZWxkczogSU1hdGNoRmllbGRbXSk6IFJlYWRvbmx5QXJyYXk8UGlwZWxpbmVTdGFnZS5NYXRjaD4ge1xyXG4gICAgY29uc3QgbWF0Y2ggPSB7fTtcclxuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICBpZiAoZmllbGQud2hlbikge1xyXG4gICAgICAgICAgICBtYXRjaFtmaWVsZC5maWVsZF0gPSBmaWVsZC5maWx0ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWF0Y2gpLmxlbmd0aCA+IDAgPyBbbWF0Y2hTdGFnZShtYXRjaCldIDogW107XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0U3RhZ2UoZmllbGRzOiBJUHJvamVjdE9wdGlvbnMpOiBQaXBlbGluZVN0YWdlLlByb2plY3Qge1xyXG4gICAgcmV0dXJuIHskcHJvamVjdDogZmllbGRzfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVud2luZFN0YWdlKGZpZWxkT3JPcHRzOiBzdHJpbmcgfCBJVW53aW5kT3B0aW9ucyk6IFBpcGVsaW5lU3RhZ2UuVW53aW5kIHtcclxuICAgIHJldHVybiB7JHVud2luZDogZmllbGRPck9wdHN9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVBvcHVsYXRlZDxUIGV4dGVuZHMgRG9jdW1lbnQ+KG1vZGVsVHlwZTogTW9kZWw8VD4sIGpzb246IGFueSk6IFQge1xyXG4gICAgbGV0IG9iamVjdCA9IG1vZGVsVHlwZS5oeWRyYXRlKGpzb24pO1xyXG5cclxuICAgIGZvciAoY29uc3QgW3BhdGgsIG9ial0gb2YgT2JqZWN0LmVudHJpZXMobW9kZWxUeXBlLnNjaGVtYS5vYmopKSB7XHJcbiAgICAgICAgbGV0IHtyZWYsIHR5cGV9ID0gb2JqIGFzIGFueTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSAmJiB0eXBlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmVmID0gdHlwZVswXS5yZWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVmKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldE1vbmdvVmFsdWUocGF0aCwganNvbik7XHJcbiAgICAgICAgY29uc3QgaHlkcmF0ZVZhbCA9IHZhbCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgaW5zdGFuY2VvZiBUeXBlcy5PYmplY3RJZCkgcmV0dXJuIHZhbDtcclxuICAgICAgICAgICAgcmV0dXJuIGh5ZHJhdGVQb3B1bGF0ZWQobW9kZWwocmVmKSBhcyBhbnksIHZhbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgc2V0TW9uZ29WYWx1ZShwYXRoLCB2YWx1ZS5tYXAoaHlkcmF0ZVZhbCksIG9iamVjdCk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRNb25nb1ZhbHVlKHBhdGgsIGh5ZHJhdGVWYWwodmFsdWUpLCBvYmplY3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcblxyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFnaW5hdGVBZ2dyZWdhdGlvbnM8VCBleHRlbmRzIFR5cGU8YW55PiwgVSA9IEluZmVyR2VuZXJpYzxUPj4obW9kZWw6IFJldHVybk1vZGVsVHlwZTxUPiwgYWdncmVnYXRpb25zOiBQaXBlbGluZVN0YWdlW10sIHBhcmFtczogSVBhZ2luYXRpb25QYXJhbXMsIG1ldGFQcm9qZWN0aW9uOiBhbnkgPSB7fSk6IFByb21pc2U8SVBhZ2luYXRpb25CYXNlPERvY3VtZW50VHlwZTxVPj4+IHtcclxuICAgIGNvbnN0IHNvcnRGaWVsZCA9ICFpc1N0cmluZyhwYXJhbXMuc29ydCkgfHwgIXBhcmFtcy5zb3J0ID8gbnVsbCA6IChwYXJhbXMuc29ydC5zdGFydHNXaXRoKFwiLVwiKSA/IHBhcmFtcy5zb3J0LnN1YnN0cigxKSA6IHBhcmFtcy5zb3J0KTtcclxuICAgIGNvbnN0IHNvcnRBZ2dyZWdhdGlvbjogUGlwZWxpbmVTdGFnZS5Tb3J0W10gPSAhc29ydEZpZWxkID8gW10gOiBbe1xyXG4gICAgICAgICRzb3J0OiB7W3NvcnRGaWVsZF06IHNvcnRGaWVsZCA9PSBwYXJhbXMuc29ydCA/IDEgOiAtMX1cclxuICAgIH1dO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwuYWdncmVnYXRlKFtcclxuICAgICAgICAuLi5hZ2dyZWdhdGlvbnMsXHJcbiAgICAgICAgLi4uc29ydEFnZ3JlZ2F0aW9uLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgJGdyb3VwOiB7XHJcbiAgICAgICAgICAgICAgICBfaWQ6IFwicmVzdWx0c1wiLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiB7JHB1c2g6IFwiJCRDVVJSRU5UXCJ9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgJHByb2plY3Q6IHtcclxuICAgICAgICAgICAgICAgIF9pZDogMCxcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiBwYXJhbXMubGltaXQgPiAwID8geyRzbGljZTogW1wiJHJlc3VsdFwiLCBwYXJhbXMucGFnZSAqIHBhcmFtcy5saW1pdCwgcGFyYW1zLmxpbWl0XX0gOiBcIiRyZXN1bHRcIixcclxuICAgICAgICAgICAgICAgIGNvdW50OiB7JHNpemU6IFwiJHJlc3VsdFwifSxcclxuICAgICAgICAgICAgICAgIG1ldGE6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogeyRzaXplOiBcIiRyZXN1bHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ubWV0YVByb2plY3Rpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIF0pO1xyXG4gICAgY29uc3QgcGFnaW5hdGlvbiA9IHJlc3VsdFswXSBhcyBJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+PjtcclxuICAgIGlmICghcGFnaW5hdGlvbikge1xyXG4gICAgICAgIHJldHVybiB7aXRlbXM6IFtdLCBjb3VudDogMCwgbWV0YToge3RvdGFsOiAwfX07XHJcbiAgICB9XHJcbiAgICBwYWdpbmF0aW9uLml0ZW1zID0gcGFnaW5hdGlvbi5pdGVtcy5tYXAoaSA9PiBoeWRyYXRlUG9wdWxhdGVkKG1vZGVsLCBpKSBhcyBhbnkpO1xyXG4gICAgcmV0dXJuIHBhZ2luYXRpb247XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBSZXNvbHZlRW50aXR5PFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIGV4dHJhQ2hlY2s/OiAocXVlcnk6IFF1ZXJ5PERvY3VtZW50VHlwZTxVPiwgYW55PiwgYWN0aW9uOiBBY3Rpb24pID0+IFByb21pc2U8RG9jdW1lbnRUeXBlPFU+Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XHJcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbC5tb2RlbE5hbWU7XHJcbiAgICBjb25zdCBwYXJhbU5hbWUgPSBtb2RlbE5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBjcmVhdGVQYXJhbURlY29yYXRvcih7XHJcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICAgIHZhbHVlOiBhc3luYyBhY3Rpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXEgPSBhY3Rpb24ucmVxdWVzdCBhcyBJUmVxdWVzdDtcclxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyKGB4LSR7cGFyYW1OYW1lfS10b2tlbmApO1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IHJlcS5wYXJhbXNbYCR7cGFyYW1OYW1lfUlkYF0gYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoIWlkICYmICF0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFcnJvcihgJHttb2RlbE5hbWV9IGlkIG9yIHRva2VuIHNob3VsZCBiZSBkZWZpbmVkIWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gIXRva2VuXHJcbiAgICAgICAgICAgICAgICA/IG1vZGVsLmZpbmRCeUlkKGlkKVxyXG4gICAgICAgICAgICAgICAgOiBtb2RlbC5maW5kT25lKHt0b2tlbn0gYXMgYW55KTtcclxuICAgICAgICAgICAgbGV0IGRvYzogRG9jdW1lbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihleHRyYUNoZWNrKSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBkb2MgPSBhd2FpdCB2YWx1ZVRvUHJvbWlzZShleHRyYUNoZWNrKHF1ZXJ5LCBhY3Rpb24pKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEVycm9yKGAke21vZGVsTmFtZX0gY2hlY2sgZXJyb3I6ICR7ZS5tZXNzYWdlIHx8IGV9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb2MgPSBhd2FpdCBxdWVyeTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWRvYykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcig0MDQsICF0b2tlblxyXG4gICAgICAgICAgICAgICAgICAgID8gYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCBpZDogJHtpZH1gXHJcbiAgICAgICAgICAgICAgICAgICAgOiBgJHttb2RlbE5hbWV9IGNvdWxkIG5vdCBiZSBmb3VuZCB3aXRoIHRva2VuOiAke3Rva2VufWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFjdGlvbi5yZXF1ZXN0W3BhcmFtTmFtZV0gPSBkb2M7XHJcbiAgICAgICAgICAgIHJldHVybiBkb2M7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuIl19