@recursyve/nestjs-data-filter 8.5.4 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/index.js +6 -2
  2. package/lib/adapters/default-access-control.adapter.js +1 -1
  3. package/lib/adapters/default-export.adapter.js +1 -1
  4. package/lib/adapters/default-translate.adapter.js +1 -1
  5. package/lib/adapters/index.js +6 -2
  6. package/lib/data-filter.repository.js +4 -4
  7. package/lib/data-filter.service.js +1 -1
  8. package/lib/decorators/index.js +6 -2
  9. package/lib/deserializers/index.js +6 -2
  10. package/lib/filter/controllers/dynamic-filter.controller.js +1 -1
  11. package/lib/filter/controllers/filter.controller.js +1 -1
  12. package/lib/filter/filter.service.js +1 -1
  13. package/lib/filter/filters/filter.d.ts +4 -5
  14. package/lib/filter/filters/filter.js +14 -11
  15. package/lib/filter/filters/geo-bounds.filter.d.ts +1 -1
  16. package/lib/filter/filters/group.filter.js +6 -6
  17. package/lib/filter/filters/index.js +6 -2
  18. package/lib/filter/filters/radio.filter.d.ts +2 -2
  19. package/lib/filter/filters/radio.filter.js +2 -2
  20. package/lib/filter/guards/filter-query.guard.js +1 -1
  21. package/lib/filter/index.d.ts +0 -1
  22. package/lib/filter/index.js +6 -3
  23. package/lib/filter/interceptors/data-file-download.interceptor.js +1 -1
  24. package/lib/filter/models/filter.model.d.ts +1 -1
  25. package/lib/filter/models/index.js +6 -2
  26. package/lib/filter/models/query.model.d.ts +1 -1
  27. package/lib/filter/models/query.model.js +1 -1
  28. package/lib/filter/operators.d.ts +1 -1
  29. package/lib/filter/order-rules/index.js +6 -2
  30. package/lib/filter/order-rules/order-rule.d.ts +1 -1
  31. package/lib/index.js +6 -2
  32. package/lib/models/data-filter.model.js +3 -3
  33. package/lib/models/distance.model.d.ts +1 -1
  34. package/lib/scanners/data-filter.scanner.js +1 -1
  35. package/lib/scanners/sequelize-model.scanner.js +1 -1
  36. package/lib/services/data-filter-validation.service.js +1 -1
  37. package/package.json +26 -26
  38. package/lib/filter/filters/json-array.filter.d.ts +0 -16
  39. package/lib/filter/filters/json-array.filter.js +0 -58
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@recursyve/nestjs-data-filter",
3
- "version": "8.5.4",
3
+ "version": "9.0.0",
4
4
  "description": "NestJs DataFilter library",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -19,40 +19,40 @@
19
19
  "author": "Recursyve",
20
20
  "license": "MIT",
21
21
  "peerDependencies": {
22
- "@nestjs/common": ">=8.0.0",
23
- "@nestjs/core": ">=8.0.0",
24
- "@recursyve/nestjs-common": ">=8.0.0",
25
- "sequelize": ">=6.19.0",
26
- "sequelize-typescript": ">=2.1.0",
22
+ "@nestjs/common": ">=9.0.0",
23
+ "@nestjs/core": ">=9.0.0",
24
+ "@recursyve/nestjs-common": ">=9.0.0",
27
25
  "date-fns": "^2.28.0",
28
- "date-fns-tz": "^1.3.4"
26
+ "date-fns-tz": "^1.3.4",
27
+ "sequelize": ">=6.28.0",
28
+ "sequelize-typescript": ">=2.1.0"
29
29
  },
