@blinkk/root-cms 1.3.21 → 1.3.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +66 -35
- package/dist/plugin.js +66 -35
- package/dist/ui/ui.js +2 -2
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -24,16 +24,16 @@ async function generateTypes() {
|
|
|
24
24
|
}
|
|
25
25
|
var TEMPLATE = `/** Root.js CMS types. This file is autogenerated. */
|
|
26
26
|
|
|
27
|
-
export interface
|
|
27
|
+
export interface RootCMSFile {
|
|
28
28
|
src: string;
|
|
29
29
|
width?: number;
|
|
30
30
|
height?: number;
|
|
31
31
|
alt?: string;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export type
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
export type RootCMSImage = RootCMSFile;
|
|
35
|
+
|
|
36
|
+
export type RootCMSOneOf<T = any> = T;
|
|
37
37
|
|
|
38
38
|
export interface RootCMSRichTextBlock {
|
|
39
39
|
type: string;
|
|
@@ -81,13 +81,13 @@ async function generateSchemaDts(outputPath, schemas) {
|
|
|
81
81
|
const schema = schemas[fileId];
|
|
82
82
|
results.push(renderSchema(fileId, schema));
|
|
83
83
|
}
|
|
84
|
-
const output = results.join("\n\n").replaceAll("/** ", "/** ").replaceAll(" */", " */").replace(/\r\n|\r|\n/g, "\n");
|
|
84
|
+
const output = results.join("\n\n").replaceAll("/** ", "/** ").replaceAll(" */", " */").replace(/\r\n|\r|\n/g, "\n") + "\n";
|
|
85
85
|
await fs.writeFile(outputPath, output, "utf-8");
|
|
86
86
|
}
|
|
87
|
-
function fieldProperty(field) {
|
|
87
|
+
function fieldProperty(field, options) {
|
|
88
88
|
const prop = dom.create.property(
|
|
89
89
|
field.id,
|
|
90
|
-
fieldType(field),
|
|
90
|
+
fieldType(field, options),
|
|
91
91
|
dom.DeclarationFlags.Optional
|
|
92
92
|
);
|
|
93
93
|
const jsdoc = [];
|
|
@@ -106,9 +106,9 @@ function fieldProperty(field) {
|
|
|
106
106
|
}
|
|
107
107
|
return prop;
|
|
108
108
|
}
|
|
109
|
-
function fieldType(field) {
|
|
109
|
+
function fieldType(field, options) {
|
|
110
110
|
if (field.type === "array") {
|
|
111
|
-
return dom.type.array(fieldType(field.of));
|
|
111
|
+
return dom.type.array(fieldType(field.of, options));
|
|
112
112
|
}
|
|
113
113
|
if (field.type === "boolean") {
|
|
114
114
|
return dom.type.boolean;
|
|
@@ -119,33 +119,52 @@ function fieldType(field) {
|
|
|
119
119
|
if (field.type === "datetime") {
|
|
120
120
|
return dom.type.number;
|
|
121
121
|
}
|
|
122
|
+
if (field.type === "file") {
|
|
123
|
+
const fileType = dom.create.namedTypeReference("RootCMSFile");
|
|
124
|
+
return fileType;
|
|
125
|
+
}
|
|
122
126
|
if (field.type === "image") {
|
|
123
127
|
const imageType = dom.create.namedTypeReference("RootCMSImage");
|
|
124
128
|
return imageType;
|
|
125
129
|
}
|
|
126
|
-
if (field.type === "file") {
|
|
127
|
-
return dom.create.objectType([dom.create.property("src", dom.type.string)]);
|
|
128
|
-
}
|
|
129
130
|
if (field.type === "multiselect") {
|
|
130
131
|
return dom.type.array(dom.type.string);
|
|
131
132
|
}
|
|
132
133
|
if (field.type === "oneof") {
|
|
133
|
-
const
|
|
134
|
+
const oneOf = dom.create.namedTypeReference("RootCMSOneOf");
|
|
134
135
|
if (field.types && Array.isArray(field.types)) {
|
|
135
|
-
const unionTypes =
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return
|
|
136
|
+
const unionTypes = [];
|
|
137
|
+
field.types.forEach((schema) => {
|
|
138
|
+
if (!schema.name) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const cleanName = alphanumeric(schema.name);
|
|
142
|
+
const oneOfTypeId = `${options.typeId}_${cleanName}`;
|
|
143
|
+
if (!options.oneOfTypes[oneOfTypeId]) {
|
|
144
|
+
const oneOfTypeInterface = dom.create.interface(
|
|
145
|
+
oneOfTypeId,
|
|
146
|
+
dom.DeclarationFlags.Export
|
|
147
|
+
);
|
|
148
|
+
oneOfTypeInterface.members.push(
|
|
149
|
+
dom.create.property(
|
|
150
|
+
"_type",
|
|
151
|
+
dom.type.stringLiteral(schema.name),
|
|
152
|
+
dom.DeclarationFlags.None
|
|
153
|
+
)
|
|
154
|
+
);
|
|
155
|
+
const oneOfTypeFields = schema.fields || [];
|
|
156
|
+
oneOfTypeFields.forEach((f) => {
|
|
157
|
+
oneOfTypeInterface.members.push(fieldProperty(f, options));
|
|
158
|
+
});
|
|
159
|
+
options.oneOfTypes[oneOfTypeId] = oneOfTypeInterface;
|
|
139
160
|
}
|
|
140
|
-
|
|
141
|
-
const properties = fields.map((f) => fieldProperty(f));
|
|
142
|
-
return dom.create.objectType(properties);
|
|
161
|
+
unionTypes.push(dom.create.namedTypeReference(oneOfTypeId));
|
|
143
162
|
});
|
|
144
163
|
if (unionTypes.length > 0) {
|
|
145
|
-
|
|
164
|
+
oneOf.typeArguments = [dom.create.union(unionTypes)];
|
|
146
165
|
}
|
|
147
166
|
}
|
|
148
|
-
return
|
|
167
|
+
return oneOf;
|
|
149
168
|
}
|
|
150
169
|
if (field.type === "reference") {
|
|
151
170
|
const referenceType = dom.create.namedTypeReference("RootCMSReference");
|
|
@@ -162,46 +181,58 @@ function fieldType(field) {
|
|
|
162
181
|
return dom.type.string;
|
|
163
182
|
}
|
|
164
183
|
if (field.type === "object") {
|
|
165
|
-
const subproperties = (field.fields || []).map(
|
|
184
|
+
const subproperties = (field.fields || []).map(
|
|
185
|
+
(f) => fieldProperty(f, options)
|
|
186
|
+
);
|
|
166
187
|
return dom.create.objectType(subproperties);
|
|
167
188
|
}
|
|
168
189
|
return dom.type.unknown;
|
|
169
190
|
}
|
|
170
191
|
function renderSchema(fileId, schema) {
|
|
171
192
|
const jsdoc = `Generated from \`${fileId}\`.`;
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
const
|
|
193
|
+
const typeId = alphanumeric(path.parse(fileId).name.split(".")[0]);
|
|
194
|
+
const oneOfTypes = {};
|
|
195
|
+
const fieldsInterface = `${typeId}Fields`;
|
|
196
|
+
const fieldsType = dom.create.interface(
|
|
175
197
|
fieldsInterface,
|
|
176
198
|
dom.DeclarationFlags.Export
|
|
177
199
|
);
|
|
178
|
-
|
|
200
|
+
fieldsType.jsDocComment = jsdoc;
|
|
179
201
|
for (const field of schema.fields) {
|
|
180
202
|
if (!field.id) {
|
|
181
203
|
continue;
|
|
182
204
|
}
|
|
183
|
-
|
|
205
|
+
fieldsType.members.push(fieldProperty(field, { typeId, oneOfTypes }));
|
|
184
206
|
}
|
|
185
|
-
const
|
|
207
|
+
const typesOutput = [];
|
|
208
|
+
Object.values(oneOfTypes).forEach((oneOfTypeDef) => {
|
|
209
|
+
oneOfTypeDef.jsDocComment = jsdoc;
|
|
210
|
+
typesOutput.push(
|
|
211
|
+
dom.emit(oneOfTypeDef, { singleLineJsDocComments: true }).trim()
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
typesOutput.push(
|
|
215
|
+
dom.emit(fieldsType, { singleLineJsDocComments: true }).trim()
|
|
216
|
+
);
|
|
186
217
|
if (fileId.startsWith("/collections/")) {
|
|
187
218
|
const baseType = dom.create.namedTypeReference("RootCMSDoc");
|
|
188
219
|
baseType.typeArguments.push(dom.create.namedTypeReference(fieldsInterface));
|
|
189
220
|
const docType = dom.create.alias(
|
|
190
|
-
`${
|
|
221
|
+
`${typeId}Doc`,
|
|
191
222
|
baseType,
|
|
192
223
|
dom.DeclarationFlags.Export
|
|
193
224
|
);
|
|
194
225
|
docType.jsDocComment = jsdoc;
|
|
195
226
|
const docTypeOutput = dom.emit(docType, { singleLineJsDocComments: true }).trim();
|
|
196
|
-
|
|
227
|
+
typesOutput.push(docTypeOutput);
|
|
197
228
|
}
|
|
198
|
-
return
|
|
229
|
+
return reformatOutput(typesOutput.join("\n\n"));
|
|
199
230
|
}
|
|
200
|
-
function
|
|
231
|
+
function reformatOutput(input) {
|
|
201
232
|
const lines = input.split("\n");
|
|
202
233
|
const results = [];
|
|
203
234
|
for (const line of lines) {
|
|
204
|
-
const convertedLine = line.replace(/ {4}/g, " ");
|
|
235
|
+
const convertedLine = line.replace(/ {4}/g, " ").replaceAll('"', "'");
|
|
205
236
|
results.push(convertedLine);
|
|
206
237
|
}
|
|
207
238
|
return results.join("\n");
|
|
@@ -356,4 +387,4 @@ export {
|
|
|
356
387
|
generateTypes,
|
|
357
388
|
initFirebase
|
|
358
389
|
};
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL2NsaS50cyIsICIuLi9jbGkvZ2VuZXJhdGUtdHlwZXMudHMiLCAiLi4vY2xpL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9zZWN1cml0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtDb21tYW5kfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtiZ0dyZWVuLCBibGFja30gZnJvbSAna2xldXIvY29sb3JzJztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi9nZW5lcmF0ZS10eXBlcy5qcyc7XG5pbXBvcnQge2luaXRGaXJlYmFzZX0gZnJvbSAnLi9pbml0LWZpcmViYXNlLmpzJztcblxuY2xhc3MgQ2xpUnVubmVyIHtcbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgcnVuKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKHRoaXMubmFtZSk7XG4gICAgcHJvZ3JhbS52ZXJzaW9uKHRoaXMudmVyc2lvbik7XG4gICAgcHJvZ3JhbS5vcHRpb24oJy1xLCAtLXF1aWV0JywgJ3F1aWV0Jyk7XG4gICAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoY21kKSA9PiB7XG4gICAgICBpZiAoIWNtZC5vcHRzKCkucXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFx1RDgzRVx1REQ1NSAke2JnR3JlZW4oYmxhY2soYCAke3RoaXMubmFtZX0gYCkpfSB2JHt0aGlzLnZlcnNpb259XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdpbml0LWZpcmViYXNlJylcbiAgICAgIC5hbGlhcygnaW5pdCcpXG4gICAgICAuZGVzY3JpcHRpb24oJ2luaXRzIHRoZSBmaXJlYmFzZSBwcm9qZWN0IHByb3BlciBzZWN1cml0eSBydWxlcycpXG4gICAgICAub3B0aW9uKCctLXByb2plY3QgPHByb2plY3Q+JywgJ2djcCBwcm9qZWN0IGlkJylcbiAgICAgIC5vcHRpb24oJy0tYWRtaW4gPGVtYWlsPicsICdhZGRzIGFuIGFkbWluIHRvIHRoZSBwcm9qZWN0JylcbiAgICAgIC5hY3Rpb24oaW5pdEZpcmViYXNlKTtcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZCgnZ2VuZXJhdGUtdHlwZXMnKVxuICAgICAgLmFsaWFzKCd0eXBlcycpXG4gICAgICAuZGVzY3JpcHRpb24oXG4gICAgICAgICdnZW5lcmF0ZXMgcm9vdC1jbXMuZC50cyBmcm9tICouc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0J1xuICAgICAgKVxuICAgICAgLmFjdGlvbihnZW5lcmF0ZVR5cGVzKTtcbiAgICBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMoYXJndik7XG4gIH1cbn1cblxuZXhwb3J0IHtDbGlSdW5uZXIsIGdlbmVyYXRlVHlwZXMsIGluaXRGaXJlYmFzZX07XG4iLCAiaW1wb3J0IHtwcm9taXNlcyBhcyBmc30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge2xvYWRSb290Q29uZmlnLCB2aXRlU3NyTG9hZE1vZHVsZX0gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJ2R0cy1kb20nO1xuXG5pbXBvcnQge0ZpZWxkLCBTY2hlbWF9IGZyb20gJy4uL2NvcmUvc2NoZW1hLmpzJztcblxudHlwZSBQcm9qZWN0TW9kdWxlID0gdHlwZW9mIGltcG9ydCgnLi4vY29yZS9wcm9qZWN0LmpzJyk7XG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXMoKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgY29uc3QgcHJvamVjdCA9IChhd2FpdCB2aXRlU3NyTG9hZE1vZHVsZShcbiAgICByb290Q29uZmlnLFxuICAgIG1vZHVsZVBhdGhcbiAgKSkgYXMgUHJvamVjdE1vZHVsZTtcbiAgY29uc3Qgc2NoZW1hcyA9IHByb2plY3QuZ2V0UHJvamVjdFNjaGVtYXMoKTtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAncm9vdC1jbXMuZC50cycpO1xuICBhd2FpdCBnZW5lcmF0ZVNjaGVtYUR0cyhvdXRwdXRQYXRoLCBzY2hlbWFzKTtcbiAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG59XG5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0ltYWdlIHtcbiAgc3JjOiBzdHJpbmc7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGFsdD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUm9vdENNU09uZU9mPFQgPSBhbnk+ID0gVCAmIHtcbiAgX3R5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmljaFRleHQge1xuICBibG9ja3M6IFJvb3RDTVNSaWNoVGV4dEJsb2NrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JlZmVyZW5jZSB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0RvYzxGaWVsZHMgZXh0ZW5kcyB7fT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICAvKiogU3lzdGVtLWxldmVsIG1ldGFkYXRhLiAqL1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIC8qKiBVc2VyLWVudGVyZWQgZmllbGQgdmFsdWVzIGZyb20gdGhlIENNUy4gKi9cbiAgZmllbGRzPzogRmllbGRzO1xufWA7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcm9vdC1jbXMuZC50cyBmaWxlIGZyb20gdGhlIC5zY2hlbWEudHMgZmlsZXMgaW4gdGhlIHByb2plY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYUR0cyhcbiAgb3V0cHV0UGF0aDogc3RyaW5nLFxuICBzY2hlbWFzOiBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+XG4pIHtcbiAgY29uc3QgcmVzdWx0cyA9IFtURU1QTEFURV07XG4gIGZvciAoY29uc3QgZmlsZUlkIGluIHNjaGVtYXMpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW2ZpbGVJZF07XG4gICAgcmVzdWx0cy5wdXNoKHJlbmRlclNjaGVtYShmaWxlSWQsIHNjaGVtYSkpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdHNcbiAgICAuam9pbignXFxuXFxuJylcbiAgICAucmVwbGFjZUFsbCgnLyoqICAnLCAnLyoqICcpXG4gICAgLnJlcGxhY2VBbGwoJyAgKi8nLCAnICovJylcbiAgICAucmVwbGFjZSgvXFxyXFxufFxccnxcXG4vZywgJ1xcbicpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0UGF0aCwgb3V0cHV0LCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gZmllbGRQcm9wZXJ0eShmaWVsZDogRmllbGQpOiBkb20uUHJvcGVydHlEZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHByb3AgPSBkb20uY3JlYXRlLnByb3BlcnR5KFxuICAgIGZpZWxkLmlkISxcbiAgICBmaWVsZFR5cGUoZmllbGQpLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLk9wdGlvbmFsXG4gICk7XG4gIGNvbnN0IGpzZG9jID0gW107XG4gIGlmIChmaWVsZC5sYWJlbCkge1xuICAgIGlmIChmaWVsZC5oZWxwKSB7XG4gICAgICBqc2RvYy5wdXNoKGAke2ZpZWxkLmxhYmVsfS4gJHtmaWVsZC5oZWxwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBqc2RvYy5wdXNoKGZpZWxkLmxhYmVsKTtcbiAgICB9XG4gIH1cbiAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIHtcbiAgICBqc2RvYy5wdXNoKCdAZGVwcmVjYXRlZCcpO1xuICB9XG4gIGlmIChqc2RvYy5sZW5ndGggPiAwKSB7XG4gICAgcHJvcC5qc0RvY0NvbW1lbnQgPSBqc2RvYy5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn1cblxuZnVuY3Rpb24gZmllbGRUeXBlKGZpZWxkOiBGaWVsZCk6IGRvbS5UeXBlIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZmllbGRUeXBlKGZpZWxkLm9mKSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb20udHlwZS5ib29sZWFuO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLm51bWJlcjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIGNvbnN0IGltYWdlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TSW1hZ2UnKTtcbiAgICByZXR1cm4gaW1hZ2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKFtkb20uY3JlYXRlLnByb3BlcnR5KCdzcmMnLCBkb20udHlwZS5zdHJpbmcpXSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZG9tLnR5cGUuc3RyaW5nKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29uZW9mJykge1xuICAgIGNvbnN0IG9uZW9mVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TT25lT2YnKTtcbiAgICBpZiAoZmllbGQudHlwZXMgJiYgQXJyYXkuaXNBcnJheShmaWVsZC50eXBlcykpIHtcbiAgICAgIGNvbnN0IHVuaW9uVHlwZXMgPSBmaWVsZC50eXBlcy5tYXAoKHNjaGVtYTogU2NoZW1hKSA9PiB7XG4gICAgICAgIC8vIEZvciBuYW1lZCBzY2hlbWFzLCBlbWl0IGEgcmVmZXJlbmNlIHRvIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAgICBpZiAoc2NoZW1hLm5hbWUpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IGFscGhhbnVtZXJpYyhzY2hlbWEubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGAke2lkfUZpZWxkc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaW5saW5lIHRoZSBmaWVsZHMgZm9yIHRoZSBnZW5lcmF0ZWQgdW5pb24gdHlwZS5cbiAgICAgICAgY29uc3QgZmllbGRzID0gc2NoZW1hLmZpZWxkcyB8fCBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGZpZWxkcy5tYXAoKGY6IEZpZWxkKSA9PiBmaWVsZFByb3BlcnR5KGYpKTtcbiAgICAgICAgcmV0dXJuIGRvbS5jcmVhdGUub2JqZWN0VHlwZShwcm9wZXJ0aWVzKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHVuaW9uVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBvbmVvZlR5cGUudHlwZUFyZ3VtZW50cyA9IFtkb20uY3JlYXRlLnVuaW9uKHVuaW9uVHlwZXMpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9uZW9mVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSZWZlcmVuY2UnKTtcbiAgICByZXR1cm4gcmVmZXJlbmNlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3JpY2h0ZXh0Jykge1xuICAgIGNvbnN0IHJpY2h0ZXh0VHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TUmljaFRleHQnKTtcbiAgICByZXR1cm4gcmljaHRleHRUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBzdWJwcm9wZXJ0aWVzID0gKGZpZWxkLmZpZWxkcyB8fCBbXSkubWFwKChmKSA9PiBmaWVsZFByb3BlcnR5KGYpKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IGlkID0gYWxwaGFudW1lcmljKHBhdGgucGFyc2UoZmlsZUlkKS5uYW1lLnNwbGl0KCcuJylbMF0pO1xuICBjb25zdCBmaWVsZHNJbnRlcmZhY2UgPSBgJHtpZH1GaWVsZHNgO1xuICBjb25zdCBmaWVsZHMgPSBkb20uY3JlYXRlLmludGVyZmFjZShcbiAgICBmaWVsZHNJbnRlcmZhY2UsXG4gICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuRXhwb3J0XG4gICk7XG4gIGZpZWxkcy5qc0RvY0NvbW1lbnQgPSBqc2RvYztcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBzY2hlbWEuZmllbGRzKSB7XG4gICAgaWYgKCFmaWVsZC5pZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZpZWxkcy5tZW1iZXJzLnB1c2goZmllbGRQcm9wZXJ0eShmaWVsZCkpO1xuICB9XG5cbiAgY29uc3QgZmllbGRzVHlwZU91dHB1dCA9IGRvbVxuICAgIC5lbWl0KGZpZWxkcywge3NpbmdsZUxpbmVKc0RvY0NvbW1lbnRzOiB0cnVlfSlcbiAgICAudHJpbSgpO1xuICBpZiAoZmlsZUlkLnN0YXJ0c1dpdGgoJy9jb2xsZWN0aW9ucy8nKSkge1xuICAgIGNvbnN0IGJhc2VUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNEb2MnKTtcbiAgICBiYXNlVHlwZS50eXBlQXJndW1lbnRzLnB1c2goZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoZmllbGRzSW50ZXJmYWNlKSk7XG4gICAgY29uc3QgZG9jVHlwZSA9IGRvbS5jcmVhdGUuYWxpYXMoXG4gICAgICBgJHtpZH1Eb2NgLFxuICAgICAgYmFzZVR5cGUsXG4gICAgICBkb20uRGVjbGFyYXRpb25GbGFncy5FeHBvcnRcbiAgICApO1xuICAgIGRvY1R5cGUuanNEb2NDb21tZW50ID0ganNkb2M7XG5cbiAgICBjb25zdCBkb2NUeXBlT3V0cHV0ID0gZG9tXG4gICAgICAuZW1pdChkb2NUeXBlLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KVxuICAgICAgLnRyaW0oKTtcbiAgICByZXR1cm4gcmVpbmRlbnQoZmllbGRzVHlwZU91dHB1dCArICdcXG5cXG4nICsgZG9jVHlwZU91dHB1dCk7XG4gIH1cbiAgcmV0dXJuIHJlaW5kZW50KGZpZWxkc1R5cGVPdXRwdXQpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIDQtc3BhY2UgaW5kZW50cyB0byAyLlxuICovXG5mdW5jdGlvbiByZWluZGVudChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBpbnB1dC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGNvbnZlcnRlZExpbmUgPSBsaW5lLnJlcGxhY2UoLyB7NH0vZywgJyAgJyk7XG4gICAgcmVzdWx0cy5wdXNoKGNvbnZlcnRlZExpbmUpO1xuICB9XG4gIHJldHVybiByZXN1bHRzLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgbm9uLWFscGhhbnVtZXJpYyBjaGFycyBmcm9tIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBhbHBoYW51bWVyaWMoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpbnB1dC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgJycpO1xufVxuIiwgImltcG9ydCB7bG9hZFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdC9ub2RlJztcbmltcG9ydCB7RmlyZXN0b3JlfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtnZXRDbXNQbHVnaW59IGZyb20gJy4uL2NvcmUvY2xpZW50LmpzJztcbmltcG9ydCB7YXBwbHlTZWN1cml0eVJ1bGVzfSBmcm9tICcuLi9jb3JlL3NlY3VyaXR5LmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbml0RmlyZWJhc2VPcHRpb25zIHtcbiAgLyoqIEdDUCBwcm9qZWN0IGlkLiAqL1xuICBwcm9qZWN0Pzogc3RyaW5nO1xuICAvKiogQWRkcyBhbiBBRE1JTiB0byB0aGUgc2VjdXJpdHkgcnVsZXMuICovXG4gIGFkbWluPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdEZpcmViYXNlKG9wdGlvbnM6IEluaXRGaXJlYmFzZU9wdGlvbnMpIHtcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ3Jvb3QtY21zJ30pO1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9XG4gICAgb3B0aW9ucy5wcm9qZWN0IHx8IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuXG4gIGlmICghZ2NwUHJvamVjdElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmaXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQgbm90IHNldCBpbiBjbXMgcGx1Z2luIG9wdGlvbnMnKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBnY3AgcHJvamVjdDogJHtnY3BQcm9qZWN0SWR9YCk7XG4gIGNvbnNvbGUubG9nKCdcdUQ4M0RcdURDNkUgdXBkYXRpbmcgc2VjdXJpdHkgcnVsZXMuLi4nKTtcbiAgYXdhaXQgYXBwbHlTZWN1cml0eVJ1bGVzKGdjcFByb2plY3RJZCk7XG5cbiAgaWYgKG9wdGlvbnMuYWRtaW4pIHtcbiAgICBjb25zdCBkYiA9IGNtc1BsdWdpbi5nZXRGaXJlc3RvcmUoKTtcbiAgICBjb25zdCByb290UHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgYXdhaXQgYWRkQWRtaW4oZGIsIHJvb3RQcm9qZWN0SWQsIG9wdGlvbnMuYWRtaW4pO1xuICB9XG5cbiAgY29uc29sZS5sb2coJ2RvbmUgaW5pdGlhbGl6aW5nIGZpcmViYXNlIHByb2plY3QhJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZEFkbWluKGRiOiBGaXJlc3RvcmUsIHByb2plY3RJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nKSB7XG4gIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0SWQpfWA7XG4gIGNvbnN0IGRvY1JlZiA9IGRiLmRvYyhkYlBhdGgpO1xuICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgbGV0IGRhdGE7XG4gIGlmIChzbmFwc2hvdC5leGlzdHMpIHtcbiAgICBkYXRhID0gc25hcHNob3QuZGF0YSgpIHx8IHt9O1xuICB9IGVsc2Uge1xuICAgIGRhdGEgPSB7fTtcbiAgfVxuICBjb25zdCByb2xlcyA9IGRhdGEucm9sZXMgPz8ge307XG4gIHJvbGVzW2VtYWlsXSA9ICdBRE1JTic7XG4gIGRhdGEucm9sZXMgPSByb2xlcztcbiAgYXdhaXQgZG9jUmVmLnNldChkYXRhKTtcbiAgY29uc29sZS5sb2coYGFkZGVkIGFkbWluICR7ZW1haWx9IHRvIHByb2plY3QgJHtwcm9qZWN0SWR9YCk7XG59XG4iLCAiaW1wb3J0IGNyeXB0byBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1BsdWdpbiwgUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7QXBwfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtcbiAgRmllbGRWYWx1ZSxcbiAgRmlyZXN0b3JlLFxuICBRdWVyeSxcbiAgVGltZXN0YW1wLFxuICBXcml0ZUJhdGNoLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtDTVNQbHVnaW59IGZyb20gJy4vcGx1Z2luLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEb2M8RmllbGRzID0gYW55PiB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIHN5czoge1xuICAgIGNyZWF0ZWRBdDogbnVtYmVyO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIG1vZGlmaWVkQXQ6IG51bWJlcjtcbiAgICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBmaXJzdFB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIHB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIHB1Ymxpc2hpbmdMb2NrZWQ6IHtcbiAgICAgIGxvY2tlZEF0OiBzdHJpbmc7XG4gICAgICBsb2NrZWRCeTogc3RyaW5nO1xuICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICB1bnRpbD86IFRpbWVzdGFtcDtcbiAgICB9O1xuICAgIGxvY2FsZXM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgZmllbGRzOiBGaWVsZHM7XG59XG5cbmV4cG9ydCB0eXBlIERvY01vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCB0eXBlIFVzZXJSb2xlID0gJ0FETUlOJyB8ICdFRElUT1InIHwgJ1ZJRVdFUic7XG5cbmV4cG9ydCB0eXBlIEh0dHBNZXRob2QgPSAnR0VUJyB8ICdQT1NUJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlIHtcbiAgaWQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHR5cGU6ICdodHRwJyB8ICdnc2hlZXQnO1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIEN1cnJlbnRseSBvbmx5IHVzZWQgYnkgZ3NoZWV0LiBgYXJyYXlgIHJldHVybnMgdGhlIHNoZWV0IGFzIGFuIGFycmF5IG9mXG4gICAqIGFycmF5cywgYG1hcGAgcmV0dXJucyB0aGUgc2hlZXQgYXMgYW4gYXJyYXkgb2Ygb2JqZWN0cy5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiAnYXJyYXknIHwgJ21hcCc7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBIVFRQIHJlcXVlc3RzLlxuICAgKi9cbiAgaHR0cE9wdGlvbnM/OiB7XG4gICAgbWV0aG9kOiBIdHRwTWV0aG9kO1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGJvZHk/OiBzdHJpbmc7XG4gIH07XG4gIGNyZWF0ZWRBdDogVGltZXN0YW1wO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgc3luY2VkQXQ/OiBUaW1lc3RhbXA7XG4gIHN5bmNlZEJ5Pzogc3RyaW5nO1xuICBwdWJsaXNoZWRBdD86IFRpbWVzdGFtcDtcbiAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZURhdGE8VCA9IGFueT4ge1xuICBkYXRhU291cmNlOiBEYXRhU291cmNlO1xuICBkYXRhOiBUO1xufVxuXG5leHBvcnQgdHlwZSBEYXRhU291cmNlTW9kZSA9ICdkcmFmdCcgfCAncHVibGlzaGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBHZXREb2NPcHRpb25zIHtcbiAgLyoqIE1vZGUsIGVpdGhlciBcImRyYWZ0XCIgb3IgXCJwdWJsaXNoZWRcIi4gKi9cbiAgbW9kZTogRG9jTW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXREb2NPcHRpb25zIHtcbiAgLyoqIE1vZGUsIGVpdGhlciBcImRyYWZ0XCIgb3IgXCJwdWJsaXNoZWRcIi4gKi9cbiAgbW9kZTogRG9jTW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYXZlRHJhZnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIExvY2FsZXMgdG8gZW5hYmxlLlxuICAgKi9cbiAgbG9jYWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBFbWFpbCBvZiB1c2VyIG1vZGlmeWluZyB0aGUgZG9jLiBJZiBibGFuaywgZGVmYXVsdHMgdG8gYHJvb3QtY21zLWNsaWVudGAuXG4gICAqL1xuICBtb2RpZmllZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZmV0Y2ggdGhlIFwicmF3XCIgdmVyc2lvbiBvZiB0aGUgZG9jIChmb3IgdXNlIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICogYHNldFJhd0RvYygpYCkuXG4gICAqL1xuICByYXc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldENvdW50T3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICBbbG9jYWxlOiBzdHJpbmddOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uc01hcCB7XG4gIFtoYXNoOiBzdHJpbmddOiBUcmFuc2xhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGVUcmFuc2xhdGlvbnMge1xuICBbc291cmNlOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZFRyYW5zbGF0aW9uc09wdGlvbnMge1xuICB0YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVsZWFzZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBkb2NJZHM/OiBzdHJpbmdbXTtcbiAgY3JlYXRlZEF0PzogVGltZXN0YW1wO1xuICBjcmVhdGVkQnk/OiBzdHJpbmc7XG4gIHNjaGVkdWxlZEF0PzogVGltZXN0YW1wO1xuICBzY2hlZHVsZWRCeT86IHN0cmluZztcbiAgcHVibGlzaGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbjxUID0gYW55PiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYWN0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdXNlcidzIGVtYWlsIHRoYXQgcGVyZm9ybWVkIHRoZSBhY3Rpb24gKG9yIFwic3lzdGVtXCIpLlxuICAgKi9cbiAgYnk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgYWN0aW9uIG9jY3VycmVkLlxuICAgKi9cbiAgdGltZXN0YW1wOiBUaW1lc3RhbXA7XG4gIC8qKlxuICAgKiBNZXRhZGF0YSBmb3IgdGhlIGFjdGlvbi5cbiAgICovXG4gIG1ldGFkYXRhPzogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0QWN0aW9uc09wdGlvbnMge1xuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc3BlY2lmaWMgYWN0aW9uLiBEZWZhdWx0cyB0byBhbGwgYWN0aW9ucy5cbiAgICovXG4gIGFjdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNwZWNpZmljIHVzZXIuIERlZmF1bHRzIHRvIGFsbCB1c2Vycy5cbiAgICovXG4gIGJ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogTWF4IG51bWJlciBvZiBhY3Rpb25zIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKi9cbiAgbGltaXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSb290Q01TQ2xpZW50IHtcbiAgcmVhZG9ubHkgcm9vdENvbmZpZzogUm9vdENvbmZpZztcbiAgcmVhZG9ubHkgY21zUGx1Z2luOiBDTVNQbHVnaW47XG4gIHJlYWRvbmx5IHByb2plY3RJZDogc3RyaW5nO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGI6IEZpcmVzdG9yZTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZztcbiAgICB0aGlzLmNtc1BsdWdpbiA9IGdldENtc1BsdWdpbih0aGlzLnJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IHRoaXMuY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIHRoaXMucHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5hcHAgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICAgIHRoaXMuZGIgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgZG9jIGRhdGEgZnJvbSBSb290LmpzIENNUy5cbiAgICovXG4gIGFzeW5jIGdldERvYzxGaWVsZHMgPSBhbnk+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8RG9jPEZpZWxkcz4gfCBudWxsPiB7XG4gICAgY29uc3QgcmF3RGF0YSA9IGF3YWl0IHRoaXMuZ2V0UmF3RG9jKGNvbGxlY3Rpb25JZCwgc2x1Zywgb3B0aW9ucyk7XG4gICAgaWYgKHJhd0RhdGEpIHtcbiAgICAgIHJldHVybiB1bm1hcnNoYWxEYXRhKHJhd0RhdGEpIGFzIERvYzxGaWVsZHM+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcmF3IGRvYyBkYXRhIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIE9ubHkgdXNlIHRoaXMgaWYgeW91IGtub3dcbiAgICogd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gICAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBkcmFmdCBkYXRhIHRvIGEgZG9jLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHNhdmVzIGRhdGEgdG8gdGhlIFwiZmllbGRzXCIgYXR0ciBvZiB0aGUgZHJhZnQgZG9jLiBJZiB5b3UgbmVlZCB0b1xuICAgKiBtb2RpZnkgdGhlIHN5cy1sZXZlbCBhdHRyaWJ1dGVzIG9mIHRoZSBkb2MsIHVzZSBgc2V0UmF3RG9jKClgLlxuICAgKi9cbiAgYXN5bmMgc2F2ZURyYWZ0RGF0YShcbiAgICBkb2NJZDogc3RyaW5nLFxuICAgIGZpZWxkc0RhdGE6IGFueSxcbiAgICBvcHRpb25zPzogU2F2ZURyYWZ0T3B0aW9uc1xuICApIHtcbiAgICBjb25zdCB7Y29sbGVjdGlvbiwgc2x1Z30gPSBwYXJzZURvY0lkKGRvY0lkKTtcbiAgICBjb25zdCBkcmFmdERvYyA9XG4gICAgICAoYXdhaXQgdGhpcy5nZXRSYXdEb2MoY29sbGVjdGlvbiwgc2x1Zywge21vZGU6ICdkcmFmdCd9KSkgfHwge307XG4gICAgY29uc3QgZHJhZnRTeXMgPSBkcmFmdERvYy5zeXMgfHwge307XG4gICAgY29uc3QgbW9kaWZpZWRCeSA9IG9wdGlvbnM/Lm1vZGlmaWVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG4gICAgY29uc3QgZmllbGRzID0gbWFyc2hhbERhdGEoZmllbGRzRGF0YSB8fCB7fSk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGlkOiBkb2NJZCxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBzbHVnLFxuICAgICAgc3lzOiB7XG4gICAgICAgIC4uLmRyYWZ0U3lzLFxuICAgICAgICBjcmVhdGVkQXQ6IGRyYWZ0U3lzLmNyZWF0ZWRBdCA/PyBUaW1lc3RhbXAubm93KCksXG4gICAgICAgIGNyZWF0ZWRCeTogZHJhZnRTeXMuY3JlYXRlZEJ5ID8/IG1vZGlmaWVkQnksXG4gICAgICAgIG1vZGlmaWVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgbW9kaWZpZWRCeSxcbiAgICAgICAgbG9jYWxlczogb3B0aW9ucz8ubG9jYWxlcyA/PyBkcmFmdFN5cy5sb2NhbGVzID8/IFsnZW4nXSxcbiAgICAgIH0sXG4gICAgICBmaWVsZHMsXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLnNldFJhd0RvYyhjb2xsZWN0aW9uLCBzbHVnLCBkYXRhLCB7bW9kZTogJ2RyYWZ0J30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZWZlciBgc2F2ZURyYWZ0RGF0YSgnUGFnZXMvZm9vJywgZGF0YSlgLiBPbmx5IHVzZSB0aGlzIGlmIHlvdSBrbm93IHdoYXRcbiAgICogeW91J3JlIGRvaW5nLlxuICAgKi9cbiAgYXN5bmMgc2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgb3B0aW9uczogU2V0RG9jT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGF3YWl0IGRvY1JlZi5zZXQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGxpc3REb2NzPFQ+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuICApOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgZG9jczogVFtdID0gW107XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnJhdykge1xuICAgICAgICAvLyBGb3IgY2FsbGVycyB0aGF0IHdpc2ggdG8gbW9kaWZ5IHRoZSByYXcgZG9jIHZpYSBgc2V0UmF3RG9jKClgLFxuICAgICAgICAvLyByZXR1cm4gdGhlIHVubW9kaWZpZWQgZG9jIGFzIHJldHVybmVkIGZyb20gZmlyZXN0b3JlLlxuICAgICAgICBjb25zdCByYXdEb2MgPSByZXN1bHQuZGF0YSgpIGFzIFQ7XG4gICAgICAgIGRvY3MucHVzaChyYXdEb2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZG9jID0gdW5tYXJzaGFsRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgICAgICBkb2NzLnB1c2goZG9jKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge2RvY3N9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERvY3NDb3VudChjb2xsZWN0aW9uSWQ6IHN0cmluZywgb3B0aW9uczogR2V0Q291bnRPcHRpb25zKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gICAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggcHVibGlzaGVzIGEgc2V0IG9mIGRvY3MgYnkgaWQuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoRG9jcyhcbiAgICBkb2NJZHM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiB7cHVibGlzaGVkQnk6IHN0cmluZzsgYmF0Y2g/OiBXcml0ZUJhdGNofVxuICApIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBwdWJsaXNoZWRCeSA9IG9wdGlvbnM/LnB1Ymxpc2hlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgLy8gRmV0Y2ggdGhlIGN1cnJlbnQgZHJhZnQgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgY29uc3QgZG9jUmVmcyA9IGRvY0lkcy5tYXAoKGRvY0lkKSA9PiB7XG4gICAgICBjb25zdCBbY29sbGVjdGlvbiwgc2x1Z10gPSBkb2NJZC5zcGxpdCgnLycpO1xuICAgICAgaWYgKCFjb2xsZWN0aW9uIHx8ICFzbHVnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkb2MgaWQ6ICR7ZG9jSWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZG9jUmVmO1xuICAgIH0pO1xuICAgIGNvbnN0IGRvY1NuYXBzaG90cyA9IGF3YWl0IHRoaXMuZGIuZ2V0QWxsKC4uLmRvY1JlZnMpO1xuICAgIGNvbnN0IGRvY3MgPSBkb2NTbmFwc2hvdHNcbiAgICAgIC8vIFJldHJpZXZlIHNuYXBzaG90IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgICAgLm1hcCgoc25hcHNob3QpID0+IHNuYXBzaG90LmRhdGEoKSBhcyBEb2MpXG4gICAgICAvLyBSZW1vdmUgZG9jcyB0aGF0IGRvbid0IGV4aXN0LlxuICAgICAgLmZpbHRlcigoZCkgPT4gISFkKTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gcHVibGlzaCcpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGVyZSBhcmUgbm8gcHVibGlzaGluZyBsb2NrcyBvbiBhbnkgZG9jcy5cbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBpZiAodGhpcy50ZXN0UHVibGlzaGluZ0xvY2tlZChkb2MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcHVibGlzaGluZyBpcyBsb2NrZWQgZm9yIGRvYzogJHtkb2MuaWR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gb3B0aW9ucz8uYmF0Y2ggfHwgdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBzeXMsIGZpZWxkc30gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKTtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyBwdWJsaXNoZWRCeTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBzY2hlZHVsZWQgZG9jLCBpZiBhbnkuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5JzogcHVibGlzaGVkQnksXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQwMCkge1xuICAgICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICAgICAgYmF0Y2hDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWREb2NzKCkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgICBjb25zdCBkb2NzID0gc25hcHNob3QuZG9jc1xuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgICBpZiAoIWQucmVmLnBhdGguc3RhcnRzV2l0aChwcm9qZWN0Q29sbGVjdGlvbnNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWx0ZXIgZG9jcyB3aGVyZSBzY2hlZHVsZWRBdCBpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBkLmRhdGEoKSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzY2hlZHVsZWRBdCAmJiBzY2hlZHVsZWRBdC50b01pbGxpcyAmJiBzY2hlZHVsZWRBdC50b01pbGxpcygpIDw9IG5vd1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgIHNsdWcsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gc2NoZWR1bGUnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50Jyk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnLFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmF0Y2hDb3VudCA+IDApIHtcbiAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGRvY3MgaW4gc2NoZWR1bGVkIHJlbGVhc2VzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZFJlbGVhc2VzKCkge1xuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9SZWxlYXNlc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiXG4gICAgICAuY29sbGVjdGlvbihyZWxlYXNlc1BhdGgpXG4gICAgICAud2hlcmUoJ3NjaGVkdWxlZEF0JywgJzw9JywgVGltZXN0YW1wLmZyb21NaWxsaXMobm93KSk7XG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuXG4gICAgZm9yIChjb25zdCBzbmFwc2hvdCBvZiBxdWVyeVNuYXBzaG90LmRvY3MpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2UgPSBzbmFwc2hvdC5kYXRhKCkgYXMgUmVsZWFzZTtcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgICAgY29uc3QgcHVibGlzaGVkQnkgPSByZWxlYXNlLnNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuICAgICAgYmF0Y2gudXBkYXRlKHNuYXBzaG90LnJlZiwge1xuICAgICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgICAgIHNjaGVkdWxlZEF0OiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICBzY2hlZHVsZWRCeTogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoRG9jcyhyZWxlYXNlLmRvY0lkcyB8fCBbXSwge3B1Ymxpc2hlZEJ5LCBiYXRjaH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBkb2MgaXMgY3VycmVudGx5IFwibG9ja2VkXCIgZm9yIHB1Ymxpc2hpbmcuXG4gICAqL1xuICB0ZXN0UHVibGlzaGluZ0xvY2tlZChkb2M6IERvYykge1xuICAgIGlmIChkb2Muc3lzPy5wdWJsaXNoaW5nTG9ja2VkKSB7XG4gICAgICBpZiAoZG9jLnN5cy5wdWJsaXNoaW5nTG9ja2VkLnVudGlsKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IFRpbWVzdGFtcC5ub3coKS50b01pbGxpcygpO1xuICAgICAgICBjb25zdCB1bnRpbCA9IGRvYy5zeXMucHVibGlzaGluZ0xvY2tlZC51bnRpbC50b01pbGxpcygpO1xuICAgICAgICByZXR1cm4gbm93IDwgdW50aWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRyYW5zbGF0aW9ucyBzYXZlZCBpbiB0aGUgdHJhbnNsYXRpb25zIGNvbGxlY3Rpb24sIG9wdGlvbmFsbHlcbiAgICogZmlsdGVyZWQgYnkgdGFnLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCI8aGFzaD5cIjoge1wic291cmNlXCI6IFwiSGVsbG9cIiwgXCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2FkVHJhbnNsYXRpb25zKFxuICAgIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zbGF0aW9uc01hcD4ge1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucz8udGFncykge1xuICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgndGFncycsICdhcnJheS1jb250YWlucy1hbnknLCBvcHRpb25zLnRhZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCA9IHt9O1xuICAgIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gZG9jLmlkO1xuICAgICAgdHJhbnNsYXRpb25zTWFwW2hhc2hdID0gZG9jLmRhdGEoKSBhcyBUcmFuc2xhdGlvbjtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25zTWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgbWFwIG9mIHRyYW5zbGF0aW9ucywgZS5nLjpcbiAgICogYGBgXG4gICAqIGF3YWl0IGNsaWVudC5zYXZlVHJhbnNsYXRpb25zKHtcbiAgICogICBcIkhlbGxvXCI6IHtcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2F2ZVRyYW5zbGF0aW9ucyhcbiAgICB0cmFuc2xhdGlvbnM6IHtcbiAgICAgIFtzb3VyY2U6IHN0cmluZ106IHtbbG9jYWxlOiBzdHJpbmddOiBzdHJpbmd9O1xuICAgIH0sXG4gICAgdGFncz86IHN0cmluZ1tdXG4gICkge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb25zKS5mb3JFYWNoKChbc291cmNlLCBzb3VyY2VUcmFuc2xhdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRUcmFuc2xhdGlvbktleShzb3VyY2UpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25SZWYgPSB0aGlzLmRiLmRvYyhgJHt0cmFuc2xhdGlvbnNQYXRofS8ke2hhc2h9YCk7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICAgIC4uLnNvdXJjZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgc291cmNlOiB0aGlzLm5vcm1hbGl6ZVN0cmluZyhzb3VyY2UpLFxuICAgICAgfTtcbiAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgIGRhdGEudGFncyA9IHRhZ3M7XG4gICAgICB9XG4gICAgICBiYXRjaC5zZXQodHJhbnNsYXRpb25SZWYsIGRhdGEsIHttZXJnZTogdHJ1ZX0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuICAgIH0pO1xuICAgIGlmIChiYXRjaENvdW50ID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VwIHRvIDUwMCB0cmFuc2xhdGlvbnMgY2FuIGJlIHNhdmVkIGF0IGEgdGltZS4nKTtcbiAgICB9XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgXCJrZXlcIiB1c2VkIGZvciBhIHRyYW5zbGF0aW9uIGFzIHN0b3JlZCBpbiB0aGUgZGIuIFRyYW5zbGF0aW9uc1xuICAgKiBhcmUgc3RvcmVkIHVuZGVyIGBQcm9qZWN0cy88cHJvamVjdCBpZD4vVHJhbnNsYXRpb25zLzxzaGExIGhhc2g+YC5cbiAgICovXG4gIGdldFRyYW5zbGF0aW9uS2V5KHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2hhMSA9IGNyeXB0b1xuICAgICAgLmNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZSh0aGlzLm5vcm1hbGl6ZVN0cmluZyhzb3VyY2UpKVxuICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG4gICAgcmV0dXJuIHNoYTE7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIGEgc3RyaW5nIHRoYXQncyB1c2VkIGZvciB0cmFuc2xhdGlvbnMuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gUmVtb3ZlcyBhbnkgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAqIC0gUmVtb3ZlcyBzcGFjZXMgYXQgdGhlIGVuZCBvZiBhbnkgbGluZVxuICAgKi9cbiAgbm9ybWFsaXplU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbGluZXMgPSBTdHJpbmcoc3RyKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltRW5kKCkpO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgZm9yIGEgcGFydGljdWxhciBsb2NhbGUuXG4gICAqXG4gICAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxMb2NhbGVUcmFuc2xhdGlvbnM+IHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNNYXAgPSBhd2FpdCB0aGlzLmxvYWRUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSh0cmFuc2xhdGlvbnNNYXAsIGxvY2FsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKSBhcyBEYXRhU291cmNlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jcyBhIGRhdGEgc291cmNlIHRvIGRyYWZ0IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgc3luY0RhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7c3luY2VkQnk/OiBzdHJpbmd9KSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoRGF0YShkYXRhU291cmNlKTtcblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBzeW5jZWRCeSA9IG9wdGlvbnM/LnN5bmNlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgY29uc3QgdXBkYXRlZERhdGFTb3VyY2U6IERhdGFTb3VyY2UgPSB7XG4gICAgICAuLi5kYXRhU291cmNlLFxuICAgICAgc3luY2VkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHN5bmNlZEJ5OiBzeW5jZWRCeSxcbiAgICB9O1xuXG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgYmF0Y2guc2V0KGRhdGFEb2NSZWYsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHVwZGF0ZWREYXRhU291cmNlLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgc3luY2VkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHN5bmNlZEJ5OiBzeW5jZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBzeW5jZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIGNvbnNvbGUubG9nKGBzeW5jZWQgYnk6ICR7c3luY2VkQnl9YCk7XG4gIH1cblxuICBhc3luYyBwdWJsaXNoRGF0YVNvdXJjZShcbiAgICBkYXRhU291cmNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge3B1Ymxpc2hlZEJ5Pzogc3RyaW5nfVxuICApIHtcbiAgICBjb25zdCBkYXRhU291cmNlID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlKGRhdGFTb3VyY2VJZCk7XG4gICAgaWYgKCFkYXRhU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRhdGEgc291cmNlIG5vdCBmb3VuZDogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVNvdXJjZURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfWBcbiAgICApO1xuICAgIGNvbnN0IGRhdGFEb2NSZWZEcmFmdCA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9kcmFmdGBcbiAgICApO1xuICAgIGNvbnN0IGRhdGFEb2NSZWZQdWJsaXNoZWQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vcHVibGlzaGVkYFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhUmVzID0gYXdhaXQgdGhpcy5nZXRGcm9tRGF0YVNvdXJjZShkYXRhU291cmNlSWQsIHttb2RlOiAnZHJhZnQnfSk7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRCeSA9IG9wdGlvbnM/LnB1Ymxpc2hlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgY29uc3QgdXBkYXRlZERhdGFTb3VyY2U6IERhdGFTb3VyY2UgPSB7XG4gICAgICAuLi5kYXRhU291cmNlLFxuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9O1xuXG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgYmF0Y2guc2V0KGRhdGFEb2NSZWZQdWJsaXNoZWQsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHVwZGF0ZWREYXRhU291cmNlLFxuICAgICAgZGF0YTogZGF0YVJlcz8uZGF0YSB8fCBudWxsLFxuICAgIH0pO1xuICAgIGJhdGNoLnVwZGF0ZShkYXRhRG9jUmVmRHJhZnQsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHVwZGF0ZWREYXRhU291cmNlLFxuICAgIH0pO1xuICAgIGJhdGNoLnVwZGF0ZShkYXRhU291cmNlRG9jUmVmLCB7XG4gICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgIH0pO1xuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuXG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCBkYXRhICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgYnk6ICR7cHVibGlzaGVkQnl9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoRGF0YShkYXRhU291cmNlOiBEYXRhU291cmNlKSB7XG4gICAgaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2h0dHAnKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgICAvLyBUT0RPKHN0ZXZlbmxlKTogaW1wbC5cbiAgICAvLyBpZiAoZGF0YVNvdXJjZS50eXBlID09PSAnZ3NoZWV0Jykge1xuICAgIC8vICAgcmV0dXJuIGF3YWl0IGZldGNoR3NoZWV0RGF0YShkYXRhU291cmNlKTtcbiAgICAvLyB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHNvdXJjZTogJHtkYXRhU291cmNlLnR5cGV9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoSHR0cERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGNvbnN0IHVybCA9IGRhdGFTb3VyY2UudXJsIHx8ICcnO1xuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXJsIG5vdCBzdXBwb3J0ZWQ6ICR7dXJsfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBkYXRhU291cmNlLmh0dHBPcHRpb25zPy5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICBoZWFkZXJzOiBkYXRhU291cmNlLmh0dHBPcHRpb25zPy5oZWFkZXJzIHx8IFtdLFxuICAgICAgYm9keTogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uYm9keSB8fCB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXEgZmFpbGVkOiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50VHlwZSA9IFN0cmluZyhyZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKTtcbiAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudGV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgZGF0YSBmcm9tIGEgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBhc3luYyBnZXRGcm9tRGF0YVNvdXJjZTxUID0gYW55PihcbiAgICBkYXRhU291cmNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge21vZGU/OiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCd9XG4gICk6IFByb21pc2U8RGF0YVNvdXJjZURhdGE8VD4gfCBudWxsPiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnM/Lm1vZGUgfHwgJ3B1Ymxpc2hlZCc7XG4gICAgaWYgKCEobW9kZSA9PT0gJ2RyYWZ0JyB8fCBtb2RlID09PSAncHVibGlzaGVkJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBtb2RlOiAke21vZGV9YCk7XG4gICAgfVxuICAgIGlmICghZGF0YVNvdXJjZUlkIHx8IGRhdGFTb3VyY2VJZC5pbmNsdWRlcygnLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZGF0YSBzb3VyY2UgaWQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vRGF0YS8ke21vZGV9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZURhdGE8VD47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIncyByb2xlIGZyb20gdGhlIHByb2plY3QncyBBQ0wuXG4gICAqL1xuICBhc3luYyBnZXRVc2VyUm9sZShlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxVc2VyUm9sZSB8IG51bGw+IHtcbiAgICBpZiAoIWVtYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9YCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgICBjb25zdCBhY2wgPSBkYXRhLnJvbGVzIHx8IHt9O1xuXG4gICAgaWYgKGVtYWlsIGluIGFjbCkge1xuICAgICAgcmV0dXJuIGFjbFtlbWFpbF07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2lsZGNhcmQgZG9tYWlucywgZS5nLiBgKkBleGFtcGxlLmNvbWAuXG4gICAgaWYgKCFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGludmFsaWQgZW1haWw6ICR7ZW1haWx9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZG9tYWluID0gZW1haWwuc3BsaXQoJ0AnKS5hdCgtMSk7XG4gICAgaWYgKGRvbWFpbiAmJiBgKkAke2RvbWFpbn1gIGluIGFjbCkge1xuICAgICAgcmV0dXJuIGFjbFtgKkAke2RvbWFpbn1gXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdXNlciBleGlzdHMgaW4gdGhlIEFDTCBsaXN0LlxuICAgKi9cbiAgYXN5bmMgdXNlckV4aXN0c0luQWNsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWVtYWlsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfWApO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGNvbnN0IGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgfHwge307XG4gICAgY29uc3QgYWNsID0gZGF0YS5yb2xlcyB8fCB7fTtcbiAgICBpZiAoZW1haWwgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB3aWxkY2FyZCBkb21haW5zLCBlLmcuIGAqQGV4YW1wbGUuY29tYC5cbiAgICBpZiAoIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgaW52YWxpZCBlbWFpbDogJHtlbWFpbH1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZG9tYWluID0gZW1haWwuc3BsaXQoJ0AnKS5hdCgtMSk7XG4gICAgaWYgKGRvbWFpbiAmJiBgKkAke2RvbWFpbn1gIGluIGFjbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGxvZ0FjdGlvbihhY3Rpb246IHN0cmluZywgb3B0aW9ucz86IHtieT86IHN0cmluZzsgbWV0YWRhdGE/OiBhbnl9KSB7XG4gICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZDogXCJhY3Rpb25cIicpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICB0aW1lc3RhbXA6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIGJ5OiBvcHRpb25zPy5ieSB8fCAnc3lzdGVtJyxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zPy5tZXRhZGF0YSB8fCB7fSxcbiAgICB9O1xuICAgIGNvbnN0IGNvbFJlZiA9IHRoaXMuZGIuY29sbGVjdGlvbihgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQWN0aW9uTG9nc2ApO1xuICAgIGF3YWl0IGNvbFJlZi5hZGQoZGF0YSk7XG5cbiAgICBjb25zdCBtZXRhU3RyID0gb3B0aW9ucz8ubWV0YWRhdGEgPyBzdHJpbmdpZnlPYmoob3B0aW9ucy5tZXRhZGF0YSkgOiAnJztcbiAgICBjb25zb2xlLmxvZyhgWyR7ZGF0YS50aW1lc3RhbXAudG9NaWxsaXMoKX1dIGFjdGlvbjogJHthY3Rpb259ICR7bWV0YVN0cn1gKTtcblxuICAgIC8vIENhbGwgdGhlIGBvbkFjdGlvbigpYCBjYWxsYmFjayBmcm9tIGNtc1BsdWdpbigpLlxuICAgIGNvbnN0IGNtc1BsdWdpbkNvbmZpZyA9IHRoaXMuY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIGlmIChjbXNQbHVnaW5Db25maWcub25BY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNtc1BsdWdpbkNvbmZpZy5vbkFjdGlvbihkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBgZGF0YWAgaXMgYSByaWNoIHRleHQgZGF0YSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JpY2hUZXh0RGF0YShkYXRhOiBhbnkpIHtcbiAgLy8gVGhlIFJpY2hUZXh0RWRpdG9yIHVzZXMgZWRpdG9yanMgdW5kZXIgdGhlIGhvb2QsIHRoZSBkYXRhIGZvcm1hdCBpc1xuICAvLyBzb21ldGhpbmcgbGlrZTpcbiAgLy8gIHtcbiAgLy8gICBcInRpbWVcIjogMTcyMTc2MTIxMTcyMCxcbiAgLy8gICBcInZlcnNpb25cIjogXCIyLjI4LjJcIixcbiAgLy8gICBcImJsb2Nrc1wiOiBbLi4uXVxuICAvLyB9XG4gIHJldHVybiBCb29sZWFuKFxuICAgIGlzT2JqZWN0KGRhdGEpICYmIEFycmF5LmlzQXJyYXkoZGF0YS5ibG9ja3MpICYmIGRhdGEudGltZSAmJiBkYXRhLnZlcnNpb25cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENtc1BsdWdpbihyb290Q29uZmlnOiBSb290Q29uZmlnKTogQ01TUGx1Z2luIHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSByb290Q29uZmlnLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCgocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gJ3Jvb3QtY21zJyk7XG4gIGlmICghcGx1Z2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByb290LWNtcyBwbHVnaW4gY29uZmlnIGluIHJvb3QuY29uZmlnLnRzJyk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbiBhcyBDTVNQbHVnaW47XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IGFycmF5IG9mIG9iamVjdHMgaW50byBcImFycmF5IG9iamVjdHNcIlxuICogZm9yIHN0b3JhZ2UgaW4gZmlyZXN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgLy8gQXZvaWQgY2hhbmdpbmcgdGhlIGZvcm1hdCBvZiByaWNoIHRleHQgZGF0YS5cbiAgaWYgKGlzUmljaFRleHREYXRhKGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1hcnNoYWxEYXRhKHZhbCk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGlmICh2YWwubGVuZ3RoID4gMCAmJiB2YWwuc29tZSgoaXRlbSkgPT4gaXNPYmplY3QoaXRlbSkpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdmFsLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWxEYXRhKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdG9BcnJheU9iamVjdChpdGVtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IFRpbWVzdGFtcCBvYmplY3RzIHRvIG1pbGxpcyBhbmQgYW55XG4gKiBfYXJyYXkgbWFwcyB0byBub3JtYWwgYXJyYXlzLlxuICpcbiAqIEUuZy46XG4gKlxuICogbm9ybWFsaXplRGF0YSh7XG4gKiAgIHN5czoge21vZGlmaWVkQXQ6IFRpbWVzdGFtcCgxMjMpfSxcbiAqICAgZmllbGRzOiB7XG4gKiAgICAgX2FycmF5OiBbJ2FzZGYnXSxcbiAqICAgICBhc2RmOiB7dGl0bGU6ICdoZWxsbyd9XG4gKiAgIH1cbiAqIH0pXG4gKiAvLyA9PiB7c3lzOiB7bW9kaWZpZWRBdDogMTIzfSwgZmllbGRzOiB7Zm9vOiBbe3RpdGxlOiAnaGVsbG8nfV19fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXJzaGFsRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAodmFsLnRvTWlsbGlzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsLnRvTWlsbGlzKCk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5oYXNPd24odmFsLCAnX2FycmF5JykgJiYgQXJyYXkuaXNBcnJheSh2YWwuX2FycmF5KSkge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWwuX2FycmF5Lm1hcCgoYXJyYXlLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi51bm1hcnNoYWxEYXRhKHZhbFthcnJheUtleV0gfHwge30pLFxuICAgICAgICAgICAgX2FycmF5S2V5OiBhcnJheUtleSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVubWFyc2hhbERhdGEodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYHVubWFyc2hhbERhdGEoKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIHJldHVybiB1bm1hcnNoYWxEYXRhKGRhdGEpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5T2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBfYXJyYXk6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gYXJyYXkgaW50byBhbiBgQXJyYXlPYmplY3RgLCBlLmcuOlxuICpcbiAqIGBgYFxuICogbWFyc2hhbEFycmF5KFsxLCAyLCAzXSlcbiAqIC8vID0+IHthOiAxLCBiOiAyLCBjOiAzLCBfYXJyYXk6IFsnYScsICdiJywgJ2MnXX1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGF0YWJhc2Ugc3RvcmFnZSBtZXRob2QgbWFrZXMgaXQgZWFzaWVyIHRvIHVwZGF0ZSBhIHNpbmdsZSBmaWVsZCBpbiBhXG4gKiBkZWVwbHkgbmVzdGVkIGFycmF5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXlPYmplY3QoYXJyOiBhbnlbXSk6IEFycmF5T2JqZWN0IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9XG4gIGNvbnN0IGFyck9iamVjdDogQXJyYXlPYmplY3QgPSB7X2FycmF5OiBbXX07XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICBjb25zdCBrZXkgPSByYW5kU3RyaW5nKDYpO1xuICAgIGFyck9iamVjdFtrZXldID0gaXRlbTtcbiAgICBhcnJPYmplY3QuX2FycmF5LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gYXJyT2JqZWN0O1xufVxuXG5leHBvcnQgY29uc3QgbWFyc2hhbEFycmF5ID0gdG9BcnJheU9iamVjdDtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBgQXJyYXlPYmplY3RgIHRvIGEgbm9ybWFsIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXJzaGFsQXJyYXkoYXJyT2JqZWN0OiBBcnJheU9iamVjdCk6IGFueVtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFyck9iamVjdD8uX2FycmF5KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBhcnIgPSBhcnJPYmplY3QuX2FycmF5Lm1hcCgoazogc3RyaW5nKSA9PiBhcnJPYmplY3Rba10pO1xuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiByYW5kU3RyaW5nKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGNoYXJzID1cbiAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgcmFuZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCk7XG4gICAgcmVzdWx0LnB1c2goY2hhcnMuY2hhckF0KHJhbmQpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgdHJhbnNsYXRpb25zIG1hcCBmcm9tIGBsb2FkVHJhbnNsYXRpb25zKClgIHRvIGEgbWFwIG9mIHNvdXJjZSB0b1xuICogdHJhbnNsYXRlZCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciBsb2NhbGUuXG4gKlxuICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICogYGBgXG4gKiB7XG4gKiAgIFwiSGVsbG9cIjogXCJCb25qb3VyXCIsXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAsXG4gIGxvY2FsZTogc3RyaW5nXG4pIHtcbiAgY29uc3QgbG9jYWxlVHJhbnNsYXRpb25zOiBMb2NhbGVUcmFuc2xhdGlvbnMgPSB7fTtcbiAgT2JqZWN0LnZhbHVlcyh0cmFuc2xhdGlvbnNNYXApLmZvckVhY2goKHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmluZy5zb3VyY2U7XG4gICAgY29uc3QgdHJhbnNsYXRpb24gPSBzdHJpbmdbbG9jYWxlXSB8fCBzdHJpbmcuZW4gfHwgc3RyaW5nLnNvdXJjZTtcbiAgICBsb2NhbGVUcmFuc2xhdGlvbnNbc291cmNlXSA9IHRyYW5zbGF0aW9uO1xuICB9KTtcbiAgcmV0dXJuIGxvY2FsZVRyYW5zbGF0aW9ucztcbn1cblxuLyoqIEEgcHJldHR5IHByaW50ZXIgZm9yIEphdmFTY3JpcHQgb2JqZWN0cy4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iaihvYmo6IGFueSkge1xuICBmdW5jdGlvbiBmb3JtYXQob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgXCIke29iai5yZXBsYWNlQWxsKCdcIicsICdcXFxcXCInKX1cImA7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFN0cmluZyhvYmopO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gYFske29iai5tYXAoZm9ybWF0KS5qb2luKCcsICcpfV1gO1xuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHtrZXl9OiAke2Zvcm1hdCh2YWx1ZSl9YDtcbiAgICB9KTtcbiAgICByZXR1cm4gYHske2VudHJpZXMuam9pbignLCAnKX19YDtcbiAgfVxuICByZXR1cm4gZm9ybWF0KG9iaik7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgZG9jSWQgKGUuZy4gYFBhZ2VzL2Zvb2ApIGFuZCByZXR1cm5zIHRoZSBgY29sbGVjdGlvbmAgYW5kIGBzbHVnYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRG9jSWQoZG9jSWQ6IHN0cmluZykge1xuICBjb25zdCBzZXBJbmRleCA9IGRvY0lkLmluZGV4T2YoJy8nKTtcbiAgaWYgKHNlcEluZGV4IDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZG9jIGlkOiAke2RvY0lkfWApO1xuICB9XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBkb2NJZC5zbGljZSgwLCBzZXBJbmRleCk7XG4gIGNvbnN0IHNsdWcgPSBkb2NJZC5zbGljZShzZXBJbmRleCArIDEpLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgaWYgKCFjb2xsZWN0aW9uIHx8ICFzbHVnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgfVxuICByZXR1cm4ge2NvbGxlY3Rpb24sIHNsdWd9O1xufVxuIiwgImltcG9ydCB7aW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7Z2V0U2VjdXJpdHlSdWxlc30gZnJvbSAnZmlyZWJhc2UtYWRtaW4vc2VjdXJpdHktcnVsZXMnO1xuXG5leHBvcnQgY29uc3QgRklSRVNUT1JFX1JVTEVTID0gYHJ1bGVzX3ZlcnNpb24gPSAnMic7XG5zZXJ2aWNlIGNsb3VkLmZpcmVzdG9yZSB7XG4gIG1hdGNoIC9kYXRhYmFzZXMve2RhdGFiYXNlfS9kb2N1bWVudHMge1xuICAgIG1hdGNoIC97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgIGFsbG93IHJlYWQsIHdyaXRlOiBpZiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9IHtcbiAgICAgIGFsbG93IHdyaXRlOlxuICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlcklzQWRtaW4oKTtcbiAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VyQ2FuUmVhZCgpO1xuXG4gICAgICBtYXRjaCAve2NvbGxlY3Rpb259L3tkb2N1bWVudD0qKn0ge1xuICAgICAgICBhbGxvdyB3cml0ZTpcbiAgICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlckNhbldyaXRlKCk7XG4gICAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJDYW5SZWFkKCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzU2lnbmVkSW4oKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0LmF1dGggIT0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0Um9sZXMoKSB7XG4gICAgICAgIHJldHVybiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSkuZGF0YS5yb2xlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlckNhblJlYWQoKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXSkgfHwgKHJvbGVzW2RvbWFpbl0gaW4gWydBRE1JTicsICdFRElUT1InLCAnVklFV0VSJ10pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB1c2VyQ2FuV3JpdGUoKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUiddKSB8fCAocm9sZXNbZG9tYWluXSBpbiBbJ0FETUlOJywgJ0VESVRPUiddKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlcklzQWRtaW4oKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSA9PSAnQURNSU4nKSB8fCAocm9sZXNbZG9tYWluXSA9PSAnQURNSU4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmA7XG5cbi8qKlxuICogQWRkcyB0aGUgcm9vdC1jbXMgc2VjdXJpdHkgcnVsZXMgdG8gYSBGaXJlYmFzZSBwcm9qZWN0LlxuICogTk9URTogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcnVsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVNlY3VyaXR5UnVsZXMocHJvamVjdElkOiBzdHJpbmcpIHtcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IGNoZWNrIGlmIGFuIGFwcCBleGlzdHMgZmlyc3QgYmVmb3JlIGluaXRpYWxpemluZy5cbiAgY29uc3QgYXBwID0gaW5pdGlhbGl6ZUFwcCh7cHJvamVjdElkfSk7XG4gIGNvbnN0IHNlY3VyaXR5UnVsZXMgPSBnZXRTZWN1cml0eVJ1bGVzKGFwcCk7XG4gIGF3YWl0IHNlY3VyaXR5UnVsZXMucmVsZWFzZUZpcmVzdG9yZVJ1bGVzZXRGcm9tU291cmNlKEZJUkVTVE9SRV9SVUxFUyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSxlQUFjO0FBQ3RCLFNBQVEsU0FBUyxhQUFZOzs7QUNEN0IsU0FBUSxZQUFZLFVBQVM7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLFNBQVEscUJBQW9CO0FBQzVCLFNBQVEsZ0JBQWdCLHlCQUF3QjtBQUNoRCxZQUFZLFNBQVM7QUFLckIsSUFBTSxZQUFZLEtBQUssUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBRTdELGVBQXNCLGdCQUFnQjtBQUNwQyxRQUFNLFVBQVUsUUFBUSxJQUFJO0FBQzVCLFFBQU0sYUFBYSxNQUFNLGVBQWUsU0FBUyxFQUFDLFNBQVMsV0FBVSxDQUFDO0FBQ3RFLFFBQU0sYUFBYSxLQUFLLFFBQVEsV0FBVyxjQUFjO0FBQ3pELFFBQU0sVUFBVyxNQUFNO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sVUFBVSxRQUFRLGtCQUFrQjtBQUMxQyxRQUFNLGFBQWEsS0FBSyxRQUFRLFNBQVMsZUFBZTtBQUN4RCxRQUFNLGtCQUFrQixZQUFZLE9BQU87QUFDM0MsVUFBUSxJQUFJLHNCQUFzQjtBQUNwQztBQUVBLElBQU0sV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL2NsaS50cyIsICIuLi9jbGkvZ2VuZXJhdGUtdHlwZXMudHMiLCAiLi4vY2xpL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9zZWN1cml0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtDb21tYW5kfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtiZ0dyZWVuLCBibGFja30gZnJvbSAna2xldXIvY29sb3JzJztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi9nZW5lcmF0ZS10eXBlcy5qcyc7XG5pbXBvcnQge2luaXRGaXJlYmFzZX0gZnJvbSAnLi9pbml0LWZpcmViYXNlLmpzJztcblxuY2xhc3MgQ2xpUnVubmVyIHtcbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgcnVuKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKHRoaXMubmFtZSk7XG4gICAgcHJvZ3JhbS52ZXJzaW9uKHRoaXMudmVyc2lvbik7XG4gICAgcHJvZ3JhbS5vcHRpb24oJy1xLCAtLXF1aWV0JywgJ3F1aWV0Jyk7XG4gICAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoY21kKSA9PiB7XG4gICAgICBpZiAoIWNtZC5vcHRzKCkucXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFx1RDgzRVx1REQ1NSAke2JnR3JlZW4oYmxhY2soYCAke3RoaXMubmFtZX0gYCkpfSB2JHt0aGlzLnZlcnNpb259XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdpbml0LWZpcmViYXNlJylcbiAgICAgIC5hbGlhcygnaW5pdCcpXG4gICAgICAuZGVzY3JpcHRpb24oJ2luaXRzIHRoZSBmaXJlYmFzZSBwcm9qZWN0IHByb3BlciBzZWN1cml0eSBydWxlcycpXG4gICAgICAub3B0aW9uKCctLXByb2plY3QgPHByb2plY3Q+JywgJ2djcCBwcm9qZWN0IGlkJylcbiAgICAgIC5vcHRpb24oJy0tYWRtaW4gPGVtYWlsPicsICdhZGRzIGFuIGFkbWluIHRvIHRoZSBwcm9qZWN0JylcbiAgICAgIC5hY3Rpb24oaW5pdEZpcmViYXNlKTtcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZCgnZ2VuZXJhdGUtdHlwZXMnKVxuICAgICAgLmFsaWFzKCd0eXBlcycpXG4gICAgICAuZGVzY3JpcHRpb24oXG4gICAgICAgICdnZW5lcmF0ZXMgcm9vdC1jbXMuZC50cyBmcm9tICouc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0J1xuICAgICAgKVxuICAgICAgLmFjdGlvbihnZW5lcmF0ZVR5cGVzKTtcbiAgICBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMoYXJndik7XG4gIH1cbn1cblxuZXhwb3J0IHtDbGlSdW5uZXIsIGdlbmVyYXRlVHlwZXMsIGluaXRGaXJlYmFzZX07XG4iLCAiaW1wb3J0IHtwcm9taXNlcyBhcyBmc30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge2xvYWRSb290Q29uZmlnLCB2aXRlU3NyTG9hZE1vZHVsZX0gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJ2R0cy1kb20nO1xuXG5pbXBvcnQge0ZpZWxkLCBTY2hlbWF9IGZyb20gJy4uL2NvcmUvc2NoZW1hLmpzJztcblxudHlwZSBQcm9qZWN0TW9kdWxlID0gdHlwZW9mIGltcG9ydCgnLi4vY29yZS9wcm9qZWN0LmpzJyk7XG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXMoKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgY29uc3QgcHJvamVjdCA9IChhd2FpdCB2aXRlU3NyTG9hZE1vZHVsZShcbiAgICByb290Q29uZmlnLFxuICAgIG1vZHVsZVBhdGhcbiAgKSkgYXMgUHJvamVjdE1vZHVsZTtcbiAgY29uc3Qgc2NoZW1hcyA9IHByb2plY3QuZ2V0UHJvamVjdFNjaGVtYXMoKTtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAncm9vdC1jbXMuZC50cycpO1xuICBhd2FpdCBnZW5lcmF0ZVNjaGVtYUR0cyhvdXRwdXRQYXRoLCBzY2hlbWFzKTtcbiAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG59XG5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0ZpbGUge1xuICBzcmM6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgYWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSb290Q01TSW1hZ2UgPSBSb290Q01TRmlsZTtcblxuZXhwb3J0IHR5cGUgUm9vdENNU09uZU9mPFQgPSBhbnk+ID0gVDtcblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmljaFRleHRCbG9jayB7XG4gIHR5cGU6IHN0cmluZztcbiAgZGF0YTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSaWNoVGV4dCB7XG4gIGJsb2NrczogUm9vdENNU1JpY2hUZXh0QmxvY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmVmZXJlbmNlIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TRG9jPEZpZWxkcyBleHRlbmRzIHt9PiB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIC8qKiBTeXN0ZW0tbGV2ZWwgbWV0YWRhdGEuICovXG4gIHN5czoge1xuICAgIGNyZWF0ZWRBdDogbnVtYmVyO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIG1vZGlmaWVkQXQ6IG51bWJlcjtcbiAgICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBmaXJzdFB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIHB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIGxvY2FsZXM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqIFVzZXItZW50ZXJlZCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgQ01TLiAqL1xuICBmaWVsZHM/OiBGaWVsZHM7XG59YDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByb290LWNtcy5kLnRzIGZpbGUgZnJvbSB0aGUgLnNjaGVtYS50cyBmaWxlcyBpbiB0aGUgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hRHRzKFxuICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gIHNjaGVtYXM6IFJlY29yZDxzdHJpbmcsIFNjaGVtYT5cbikge1xuICBjb25zdCByZXN1bHRzID0gW1RFTVBMQVRFXTtcbiAgZm9yIChjb25zdCBmaWxlSWQgaW4gc2NoZW1hcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbZmlsZUlkXTtcbiAgICByZXN1bHRzLnB1c2gocmVuZGVyU2NoZW1hKGZpbGVJZCwgc2NoZW1hKSk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0ID1cbiAgICByZXN1bHRzXG4gICAgICAuam9pbignXFxuXFxuJylcbiAgICAgIC5yZXBsYWNlQWxsKCcvKiogICcsICcvKiogJylcbiAgICAgIC5yZXBsYWNlQWxsKCcgICovJywgJyAqLycpXG4gICAgICAucmVwbGFjZSgvXFxyXFxufFxccnxcXG4vZywgJ1xcbicpICsgJ1xcbic7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRQYXRoLCBvdXRwdXQsICd1dGYtOCcpO1xufVxuXG5pbnRlcmZhY2UgRmllbGRQcm9wZXJ0eU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBmaWxlIGJlaW5nIHBhcnNlZCwgZS5nLiBmb3IgXCJQYWdlcy5zY2hlbWEudHNcIiB0aGlzIHdvdWxkIGJlXG4gICAqIFwiUGFnZXNcIi5cbiAgICovXG4gIHR5cGVJZDogc3RyaW5nO1xuICAvKipcbiAgICogQSBjb2xsZWN0aW9uIG9mIHRoZSBvbmVPZiB0eXBlcyB1c2VkIGJ5IHRoZSBmaWVsZC5cbiAgICovXG4gIG9uZU9mVHlwZXM6IFJlY29yZDxzdHJpbmcsIGRvbS5JbnRlcmZhY2VEZWNsYXJhdGlvbj47XG59XG5cbmZ1bmN0aW9uIGZpZWxkUHJvcGVydHkoXG4gIGZpZWxkOiBGaWVsZCxcbiAgb3B0aW9uczogRmllbGRQcm9wZXJ0eU9wdGlvbnNcbik6IGRvbS5Qcm9wZXJ0eURlY2xhcmF0aW9uIHtcbiAgY29uc3QgcHJvcCA9IGRvbS5jcmVhdGUucHJvcGVydHkoXG4gICAgZmllbGQuaWQhLFxuICAgIGZpZWxkVHlwZShmaWVsZCwgb3B0aW9ucyksXG4gICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgKTtcbiAgY29uc3QganNkb2MgPSBbXTtcbiAgaWYgKGZpZWxkLmxhYmVsKSB7XG4gICAgaWYgKGZpZWxkLmhlbHApIHtcbiAgICAgIGpzZG9jLnB1c2goYCR7ZmllbGQubGFiZWx9LiAke2ZpZWxkLmhlbHB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGpzZG9jLnB1c2goZmllbGQubGFiZWwpO1xuICAgIH1cbiAgfVxuICBpZiAoZmllbGQuZGVwcmVjYXRlZCkge1xuICAgIGpzZG9jLnB1c2goJ0BkZXByZWNhdGVkJyk7XG4gIH1cbiAgaWYgKGpzZG9jLmxlbmd0aCA+IDApIHtcbiAgICBwcm9wLmpzRG9jQ29tbWVudCA9IGpzZG9jLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBwcm9wO1xufVxuXG5mdW5jdGlvbiBmaWVsZFR5cGUoZmllbGQ6IEZpZWxkLCBvcHRpb25zOiBGaWVsZFByb3BlcnR5T3B0aW9ucyk6IGRvbS5UeXBlIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZmllbGRUeXBlKGZpZWxkLm9mLCBvcHRpb25zKSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb20udHlwZS5ib29sZWFuO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLm51bWJlcjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgY29uc3QgZmlsZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0ZpbGUnKTtcbiAgICByZXR1cm4gZmlsZVR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICBjb25zdCBpbWFnZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0ltYWdlJyk7XG4gICAgcmV0dXJuIGltYWdlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5hcnJheShkb20udHlwZS5zdHJpbmcpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb25lb2YnKSB7XG4gICAgY29uc3Qgb25lT2YgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU09uZU9mJyk7XG4gICAgaWYgKGZpZWxkLnR5cGVzICYmIEFycmF5LmlzQXJyYXkoZmllbGQudHlwZXMpKSB7XG4gICAgICBjb25zdCB1bmlvblR5cGVzOiBkb20uTmFtZWRUeXBlUmVmZXJlbmNlW10gPSBbXTtcbiAgICAgIGZpZWxkLnR5cGVzLmZvckVhY2goKHNjaGVtYTogU2NoZW1hKSA9PiB7XG4gICAgICAgIC8vIFRoZSBcIm5hbWVcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAgICAgICAgaWYgKCFzY2hlbWEubmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsZWFuTmFtZSA9IGFscGhhbnVtZXJpYyhzY2hlbWEubmFtZSk7XG4gICAgICAgIGNvbnN0IG9uZU9mVHlwZUlkID0gYCR7b3B0aW9ucy50eXBlSWR9XyR7Y2xlYW5OYW1lfWA7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBvbmVPZiB0eXBlIHRvIHRoZSAuZC50cyBmaWxlIGFzIGB7RmlsZUlkfV97VHlwZU5hbWV9YC5cbiAgICAgICAgaWYgKCFvcHRpb25zLm9uZU9mVHlwZXNbb25lT2ZUeXBlSWRdKSB7XG4gICAgICAgICAgY29uc3Qgb25lT2ZUeXBlSW50ZXJmYWNlID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgICAgICAgICBvbmVPZlR5cGVJZCxcbiAgICAgICAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICAgICAgICAgICk7XG4gICAgICAgICAgb25lT2ZUeXBlSW50ZXJmYWNlLm1lbWJlcnMucHVzaChcbiAgICAgICAgICAgIGRvbS5jcmVhdGUucHJvcGVydHkoXG4gICAgICAgICAgICAgICdfdHlwZScsXG4gICAgICAgICAgICAgIGRvbS50eXBlLnN0cmluZ0xpdGVyYWwoc2NoZW1hLm5hbWUpLFxuICAgICAgICAgICAgICBkb20uRGVjbGFyYXRpb25GbGFncy5Ob25lXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvbmVPZlR5cGVGaWVsZHMgPSBzY2hlbWEuZmllbGRzIHx8IFtdO1xuICAgICAgICAgIG9uZU9mVHlwZUZpZWxkcy5mb3JFYWNoKChmOiBGaWVsZCkgPT4ge1xuICAgICAgICAgICAgb25lT2ZUeXBlSW50ZXJmYWNlLm1lbWJlcnMucHVzaChmaWVsZFByb3BlcnR5KGYsIG9wdGlvbnMpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvcHRpb25zLm9uZU9mVHlwZXNbb25lT2ZUeXBlSWRdID0gb25lT2ZUeXBlSW50ZXJmYWNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pb25UeXBlcy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKG9uZU9mVHlwZUlkKSk7XG4gICAgICB9KTtcbiAgICAgIGlmICh1bmlvblR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb25lT2YudHlwZUFyZ3VtZW50cyA9IFtkb20uY3JlYXRlLnVuaW9uKHVuaW9uVHlwZXMpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9uZU9mO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmVmZXJlbmNlJykge1xuICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU1JlZmVyZW5jZScpO1xuICAgIHJldHVybiByZWZlcmVuY2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmljaHRleHQnKSB7XG4gICAgY29uc3QgcmljaHRleHRUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSaWNoVGV4dCcpO1xuICAgIHJldHVybiByaWNodGV4dFR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHN1YnByb3BlcnRpZXMgPSAoZmllbGQuZmllbGRzIHx8IFtdKS5tYXAoKGYpID0+XG4gICAgICBmaWVsZFByb3BlcnR5KGYsIG9wdGlvbnMpXG4gICAgKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IHR5cGVJZCA9IGFscGhhbnVtZXJpYyhwYXRoLnBhcnNlKGZpbGVJZCkubmFtZS5zcGxpdCgnLicpWzBdKTtcblxuICAvLyBDcmVhdGUgYSBzZXQgZm9yIGNvbGxlY3Rpbmcgb25lT2YgdHlwZXMgdXNlZCBpbiB0aGUgZmlsZS5cbiAgY29uc3Qgb25lT2ZUeXBlczogUmVjb3JkPHN0cmluZywgZG9tLkludGVyZmFjZURlY2xhcmF0aW9uPiA9IHt9O1xuXG4gIC8vIEZvciBgRm9vLnNjaGVtYS50c2AsIG91dHB1dCBhIHR5cGUgY2FsbGVkIGBGb29GaWVsZHNgLlxuICBjb25zdCBmaWVsZHNJbnRlcmZhY2UgPSBgJHt0eXBlSWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzVHlwZSA9IGRvbS5jcmVhdGUuaW50ZXJmYWNlKFxuICAgIGZpZWxkc0ludGVyZmFjZSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5FeHBvcnRcbiAgKTtcbiAgZmllbGRzVHlwZS5qc0RvY0NvbW1lbnQgPSBqc2RvYztcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBzY2hlbWEuZmllbGRzKSB7XG4gICAgaWYgKCFmaWVsZC5pZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZpZWxkc1R5cGUubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQsIHt0eXBlSWQsIG9uZU9mVHlwZXN9KSk7XG4gIH1cblxuICBjb25zdCB0eXBlc091dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAvLyBPdXRwdXQgYWxsIG9uZU9mIHR5cGVzIHVzZWQgYnkgdGhlIGZpbGUuXG4gIE9iamVjdC52YWx1ZXMob25lT2ZUeXBlcykuZm9yRWFjaCgob25lT2ZUeXBlRGVmKSA9PiB7XG4gICAgb25lT2ZUeXBlRGVmLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuICAgIHR5cGVzT3V0cHV0LnB1c2goXG4gICAgICBkb20uZW1pdChvbmVPZlR5cGVEZWYsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pLnRyaW0oKVxuICAgICk7XG4gIH0pO1xuXG4gIC8vIE91dHB1dCB0aGUgYEZvb0ZpZWxkc2AgdHlwZS5cbiAgdHlwZXNPdXRwdXQucHVzaChcbiAgICBkb20uZW1pdChmaWVsZHNUeXBlLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KS50cmltKClcbiAgKTtcblxuICAvLyBGb3IgYC9jb2xsZWN0aW9ucy9Gb28uc2NoZW1hLnRzYCBmaWxlcywgb3V0cHV0IGEgYEZvb0RvY2AgdHlwZS5cbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7dHlwZUlkfURvY2AsXG4gICAgICBiYXNlVHlwZSxcbiAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICAgICk7XG4gICAgZG9jVHlwZS5qc0RvY0NvbW1lbnQgPSBqc2RvYztcbiAgICBjb25zdCBkb2NUeXBlT3V0cHV0ID0gZG9tXG4gICAgICAuZW1pdChkb2NUeXBlLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KVxuICAgICAgLnRyaW0oKTtcbiAgICB0eXBlc091dHB1dC5wdXNoKGRvY1R5cGVPdXRwdXQpO1xuICB9XG4gIHJldHVybiByZWZvcm1hdE91dHB1dCh0eXBlc091dHB1dC5qb2luKCdcXG5cXG4nKSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgb3V0cHV0IHRvIEdvb2dsZSBzdHlsZSBjb252ZW50aW9ucywgZS5nLiAyLXNwYWNlIGluZGVudHMgYW5kXG4gKiBzaW5nbGUgcXVvdGUgc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gcmVmb3JtYXRPdXRwdXQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gaW5wdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRMaW5lID0gbGluZS5yZXBsYWNlKC8gezR9L2csICcgICcpLnJlcGxhY2VBbGwoJ1wiJywgXCInXCIpO1xuICAgIHJlc3VsdHMucHVzaChjb252ZXJ0ZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgZnJvbSBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYWxwaGFudW1lcmljKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKTtcbn1cbiIsICJpbXBvcnQge2xvYWRSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQge0ZpcmVzdG9yZX0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuLi9jb3JlL2NsaWVudC5qcyc7XG5pbXBvcnQge2FwcGx5U2VjdXJpdHlSdWxlc30gZnJvbSAnLi4vY29yZS9zZWN1cml0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdEZpcmViYXNlT3B0aW9ucyB7XG4gIC8qKiBHQ1AgcHJvamVjdCBpZC4gKi9cbiAgcHJvamVjdD86IHN0cmluZztcbiAgLyoqIEFkZHMgYW4gQURNSU4gdG8gdGhlIHNlY3VyaXR5IHJ1bGVzLiAqL1xuICBhZG1pbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRGaXJlYmFzZShvcHRpb25zOiBJbml0RmlyZWJhc2VPcHRpb25zKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPVxuICAgIG9wdGlvbnMucHJvamVjdCB8fCBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcblxuICBpZiAoIWdjcFByb2plY3RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmlyZWJhc2VDb25maWcucHJvamVjdElkIG5vdCBzZXQgaW4gY21zIHBsdWdpbiBvcHRpb25zJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgZ2NwIHByb2plY3Q6ICR7Z2NwUHJvamVjdElkfWApO1xuICBjb25zb2xlLmxvZygnXHVEODNEXHVEQzZFIHVwZGF0aW5nIHNlY3VyaXR5IHJ1bGVzLi4uJyk7XG4gIGF3YWl0IGFwcGx5U2VjdXJpdHlSdWxlcyhnY3BQcm9qZWN0SWQpO1xuXG4gIGlmIChvcHRpb25zLmFkbWluKSB7XG4gICAgY29uc3QgZGIgPSBjbXNQbHVnaW4uZ2V0RmlyZXN0b3JlKCk7XG4gICAgY29uc3Qgcm9vdFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIGF3YWl0IGFkZEFkbWluKGRiLCByb290UHJvamVjdElkLCBvcHRpb25zLmFkbWluKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdkb25lIGluaXRpYWxpemluZyBmaXJlYmFzZSBwcm9qZWN0IScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRBZG1pbihkYjogRmlyZXN0b3JlLCBwcm9qZWN0SWQ6IHN0cmluZywgZW1haWw6IHN0cmluZykge1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdElkKX1gO1xuICBjb25zdCBkb2NSZWYgPSBkYi5kb2MoZGJQYXRoKTtcbiAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGxldCBkYXRhO1xuICBpZiAoc25hcHNob3QuZXhpc3RzKSB7XG4gICAgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhID0ge307XG4gIH1cbiAgY29uc3Qgcm9sZXMgPSBkYXRhLnJvbGVzID8/IHt9O1xuICByb2xlc1tlbWFpbF0gPSAnQURNSU4nO1xuICBkYXRhLnJvbGVzID0gcm9sZXM7XG4gIGF3YWl0IGRvY1JlZi5zZXQoZGF0YSk7XG4gIGNvbnNvbGUubG9nKGBhZGRlZCBhZG1pbiAke2VtYWlsfSB0byBwcm9qZWN0ICR7cHJvamVjdElkfWApO1xufVxuIiwgImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge0FwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7XG4gIEZpZWxkVmFsdWUsXG4gIEZpcmVzdG9yZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgV3JpdGVCYXRjaCxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jPEZpZWxkcyA9IGFueT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoaW5nTG9ja2VkOiB7XG4gICAgICBsb2NrZWRBdDogc3RyaW5nO1xuICAgICAgbG9ja2VkQnk6IHN0cmluZztcbiAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgdW50aWw/OiBUaW1lc3RhbXA7XG4gICAgfTtcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgdHlwZSBVc2VyUm9sZSA9ICdBRE1JTicgfCAnRURJVE9SJyB8ICdWSUVXRVInO1xuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gJ0dFVCcgfCAnUE9TVCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0eXBlOiAnaHR0cCcgfCAnZ3NoZWV0JztcbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IGdzaGVldC4gYGFycmF5YCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZlxuICAgKiBhcnJheXMsIGBtYXBgIHJldHVybnMgdGhlIHNoZWV0IGFzIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogJ2FycmF5JyB8ICdtYXAnO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICovXG4gIGh0dHBPcHRpb25zPzoge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZDtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBib2R5Pzogc3RyaW5nO1xuICB9O1xuICBjcmVhdGVkQXQ6IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHN5bmNlZEF0PzogVGltZXN0YW1wO1xuICBzeW5jZWRCeT86IHN0cmluZztcbiAgcHVibGlzaGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2VEYXRhPFQgPSBhbnk+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgZGF0YTogVDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZURyYWZ0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2NhbGVzIHRvIGVuYWJsZS5cbiAgICovXG4gIGxvY2FsZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW1haWwgb2YgdXNlciBtb2RpZnlpbmcgdGhlIGRvYy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIGByb290LWNtcy1jbGllbnRgLlxuICAgKi9cbiAgbW9kaWZpZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZldGNoIHRoZSBcInJhd1wiIHZlcnNpb24gb2YgdGhlIGRvYyAoZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAqIGBzZXRSYXdEb2MoKWApLlxuICAgKi9cbiAgcmF3PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb3VudE9wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZG9jSWRzPzogc3RyaW5nW107XG4gIGNyZWF0ZWRBdD86IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuICBzY2hlZHVsZWRBdD86IFRpbWVzdGFtcDtcbiAgc2NoZWR1bGVkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb248VCA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICovXG4gIGFjdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVzZXIncyBlbWFpbCB0aGF0IHBlcmZvcm1lZCB0aGUgYWN0aW9uIChvciBcInN5c3RlbVwiKS5cbiAgICovXG4gIGJ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGFjdGlvbiBvY2N1cnJlZC5cbiAgICovXG4gIHRpbWVzdGFtcDogVGltZXN0YW1wO1xuICAvKipcbiAgICogTWV0YWRhdGEgZm9yIHRoZSBhY3Rpb24uXG4gICAqL1xuICBtZXRhZGF0YT86IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEFjdGlvbnNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNwZWNpZmljIGFjdGlvbi4gRGVmYXVsdHMgdG8gYWxsIGFjdGlvbnMuXG4gICAqL1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzcGVjaWZpYyB1c2VyLiBEZWZhdWx0cyB0byBhbGwgdXNlcnMuXG4gICAqL1xuICBieT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1heCBudW1iZXIgb2YgYWN0aW9ucyB0byByZXR1cm4uIERlZmF1bHRzIHRvIDEwMC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUm9vdENNU0NsaWVudCB7XG4gIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHJlYWRvbmx5IGNtc1BsdWdpbjogQ01TUGx1Z2luO1xuICByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRiOiBGaXJlc3RvcmU7XG5cbiAgY29uc3RydWN0b3Iocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWc7XG4gICAgdGhpcy5jbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4odGhpcy5yb290Q29uZmlnKTtcblxuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICB0aGlzLnByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuYXBwID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgICB0aGlzLmRiID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZXN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGRvYyBkYXRhIGZyb20gUm9vdC5qcyBDTVMuXG4gICAqL1xuICBhc3luYyBnZXREb2M8RmllbGRzID0gYW55PihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPERvYzxGaWVsZHM+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJhd0RhdGEgPSBhd2FpdCB0aGlzLmdldFJhd0RvYyhjb2xsZWN0aW9uSWQsIHNsdWcsIG9wdGlvbnMpO1xuICAgIGlmIChyYXdEYXRhKSB7XG4gICAgICByZXR1cm4gdW5tYXJzaGFsRGF0YShyYXdEYXRhKSBhcyBEb2M8RmllbGRzPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHJhdyBkb2MgZGF0YSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBPbmx5IHVzZSB0aGlzIGlmIHlvdSBrbm93XG4gICAqIHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICovXG4gIGFzeW5jIGdldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICAgIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgZHJhZnQgZGF0YSB0byBhIGRvYy5cbiAgICpcbiAgICogTm90ZTogdGhpcyBzYXZlcyBkYXRhIHRvIHRoZSBcImZpZWxkc1wiIGF0dHIgb2YgdGhlIGRyYWZ0IGRvYy4gSWYgeW91IG5lZWQgdG9cbiAgICogbW9kaWZ5IHRoZSBzeXMtbGV2ZWwgYXR0cmlidXRlcyBvZiB0aGUgZG9jLCB1c2UgYHNldFJhd0RvYygpYC5cbiAgICovXG4gIGFzeW5jIHNhdmVEcmFmdERhdGEoXG4gICAgZG9jSWQ6IHN0cmluZyxcbiAgICBmaWVsZHNEYXRhOiBhbnksXG4gICAgb3B0aW9ucz86IFNhdmVEcmFmdE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3Qge2NvbGxlY3Rpb24sIHNsdWd9ID0gcGFyc2VEb2NJZChkb2NJZCk7XG4gICAgY29uc3QgZHJhZnREb2MgPVxuICAgICAgKGF3YWl0IHRoaXMuZ2V0UmF3RG9jKGNvbGxlY3Rpb24sIHNsdWcsIHttb2RlOiAnZHJhZnQnfSkpIHx8IHt9O1xuICAgIGNvbnN0IGRyYWZ0U3lzID0gZHJhZnREb2Muc3lzIHx8IHt9O1xuICAgIGNvbnN0IG1vZGlmaWVkQnkgPSBvcHRpb25zPy5tb2RpZmllZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuICAgIGNvbnN0IGZpZWxkcyA9IG1hcnNoYWxEYXRhKGZpZWxkc0RhdGEgfHwge30pO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpZDogZG9jSWQsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgc2x1ZyxcbiAgICAgIHN5czoge1xuICAgICAgICAuLi5kcmFmdFN5cyxcbiAgICAgICAgY3JlYXRlZEF0OiBkcmFmdFN5cy5jcmVhdGVkQXQgPz8gVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBjcmVhdGVkQnk6IGRyYWZ0U3lzLmNyZWF0ZWRCeSA/PyBtb2RpZmllZEJ5LFxuICAgICAgICBtb2RpZmllZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICAgIG1vZGlmaWVkQnksXG4gICAgICAgIGxvY2FsZXM6IG9wdGlvbnM/LmxvY2FsZXMgPz8gZHJhZnRTeXMubG9jYWxlcyA/PyBbJ2VuJ10sXG4gICAgICB9LFxuICAgICAgZmllbGRzLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy5zZXRSYXdEb2MoY29sbGVjdGlvbiwgc2x1ZywgZGF0YSwge21vZGU6ICdkcmFmdCd9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmZXIgYHNhdmVEcmFmdERhdGEoJ1BhZ2VzL2ZvbycsIGRhdGEpYC4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vdyB3aGF0XG4gICAqIHlvdSdyZSBkb2luZy5cbiAgICovXG4gIGFzeW5jIHNldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIG9wdGlvbnM6IFNldERvY09wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBsaXN0RG9jczxUPihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbiAgKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5yYXcpIHtcbiAgICAgICAgLy8gRm9yIGNhbGxlcnMgdGhhdCB3aXNoIHRvIG1vZGlmeSB0aGUgcmF3IGRvYyB2aWEgYHNldFJhd0RvYygpYCxcbiAgICAgICAgLy8gcmV0dXJuIHRoZSB1bm1vZGlmaWVkIGRvYyBhcyByZXR1cm5lZCBmcm9tIGZpcmVzdG9yZS5cbiAgICAgICAgY29uc3QgcmF3RG9jID0gcmVzdWx0LmRhdGEoKSBhcyBUO1xuICAgICAgICBkb2NzLnB1c2gocmF3RG9jKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICAgICAgZG9jcy5wdXNoKGRvYyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtkb2NzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBnZXREb2NzQ291bnQoY29sbGVjdGlvbklkOiBzdHJpbmcsIG9wdGlvbnM6IEdldENvdW50T3B0aW9ucykge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5jb3VudCgpLmdldCgpO1xuICAgIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHB1Ymxpc2hlcyBhIHNldCBvZiBkb2NzIGJ5IGlkLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaERvY3MoXG4gICAgZG9jSWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzoge3B1Ymxpc2hlZEJ5OiBzdHJpbmc7IGJhdGNoPzogV3JpdGVCYXRjaH1cbiAgKSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIC8vIEZldGNoIHRoZSBjdXJyZW50IGRyYWZ0IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgIGNvbnN0IGRvY1JlZnMgPSBkb2NJZHMubWFwKChkb2NJZCkgPT4ge1xuICAgICAgY29uc3QgW2NvbGxlY3Rpb24sIHNsdWddID0gZG9jSWQuc3BsaXQoJy8nKTtcbiAgICAgIGlmICghY29sbGVjdGlvbiB8fCAhc2x1Zykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZG9jIGlkOiAke2RvY0lkfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY1JlZjtcbiAgICB9KTtcbiAgICBjb25zdCBkb2NTbmFwc2hvdHMgPSBhd2FpdCB0aGlzLmRiLmdldEFsbCguLi5kb2NSZWZzKTtcbiAgICBjb25zdCBkb2NzID0gZG9jU25hcHNob3RzXG4gICAgICAvLyBSZXRyaWV2ZSBzbmFwc2hvdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICAgIC5tYXAoKHNuYXBzaG90KSA9PiBzbmFwc2hvdC5kYXRhKCkgYXMgRG9jKVxuICAgICAgLy8gUmVtb3ZlIGRvY3MgdGhhdCBkb24ndCBleGlzdC5cbiAgICAgIC5maWx0ZXIoKGQpID0+ICEhZCk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHB1Ymxpc2gnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhlcmUgYXJlIG5vIHB1Ymxpc2hpbmcgbG9ja3Mgb24gYW55IGRvY3MuXG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgaWYgKHRoaXMudGVzdFB1Ymxpc2hpbmdMb2NrZWQoZG9jKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHB1Ymxpc2hpbmcgaXMgbG9ja2VkIGZvciBkb2M6ICR7ZG9jLmlkfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IG9wdGlvbnM/LmJhdGNoIHx8IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1Zywgc3lzLCBmaWVsZHN9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCk7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID0gc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gcHVibGlzaGVkQnk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgc2NoZWR1bGVkIGRvYywgaWYgYW55LlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHB1Ymxpc2hlZEJ5LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXRjaENvdW50ID4gMCkge1xuICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgICByZXR1cm4gcHVibGlzaGVkRG9jcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoU2NoZWR1bGVkRG9jcygpIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gICAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAgIC5maWx0ZXIoKGQpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIGRvY3MgYnkgcHJvamVjdC5cbiAgICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgIC8vIE5PVEUoc3RldmVubGUpOiB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyBhIHF1ZXJ5XG4gICAgICAgIC8vIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW4gaW5kZXggaW4gZmlyZXN0b3JlLlxuICAgICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZEF0OiBUaW1lc3RhbXAgfCB1bmRlZmluZWQgPSBkYXRhLnN5cz8uc2NoZWR1bGVkQXQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGRiUGF0aCA9IGQucmVmLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzZWdtZW50cy5hdCgtMyk7XG4gICAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogZC5kYXRhKCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICBzbHVnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHNjaGVkdWxlJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBkYXRhfSA9IGRvYztcbiAgICAgIGNvbnN0IGRyYWZ0UmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3QgcHVibGlzaGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPSBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBzY2hlZHVsZWRBdDtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPVxuICAgICAgICBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCcpO1xuXG4gICAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JyxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgICAgaWYgKGJhdGNoQ291bnQgPj0gNDAwKSB7XG4gICAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgICAgICBiYXRjaENvdW50ID0gMDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBkb2NzIGluIHNjaGVkdWxlZCByZWxlYXNlcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWRSZWxlYXNlcygpIHtcbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vUmVsZWFzZXNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYlxuICAgICAgLmNvbGxlY3Rpb24ocmVsZWFzZXNQYXRoKVxuICAgICAgLndoZXJlKCdzY2hlZHVsZWRBdCcsICc8PScsIFRpbWVzdGFtcC5mcm9tTWlsbGlzKG5vdykpO1xuICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcblxuICAgIGZvciAoY29uc3Qgc25hcHNob3Qgb2YgcXVlcnlTbmFwc2hvdC5kb2NzKSB7XG4gICAgICBjb25zdCByZWxlYXNlID0gc25hcHNob3QuZGF0YSgpIGFzIFJlbGVhc2U7XG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gcmVsZWFzZS5zY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcbiAgICAgIGJhdGNoLnVwZGF0ZShzbmFwc2hvdC5yZWYsIHtcbiAgICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICBzY2hlZHVsZWRBdDogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgc2NoZWR1bGVkQnk6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaERvY3MocmVsZWFzZS5kb2NJZHMgfHwgW10sIHtwdWJsaXNoZWRCeSwgYmF0Y2h9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZG9jIGlzIGN1cnJlbnRseSBcImxvY2tlZFwiIGZvciBwdWJsaXNoaW5nLlxuICAgKi9cbiAgdGVzdFB1Ymxpc2hpbmdMb2NrZWQoZG9jOiBEb2MpIHtcbiAgICBpZiAoZG9jLnN5cz8ucHVibGlzaGluZ0xvY2tlZCkge1xuICAgICAgaWYgKGRvYy5zeXMucHVibGlzaGluZ0xvY2tlZC51bnRpbCkge1xuICAgICAgICBjb25zdCBub3cgPSBUaW1lc3RhbXAubm93KCkudG9NaWxsaXMoKTtcbiAgICAgICAgY29uc3QgdW50aWwgPSBkb2Muc3lzLnB1Ymxpc2hpbmdMb2NrZWQudW50aWwudG9NaWxsaXMoKTtcbiAgICAgICAgcmV0dXJuIG5vdyA8IHVudGlsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgc2F2ZWQgaW4gdGhlIHRyYW5zbGF0aW9ucyBjb2xsZWN0aW9uLCBvcHRpb25hbGx5XG4gICAqIGZpbHRlcmVkIGJ5IHRhZy5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiPGhhc2g+XCI6IHtcInNvdXJjZVwiOiBcIkhlbGxvXCIsIFwiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9ucyhcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG1hcCBvZiB0cmFuc2xhdGlvbnMsIGUuZy46XG4gICAqIGBgYFxuICAgKiBhd2FpdCBjbGllbnQuc2F2ZVRyYW5zbGF0aW9ucyh7XG4gICAqICAgXCJIZWxsb1wiOiB7XCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNhdmVUcmFuc2xhdGlvbnMoXG4gICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICBbc291cmNlOiBzdHJpbmddOiB7W2xvY2FsZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB9LFxuICAgIHRhZ3M/OiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgoW3NvdXJjZSwgc291cmNlVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUmVmID0gdGhpcy5kYi5kb2MoYCR7dHJhbnNsYXRpb25zUGF0aH0vJHtoYXNofWApO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAuLi5zb3VyY2VUcmFuc2xhdGlvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSxcbiAgICAgIH07XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBkYXRhLnRhZ3MgPSB0YWdzO1xuICAgICAgfVxuICAgICAgYmF0Y2guc2V0KHRyYW5zbGF0aW9uUmVmLCBkYXRhLCB7bWVyZ2U6IHRydWV9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcbiAgICB9KTtcbiAgICBpZiAoYmF0Y2hDb3VudCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cCB0byA1MDAgdHJhbnNsYXRpb25zIGNhbiBiZSBzYXZlZCBhdCBhIHRpbWUuJyk7XG4gICAgfVxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwia2V5XCIgdXNlZCBmb3IgYSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIGRiLiBUcmFuc2xhdGlvbnNcbiAgICogYXJlIHN0b3JlZCB1bmRlciBgUHJvamVjdHMvPHByb2plY3QgaWQ+L1RyYW5zbGF0aW9ucy88c2hhMSBoYXNoPmAuXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbktleShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYTEgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAgIC51cGRhdGUodGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiBzaGExO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhIHN0cmluZyB0aGF0J3MgdXNlZCBmb3IgdHJhbnNsYXRpb25zLiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIFJlbW92ZXMgYW55IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgKiAtIFJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYW55IGxpbmVcbiAgICovXG4gIG5vcm1hbGl6ZVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVzID0gU3RyaW5nKHN0cilcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbUVuZCgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3luY3MgYSBkYXRhIHNvdXJjZSB0byBkcmFmdCBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhU291cmNlKGRhdGFTb3VyY2VJZDogc3RyaW5nLCBvcHRpb25zPzoge3N5bmNlZEJ5Pzogc3RyaW5nfSkge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkKTtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBzb3VyY2Ugbm90IGZvdW5kOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaERhdGEoZGF0YVNvdXJjZSk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9EYXRhL2RyYWZ0YFxuICAgICk7XG4gICAgY29uc3Qgc3luY2VkQnkgPSBvcHRpb25zPy5zeW5jZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFTb3VyY2VEb2NSZWYsIHtcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG5cbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGRhdGEgc291cmNlOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGJ5OiAke3N5bmNlZEJ5fWApO1xuICB9XG5cbiAgYXN5bmMgcHVibGlzaERhdGFTb3VyY2UoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeT86IHN0cmluZ31cbiAgKSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmRHJhZnQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmUHVibGlzaGVkID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L3B1Ymxpc2hlZGBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVJlcyA9IGF3YWl0IHRoaXMuZ2V0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZUlkLCB7bW9kZTogJ2RyYWZ0J30pO1xuXG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmUHVibGlzaGVkLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGFSZXM/LmRhdGEgfHwgbnVsbCxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YURvY1JlZkRyYWZ0LCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgZGF0YSAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkIGJ5OiAke3B1Ymxpc2hlZEJ5fWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGlmIChkYXRhU291cmNlLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hIdHRwRGF0YShkYXRhU291cmNlKTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGltcGwuXG4gICAgLy8gaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2dzaGVldCcpIHtcbiAgICAvLyAgIHJldHVybiBhd2FpdCBmZXRjaEdzaGVldERhdGEoZGF0YVNvdXJjZSk7XG4gICAgLy8gfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZS50eXBlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHtcbiAgICBjb25zdCB1cmwgPSBkYXRhU291cmNlLnVybCB8fCAnJztcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBub3Qgc3VwcG9ydGVkOiAke3VybH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8ubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgaGVhZGVyczogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uaGVhZGVycyB8fCBbXSxcbiAgICAgIGJvZHk6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/LmJvZHkgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxIGZhaWxlZDogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFR5cGUgPSBTdHJpbmcocmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSk7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGRhdGEgZnJvbSBhIGRhdGEgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RnJvbURhdGFTb3VyY2U8VCA9IGFueT4oXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHttb2RlPzogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnfVxuICApOiBQcm9taXNlPERhdGFTb3VyY2VEYXRhPFQ+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlIHx8ICdwdWJsaXNoZWQnO1xuICAgIGlmICghKG1vZGUgPT09ICdkcmFmdCcgfHwgbW9kZSA9PT0gJ3B1Ymxpc2hlZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbW9kZTogJHttb2RlfWApO1xuICAgIH1cbiAgICBpZiAoIWRhdGFTb3VyY2VJZCB8fCBkYXRhU291cmNlSWQuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgc291cmNlIGlkOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvJHttb2RlfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpIGFzIERhdGFTb3VyY2VEYXRhPFQ+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyJ3Mgcm9sZSBmcm9tIHRoZSBwcm9qZWN0J3MgQUNMLlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlclJvbGUoZW1haWw6IHN0cmluZyk6IFByb21pc2U8VXNlclJvbGUgfCBudWxsPiB7XG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfWApO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGNvbnN0IGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgfHwge307XG4gICAgY29uc3QgYWNsID0gZGF0YS5yb2xlcyB8fCB7fTtcblxuICAgIGlmIChlbWFpbCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiBhY2xbZW1haWxdO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdpbGRjYXJkIGRvbWFpbnMsIGUuZy4gYCpAZXhhbXBsZS5jb21gLlxuICAgIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpbnZhbGlkIGVtYWlsOiAke2VtYWlsfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLnNwbGl0KCdAJykuYXQoLTEpO1xuICAgIGlmIChkb21haW4gJiYgYCpAJHtkb21haW59YCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiBhY2xbYCpAJHtkb21haW59YF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHVzZXIgZXhpc3RzIGluIHRoZSBBQ0wgbGlzdC5cbiAgICovXG4gIGFzeW5jIHVzZXJFeGlzdHNJbkFjbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH1gKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBjb25zdCBkYXRhID0gc25hcHNob3QuZGF0YSgpIHx8IHt9O1xuICAgIGNvbnN0IGFjbCA9IGRhdGEucm9sZXMgfHwge307XG4gICAgaWYgKGVtYWlsIGluIGFjbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2lsZGNhcmQgZG9tYWlucywgZS5nLiBgKkBleGFtcGxlLmNvbWAuXG4gICAgaWYgKCFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGludmFsaWQgZW1haWw6ICR7ZW1haWx9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLnNwbGl0KCdAJykuYXQoLTEpO1xuICAgIGlmIChkb21haW4gJiYgYCpAJHtkb21haW59YCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBsb2dBY3Rpb24oYWN0aW9uOiBzdHJpbmcsIG9wdGlvbnM/OiB7Ynk/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSkge1xuICAgIGlmICghYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQ6IFwiYWN0aW9uXCInKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBUaW1lc3RhbXAubm93KCksXG4gICAgICBieTogb3B0aW9ucz8uYnkgfHwgJ3N5c3RlbScsXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucz8ubWV0YWRhdGEgfHwge30sXG4gICAgfTtcbiAgICBjb25zdCBjb2xSZWYgPSB0aGlzLmRiLmNvbGxlY3Rpb24oYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0FjdGlvbkxvZ3NgKTtcbiAgICBhd2FpdCBjb2xSZWYuYWRkKGRhdGEpO1xuXG4gICAgY29uc3QgbWV0YVN0ciA9IG9wdGlvbnM/Lm1ldGFkYXRhID8gc3RyaW5naWZ5T2JqKG9wdGlvbnMubWV0YWRhdGEpIDogJyc7XG4gICAgY29uc29sZS5sb2coYFske2RhdGEudGltZXN0YW1wLnRvTWlsbGlzKCl9XSBhY3Rpb246ICR7YWN0aW9ufSAke21ldGFTdHJ9YCk7XG5cbiAgICAvLyBDYWxsIHRoZSBgb25BY3Rpb24oKWAgY2FsbGJhY2sgZnJvbSBjbXNQbHVnaW4oKS5cbiAgICBjb25zdCBjbXNQbHVnaW5Db25maWcgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICBpZiAoY21zUGx1Z2luQ29uZmlnLm9uQWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjbXNQbHVnaW5Db25maWcub25BY3Rpb24oZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYGRhdGFgIGlzIGEgcmljaCB0ZXh0IGRhdGEgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSaWNoVGV4dERhdGEoZGF0YTogYW55KSB7XG4gIC8vIFRoZSBSaWNoVGV4dEVkaXRvciB1c2VzIGVkaXRvcmpzIHVuZGVyIHRoZSBob29kLCB0aGUgZGF0YSBmb3JtYXQgaXNcbiAgLy8gc29tZXRoaW5nIGxpa2U6XG4gIC8vICB7XG4gIC8vICAgXCJ0aW1lXCI6IDE3MjE3NjEyMTE3MjAsXG4gIC8vICAgXCJ2ZXJzaW9uXCI6IFwiMi4yOC4yXCIsXG4gIC8vICAgXCJibG9ja3NcIjogWy4uLl1cbiAgLy8gfVxuICByZXR1cm4gQm9vbGVhbihcbiAgICBpc09iamVjdChkYXRhKSAmJiBBcnJheS5pc0FycmF5KGRhdGEuYmxvY2tzKSAmJiBkYXRhLnRpbWUgJiYgZGF0YS52ZXJzaW9uXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBhcnJheSBvZiBvYmplY3RzIGludG8gXCJhcnJheSBvYmplY3RzXCJcbiAqIGZvciBzdG9yYWdlIGluIGZpcmVzdG9yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcnNoYWxEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIC8vIEF2b2lkIGNoYW5naW5nIHRoZSBmb3JtYXQgb2YgcmljaCB0ZXh0IGRhdGEuXG4gIGlmIChpc1JpY2hUZXh0RGF0YShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtYXJzaGFsRGF0YSh2YWwpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBpZiAodmFsLmxlbmd0aCA+IDAgJiYgdmFsLnNvbWUoKGl0ZW0pID0+IGlzT2JqZWN0KGl0ZW0pKSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHZhbC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXJzaGFsRGF0YShpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRba2V5XSA9IHRvQXJyYXlPYmplY3QoaXRlbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGFycmF5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udW5tYXJzaGFsRGF0YSh2YWxbYXJyYXlLZXldIHx8IHt9KSxcbiAgICAgICAgICAgIF9hcnJheUtleTogYXJyYXlLZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB1bm1hcnNoYWxEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGB1bm1hcnNoYWxEYXRhKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheU9iamVjdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgX2FycmF5OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGFycmF5IGludG8gYW4gYEFycmF5T2JqZWN0YCwgZS5nLjpcbiAqXG4gKiBgYGBcbiAqIG1hcnNoYWxBcnJheShbMSwgMiwgM10pXG4gKiAvLyA9PiB7YTogMSwgYjogMiwgYzogMywgX2FycmF5OiBbJ2EnLCAnYicsICdjJ119XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRhdGFiYXNlIHN0b3JhZ2UgbWV0aG9kIG1ha2VzIGl0IGVhc2llciB0byB1cGRhdGUgYSBzaW5nbGUgZmllbGQgaW4gYVxuICogZGVlcGx5IG5lc3RlZCBhcnJheSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5T2JqZWN0KGFycjogYW55W10pOiBBcnJheU9iamVjdCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuICBjb25zdCBhcnJPYmplY3Q6IEFycmF5T2JqZWN0ID0ge19hcnJheTogW119O1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZFN0cmluZyg2KTtcbiAgICBhcnJPYmplY3Rba2V5XSA9IGl0ZW07XG4gICAgYXJyT2JqZWN0Ll9hcnJheS5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGFyck9iamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IG1hcnNoYWxBcnJheSA9IHRvQXJyYXlPYmplY3Q7XG5cbi8qKlxuICogQ29udmVydHMgYW4gYEFycmF5T2JqZWN0YCB0byBhIG5vcm1hbCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbEFycmF5KGFyck9iamVjdDogQXJyYXlPYmplY3QpOiBhbnlbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJPYmplY3Q/Ll9hcnJheSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgYXJyID0gYXJyT2JqZWN0Ll9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gYXJyT2JqZWN0W2tdKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmFuZFN0cmluZyhsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjaGFycyA9XG4gICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHJhbmQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpO1xuICAgIHJlc3VsdC5wdXNoKGNoYXJzLmNoYXJBdChyYW5kKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHRyYW5zbGF0aW9ucyBtYXAgZnJvbSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBhIG1hcCBvZiBzb3VyY2UgdG9cbiAqIHRyYW5zbGF0ZWQgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwLFxuICBsb2NhbGU6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGxvY2FsZVRyYW5zbGF0aW9uczogTG9jYWxlVHJhbnNsYXRpb25zID0ge307XG4gIE9iamVjdC52YWx1ZXModHJhbnNsYXRpb25zTWFwKS5mb3JFYWNoKChzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmcuc291cmNlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RyaW5nW2xvY2FsZV0gfHwgc3RyaW5nLmVuIHx8IHN0cmluZy5zb3VyY2U7XG4gICAgbG9jYWxlVHJhbnNsYXRpb25zW3NvdXJjZV0gPSB0cmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiBsb2NhbGVUcmFuc2xhdGlvbnM7XG59XG5cbi8qKiBBIHByZXR0eSBwcmludGVyIGZvciBKYXZhU2NyaXB0IG9iamVjdHMuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmoob2JqOiBhbnkpIHtcbiAgZnVuY3Rpb24gZm9ybWF0KG9iajogYW55KTogc3RyaW5nIHtcbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYFwiJHtvYmoucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJyl9XCJgO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcob2JqKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIGBbJHtvYmoubWFwKGZvcm1hdCkuam9pbignLCAnKX1dYDtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogc3RyaW5nW10gPSBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7a2V5fTogJHtmb3JtYXQodmFsdWUpfWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGB7JHtlbnRyaWVzLmpvaW4oJywgJyl9fWA7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChvYmopO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGRvY0lkIChlLmcuIGBQYWdlcy9mb29gKSBhbmQgcmV0dXJucyB0aGUgYGNvbGxlY3Rpb25gIGFuZCBgc2x1Z2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURvY0lkKGRvY0lkOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2VwSW5kZXggPSBkb2NJZC5pbmRleE9mKCcvJyk7XG4gIGlmIChzZXBJbmRleCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgfVxuICBjb25zdCBjb2xsZWN0aW9uID0gZG9jSWQuc2xpY2UoMCwgc2VwSW5kZXgpO1xuICBjb25zdCBzbHVnID0gZG9jSWQuc2xpY2Uoc2VwSW5kZXggKyAxKS5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gIGlmICghY29sbGVjdGlvbiB8fCAhc2x1Zykge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkb2MgaWQ6ICR7ZG9jSWR9YCk7XG4gIH1cbiAgcmV0dXJuIHtjb2xsZWN0aW9uLCBzbHVnfTtcbn1cbiIsICJpbXBvcnQge2luaXRpYWxpemVBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge2dldFNlY3VyaXR5UnVsZXN9IGZyb20gJ2ZpcmViYXNlLWFkbWluL3NlY3VyaXR5LXJ1bGVzJztcblxuZXhwb3J0IGNvbnN0IEZJUkVTVE9SRV9SVUxFUyA9IGBydWxlc192ZXJzaW9uID0gJzInO1xuc2VydmljZSBjbG91ZC5maXJlc3RvcmUge1xuICBtYXRjaCAvZGF0YWJhc2VzL3tkYXRhYmFzZX0vZG9jdW1lbnRzIHtcbiAgICBtYXRjaCAve2RvY3VtZW50PSoqfSB7XG4gICAgICBhbGxvdyByZWFkLCB3cml0ZTogaWYgZmFsc2U7XG4gICAgfVxuXG4gICAgbWF0Y2ggL1Byb2plY3RzL3twcm9qZWN0fSB7XG4gICAgICBhbGxvdyB3cml0ZTpcbiAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJJc0FkbWluKCk7XG4gICAgICBhbGxvdyByZWFkOlxuICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlckNhblJlYWQoKTtcblxuICAgICAgbWF0Y2ggL3tjb2xsZWN0aW9ufS97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgICAgYWxsb3cgd3JpdGU6XG4gICAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJDYW5Xcml0ZSgpO1xuICAgICAgICBhbGxvdyByZWFkOlxuICAgICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VyQ2FuUmVhZCgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc1NpZ25lZEluKCkge1xuICAgICAgICByZXR1cm4gcmVxdWVzdC5hdXRoICE9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldFJvbGVzKCkge1xuICAgICAgICByZXR1cm4gZ2V0KC9kYXRhYmFzZXMvJChkYXRhYmFzZSkvZG9jdW1lbnRzL1Byb2plY3RzLyQocHJvamVjdCkpLmRhdGEucm9sZXM7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVzZXJDYW5SZWFkKCkge1xuICAgICAgICBsZXQgcm9sZXMgPSBnZXRSb2xlcygpO1xuICAgICAgICBsZXQgZW1haWwgPSByZXF1ZXN0LmF1dGgudG9rZW4uZW1haWw7XG4gICAgICAgIGxldCBkb21haW4gPSAnKkAnICsgZW1haWwuc3BsaXQoJ0AnKVsxXTtcbiAgICAgICAgcmV0dXJuIChyb2xlc1tlbWFpbF0gaW4gWydBRE1JTicsICdFRElUT1InLCAnVklFV0VSJ10pIHx8IChyb2xlc1tkb21haW5dIGluIFsnQURNSU4nLCAnRURJVE9SJywgJ1ZJRVdFUiddKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlckNhbldyaXRlKCkge1xuICAgICAgICBsZXQgcm9sZXMgPSBnZXRSb2xlcygpO1xuICAgICAgICBsZXQgZW1haWwgPSByZXF1ZXN0LmF1dGgudG9rZW4uZW1haWw7XG4gICAgICAgIGxldCBkb21haW4gPSAnKkAnICsgZW1haWwuc3BsaXQoJ0AnKVsxXTtcbiAgICAgICAgcmV0dXJuIChyb2xlc1tlbWFpbF0gaW4gWydBRE1JTicsICdFRElUT1InXSkgfHwgKHJvbGVzW2RvbWFpbl0gaW4gWydBRE1JTicsICdFRElUT1InXSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVzZXJJc0FkbWluKCkge1xuICAgICAgICBsZXQgcm9sZXMgPSBnZXRSb2xlcygpO1xuICAgICAgICBsZXQgZW1haWwgPSByZXF1ZXN0LmF1dGgudG9rZW4uZW1haWw7XG4gICAgICAgIGxldCBkb21haW4gPSAnKkAnICsgZW1haWwuc3BsaXQoJ0AnKVsxXTtcbiAgICAgICAgcmV0dXJuIChyb2xlc1tlbWFpbF0gPT0gJ0FETUlOJykgfHwgKHJvbGVzW2RvbWFpbl0gPT0gJ0FETUlOJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5gO1xuXG4vKipcbiAqIEFkZHMgdGhlIHJvb3QtY21zIHNlY3VyaXR5IHJ1bGVzIHRvIGEgRmlyZWJhc2UgcHJvamVjdC5cbiAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJ1bGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTZWN1cml0eVJ1bGVzKHByb2plY3RJZDogc3RyaW5nKSB7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBjaGVjayBpZiBhbiBhcHAgZXhpc3RzIGZpcnN0IGJlZm9yZSBpbml0aWFsaXppbmcuXG4gIGNvbnN0IGFwcCA9IGluaXRpYWxpemVBcHAoe3Byb2plY3RJZH0pO1xuICBjb25zdCBzZWN1cml0eVJ1bGVzID0gZ2V0U2VjdXJpdHlSdWxlcyhhcHApO1xuICBhd2FpdCBzZWN1cml0eVJ1bGVzLnJlbGVhc2VGaXJlc3RvcmVSdWxlc2V0RnJvbVNvdXJjZShGSVJFU1RPUkVfUlVMRVMpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsZUFBYztBQUN0QixTQUFRLFNBQVMsYUFBWTs7O0FDRDdCLFNBQVEsWUFBWSxVQUFTO0FBQzdCLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLGdCQUFnQix5QkFBd0I7QUFDaEQsWUFBWSxTQUFTO0FBS3JCLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQUU3RCxlQUFzQixnQkFBZ0I7QUFDcEMsUUFBTSxVQUFVLFFBQVEsSUFBSTtBQUM1QixRQUFNLGFBQWEsTUFBTSxlQUFlLFNBQVMsRUFBQyxTQUFTLFdBQVUsQ0FBQztBQUN0RSxRQUFNLGFBQWEsS0FBSyxRQUFRLFdBQVcsY0FBYztBQUN6RCxRQUFNLFVBQVcsTUFBTTtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLFVBQVUsUUFBUSxrQkFBa0I7QUFDMUMsUUFBTSxhQUFhLEtBQUssUUFBUSxTQUFTLGVBQWU7QUFDeEQsUUFBTSxrQkFBa0IsWUFBWSxPQUFPO0FBQzNDLFVBQVEsSUFBSSxzQkFBc0I7QUFDcEM7QUFFQSxJQUFNLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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QU0sWUFBTixNQUFnQjtBQUFBLEVBSWQsWUFBWSxNQUFjLFNBQWlCO0FBQ3pDLFNBQUssT0FBTztBQUNaLFNBQUssVUFBVTtBQUFBLEVBQ2pCO0FBQUEsRUFFQSxNQUFNLElBQUksTUFBZ0I7QUFDeEIsVUFBTSxVQUFVLElBQUksUUFBUSxLQUFLLElBQUk7QUFDckMsWUFBUSxRQUFRLEtBQUssT0FBTztBQUM1QixZQUFRLE9BQU8sZUFBZSxPQUFPO0FBQ3JDLFlBQVEsS0FBSyxhQUFhLENBQUMsUUFBUTtBQUNqQyxVQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsT0FBTztBQUNyQixnQkFBUTtBQUFBLFVBQ04sYUFBTSxRQUFRLE1BQU0sSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLE9BQU87QUFBQTtBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNELFlBQ0csUUFBUSxlQUFlLEVBQ3ZCLE1BQU0sTUFBTSxFQUNaLFlBQVksa0RBQWtELEVBQzlELE9BQU8sdUJBQXVCLGdCQUFnQixFQUM5QyxPQUFPLG1CQUFtQiw4QkFBOEIsRUFDeEQsT0FBTyxZQUFZO0FBQ3RCLFlBQ0csUUFBUSxnQkFBZ0IsRUFDeEIsTUFBTSxPQUFPLEVBQ2I7QUFBQSxNQUNDO0FBQUEsSUFDRixFQUNDLE9BQU8sYUFBYTtBQUN2QixVQUFNLFFBQVEsV0FBVyxJQUFJO0FBQUEsRUFDL0I7QUFDRjsiLAogICJuYW1lcyI6IFsibG9hZFJvb3RDb25maWciLCAicGx1Z2luIiwgImxvYWRSb290Q29uZmlnIl0KfQo=
|