@recursyve/nestjs-data-filter 10.2.0 → 10.2.1
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/lib/filter/controllers/open-api-filter.controller.d.ts +4 -0
- package/lib/filter/controllers/open-api-filter.controller.js +123 -0
- package/lib/filter/order-rules/json.order-rule.d.ts +1 -0
- package/lib/filter/order-rules/json.order-rule.js +11 -3
- package/lib/sequelize.utils.js +5 -4
- package/package.json +1 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Type } from "@nestjs/common";
|
|
2
|
+
import { FilterController } from "../..";
|
|
3
|
+
import { FilterService } from "../filter.service";
|
|
4
|
+
export declare function OpenApiFilterController<T extends Type, D>(Base: T): Type<FilterController<D>> & (new (filterService: FilterService<D>) => FilterController<D>);
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.OpenApiFilterController = OpenApiFilterController;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const __1 = require("../..");
|
|
18
|
+
const filter_query_guard_1 = require("../guards/filter-query.guard");
|
|
19
|
+
const data_file_download_interceptor_1 = require("../interceptors/data-file-download.interceptor");
|
|
20
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
21
|
+
const filter_resource_value_model_1 = require("../models/filter-resource-value.model");
|
|
22
|
+
function OpenApiFilterController(Base) {
|
|
23
|
+
const _FilterResultModel = (0, __1.FilterResultModelMixin)(Base);
|
|
24
|
+
class _FilterController extends __1.FilterController {
|
|
25
|
+
async filter(query, req) {
|
|
26
|
+
return super.filter(query, req);
|
|
27
|
+
}
|
|
28
|
+
async filterCount(query, req) {
|
|
29
|
+
return super.filterCount(query, req);
|
|
30
|
+
}
|
|
31
|
+
async downloadData(query, type, req) {
|
|
32
|
+
return super.downloadData(query, type, req);
|
|
33
|
+
}
|
|
34
|
+
async getFilterConfig(req) {
|
|
35
|
+
return super.getFilterConfig(req);
|
|
36
|
+
}
|
|
37
|
+
async searchFilterResourceValue(search, req) {
|
|
38
|
+
return super.searchFilterResourceValue(search, req);
|
|
39
|
+
}
|
|
40
|
+
async searchFilterConfigValues(search, req) {
|
|
41
|
+
return super.searchFilterConfigValues(search, req);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, common_1.Post)("filter"),
|
|
46
|
+
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
|
|
47
|
+
(0, common_1.UseGuards)(filter_query_guard_1.FilterQueryGuard),
|
|
48
|
+
(0, swagger_1.ApiOkResponse)({ type: () => _FilterResultModel }),
|
|
49
|
+
(0, swagger_1.ApiOperation)({ operationId: `filter${Base.name}` }),
|
|
50
|
+
__param(0, (0, common_1.Body)()),
|
|
51
|
+
__param(1, (0, common_1.Req)()),
|
|
52
|
+
__metadata("design:type", Function),
|
|
53
|
+
__metadata("design:paramtypes", [__1.FilterQueryModel, Object]),
|
|
54
|
+
__metadata("design:returntype", Promise)
|
|
55
|
+
], _FilterController.prototype, "filter", null);
|
|
56
|
+
__decorate([
|
|
57
|
+
(0, common_1.Post)("filter-count"),
|
|
58
|
+
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
|
|
59
|
+
(0, swagger_1.ApiOkResponse)({ schema: { type: "number" } }),
|
|
60
|
+
(0, swagger_1.ApiOperation)({ operationId: `filter${Base.name}Count` }),
|
|
61
|
+
__param(0, (0, common_1.Body)()),
|
|
62
|
+
__param(1, (0, common_1.Req)()),
|
|
63
|
+
__metadata("design:type", Function),
|
|
64
|
+
__metadata("design:paramtypes", [__1.FilterQueryModel, Object]),
|
|
65
|
+
__metadata("design:returntype", Promise)
|
|
66
|
+
], _FilterController.prototype, "filterCount", null);
|
|
67
|
+
__decorate([
|
|
68
|
+
(0, common_1.Post)("download/:type"),
|
|
69
|
+
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
|
|
70
|
+
(0, common_1.UseInterceptors)(data_file_download_interceptor_1.DataFileDownloadInterceptor),
|
|
71
|
+
(0, swagger_1.ApiOkResponse)({
|
|
72
|
+
description: 'Returns file data as binary (Buffer) or as text (string) depending on the export type.',
|
|
73
|
+
content: {
|
|
74
|
+
'application/octet-stream': {
|
|
75
|
+
schema: {
|
|
76
|
+
oneOf: [
|
|
77
|
+
{ type: 'string', format: 'binary' },
|
|
78
|
+
{ type: 'string' }
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}),
|
|
84
|
+
(0, swagger_1.ApiParam)({ name: "type", enum: __1.ExportTypes, enumName: "ExportTypes" }),
|
|
85
|
+
(0, swagger_1.ApiOperation)({ operationId: `download${Base.name}Data` }),
|
|
86
|
+
__param(0, (0, common_1.Body)()),
|
|
87
|
+
__param(1, (0, common_1.Param)("type")),
|
|
88
|
+
__param(2, (0, common_1.Req)()),
|
|
89
|
+
__metadata("design:type", Function),
|
|
90
|
+
__metadata("design:paramtypes", [__1.FilterQueryModel, String, Object]),
|
|
91
|
+
__metadata("design:returntype", Promise)
|
|
92
|
+
], _FilterController.prototype, "downloadData", null);
|
|
93
|
+
__decorate([
|
|
94
|
+
(0, common_1.Post)("filter/config"),
|
|
95
|
+
(0, swagger_1.ApiOkResponse)({ type: () => __1.FilterConfigurationModel, isArray: true }),
|
|
96
|
+
(0, swagger_1.ApiOperation)({ operationId: `get${Base.name}FilterConfig` }),
|
|
97
|
+
__param(0, (0, common_1.Req)()),
|
|
98
|
+
__metadata("design:type", Function),
|
|
99
|
+
__metadata("design:paramtypes", [Object]),
|
|
100
|
+
__metadata("design:returntype", Promise)
|
|
101
|
+
], _FilterController.prototype, "getFilterConfig", null);
|
|
102
|
+
__decorate([
|
|
103
|
+
(0, common_1.Post)("filter/config/id"),
|
|
104
|
+
(0, swagger_1.ApiOkResponse)({ type: () => __1.SelectFilterValue }),
|
|
105
|
+
(0, swagger_1.ApiOperation)({ operationId: `search${Base.name}FilterResourceValue` }),
|
|
106
|
+
__param(0, (0, common_1.Query)()),
|
|
107
|
+
__param(1, (0, common_1.Req)()),
|
|
108
|
+
__metadata("design:type", Function),
|
|
109
|
+
__metadata("design:paramtypes", [filter_resource_value_model_1.FilterResourceValueModel, Object]),
|
|
110
|
+
__metadata("design:returntype", Promise)
|
|
111
|
+
], _FilterController.prototype, "searchFilterResourceValue", null);
|
|
112
|
+
__decorate([
|
|
113
|
+
(0, common_1.Post)("filter/config/value"),
|
|
114
|
+
(0, swagger_1.ApiOkResponse)({ type: () => __1.SelectFilterValue, isArray: true }),
|
|
115
|
+
(0, swagger_1.ApiOperation)({ operationId: `search${Base.name}FilterConfigValues` }),
|
|
116
|
+
__param(0, (0, common_1.Query)()),
|
|
117
|
+
__param(1, (0, common_1.Req)()),
|
|
118
|
+
__metadata("design:type", Function),
|
|
119
|
+
__metadata("design:paramtypes", [__1.FilterConfigurationSearchModel, Object]),
|
|
120
|
+
__metadata("design:returntype", Promise)
|
|
121
|
+
], _FilterController.prototype, "searchFilterConfigValues", null);
|
|
122
|
+
return _FilterController;
|
|
123
|
+
}
|
|
@@ -8,4 +8,5 @@ export declare class JsonOrderRule extends OrderRule implements JsonRuleDefiniti
|
|
|
8
8
|
json: JsonConfig;
|
|
9
9
|
constructor(definition: BaseOrderRuleDefinition & JsonRuleDefinition);
|
|
10
10
|
getOrderOption(model: typeof M, context: OrderRuleContext): OrderItemColumn;
|
|
11
|
+
private getModelPath;
|
|
11
12
|
}
|
|
@@ -2,16 +2,24 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.JsonOrderRule = void 0;
|
|
4
4
|
const sequelize_1 = require("sequelize");
|
|
5
|
+
const sequelize_utils_1 = require("../../sequelize.utils");
|
|
5
6
|
const order_rule_1 = require("./order-rule");
|
|
6
7
|
class JsonOrderRule extends order_rule_1.OrderRule {
|
|
7
8
|
constructor(definition) {
|
|
8
9
|
super(definition);
|
|
9
10
|
}
|
|
10
11
|
getOrderOption(model, context) {
|
|
11
|
-
const
|
|
12
|
-
|
|
12
|
+
const jsonPath = typeof this.json.path === "function" ? this.json.path(context) : this.json.path;
|
|
13
|
+
const modelPath = this.getModelPath(model);
|
|
14
|
+
return (0, sequelize_1.literal)(`UPPER(JSON_UNQUOTE(JSON_EXTRACT(${modelPath}, '$.${jsonPath}')))`);
|
|
15
|
+
}
|
|
16
|
+
getModelPath(model) {
|
|
17
|
+
if (this.path) {
|
|
18
|
+
return sequelize_utils_1.SequelizeUtils.getLiteralFullName(this.attribute, this.path);
|
|
19
|
+
}
|
|
20
|
+
return `\`${model.name}\`.\`${this.attribute}\``;
|
|
13
21
|
}
|
|
14
22
|
}
|
|
15
23
|
exports.JsonOrderRule = JsonOrderRule;
|
|
16
24
|
|
|
17
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvb3JkZXItcnVsZXMvanNvbi5vcmRlci1ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFvQztBQUNwQywyREFBMEQ7QUFDMUQsNkNBQXFHO0FBT3JHLE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBR3hDLFlBQVksVUFBd0Q7UUFDaEUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxjQUFjLENBQUMsS0FBZSxFQUFFLE9BQXlCO1FBQzVELE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDakcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUEsbUJBQU8sRUFBQyxtQ0FBbUMsU0FBUyxRQUFRLFFBQVEsTUFBTSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFlO1FBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNYLE9BQU8sZ0NBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2RTtRQUVELE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQztJQUNyRCxDQUFDO0NBQ0o7QUFwQkQsc0NBb0JDIiwiZmlsZSI6ImxpYi9maWx0ZXIvb3JkZXItcnVsZXMvanNvbi5vcmRlci1ydWxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGl0ZXJhbCB9IGZyb20gXCJzZXF1ZWxpemVcIjtcbmltcG9ydCB7IE0sIFNlcXVlbGl6ZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3NlcXVlbGl6ZS51dGlsc1wiO1xuaW1wb3J0IHsgQmFzZU9yZGVyUnVsZURlZmluaXRpb24sIE9yZGVySXRlbUNvbHVtbiwgT3JkZXJSdWxlLCBPcmRlclJ1bGVDb250ZXh0IH0gZnJvbSBcIi4vb3JkZXItcnVsZVwiO1xuaW1wb3J0IHsgSnNvbkNvbmZpZyB9IGZyb20gXCIuLi8uLlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25SdWxlRGVmaW5pdGlvbiB7XG4gICAganNvbjogSnNvbkNvbmZpZztcbn1cblxuZXhwb3J0IGNsYXNzIEpzb25PcmRlclJ1bGUgZXh0ZW5kcyBPcmRlclJ1bGUgaW1wbGVtZW50cyBKc29uUnVsZURlZmluaXRpb24ge1xuICAgIHB1YmxpYyBqc29uITogSnNvbkNvbmZpZztcblxuICAgIGNvbnN0cnVjdG9yKGRlZmluaXRpb246IEJhc2VPcmRlclJ1bGVEZWZpbml0aW9uICYgSnNvblJ1bGVEZWZpbml0aW9uKSB7XG4gICAgICAgIHN1cGVyKGRlZmluaXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPcmRlck9wdGlvbihtb2RlbDogdHlwZW9mIE0sIGNvbnRleHQ6IE9yZGVyUnVsZUNvbnRleHQpOiBPcmRlckl0ZW1Db2x1bW4ge1xuICAgICAgICBjb25zdCBqc29uUGF0aCA9IHR5cGVvZiB0aGlzLmpzb24ucGF0aCA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5qc29uLnBhdGgoY29udGV4dCkgOiB0aGlzLmpzb24ucGF0aDtcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gdGhpcy5nZXRNb2RlbFBhdGgobW9kZWwpO1xuICAgICAgICByZXR1cm4gbGl0ZXJhbChgVVBQRVIoSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVCgke21vZGVsUGF0aH0sICckLiR7anNvblBhdGh9JykpKWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TW9kZWxQYXRoKG1vZGVsOiB0eXBlb2YgTSk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBTZXF1ZWxpemVVdGlscy5nZXRMaXRlcmFsRnVsbE5hbWUodGhpcy5hdHRyaWJ1dGUsIHRoaXMucGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYFxcYCR7bW9kZWwubmFtZX1cXGAuXFxgJHt0aGlzLmF0dHJpYnV0ZX1cXGBgO1xuICAgIH1cbn1cbiJdfQ==
|
package/lib/sequelize.utils.js
CHANGED
|
@@ -268,14 +268,15 @@ class SequelizeUtils {
|
|
|
268
268
|
return model;
|
|
269
269
|
}
|
|
270
270
|
static findColumnFieldName(model, name) {
|
|
271
|
-
var _a;
|
|
271
|
+
var _a, _b;
|
|
272
272
|
const field = Object.keys(model.rawAttributes).find((key) => {
|
|
273
|
+
var _a;
|
|
273
274
|
if (key === name) {
|
|
274
275
|
return true;
|
|
275
276
|
}
|
|
276
|
-
return model.rawAttributes[key].field === name;
|
|
277
|
+
return ((_a = model.rawAttributes[key]) === null || _a === void 0 ? void 0 : _a.field) === name;
|
|
277
278
|
});
|
|
278
|
-
return (_a = model.rawAttributes[field].field) !== null &&
|
|
279
|
+
return (_b = (_a = model.rawAttributes[field]) === null || _a === void 0 ? void 0 : _a.field) !== null && _b !== void 0 ? _b : name;
|
|
279
280
|
}
|
|
280
281
|
static isColumnJson(model, name) {
|
|
281
282
|
var _a, _b;
|
|
@@ -310,4 +311,4 @@ class SequelizeUtils {
|
|
|
310
311
|
}
|
|
311
312
|
exports.SequelizeUtils = SequelizeUtils;
|
|
312
313
|
|
|
313
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLENBQUM7WUFDdkMsT0FBTyxjQUFjLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0RjtRQUVELE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFFTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsS0FBd0IsRUFBRSxPQUFnQjtRQUM1RSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEdBQUc7WUFDVCxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQztTQUN6QyxDQUFDO1FBQ0YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLFNBQVM7YUFDWjtZQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDN0IsS0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUMvQjtTQUNKO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBNVdELHdDQTRXQyIsImZpbGUiOiJsaWIvc2VxdWVsaXplLnV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJyYXlVdGlscywgVHlwZVV0aWxzIH0gZnJvbSBcIkByZWN1cnN5dmUvbmVzdGpzLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IsXG4gICAgRmluZEF0dHJpYnV0ZU9wdGlvbnMsXG4gICAgSW5jbHVkZWFibGUsXG4gICAgSW5jbHVkZU9wdGlvbnMsXG4gICAgT3AsXG4gICAgT3JkZXIsXG4gICAgT3JkZXJJdGVtLFxuICAgIFdoZXJlT3B0aW9uc1xufSBmcm9tIFwic2VxdWVsaXplXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJzZXF1ZWxpemUtdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgUHJvamVjdGlvbkFsaWFzLCBXaGVyZUF0dHJpYnV0ZUhhc2hWYWx1ZSB9IGZyb20gXCJzZXF1ZWxpemUvdHlwZXMvbW9kZWxcIjtcbmltcG9ydCB7IFJ1bGVNb2RlbCB9IGZyb20gXCIuL2ZpbHRlclwiO1xuaW1wb3J0IHsgSW5jbHVkZVdoZXJlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHMvaW5jbHVkZS5tb2RlbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlb1BvaW50IHtcbiAgICB0eXBlOiBcInBvaW50XCIsXG4gICAgY29vcmRpbmF0ZXM6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgTSBleHRlbmRzIE1vZGVsIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZWxpemVVdGlscyB7XG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2VJbmNsdWRlcyhpbmNsdWRlczogQXJyYXk8SW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdPiwgaWdub3JlQXR0cmlidXRlcyA9IGZhbHNlKTogSW5jbHVkZWFibGVbXSB7XG4gICAgICAgIGxldCBpbmNsdWRlOiBJbmNsdWRlT3B0aW9uc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpbmNsdWRlcykge1xuICAgICAgICAgICAgaW5jbHVkZSA9IHRoaXMubWVyZ2VJbmNsdWRlcyhpbmNsdWRlLCBpLCBpZ25vcmVBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmNsdWRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VJbmNsdWRlcyhhOiBJbmNsdWRlT3B0aW9ucyB8IEluY2x1ZGVPcHRpb25zW10gPSBbXSwgYjogSW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdID0gW10sIGlnbm9yZUF0dHJpYnV0ZXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgIGEgPSBbYV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgICAgIGIgPSBbYl07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGJDaGlsZCBvZiBiKSB7XG4gICAgICAgICAgICBjb25zdCBhQ2hpbGQgPSBhLmZpbmQodmFsdWUgPT4gdmFsdWUubW9kZWwgPT09IGJDaGlsZC5tb2RlbCAmJiB2YWx1ZS5hcyA9PT0gYkNoaWxkLmFzKTtcbiAgICAgICAgICAgIGlmIChhQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBhQ2hpbGQuaW5jbHVkZSA9IHRoaXMubWVyZ2VJbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgKGFDaGlsZC5pbmNsdWRlIGFzIEluY2x1ZGVPcHRpb25zW10pID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICAoYkNoaWxkLmluY2x1ZGUgYXMgSW5jbHVkZU9wdGlvbnNbXSkgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICgoYUNoaWxkLmF0dHJpYnV0ZXMgfHwgYkNoaWxkLmF0dHJpYnV0ZXMpICYmICFpZ25vcmVBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFDaGlsZC5hdHRyaWJ1dGVzID0gdGhpcy5tZXJnZUF0dHJpYnV0ZXMoYUNoaWxkLmF0dHJpYnV0ZXMsIGJDaGlsZC5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgd2hlcmUgPSB0aGlzLm1lcmdlV2hlcmUoYUNoaWxkLndoZXJlLCBiQ2hpbGQud2hlcmUpO1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZSkge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQud2hlcmUgPSB3aGVyZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLm1lcmdlT3JkZXIoYUNoaWxkLm9yZGVyLCBiQ2hpbGQub3JkZXIpO1xuICAgICAgICAgICAgICAgIGlmIChvcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFDaGlsZC5yZXF1aXJlZCB8fCBiQ2hpbGQucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYUNoaWxkLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFDaGlsZC5zZXBhcmF0ZSB8fCBiQ2hpbGQuc2VwYXJhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYUNoaWxkLnNlcGFyYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJDaGlsZC5saW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQubGltaXQgPz89IGJDaGlsZC5saW1pdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYUNoaWxkLnBhcmFub2lkID0gIShhQ2hpbGQucGFyYW5vaWQgPT09IGZhbHNlIHx8IGJDaGlsZC5wYXJhbm9pZCA9PT0gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChUeXBlVXRpbHMuaXNOb3ROdWxsT3JVbmRlZmluZWQoYUNoaWxkLnN1YlF1ZXJ5KSB8fCBUeXBlVXRpbHMuaXNOb3ROdWxsT3JVbmRlZmluZWQoYkNoaWxkLnN1YlF1ZXJ5KSkge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQuc3ViUXVlcnkgPSBhQ2hpbGQuc3ViUXVlcnkgPz8gYkNoaWxkLnN1YlF1ZXJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYS5wdXNoKGJDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1lcmdlQXR0cmlidXRlcyhhOiBGaW5kQXR0cmlidXRlT3B0aW9ucyB8IHVuZGVmaW5lZCwgYjogRmluZEF0dHJpYnV0ZU9wdGlvbnMgfCB1bmRlZmluZWQpOiBGaW5kQXR0cmlidXRlT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHR5cGUgQXR0ciA9IHsgZXhjbHVkZT86IHN0cmluZ1tdOyBpbmNsdWRlPzogKHN0cmluZyB8IFByb2plY3Rpb25BbGlhcylbXTsgfTtcblxuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEFycmF5ICYmIGIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMudW5pcXVlVmFsdWVzKFsuLi5hLCAuLi5iLCBcImlkXCJdLCB4ID0+IHgpO1xuICAgICAgICB9IGVsc2UgaWYgKGEgfHwgYikge1xuICAgICAgICAgICAgY29uc3QgYUF0dHJpYnV0ZXMgPSAoYSA/PyB7fSkgYXMgQXR0cjtcbiAgICAgICAgICAgIGNvbnN0IGJBdHRyaWJ1dGVzID0gKGIgPz8ge30pIGFzIEF0dHI7XG5cbiAgICAgICAgICAgIGlmIChhQXR0cmlidXRlcy5pbmNsdWRlICYmICFiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiQXR0cmlidXRlcy5pbmNsdWRlICYmICFhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiQXR0ciA9IChiID8/IHt9KSBhcyBBdHRyO1xuICAgICAgICAgICAgICAgIGlmIChiQXR0ci5pbmNsdWRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMudW5pcXVlVmFsdWVzKFsuLi5hLCAuLi5iQXR0ci5pbmNsdWRlLCBcImlkXCJdLCB4ID0+IHgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBiID8gQXJyYXlVdGlscy51bmlxdWVWYWx1ZXMoWy4uLmEsIFwiaWRcIl0sIHggPT4geCkgOiBiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYUF0dHIgPSAoYSA/PyB7fSkgYXMgQXR0cjtcbiAgICAgICAgICAgICAgICBpZiAoYUF0dHIuaW5jbHVkZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheVV0aWxzLnVuaXF1ZVZhbHVlcyhbLi4uYiwgLi4uYUF0dHIuaW5jbHVkZSwgXCJpZFwiXSwgeCA9PiB4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYSA/IEFycmF5VXRpbHMudW5pcXVlVmFsdWVzKFsuLi5iLCBcImlkXCJdLCB4ID0+IHgpIDogYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBdHRyID0ge307XG4gICAgICAgICAgICBpZiAoYUF0dHJpYnV0ZXMuaW5jbHVkZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmluY2x1ZGUgPSBbLi4uYUF0dHJpYnV0ZXMuaW5jbHVkZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYkF0dHJpYnV0ZXMuaW5jbHVkZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmluY2x1ZGUgPSBbLi4uKHJlc3VsdC5pbmNsdWRlID8/IFtdKSwgLi4uYkF0dHJpYnV0ZXMuaW5jbHVkZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhQXR0cmlidXRlcy5leGNsdWRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZXhjbHVkZSA9IFsuLi5hQXR0cmlidXRlcy5leGNsdWRlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiQXR0cmlidXRlcy5leGNsdWRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZXhjbHVkZSA9IFsuLi4ocmVzdWx0LmV4Y2x1ZGUgPz8gW10pLCAuLi5iQXR0cmlidXRlcy5leGNsdWRlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmluY2x1ZGUgPSBBcnJheVV0aWxzLnVuaXF1ZVZhbHVlcyhyZXN1bHQuaW5jbHVkZSwgeCA9PiB4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXhjbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5leGNsdWRlID0gQXJyYXlVdGlscy51bmlxdWVWYWx1ZXMocmVzdWx0LmV4Y2x1ZGUsIHggPT4geCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0LmluY2x1ZGUgJiYgIXJlc3VsdC5leGNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBGaW5kQXR0cmlidXRlT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlQXR0cmlidXRlc1ZhbGlkaXR5KGF0dHJpYnV0ZTogRmluZEF0dHJpYnV0ZU9wdGlvbnMpOiBGaW5kQXR0cmlidXRlT3B0aW9ucyB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5maW5kKCh4KSA9PiB4ID09PSBcImlkXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgXCJpZFwiLFxuICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuZXhjbHVkZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBhdHRyaWJ1dGUuZXhjbHVkZS5maWx0ZXIoKHgpID0+IHggIT09IFwiaWRcIilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXR0cmlidXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VXaGVyZShhOiBXaGVyZU9wdGlvbnMgfCB1bmRlZmluZWQsIGI6IFdoZXJlT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFdoZXJlT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghYSAmJiAhYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGEgPz8ge30sIGIgPz8ge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VPcmRlcihhOiBPcmRlciB8IHVuZGVmaW5lZCwgYjogT3JkZXIgfCB1bmRlZmluZWQpOiBPcmRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghYSAmJiAhYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhICYmICFiKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWEgJiYgYikge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXM6IE9yZGVySXRlbVtdID0gW107XG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKC4uLmEpO1xuICAgICAgICB9IGVsc2UgaWYgKGEpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKC4uLmIpO1xuICAgICAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZVdoZXJlVmFsdWUocnVsZTogUnVsZU1vZGVsKTogV2hlcmVBdHRyaWJ1dGVIYXNoVmFsdWU8YW55PiB7XG4gICAgICAgIHN3aXRjaCAocnVsZS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcXVhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlIGFzIGFueTtcblxuICAgICAgICAgICAgY2FzZSBcIm5vdF9lcXVhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5uZV06IHJ1bGUudmFsdWUgfTtcblxuICAgICAgICAgICAgY2FzZSBcImluXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmluXTogcnVsZS52YWx1ZSBhcyBhbnlbXSB9O1xuXG4gICAgICAgICAgICBjYXNlIFwibm90X2luXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5vdEluXTogcnVsZS52YWx1ZSBhcyBhbnlbXSB9O1xuXG4gICAgICAgICAgICBjYXNlIFwibGVzc1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5sdF06IHJ1bGUudmFsdWUgYXMgYW55IH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJsZXNzX29yX2VxdWFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmx0ZV06IHJ1bGUudmFsdWUgYXMgYW55IH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmd0XTogcnVsZS52YWx1ZSBhcyBhbnkgfTtcblxuICAgICAgICAgICAgY2FzZSBcImdyZWF0ZXJfb3JfZXF1YWxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3AuZ3RlXTogcnVsZS52YWx1ZSBhcyBhbnkgfTtcblxuICAgICAgICAgICAgY2FzZSBcImJldHdlZW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3AuYmV0d2Vlbl06IHJ1bGUudmFsdWUgYXMgYW55IH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJub3RfYmV0d2VlblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5ub3RCZXR3ZWVuXTogcnVsZS52YWx1ZSBhcyBhbnkgfTtcblxuICAgICAgICAgICAgY2FzZSBcImlzX251bGxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3AuZXFdOiBudWxsIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJpc19ub3RfbnVsbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5uZV06IG51bGwgfTtcblxuICAgICAgICAgICAgY2FzZSBcImJlZ2luc193aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmxpa2VdOiBgJHtydWxlLnZhbHVlfSVgIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJub3RfYmVnaW5zX3dpdGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3Aubm90TGlrZV06IGAke3J1bGUudmFsdWV9JWAgfTtcblxuICAgICAgICAgICAgY2FzZSBcImNvbnRhaW5zXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmxpa2VdOiBgJSR7cnVsZS52YWx1ZX0lYCB9O1xuXG4gICAgICAgICAgICBjYXNlIFwibm90X2NvbnRhaW5zXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5vdExpa2VdOiBgJSR7cnVsZS52YWx1ZX0lYCB9O1xuXG4gICAgICAgICAgICBjYXNlIFwiZW5kc193aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmxpa2VdOiBgJSR7cnVsZS52YWx1ZX1gIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJub3RfZW5kc193aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5vdExpa2VdOiBgJSR7cnVsZS52YWx1ZX1gIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJpc19lbXB0eVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXNfbm90X2VtcHR5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5lXTogXCJcIiB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBdHRyaWJ1dGVGdWxsTmFtZShhdHRyaWJ1dGU6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJCR7cGF0aH0uJHthdHRyaWJ1dGV9JGA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRMaXRlcmFsRnVsbE5hbWUoYXR0cmlidXRlOiBzdHJpbmcsIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXFxgJHtwYXRoLmpvaW4oXCItPlwiKX1cXGAuXFxgJHthdHRyaWJ1dGV9XFxgYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldE9yZGVyRnVsbE5hbWUoYXR0cmlidXRlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBgJHtwYXRoLmpvaW4oXCItPlwiKX0uJHthdHRyaWJ1dGV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldE1vZGVsU2VhcmNoYWJsZUF0dHJpYnV0ZXMobW9kZWw6IHR5cGVvZiBNKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobW9kZWwucmF3QXR0cmlidXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgYSA9PiAhW1wiREFURVwiLCBcIkRBVEVPTkxZXCIsIFwiVklSVFVBTFwiXS5zb21lKHQgPT4gdCA9PT0gKG1vZGVsLnJhd0F0dHJpYnV0ZXNbYV0udHlwZSBhcyBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IpLmtleSlcbiAgICAgICAgKS5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHRyID0gbW9kZWwucmF3QXR0cmlidXRlc1t4XTtcbiAgICAgICAgICAgIGlmICghYXR0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF0dHIuZmllbGQgPyBhdHRyLmZpZWxkIDogeDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRNb2RlbFNlYXJjaGFibGVGaWVsZEF0dHJpYnV0ZXMobW9kZWw6IHR5cGVvZiBNLCBmaWVsZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWwucmF3QXR0cmlidXRlcztcbiAgICAgICAgcmV0dXJuIGZpZWxkc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1t4XTtcbiAgICAgICAgICAgICAgICBpZiAoIWF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAhW1wiREFURVwiLCBcIkRBVEVPTkxZXCIsIFwiVklSVFVBTFwiXS5zb21lKHQgPT4gdCA9PT0gKGF0dHIudHlwZSBhcyBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IpLmtleSk7XG4gICAgICAgICAgICB9KS5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IGF0dHJpYnV0ZXNbeF07XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLmZpZWxkID8gYXR0ci5maWVsZCA6IHg7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlZHVjZU1vZGVsRnJvbVBhdGgobW9kZWw6IE0sIHBhdGg6IHN0cmluZyk6IE0gfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc3RlcHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICBsZXQgc3RlcCA9IHN0ZXBzLnNoaWZ0KCk7XG4gICAgICAgIHdoaWxlIChzdGVwKSB7XG4gICAgICAgICAgICBpZiAoKG1vZGVsIGFzIGFueSlbc3RlcF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIGlmICghc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kZWwgYXMgYW55KVtzdGVwXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKChtb2RlbCBhcyBhbnkpW3N0ZXBdIGFzIEFycmF5PGFueT4pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB0aGlzLnJlZHVjZU1vZGVsRnJvbVBhdGgoeCwgc3RlcHMuam9pbihcIi5cIikpKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhbGw6IGFueSwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYWxsLCAuLi5jdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYWxsLCBjdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2RlbCA9IChtb2RlbCBhcyBhbnkpW3N0ZXBdO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwID0gc3RlcHMuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRDb2x1bW5GaWVsZE5hbWUobW9kZWw6IHR5cGVvZiBNLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmaWVsZCA9IE9iamVjdC5rZXlzKG1vZGVsLnJhd0F0dHJpYnV0ZXMpLmZpbmQoKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKG1vZGVsLnJhd0F0dHJpYnV0ZXMgYXMgYW55KVtrZXldLmZpZWxkID09PSBuYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChtb2RlbC5yYXdBdHRyaWJ1dGVzIGFzIGFueSlbZmllbGQgYXMgc3RyaW5nXS5maWVsZCA/PyBuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNDb2x1bW5Kc29uKG1vZGVsOiB0eXBlb2YgTSwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGF0dHIgPSBtb2RlbC5yYXdBdHRyaWJ1dGVzW25hbWVdID8/IE9iamVjdC52YWx1ZXMobW9kZWwucmF3QXR0cmlidXRlcykuZmluZCgoeCkgPT4geC5maWVsZCA9PT0gbmFtZSk7XG4gICAgICAgIHJldHVybiAoYXR0cj8udHlwZSBhcyBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IpPy5rZXkgPT09IFwiSlNPTlwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R3JvdXBMaXRlcmFsKG1vZGVsOiB0eXBlb2YgTSwgZ3JvdXA6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ3JvdXAuc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICByZXR1cm4gU2VxdWVsaXplVXRpbHMuZ2V0TGl0ZXJhbEZ1bGxOYW1lKGNvbHVtbiwgaXRlbXMuc2xpY2UoMCwgaXRlbXMubGVuZ3RoIC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGBcXGAke21vZGVsLm5hbWV9XFxgLlxcYCR7Z3JvdXB9XFxgYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlV2hlcmVDb25kaXRpb25zKG1vZGVsOiBJbmNsdWRlV2hlcmVNb2RlbCwgb3B0aW9ucz86IG9iamVjdCk6IFdoZXJlT3B0aW9ucyB7XG4gICAgICAgIGNvbnN0IHdoZXJlID0ge307XG4gICAgICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICAgICAgICAuLi5PYmplY3Qua2V5cyhtb2RlbCksXG4gICAgICAgICAgICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG1vZGVsKVxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXkgYXMgYW55XShvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAod2hlcmUgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2hlcmU7XG4gICAgfVxufVxuIl19
|
|
314
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsT0FBTyxjQUFjLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0RjtRQUVELE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFFTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsS0FBd0IsRUFBRSxPQUFnQjtRQUM1RSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEdBQUc7WUFDVCxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQztTQUN6QyxDQUFDO1FBQ0YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLFNBQVM7YUFDWjtZQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDN0IsS0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUMvQjtTQUNKO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBNVdELHdDQTRXQyIsImZpbGUiOiJsaWIvc2VxdWVsaXplLnV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJyYXlVdGlscywgVHlwZVV0aWxzIH0gZnJvbSBcIkByZWN1cnN5dmUvbmVzdGpzLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IsXG4gICAgRmluZEF0dHJpYnV0ZU9wdGlvbnMsXG4gICAgSW5jbHVkZWFibGUsXG4gICAgSW5jbHVkZU9wdGlvbnMsXG4gICAgT3AsXG4gICAgT3JkZXIsXG4gICAgT3JkZXJJdGVtLFxuICAgIFdoZXJlT3B0aW9uc1xufSBmcm9tIFwic2VxdWVsaXplXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJzZXF1ZWxpemUtdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgUHJvamVjdGlvbkFsaWFzLCBXaGVyZUF0dHJpYnV0ZUhhc2hWYWx1ZSB9IGZyb20gXCJzZXF1ZWxpemUvdHlwZXMvbW9kZWxcIjtcbmltcG9ydCB7IFJ1bGVNb2RlbCB9IGZyb20gXCIuL2ZpbHRlclwiO1xuaW1wb3J0IHsgSW5jbHVkZVdoZXJlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHMvaW5jbHVkZS5tb2RlbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlb1BvaW50IHtcbiAgICB0eXBlOiBcInBvaW50XCIsXG4gICAgY29vcmRpbmF0ZXM6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgTSBleHRlbmRzIE1vZGVsIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZWxpemVVdGlscyB7XG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2VJbmNsdWRlcyhpbmNsdWRlczogQXJyYXk8SW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdPiwgaWdub3JlQXR0cmlidXRlcyA9IGZhbHNlKTogSW5jbHVkZWFibGVbXSB7XG4gICAgICAgIGxldCBpbmNsdWRlOiBJbmNsdWRlT3B0aW9uc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpbmNsdWRlcykge1xuICAgICAgICAgICAgaW5jbHVkZSA9IHRoaXMubWVyZ2VJbmNsdWRlcyhpbmNsdWRlLCBpLCBpZ25vcmVBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmNsdWRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VJbmNsdWRlcyhhOiBJbmNsdWRlT3B0aW9ucyB8IEluY2x1ZGVPcHRpb25zW10gPSBbXSwgYjogSW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdID0gW10sIGlnbm9yZUF0dHJpYnV0ZXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgICAgIGEgPSBbYV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgICAgIGIgPSBbYl07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGJDaGlsZCBvZiBiKSB7XG4gICAgICAgICAgICBjb25zdCBhQ2hpbGQgPSBhLmZpbmQodmFsdWUgPT4gdmFsdWUubW9kZWwgPT09IGJDaGlsZC5tb2RlbCAmJiB2YWx1ZS5hcyA9PT0gYkNoaWxkLmFzKTtcbiAgICAgICAgICAgIGlmIChhQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBhQ2hpbGQuaW5jbHVkZSA9IHRoaXMubWVyZ2VJbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgKGFDaGlsZC5pbmNsdWRlIGFzIEluY2x1ZGVPcHRpb25zW10pID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICAoYkNoaWxkLmluY2x1ZGUgYXMgSW5jbHVkZU9wdGlvbnNbXSkgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICgoYUNoaWxkLmF0dHJpYnV0ZXMgfHwgYkNoaWxkLmF0dHJpYnV0ZXMpICYmICFpZ25vcmVBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFDaGlsZC5hdHRyaWJ1dGVzID0gdGhpcy5tZXJnZUF0dHJpYnV0ZXMoYUNoaWxkLmF0dHJpYnV0ZXMsIGJDaGlsZC5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgd2hlcmUgPSB0aGlzLm1lcmdlV2hlcmUoYUNoaWxkLndoZXJlLCBiQ2hpbGQud2hlcmUpO1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZSkge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQud2hlcmUgPSB3aGVyZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLm1lcmdlT3JkZXIoYUNoaWxkLm9yZGVyLCBiQ2hpbGQub3JkZXIpO1xuICAgICAgICAgICAgICAgIGlmIChvcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFDaGlsZC5yZXF1aXJlZCB8fCBiQ2hpbGQucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYUNoaWxkLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFDaGlsZC5zZXBhcmF0ZSB8fCBiQ2hpbGQuc2VwYXJhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYUNoaWxkLnNlcGFyYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJDaGlsZC5saW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQubGltaXQgPz89IGJDaGlsZC5saW1pdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYUNoaWxkLnBhcmFub2lkID0gIShhQ2hpbGQucGFyYW5vaWQgPT09IGZhbHNlIHx8IGJDaGlsZC5wYXJhbm9pZCA9PT0gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChUeXBlVXRpbHMuaXNOb3ROdWxsT3JVbmRlZmluZWQoYUNoaWxkLnN1YlF1ZXJ5KSB8fCBUeXBlVXRpbHMuaXNOb3ROdWxsT3JVbmRlZmluZWQoYkNoaWxkLnN1YlF1ZXJ5KSkge1xuICAgICAgICAgICAgICAgICAgICBhQ2hpbGQuc3ViUXVlcnkgPSBhQ2hpbGQuc3ViUXVlcnkgPz8gYkNoaWxkLnN1YlF1ZXJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYS5wdXNoKGJDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1lcmdlQXR0cmlidXRlcyhhOiBGaW5kQXR0cmlidXRlT3B0aW9ucyB8IHVuZGVmaW5lZCwgYjogRmluZEF0dHJpYnV0ZU9wdGlvbnMgfCB1bmRlZmluZWQpOiBGaW5kQXR0cmlidXRlT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHR5cGUgQXR0ciA9IHsgZXhjbHVkZT86IHN0cmluZ1tdOyBpbmNsdWRlPzogKHN0cmluZyB8IFByb2plY3Rpb25BbGlhcylbXTsgfTtcblxuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEFycmF5ICYmIGIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMudW5pcXVlVmFsdWVzKFsuLi5hLCAuLi5iLCBcImlkXCJdLCB4ID0+IHgpO1xuICAgICAgICB9IGVsc2UgaWYgKGEgfHwgYikge1xuICAgICAgICAgICAgY29uc3QgYUF0dHJpYnV0ZXMgPSAoYSA/PyB7fSkgYXMgQXR0cjtcbiAgICAgICAgICAgIGNvbnN0IGJBdHRyaWJ1dGVzID0gKGIgPz8ge30pIGFzIEF0dHI7XG5cbiAgICAgICAgICAgIGlmIChhQXR0cmlidXRlcy5pbmNsdWRlICYmICFiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiQXR0cmlidXRlcy5pbmNsdWRlICYmICFhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiQXR0ciA9IChiID8/IHt9KSBhcyBBdHRyO1xuICAgICAgICAgICAgICAgIGlmIChiQXR0ci5pbmNsdWRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMudW5pcXVlVmFsdWVzKFsuLi5hLCAuLi5iQXR0ci5pbmNsdWRlLCBcImlkXCJdLCB4ID0+IHgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBiID8gQXJyYXlVdGlscy51bmlxdWVWYWx1ZXMoWy4uLmEsIFwiaWRcIl0sIHggPT4geCkgOiBiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYUF0dHIgPSAoYSA/PyB7fSkgYXMgQXR0cjtcbiAgICAgICAgICAgICAgICBpZiAoYUF0dHIuaW5jbHVkZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheVV0aWxzLnVuaXF1ZVZhbHVlcyhbLi4uYiwgLi4uYUF0dHIuaW5jbHVkZSwgXCJpZFwiXSwgeCA9PiB4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYSA/IEFycmF5VXRpbHMudW5pcXVlVmFsdWVzKFsuLi5iLCBcImlkXCJdLCB4ID0+IHgpIDogYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBdHRyID0ge307XG4gICAgICAgICAgICBpZiAoYUF0dHJpYnV0ZXMuaW5jbHVkZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmluY2x1ZGUgPSBbLi4uYUF0dHJpYnV0ZXMuaW5jbHVkZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYkF0dHJpYnV0ZXMuaW5jbHVkZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmluY2x1ZGUgPSBbLi4uKHJlc3VsdC5pbmNsdWRlID8/IFtdKSwgLi4uYkF0dHJpYnV0ZXMuaW5jbHVkZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhQXR0cmlidXRlcy5leGNsdWRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZXhjbHVkZSA9IFsuLi5hQXR0cmlidXRlcy5leGNsdWRlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiQXR0cmlidXRlcy5leGNsdWRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZXhjbHVkZSA9IFsuLi4ocmVzdWx0LmV4Y2x1ZGUgPz8gW10pLCAuLi5iQXR0cmlidXRlcy5leGNsdWRlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmluY2x1ZGUgPSBBcnJheVV0aWxzLnVuaXF1ZVZhbHVlcyhyZXN1bHQuaW5jbHVkZSwgeCA9PiB4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXhjbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5leGNsdWRlID0gQXJyYXlVdGlscy51bmlxdWVWYWx1ZXMocmVzdWx0LmV4Y2x1ZGUsIHggPT4geCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0LmluY2x1ZGUgJiYgIXJlc3VsdC5leGNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBGaW5kQXR0cmlidXRlT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlQXR0cmlidXRlc1ZhbGlkaXR5KGF0dHJpYnV0ZTogRmluZEF0dHJpYnV0ZU9wdGlvbnMpOiBGaW5kQXR0cmlidXRlT3B0aW9ucyB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5maW5kKCh4KSA9PiB4ID09PSBcImlkXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgXCJpZFwiLFxuICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuZXhjbHVkZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBhdHRyaWJ1dGUuZXhjbHVkZS5maWx0ZXIoKHgpID0+IHggIT09IFwiaWRcIilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXR0cmlidXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VXaGVyZShhOiBXaGVyZU9wdGlvbnMgfCB1bmRlZmluZWQsIGI6IFdoZXJlT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFdoZXJlT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghYSAmJiAhYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGEgPz8ge30sIGIgPz8ge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VPcmRlcihhOiBPcmRlciB8IHVuZGVmaW5lZCwgYjogT3JkZXIgfCB1bmRlZmluZWQpOiBPcmRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghYSAmJiAhYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhICYmICFiKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWEgJiYgYikge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXM6IE9yZGVySXRlbVtdID0gW107XG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKC4uLmEpO1xuICAgICAgICB9IGVsc2UgaWYgKGEpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKC4uLmIpO1xuICAgICAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZVdoZXJlVmFsdWUocnVsZTogUnVsZU1vZGVsKTogV2hlcmVBdHRyaWJ1dGVIYXNoVmFsdWU8YW55PiB7XG4gICAgICAgIHN3aXRjaCAocnVsZS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcXVhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlIGFzIGFueTtcblxuICAgICAgICAgICAgY2FzZSBcIm5vdF9lcXVhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5uZV06IHJ1bGUudmFsdWUgfTtcblxuICAgICAgICAgICAgY2FzZSBcImluXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmluXTogcnVsZS52YWx1ZSBhcyBhbnlbXSB9O1xuXG4gICAgICAgICAgICBjYXNlIFwibm90X2luXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5vdEluXTogcnVsZS52YWx1ZSBhcyBhbnlbXSB9O1xuXG4gICAgICAgICAgICBjYXNlIFwibGVzc1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5sdF06IHJ1bGUudmFsdWUgYXMgYW55IH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJsZXNzX29yX2VxdWFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmx0ZV06IHJ1bGUudmFsdWUgYXMgYW55IH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmd0XTogcnVsZS52YWx1ZSBhcyBhbnkgfTtcblxuICAgICAgICAgICAgY2FzZSBcImdyZWF0ZXJfb3JfZXF1YWxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3AuZ3RlXTogcnVsZS52YWx1ZSBhcyBhbnkgfTtcblxuICAgICAgICAgICAgY2FzZSBcImJldHdlZW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3AuYmV0d2Vlbl06IHJ1bGUudmFsdWUgYXMgYW55IH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJub3RfYmV0d2VlblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5ub3RCZXR3ZWVuXTogcnVsZS52YWx1ZSBhcyBhbnkgfTtcblxuICAgICAgICAgICAgY2FzZSBcImlzX251bGxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3AuZXFdOiBudWxsIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJpc19ub3RfbnVsbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IFtPcC5uZV06IG51bGwgfTtcblxuICAgICAgICAgICAgY2FzZSBcImJlZ2luc193aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmxpa2VdOiBgJHtydWxlLnZhbHVlfSVgIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJub3RfYmVnaW5zX3dpdGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbT3Aubm90TGlrZV06IGAke3J1bGUudmFsdWV9JWAgfTtcblxuICAgICAgICAgICAgY2FzZSBcImNvbnRhaW5zXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmxpa2VdOiBgJSR7cnVsZS52YWx1ZX0lYCB9O1xuXG4gICAgICAgICAgICBjYXNlIFwibm90X2NvbnRhaW5zXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5vdExpa2VdOiBgJSR7cnVsZS52YWx1ZX0lYCB9O1xuXG4gICAgICAgICAgICBjYXNlIFwiZW5kc193aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLmxpa2VdOiBgJSR7cnVsZS52YWx1ZX1gIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJub3RfZW5kc193aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5vdExpa2VdOiBgJSR7cnVsZS52YWx1ZX1gIH07XG5cbiAgICAgICAgICAgIGNhc2UgXCJpc19lbXB0eVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXNfbm90X2VtcHR5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW09wLm5lXTogXCJcIiB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBdHRyaWJ1dGVGdWxsTmFtZShhdHRyaWJ1dGU6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJCR7cGF0aH0uJHthdHRyaWJ1dGV9JGA7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRMaXRlcmFsRnVsbE5hbWUoYXR0cmlidXRlOiBzdHJpbmcsIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgXFxgJHtwYXRoLmpvaW4oXCItPlwiKX1cXGAuXFxgJHthdHRyaWJ1dGV9XFxgYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldE9yZGVyRnVsbE5hbWUoYXR0cmlidXRlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBgJHtwYXRoLmpvaW4oXCItPlwiKX0uJHthdHRyaWJ1dGV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldE1vZGVsU2VhcmNoYWJsZUF0dHJpYnV0ZXMobW9kZWw6IHR5cGVvZiBNKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobW9kZWwucmF3QXR0cmlidXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgYSA9PiAhW1wiREFURVwiLCBcIkRBVEVPTkxZXCIsIFwiVklSVFVBTFwiXS5zb21lKHQgPT4gdCA9PT0gKG1vZGVsLnJhd0F0dHJpYnV0ZXNbYV0udHlwZSBhcyBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IpLmtleSlcbiAgICAgICAgKS5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHRyID0gbW9kZWwucmF3QXR0cmlidXRlc1t4XTtcbiAgICAgICAgICAgIGlmICghYXR0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF0dHIuZmllbGQgPyBhdHRyLmZpZWxkIDogeDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRNb2RlbFNlYXJjaGFibGVGaWVsZEF0dHJpYnV0ZXMobW9kZWw6IHR5cGVvZiBNLCBmaWVsZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWwucmF3QXR0cmlidXRlcztcbiAgICAgICAgcmV0dXJuIGZpZWxkc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1t4XTtcbiAgICAgICAgICAgICAgICBpZiAoIWF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAhW1wiREFURVwiLCBcIkRBVEVPTkxZXCIsIFwiVklSVFVBTFwiXS5zb21lKHQgPT4gdCA9PT0gKGF0dHIudHlwZSBhcyBBYnN0cmFjdERhdGFUeXBlQ29uc3RydWN0b3IpLmtleSk7XG4gICAgICAgICAgICB9KS5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IGF0dHJpYnV0ZXNbeF07XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLmZpZWxkID8gYXR0ci5maWVsZCA6IHg7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlZHVjZU1vZGVsRnJvbVBhdGgobW9kZWw6IE0sIHBhdGg6IHN0cmluZyk6IE0gfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc3RlcHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICBsZXQgc3RlcCA9IHN0ZXBzLnNoaWZ0KCk7XG4gICAgICAgIHdoaWxlIChzdGVwKSB7XG4gICAgICAgICAgICBpZiAoKG1vZGVsIGFzIGFueSlbc3RlcF0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIGlmICghc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kZWwgYXMgYW55KVtzdGVwXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKChtb2RlbCBhcyBhbnkpW3N0ZXBdIGFzIEFycmF5PGFueT4pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoeCA9PiB0aGlzLnJlZHVjZU1vZGVsRnJvbVBhdGgoeCwgc3RlcHMuam9pbihcIi5cIikpKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhbGw6IGFueSwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYWxsLCAuLi5jdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYWxsLCBjdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2RlbCA9IChtb2RlbCBhcyBhbnkpW3N0ZXBdO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwID0gc3RlcHMuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRDb2x1bW5GaWVsZE5hbWUobW9kZWw6IHR5cGVvZiBNLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmaWVsZCA9IE9iamVjdC5rZXlzKG1vZGVsLnJhd0F0dHJpYnV0ZXMpLmZpbmQoKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKG1vZGVsLnJhd0F0dHJpYnV0ZXMgYXMgYW55KVtrZXldPy5maWVsZCA9PT0gbmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAobW9kZWwucmF3QXR0cmlidXRlcyBhcyBhbnkpW2ZpZWxkIGFzIHN0cmluZ10/LmZpZWxkID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbHVtbkpzb24obW9kZWw6IHR5cGVvZiBNLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYXR0ciA9IG1vZGVsLnJhd0F0dHJpYnV0ZXNbbmFtZV0gPz8gT2JqZWN0LnZhbHVlcyhtb2RlbC5yYXdBdHRyaWJ1dGVzKS5maW5kKCh4KSA9PiB4LmZpZWxkID09PSBuYW1lKTtcbiAgICAgICAgcmV0dXJuIChhdHRyPy50eXBlIGFzIEFic3RyYWN0RGF0YVR5cGVDb25zdHJ1Y3Rvcik/LmtleSA9PT0gXCJKU09OXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRHcm91cExpdGVyYWwobW9kZWw6IHR5cGVvZiBNLCBncm91cDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBncm91cC5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBTZXF1ZWxpemVVdGlscy5nZXRMaXRlcmFsRnVsbE5hbWUoY29sdW1uLCBpdGVtcy5zbGljZSgwLCBpdGVtcy5sZW5ndGggLSAxKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYFxcYCR7bW9kZWwubmFtZX1cXGAuXFxgJHtncm91cH1cXGBgO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVXaGVyZUNvbmRpdGlvbnMobW9kZWw6IEluY2x1ZGVXaGVyZU1vZGVsLCBvcHRpb25zPzogb2JqZWN0KTogV2hlcmVPcHRpb25zIHtcbiAgICAgICAgY29uc3Qgd2hlcmUgPSB7fTtcbiAgICAgICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG1vZGVsKSxcbiAgICAgICAgICAgIC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobW9kZWwpXG4gICAgICAgIF07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICghbW9kZWwuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleSBhcyBhbnldKG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICh3aGVyZSBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3aGVyZTtcbiAgICB9XG59XG4iXX0=
|