30
30
  "devDependencies": {
31
- "@nestjs/common": "^8.2.6",
32
- "@nestjs/core": "^8.2.6",
33
- "@nestjs/testing": "^8.2.6",
34
- "@recursyve/nestjs-common": "^8.0.4",
35
- "@types/express": "^4.17.13",
36
- "@types/jest": "^27.4.0",
37
- "@types/node": "^17.0.15",
31
+ "@nestjs/common": "^9.2.1",
32
+ "@nestjs/core": "^9.2.1",
33
+ "@nestjs/testing": "^9.2.1",
34
+ "@recursyve/nestjs-common": "^9.0.1",
35
+ "@types/express": "^4.17.15",
36
+ "@types/jest": "^29.2.5",
37
+ "@types/node": "^18.11.18",
38
38
  "class-transformer": "^0.5.1",
39
- "class-validator": "^0.13.2",
40
- "date-fns": "^2.28.0",
41
- "date-fns-tz": "^1.3.4",
42
- "express": "^4.17.2",
39
+ "class-validator": "^0.14.0",
40
+ "date-fns": "^2.29.3",
41
+ "date-fns-tz": "^1.3.7",
42
+ "express": "^4.18.2",
43
43
  "gulp": "^4.0.2",
44
44
  "gulp-copy": "^4.0.1",
45
45
  "gulp-sourcemaps": "^3.0.0",
46
46
  "gulp-typescript": "^6.0.0-alpha.1",
47
- "jest": "^27.5.0",
47
+ "jest": "^29.3.1",
48
48
  "reflect-metadata": "^0.1.13",
49
- "rxjs": "^7.5.2",
50
- "sequelize": "^6.19.0",
51
- "sequelize-typescript": "^2.1.3",
52
- "sqlite3": "^5.0.2",
53
- "ts-jest": "^27.1.3",
54
- "ts-node": "^10.4.0",
55
- "typescript": "^4.5.5"
49
+ "rxjs": "^7.8.0",
50
+ "sequelize": "^6.28.0",
51
+ "sequelize-typescript": "^2.1.5",
52
+ "sqlite3": "^5.1.4",
53
+ "ts-jest": "^29.0.3",
54
+ "ts-node": "^10.9.1",
55
+ "typescript": "^4.9.4"
56
56
  },
57
57
  "jest": {
58
58
  "moduleFileExtensions": [
@@ -1,16 +0,0 @@
1
- import { WhereOptions } from "sequelize";
2
- import { FilterOperatorTypes, QueryRuleModel } from "../..";
3
- import { FilterType } from "../type";
4
- import { BaseFilterDefinition, Filter } from "./filter";
5
- export interface JsonArrayFilterDefinition {
6
- jsonPath?: string;
7
- }
8
- export declare class JsonArrayFilter extends Filter {
9
- type: FilterType;
10
- operators: FilterOperatorTypes[];
11
- jsonPath?: string;
12
- constructor(definition: JsonArrayFilterDefinition & BaseFilterDefinition);
13
- getWhereOptions(rule: QueryRuleModel, name?: string): Promise<WhereOptions>;
14
- private generateEqualsLikeOptions;
15
- private generateContainsLikeOptions;
16
- }
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JsonArrayFilter = void 0;
4
- const sequelize_1 = require("sequelize");
5
- const __1 = require("../..");
6
- const sequelize_utils_1 = require("../../sequelize.utils");
7
- const type_1 = require("../type");
8
- const filter_1 = require("./filter");
9
- class JsonArrayFilter extends filter_1.Filter {
10
- constructor(definition) {
11
- super(definition);
12
- this.type = type_1.FilterType.JsonArray;
13
- this.operators = [...__1.JsonArrayOperators];
14
- }
15
- async getWhereOptions(rule, name) {
16
- if (!name) {
17
- name = this.path ? sequelize_utils_1.SequelizeUtils.getAttributeFullName(this.attribute, this.path) : this.attribute;
18
- }
19
- if (rule.operation === __1.FilterOperatorTypes.Equal || rule.operation === __1.FilterOperatorTypes.NotEqual) {
20
- return this.generateEqualsLikeOptions(rule, name);
21
- }
22
- return this.generateContainsLikeOptions(rule, name);
23
- }
24
- async generateEqualsLikeOptions(rule, name) {
25
- const newRule = {
26
- ...rule,
27
- value: (0, sequelize_1.fn)("JSON_ARRAY", rule.value)
28
- };
29
- if (!this.jsonPath) {
30
- return {
31
- [name]: sequelize_utils_1.SequelizeUtils.generateWhereValue(newRule)
32
- };
33
- }
34
- const colName = this.path ? (0, sequelize_1.col)(name) : (0, sequelize_1.literal)(name);
35
- if (this.jsonPath) {
36
- return (0, sequelize_1.where)((0, sequelize_1.fn)("JSON_EXTRACT", colName, this.jsonPath), sequelize_utils_1.SequelizeUtils.generateWhereValue(newRule));
37
- }
38
- return (0, sequelize_1.where)((0, sequelize_1.fn)("JSON_EXTRACT", colName), sequelize_utils_1.SequelizeUtils.generateWhereValue(newRule));
39
- }
40
- async generateContainsLikeOptions(rule, name) {
41
- const value = typeof rule.value === "string" ? `"${rule.value}"` : rule.value;
42
- /**
43
- * We override the rule to use an equal or not equal with a JSON_CONTAINS function
44
- */
45
- const newRule = {
46
- operation: rule.operation === __1.FilterOperatorTypes.Contains ? __1.FilterOperatorTypes.Equal : __1.FilterOperatorTypes.NotEqual,
47
- value: true
48
- };
49
- const colName = this.path ? (0, sequelize_1.col)(name) : (0, sequelize_1.literal)(name);
50
- if (this.jsonPath) {
51
- return (0, sequelize_1.where)((0, sequelize_1.fn)("JSON_CONTAINS", colName, value, this.jsonPath), sequelize_utils_1.SequelizeUtils.generateWhereValue(newRule));
52
- }
53
- return (0, sequelize_1.where)((0, sequelize_1.fn)("JSON_CONTAINS", colName, value), sequelize_utils_1.SequelizeUtils.generateWhereValue(newRule));
54
- }
55
- }
56
- exports.JsonArrayFilter = JsonArrayFilter;
57
-
58
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvZmlsdGVycy9qc29uLWFycmF5LmZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBNkU7QUFDN0UsNkJBQTJGO0FBQzNGLDJEQUF1RDtBQUN2RCxrQ0FBcUM7QUFDckMscUNBQXdEO0FBTXhELE1BQWEsZUFBZ0IsU0FBUSxlQUFNO0lBS3ZDLFlBQVksVUFBNEQ7UUFDcEUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBTGYsU0FBSSxHQUFHLGlCQUFVLENBQUMsU0FBUyxDQUFDO1FBQzVCLGNBQVMsR0FBRyxDQUFDLEdBQUcsc0JBQWtCLENBQUMsQ0FBQztJQUszQyxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFvQixFQUFFLElBQWE7UUFDNUQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQ0FBYyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3RHO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLHVCQUFtQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLHVCQUFtQixDQUFDLFFBQVEsRUFBRTtZQUNqRyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckQ7UUFFRCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxJQUFvQixFQUFFLElBQVk7UUFDdEUsTUFBTSxPQUFPLEdBQUc7WUFDWixHQUFHLElBQUk7WUFDUCxLQUFLLEVBQUUsSUFBQSxjQUFFLEVBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDdEMsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU87Z0JBQ0gsQ0FBQyxJQUFJLENBQUMsRUFBRSxnQ0FBYyxDQUFDLGtCQUFrQixDQUFDLE9BQW9CLENBQUM7YUFDbEUsQ0FBQztTQUNMO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBQSxlQUFHLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsbUJBQU8sRUFBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPLElBQUEsaUJBQUssRUFBQyxJQUFBLGNBQUUsRUFBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxnQ0FBYyxDQUFDLGtCQUFrQixDQUFDLE9BQW9CLENBQWMsQ0FBQyxDQUFBO1NBQ2pJO1FBQ0QsT0FBTyxJQUFBLGlCQUFLLEVBQUMsSUFBQSxjQUFFLEVBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxFQUFFLGdDQUFjLENBQUMsa0JBQWtCLENBQUMsT0FBb0IsQ0FBYyxDQUFDLENBQUE7SUFDbkgsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxJQUFvQixFQUFFLElBQVk7UUFDeEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFOUU7O1dBRUc7UUFDSCxNQUFNLE9BQU8sR0FBRztZQUNaLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLHVCQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsdUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx1QkFBbUIsQ0FBQyxRQUFRO1lBQ3JILEtBQUssRUFBRSxJQUFJO1NBQ2QsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUEsZUFBRyxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTyxJQUFBLGlCQUFLLEVBQUMsSUFBQSxjQUFFLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGdDQUFjLENBQUMsa0JBQWtCLENBQUMsT0FBb0IsQ0FBYyxDQUFDLENBQUE7U0FDekk7UUFDRCxPQUFPLElBQUEsaUJBQUssRUFBQyxJQUFBLGNBQUUsRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLGdDQUFjLENBQUMsa0JBQWtCLENBQUMsT0FBb0IsQ0FBYyxDQUFDLENBQUE7SUFDM0gsQ0FBQztDQUNKO0FBdkRELDBDQXVEQyIsImZpbGUiOiJsaWIvZmlsdGVyL2ZpbHRlcnMvanNvbi1hcnJheS5maWx0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2wsIGZuLCBsaXRlcmFsLCBMb2dpY1R5cGUsIHdoZXJlLCBXaGVyZU9wdGlvbnMgfSBmcm9tIFwic2VxdWVsaXplXCI7XG5pbXBvcnQgeyBGaWx0ZXJPcGVyYXRvclR5cGVzLCBKc29uQXJyYXlPcGVyYXRvcnMsIFF1ZXJ5UnVsZU1vZGVsLCBSdWxlTW9kZWwgfSBmcm9tIFwiLi4vLi5cIjtcbmltcG9ydCB7IFNlcXVlbGl6ZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3NlcXVlbGl6ZS51dGlsc1wiO1xuaW1wb3J0IHsgRmlsdGVyVHlwZSB9IGZyb20gXCIuLi90eXBlXCI7XG5pbXBvcnQgeyBCYXNlRmlsdGVyRGVmaW5pdGlvbiwgRmlsdGVyIH0gZnJvbSBcIi4vZmlsdGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkFycmF5RmlsdGVyRGVmaW5pdGlvbiB7XG4gICAganNvblBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uQXJyYXlGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICAgIHB1YmxpYyB0eXBlID0gRmlsdGVyVHlwZS5Kc29uQXJyYXk7XG4gICAgcHVibGljIG9wZXJhdG9ycyA9IFsuLi5Kc29uQXJyYXlPcGVyYXRvcnNdO1xuICAgIHB1YmxpYyBqc29uUGF0aD86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGRlZmluaXRpb246IEpzb25BcnJheUZpbHRlckRlZmluaXRpb24gJiBCYXNlRmlsdGVyRGVmaW5pdGlvbikge1xuICAgICAgICBzdXBlcihkZWZpbml0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0V2hlcmVPcHRpb25zKHJ1bGU6IFF1ZXJ5UnVsZU1vZGVsLCBuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxXaGVyZU9wdGlvbnM+IHtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5wYXRoID8gU2VxdWVsaXplVXRpbHMuZ2V0QXR0cmlidXRlRnVsbE5hbWUodGhpcy5hdHRyaWJ1dGUsIHRoaXMucGF0aCkgOiB0aGlzLmF0dHJpYnV0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlLm9wZXJhdGlvbiA9PT0gRmlsdGVyT3BlcmF0b3JUeXBlcy5FcXVhbCB8fCBydWxlLm9wZXJhdGlvbiA9PT0gRmlsdGVyT3BlcmF0b3JUeXBlcy5Ob3RFcXVhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVFcXVhbHNMaWtlT3B0aW9ucyhydWxlLCBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ29udGFpbnNMaWtlT3B0aW9ucyhydWxlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRXF1YWxzTGlrZU9wdGlvbnMocnVsZTogUXVlcnlSdWxlTW9kZWwsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8V2hlcmVPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IG5ld1J1bGUgPSB7XG4gICAgICAgICAgICAuLi5ydWxlLFxuICAgICAgICAgICAgdmFsdWU6IGZuKFwiSlNPTl9BUlJBWVwiLCBydWxlLnZhbHVlKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXRoaXMuanNvblBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgW25hbWVdOiBTZXF1ZWxpemVVdGlscy5nZW5lcmF0ZVdoZXJlVmFsdWUobmV3UnVsZSBhcyBSdWxlTW9kZWwpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sTmFtZSA9IHRoaXMucGF0aCA/IGNvbChuYW1lKSA6IGxpdGVyYWwobmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmpzb25QYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gd2hlcmUoZm4oXCJKU09OX0VYVFJBQ1RcIiwgY29sTmFtZSwgdGhpcy5qc29uUGF0aCksIFNlcXVlbGl6ZVV0aWxzLmdlbmVyYXRlV2hlcmVWYWx1ZShuZXdSdWxlIGFzIFJ1bGVNb2RlbCkgYXMgTG9naWNUeXBlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aGVyZShmbihcIkpTT05fRVhUUkFDVFwiLCBjb2xOYW1lKSwgU2VxdWVsaXplVXRpbHMuZ2VuZXJhdGVXaGVyZVZhbHVlKG5ld1J1bGUgYXMgUnVsZU1vZGVsKSBhcyBMb2dpY1R5cGUpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNvbnRhaW5zTGlrZU9wdGlvbnMocnVsZTogUXVlcnlSdWxlTW9kZWwsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8V2hlcmVPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHJ1bGUudmFsdWUgPT09IFwic3RyaW5nXCIgPyBgXCIke3J1bGUudmFsdWV9XCJgIDogcnVsZS52YWx1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2Ugb3ZlcnJpZGUgdGhlIHJ1bGUgdG8gdXNlIGFuIGVxdWFsIG9yIG5vdCBlcXVhbCB3aXRoIGEgSlNPTl9DT05UQUlOUyBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgbmV3UnVsZSA9IHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogcnVsZS5vcGVyYXRpb24gPT09IEZpbHRlck9wZXJhdG9yVHlwZXMuQ29udGFpbnMgPyBGaWx0ZXJPcGVyYXRvclR5cGVzLkVxdWFsIDogRmlsdGVyT3BlcmF0b3JUeXBlcy5Ob3RFcXVhbCxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sTmFtZSA9IHRoaXMucGF0aCA/IGNvbChuYW1lKSA6IGxpdGVyYWwobmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmpzb25QYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gd2hlcmUoZm4oXCJKU09OX0NPTlRBSU5TXCIsIGNvbE5hbWUsIHZhbHVlLCB0aGlzLmpzb25QYXRoKSwgU2VxdWVsaXplVXRpbHMuZ2VuZXJhdGVXaGVyZVZhbHVlKG5ld1J1bGUgYXMgUnVsZU1vZGVsKSBhcyBMb2dpY1R5cGUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdoZXJlKGZuKFwiSlNPTl9DT05UQUlOU1wiLCBjb2xOYW1lLCB2YWx1ZSksIFNlcXVlbGl6ZVV0aWxzLmdlbmVyYXRlV2hlcmVWYWx1ZShuZXdSdWxlIGFzIFJ1bGVNb2RlbCkgYXMgTG9naWNUeXBlKVxuICAgIH1cbn1cbiJdfQ==