@ngx-pwa/local-storage 17.0.0 → 19.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 (43) hide show
  1. package/LICENSE +14 -15
  2. package/fesm2022/ngx-pwa-local-storage.mjs +637 -573
  3. package/fesm2022/ngx-pwa-local-storage.mjs.map +1 -1
  4. package/lib/databases/exceptions.d.ts +2 -2
  5. package/lib/databases/indexeddb-database.d.ts +12 -15
  6. package/lib/databases/localstorage-database.d.ts +2 -2
  7. package/lib/databases/memory-database.d.ts +1 -1
  8. package/lib/providers.d.ts +25 -16
  9. package/lib/storage.module.d.ts +6 -4
  10. package/lib/storages/exceptions.d.ts +1 -1
  11. package/lib/storages/storage-map.service.d.ts +100 -46
  12. package/lib/tokens.d.ts +7 -0
  13. package/lib/validation/json-schema.d.ts +10 -8
  14. package/lib/validation/json-validator.d.ts +9 -9
  15. package/package.json +4 -6
  16. package/public-api.d.ts +2 -2
  17. package/schematics/collection.json +1 -1
  18. package/schematics/migration.json +1 -1
  19. package/schematics/ng-add/index.d.ts +1 -1
  20. package/schematics/ng-add/index.js +7 -8
  21. package/schematics/ng-add/index.js.map +1 -1
  22. package/schematics/ng-update/index.d.ts +1 -1
  23. package/schematics/ng-update/index.js +15 -26
  24. package/schematics/ng-update/index.js.map +1 -1
  25. package/schematics/utility/config.js +24 -33
  26. package/schematics/utility/config.js.map +1 -1
  27. package/schematics/utility/module.d.ts +1 -1
  28. package/schematics/utility/module.js +3 -4
  29. package/schematics/utility/module.js.map +1 -1
  30. package/esm2022/lib/databases/exceptions.mjs +0 -28
  31. package/esm2022/lib/databases/indexeddb-database.mjs +0 -306
  32. package/esm2022/lib/databases/local-database.mjs +0 -68
  33. package/esm2022/lib/databases/localstorage-database.mjs +0 -157
  34. package/esm2022/lib/databases/memory-database.mjs +0 -83
  35. package/esm2022/lib/providers.mjs +0 -57
  36. package/esm2022/lib/storage.module.mjs +0 -32
  37. package/esm2022/lib/storages/exceptions.mjs +0 -15
  38. package/esm2022/lib/storages/storage-map.service.mjs +0 -296
  39. package/esm2022/lib/tokens.mjs +0 -59
  40. package/esm2022/lib/validation/json-schema.mjs +0 -5
  41. package/esm2022/lib/validation/json-validator.mjs +0 -246
  42. package/esm2022/ngx-pwa-local-storage.mjs +0 -5
  43. package/esm2022/public-api.mjs +0 -9
@@ -1,61 +1,50 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.updateToV15 = exports.updateToV13 = exports.updateToV9 = exports.updateToV8 = void 0;
3
+ exports.updateToV8 = updateToV8;
4
+ exports.updateToV9 = updateToV9;
5
+ exports.updateToV13 = updateToV13;
6
+ exports.updateToV15 = updateToV15;
13
7
  const schematics_1 = require("@angular-devkit/schematics");
14
8
  const config_1 = require("../utility/config");
15
9
  const module_1 = require("../utility/module");
16
10
  function updateToV8() {
17
- return (host) => __awaiter(this, void 0, void 0, function* () {
11
+ return async (host) => {
18
12
  /* Get config */
19
- const mainPaths = yield (0, config_1.getAllMainPaths)(host);
13
+ const mainPaths = await (0, config_1.getAllMainPaths)(host);
20
14
  /* Update `AppModule` of all projects */
21
15
  return (0, schematics_1.chain)(mainPaths.map((mainPath) => (0, module_1.updateModule)(mainPath)));
22
- });
16
+ };
23
17
  }
24
- exports.updateToV8 = updateToV8;
25
18
  function updateToV9() {
26
- return (host) => __awaiter(this, void 0, void 0, function* () {
19
+ return async (host) => {
27
20
  /* Get config */
28
- const mainPaths = yield (0, config_1.getAllMainPaths)(host);
21
+ const mainPaths = await (0, config_1.getAllMainPaths)(host);
29
22
  /* Update `AppModule` of all projects */
30
23
  return (0, schematics_1.chain)(mainPaths.map((mainPath) => (0, module_1.updateModule)(mainPath)));
31
- });
24
+ };
32
25
  }
33
- exports.updateToV9 = updateToV9;
34
26
  function updateToV13() {
35
27
  return (host, context) => {
36
28
  const rxjsMajorVersion = (0, config_1.getDependencyMajorVersion)("rxjs", host);
37
- if (!rxjsMajorVersion) {
38
- context.logger.warn(`Not able to detect rxjs version. Be aware that rxjs version >= 7.4 is recommended for version 13 of this lib.`);
29
+ if (rxjsMajorVersion === undefined) {
30
+ context.logger.warn(`Not able to detect rxjs version. Be aware that rxjs version >= 7.4 is recommended for version 13 of this library.`);
39
31
  }
40
- if (rxjsMajorVersion && (rxjsMajorVersion < 7)) {
32
+ if (rxjsMajorVersion !== undefined && (rxjsMajorVersion < 7)) {
41
33
  context.logger.warn(`rxjs should be updated to version >= 7.4. Support for rxjs version 6 is not guaranteed.`);
42
34
  }
43
35
  return host;
44
36
  };
45
37
  }
46
- exports.updateToV13 = updateToV13;
47
38
  function updateToV15() {
48
39
  return (host, context) => {
49
40
  const rxjsMajorVersion = (0, config_1.getDependencyMajorVersion)("rxjs", host);
50
- if (!rxjsMajorVersion) {
51
- // eslint-disable-next-line max-len
41
+ if (rxjsMajorVersion === undefined) {
52
42
  context.logger.warn(`Not able to detect rxjs version. Be aware that rxjs version >= 7.4 is required for version 15 of this lib, rxjs 6 is not supported.`);
53
43
  }
54
- if (rxjsMajorVersion && (rxjsMajorVersion < 7)) {
44
+ if (rxjsMajorVersion !== undefined && (rxjsMajorVersion < 7)) {
55
45
  throw new schematics_1.SchematicsException("rxjs >= 7.4 is required for this lib, rxjs 6 is not supported.");
56
46
  }
57
47
  return host;
58
48
  };
59
49
  }
60
- exports.updateToV15 = updateToV15;
61
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../projects/ngx-pwa/local-storage/schematics/ng-update/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2DAAsG;AACtG,8CAA+E;AAC/E,8CAAiD;AAEjD,SAAgB,UAAU;IACxB,OAAO,CAAO,IAAU,EAAE,EAAE;QAE1B,gBAAgB;QAChB,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAC;QAE9C,wCAAwC;QACxC,OAAO,IAAA,kBAAK,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpE,CAAC,CAAA,CAAC;AACJ,CAAC;AAVD,gCAUC;AAED,SAAgB,UAAU;IACxB,OAAO,CAAO,IAAU,EAAE,EAAE;QAE1B,gBAAgB;QAChB,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAC;QAE9C,wCAAwC;QACxC,OAAO,IAAA,kBAAK,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpE,CAAC,CAAA,CAAC;AACJ,CAAC;AAVD,gCAUC;AAED,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAE/C,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,gBAAgB,EAAE;YACrB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,+GAA+G,CAAC,CAAC;SACtI;QAED,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE;YAC9C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;SAChH;QAED,OAAO,IAAI,CAAC;IAEd,CAAC,CAAC;AACJ,CAAC;AAhBD,kCAgBC;AAED,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAE/C,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,gBAAgB,EAAE;YACrB,mCAAmC;YACnC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,qIAAqI,CAAC,CAAC;SAC5J;QAED,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE;YAC9C,MAAM,IAAI,gCAAmB,CAAC,gEAAgE,CAAC,CAAC;SACjG;QAED,OAAO,IAAI,CAAC;IAEd,CAAC,CAAC;AACJ,CAAC;AAjBD,kCAiBC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/schematics/ng-update/index.ts"],"names":[],"mappings":";;AAIA,gCAUC;AAED,gCAUC;AAED,kCAgBC;AAED,kCAgBC;AA9DD,2DAAgH;AAChH,8CAA+E;AAC/E,8CAAiD;AAEjD,SAAgB,UAAU;IACxB,OAAO,KAAK,EAAE,IAAU,EAAE,EAAE;QAE1B,gBAAgB;QAChB,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAC;QAE9C,wCAAwC;QACxC,OAAO,IAAA,kBAAK,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpE,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,KAAK,EAAE,IAAU,EAAE,EAAE;QAE1B,gBAAgB;QAChB,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,CAAC;QAE9C,wCAAwC;QACxC,OAAO,IAAA,kBAAK,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpE,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAE/C,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEjE,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,mHAAmH,CAAC,CAAC;QAC3I,CAAC;QAED,IAAI,gBAAgB,KAAK,SAAS,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;QACjH,CAAC;QAED,OAAO,IAAI,CAAC;IAEd,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAE/C,MAAM,gBAAgB,GAAG,IAAA,kCAAyB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEjE,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,qIAAqI,CAAC,CAAC;QAC7J,CAAC;QAED,IAAI,gBAAgB,KAAK,SAAS,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,gCAAmB,CAAC,gEAAgE,CAAC,CAAC;QAClG,CAAC;QAED,OAAO,IAAI,CAAC;IAEd,CAAC,CAAC;AACJ,CAAC"}
@@ -1,15 +1,8 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getAllMainPaths = exports.getDependencyMajorVersion = exports.packageName = void 0;
3
+ exports.packageName = void 0;
4
+ exports.getDependencyMajorVersion = getDependencyMajorVersion;
5
+ exports.getAllMainPaths = getAllMainPaths;
13
6
  const schematics_1 = require("@angular-devkit/schematics");
14
7
  const dependencies_1 = require("@schematics/angular/utility/dependencies");
15
8
  const workspace_1 = require("@schematics/angular/utility/workspace");
@@ -24,32 +17,30 @@ function getDependencyMajorVersion(name, host) {
24
17
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
25
18
  return Number.parseInt(dependency.version.replace("~", "").replace("^", "").split(".")[0], 10);
26
19
  }
27
- exports.getDependencyMajorVersion = getDependencyMajorVersion;
28
- function getAllMainPaths(host) {
29
- return __awaiter(this, void 0, void 0, function* () {
30
- const mainPaths = [];
31
- const workspace = yield (0, workspace_1.getWorkspace)(host);
32
- /* Loop on all projects configured in angular.json */
33
- workspace.projects.forEach((project) => {
34
- /* The schematic only work with applications (not librairies) */
35
- if (project.extensions["projectType"] === "application") {
36
- /* Get `main` option in angular.json project config */
37
- const buildTarget = project.targets.get("build");
38
- const e2eTarget = project.targets.get("e2e");
39
- if (buildTarget) {
40
- if (!buildTarget.options || !buildTarget.options["main"]) {
41
- throw new schematics_1.SchematicsException(`angular.json config is broken, can't find 'architect.build.options.main' in one or more projects`);
42
- }
43
- mainPaths.push(buildTarget.options["main"]);
44
- }
45
- else if (!e2eTarget) {
46
- /* In old CLI projects, e2e where distinct applications project, we don't need to throw for them */
20
+ async function getAllMainPaths(host) {
21
+ const mainPaths = [];
22
+ const workspace = await (0, workspace_1.getWorkspace)(host);
23
+ /* Loop on all projects configured in angular.json */
24
+ workspace.projects.forEach((project) => {
25
+ var _a;
26
+ /* The schematic only work with applications (not librairies) */
27
+ if (project.extensions["projectType"] === "application") {
28
+ /* Get `main` option in angular.json project config */
29
+ const buildTarget = project.targets.get("build");
30
+ const e2eTarget = project.targets.get("e2e");
31
+ if (buildTarget) {
32
+ if (((_a = buildTarget.options) === null || _a === void 0 ? void 0 : _a["main"]) === undefined) {
47
33
  throw new schematics_1.SchematicsException(`angular.json config is broken, can't find 'architect.build.options.main' in one or more projects`);
48
34
  }
35
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
36
+ mainPaths.push(buildTarget.options["main"]);
37
+ }
38
+ else if (!e2eTarget) {
39
+ /* In old CLI projects, e2e where distinct applications project, we don't need to throw for them */
40
+ throw new schematics_1.SchematicsException(`angular.json config is broken, can't find 'architect.build.options.main' in one or more projects`);
49
41
  }
50
- });
51
- return mainPaths;
42
+ }
52
43
  });
44
+ return mainPaths;
53
45
  }
54
- exports.getAllMainPaths = getAllMainPaths;
55
46
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../projects/ngx-pwa/local-storage/schematics/utility/config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2DAAuE;AACvE,2EAAoF;AACpF,qEAAqE;AAExD,QAAA,WAAW,GAAG,wBAAwB,CAAC;AAEpD,SAAgB,yBAAyB,CAAC,IAAY,EAAE,IAAU;IAEhE,MAAM,UAAU,GAAG,IAAA,uCAAwB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExD,uCAAuC;IACvC,IAAI,UAAU,KAAK,IAAI,EAAE;QACvB,OAAO,SAAS,CAAC;KAClB;IAED,2EAA2E;IAC3E,oEAAoE;IACpE,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;AAElG,CAAC;AAbD,8DAaC;AAED,SAAsB,eAAe,CAAC,IAAU;;QAE9C,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,CAAC,CAAC;QAE3C,qDAAqD;QACrD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAErC,gEAAgE;YAChE,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,aAAa,EAAE;gBAEvD,sDAAsD;gBACtD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAE7C,IAAI,WAAW,EAAE;oBAEf,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;wBACxD,MAAM,IAAI,gCAAmB,CAAC,kGAAkG,CAAC,CAAC;qBACnI;oBACD,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAW,CAAC,CAAC;iBAEvD;qBAAM,IAAI,CAAC,SAAS,EAAE;oBACrB,mGAAmG;oBACnG,MAAM,IAAI,gCAAmB,CAAC,kGAAkG,CAAC,CAAC;iBACnI;aAEF;QAEH,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IAEnB,CAAC;CAAA;AAjCD,0CAiCC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../lib/schematics/utility/config.ts"],"names":[],"mappings":";;;AAMA,8DAaC;AAED,0CAkCC;AAvDD,2DAAuE;AACvE,2EAAoF;AACpF,qEAAqE;AAExD,QAAA,WAAW,GAAG,wBAAwB,CAAC;AAEpD,SAAgB,yBAAyB,CAAC,IAAY,EAAE,IAAU;IAEhE,MAAM,UAAU,GAAG,IAAA,uCAAwB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExD,uCAAuC;IACvC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2EAA2E;IAC3E,oEAAoE;IACpE,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;AAElG,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,IAAU;IAE9C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,CAAC,CAAC;IAE3C,qDAAqD;IACrD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;;QAErC,gEAAgE;QAChE,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,aAAa,EAAE,CAAC;YAExD,sDAAsD;YACtD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE7C,IAAI,WAAW,EAAE,CAAC;gBAEhB,IAAI,CAAA,MAAA,WAAW,CAAC,OAAO,0CAAG,MAAM,CAAC,MAAK,SAAS,EAAE,CAAC;oBAChD,MAAM,IAAI,gCAAmB,CAAC,kGAAkG,CAAC,CAAC;gBACpI,CAAC;gBACD,uEAAuE;gBACvE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAW,CAAC,CAAC;YAExD,CAAC;iBAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtB,mGAAmG;gBACnG,MAAM,IAAI,gCAAmB,CAAC,kGAAkG,CAAC,CAAC;YACpI,CAAC;QAEH,CAAC;IAEH,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AAEnB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Rule } from "@angular-devkit/schematics";
1
+ import { type Rule } from "@angular-devkit/schematics";
2
2
  /**
3
3
  * @param mainPath Path of the project `main.ts` file
4
4
  */
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateModuleToV9 = exports.updateModule = void 0;
3
+ exports.updateModule = updateModule;
4
+ exports.updateModuleToV9 = updateModuleToV9;
4
5
  const schematics_1 = require("@angular-devkit/schematics");
5
6
  const typescript_1 = require("@schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript");
6
7
  const ast_utils_1 = require("@schematics/angular/utility/ast-utils");
@@ -22,6 +23,7 @@ function getAppModule(host, mainPath) {
22
23
  function updateAppModule(host, appModulePath, appModuleFile, storageModuleName) {
23
24
  /* Third param is to disable transpilation, 4rd note sure I just followed other official schematics */
24
25
  const appModuleSource = (0, typescript_1.createSourceFile)(appModulePath, appModuleFile, typescript_1.ScriptTarget.Latest, true);
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
25
27
  const appModuleChanges = (0, ast_utils_1.addImportToModule)(appModuleSource, appModulePath, storageModuleName, config_1.packageName);
26
28
  /* The changes must be applied, otherwise the previous line does nothing */
27
29
  const recorder = host.beginUpdate(appModulePath);
@@ -44,7 +46,6 @@ function updateModule(mainPath) {
44
46
  /* If the file is still the same, it means we didn't catch the module
45
47
  * (for example, it can happen if the user aliased `StorageModule`) */
46
48
  if (updatedAppModuleFile === appModuleFile) {
47
- // eslint-disable-next-line max-len
48
49
  throw new schematics_1.SchematicsException(`We couldn't update AppModule automatically. Be sure to follow the documentation to update manually, otherwise previsouly stored data could be lost.`);
49
50
  }
50
51
  host.overwrite(appModulePath, updatedAppModuleFile);
@@ -58,7 +59,6 @@ function updateModule(mainPath) {
58
59
  return host;
59
60
  };
60
61
  }
61
- exports.updateModule = updateModule;
62
62
  /**
63
63
  * @param mainPath Path of the project `main.ts` file
64
64
  */
@@ -86,5 +86,4 @@ function updateModuleToV9(mainPath) {
86
86
  return host;
87
87
  };
88
88
  }
89
- exports.updateModuleToV9 = updateModuleToV9;
90
89
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../projects/ngx-pwa/local-storage/schematics/utility/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../lib/schematics/utility/module.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * Exception message when `indexedDB` is not working
3
- */
4
- export const IDB_BROKEN_ERROR = "indexedDB is not working";
5
- /**
6
- * Exception raised when `indexedDB` is not working
7
- */
8
- export class IDBBrokenError extends Error {
9
- constructor() {
10
- super(...arguments);
11
- this.message = IDB_BROKEN_ERROR;
12
- }
13
- }
14
- /**
15
- * Exception message when a value can't be serialized for `localStorage`
16
- */
17
- export const SERIALIZATION_ERROR = `The storage is currently localStorage,
18
- where data must be serialized, and the provided data can't be serialized.`;
19
- /**
20
- * Exception raised when a value can't be serialized for `localStorage`
21
- */
22
- export class SerializationError extends Error {
23
- constructor() {
24
- super(...arguments);
25
- this.message = SERIALIZATION_ERROR;
26
- }
27
- }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wd2EvbG9jYWwtc3RvcmFnZS9zcmMvbGliL2RhdGFiYXNlcy9leGNlcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFBekM7O1FBQ1csWUFBTyxHQUFHLGdCQUFnQixDQUFDO0lBQ3RDLENBQUM7Q0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7MEVBQ3VDLENBQUM7QUFFM0U7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsS0FBSztJQUE3Qzs7UUFDVyxZQUFPLEdBQUcsbUJBQW1CLENBQUM7SUFDekMsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeGNlcHRpb24gbWVzc2FnZSB3aGVuIGBpbmRleGVkREJgIGlzIG5vdCB3b3JraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBJREJfQlJPS0VOX0VSUk9SID0gXCJpbmRleGVkREIgaXMgbm90IHdvcmtpbmdcIjtcblxuLyoqXG4gKiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYGluZGV4ZWREQmAgaXMgbm90IHdvcmtpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIElEQkJyb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlID0gSURCX0JST0tFTl9FUlJPUjtcbn1cblxuLyoqXG4gKiBFeGNlcHRpb24gbWVzc2FnZSB3aGVuIGEgdmFsdWUgY2FuJ3QgYmUgc2VyaWFsaXplZCBmb3IgYGxvY2FsU3RvcmFnZWBcbiAqL1xuZXhwb3J0IGNvbnN0IFNFUklBTElaQVRJT05fRVJST1IgPSBgVGhlIHN0b3JhZ2UgaXMgY3VycmVudGx5IGxvY2FsU3RvcmFnZSxcbndoZXJlIGRhdGEgbXVzdCBiZSBzZXJpYWxpemVkLCBhbmQgdGhlIHByb3ZpZGVkIGRhdGEgY2FuJ3QgYmUgc2VyaWFsaXplZC5gO1xuXG4vKipcbiAqIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIHZhbHVlIGNhbid0IGJlIHNlcmlhbGl6ZWQgZm9yIGBsb2NhbFN0b3JhZ2VgXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG92ZXJyaWRlIG1lc3NhZ2UgPSBTRVJJQUxJWkFUSU9OX0VSUk9SO1xufVxuIl19
@@ -1,306 +0,0 @@
1
- import { Injectable, inject } from "@angular/core";
2
- import { ReplaySubject, fromEvent, of, race, throwError } from "rxjs";
3
- import { first, map, mergeMap, takeWhile, tap } from "rxjs/operators";
4
- import { IDB_DB_NAME, IDB_DB_VERSION, IDB_NO_WRAP, IDB_STORE_NAME } from "../tokens";
5
- import { IDBBrokenError } from "./exceptions";
6
- import * as i0 from "@angular/core";
7
- export class IndexedDBDatabase {
8
- constructor() {
9
- /**
10
- * `indexedDB` database connection, wrapped in a RxJS `ReplaySubject` to be able to access the connection
11
- * even after the connection success event happened
12
- */
13
- this.database = new ReplaySubject(1);
14
- /**
15
- * Index used when wrapping value. *For backward compatibility only.*
16
- */
17
- this.wrapIndex = "value";
18
- this.dbName = inject(IDB_DB_NAME);
19
- this.storeName = inject(IDB_STORE_NAME);
20
- this.dbVersion = inject(IDB_DB_VERSION);
21
- this.noWrap = inject(IDB_NO_WRAP);
22
- /* Connect to `indexedDB`, with prefix if provided by the user */
23
- this.connect();
24
- }
25
- /**
26
- * Information about `indexedDB` connection. *Only useful for interoperability.*
27
- * @returns `indexedDB` database name, store name and database version
28
- */
29
- get backingStore() {
30
- return {
31
- database: this.dbName,
32
- store: this.storeName,
33
- version: this.dbVersion,
34
- };
35
- }
36
- /**
37
- * Number of items in our `indexedDB` database and object store
38
- */
39
- get size() {
40
- /* Open a transaction in read-only mode */
41
- return this.transaction("readonly").pipe(mergeMap((transactionData) => {
42
- const { store, events } = transactionData;
43
- /* Request to know the number of items */
44
- const request = store.count();
45
- /* Return the result */
46
- return events.pipe(map(() => request.result));
47
- }),
48
- /* The observable will complete after the first value */
49
- first());
50
- }
51
- /**
52
- * Gets an item value in our `indexedDB` store
53
- * @param key The item's key
54
- * @returns The item's value if the key exists, `undefined` otherwise, wrapped in an RxJS `Observable`
55
- */
56
- get(key) {
57
- /* Open a transaction in read-only mode */
58
- return this.transaction("readonly").pipe(mergeMap((transactionData) => {
59
- const { store, events } = transactionData;
60
- /* Request the value with the key provided by the user */
61
- const request = store.get(key);
62
- /* Listen events and return the result */
63
- return events.pipe(map(() => {
64
- if ((request.result !== undefined) && (request.result !== null)) {
65
- /* Prior to v8, the value was wrapped in an `{ value: ...}` object */
66
- if (!this.noWrap && (typeof request.result === "object") && (this.wrapIndex in request.result) &&
67
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
68
- (request.result[this.wrapIndex] !== undefined) && (request.result[this.wrapIndex] !== null)) {
69
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
70
- return request.result[this.wrapIndex];
71
- }
72
- else {
73
- /* Cast to the wanted type */
74
- return request.result;
75
- }
76
- }
77
- /* Return `undefined` if the value is empty */
78
- return undefined;
79
- }));
80
- }),
81
- /* The observable will complete after the first value */
82
- first());
83
- }
84
- /**
85
- * Sets an item in our `indexedDB` store
86
- * @param key The item's key
87
- * @param data The item's value
88
- * @returns An RxJS `Observable` to wait the end of the operation
89
- */
90
- set(key, data) {
91
- /* Storing `undefined` in `indexedDb` can cause issues in some browsers so removing item instead */
92
- if (data === undefined) {
93
- return this.delete(key);
94
- }
95
- /* Open a transaction in write mode */
96
- return this.transaction("readwrite").pipe(mergeMap((transactionData) => {
97
- const { store, events } = transactionData;
98
- /* Prior to v8, data was wrapped in a `{ value: ... }` object */
99
- const dataToStore = this.noWrap ? data : { [this.wrapIndex]: data };
100
- /* Add if the item is not existing yet, or update otherwise */
101
- store.put(dataToStore, key);
102
- /* Listen to events and return `undefined` as no value is expected */
103
- return events.pipe(map(() => undefined));
104
- }),
105
- /* The observable will complete after the first value */
106
- first());
107
- }
108
- /**
109
- * Deletes an item in our `indexedDB` store
110
- * @param key The item's key
111
- * @returns An RxJS `Observable` to wait the end of the operation
112
- */
113
- delete(key) {
114
- /* Open a transaction in write mode */
115
- return this.transaction("readwrite").pipe(mergeMap((transactionData) => {
116
- const { store, events } = transactionData;
117
- /* Delete the item in store */
118
- store.delete(key);
119
- /* Listen to events and return `undefined` as no data is expected here */
120
- return events.pipe(map(() => undefined));
121
- }),
122
- /* The observable will complete after the first value */
123
- first());
124
- }
125
- /**
126
- * Deletes all items from our `indexedDB` objet store
127
- * @returns An RxJS `Observable` to wait the end of the operation
128
- */
129
- clear() {
130
- /* Open a transaction in write mode */
131
- return this.transaction("readwrite").pipe(mergeMap((transactionData) => {
132
- const { store, events } = transactionData;
133
- /* Delete all items in object store */
134
- store.clear();
135
- /* Listen to events and return `undefined` as no data is expected here */
136
- return events.pipe(map(() => undefined));
137
- }),
138
- /* The observable will complete */
139
- first());
140
- }
141
- /**
142
- * Get all the keys in our `indexedDB` store
143
- * @returns An RxJS `Observable` iterating on each key
144
- */
145
- keys() {
146
- /* Open a transaction in read-only mode */
147
- return this.transaction("readonly").pipe(
148
- /* `first()` is used as the final operator in other methods to complete the `Observable`
149
- * (as it all starts from a `ReplaySubject` which never ends),
150
- * but as this method is iterating over multiple values, `first()` **must** be used here */
151
- first(), mergeMap((transactionData) => {
152
- const { store } = transactionData;
153
- /* Open a cursor on the store
154
- * Avoid issues like https://github.com/cyrilletuzi/angular-async-local-storage/issues/69 */
155
- const request = store.openKeyCursor();
156
- /* Listen to success event */
157
- const success$ = fromEvent(request, "success").pipe(
158
- /* Stop the `Observable` when the cursor is `null` */
159
- takeWhile(() => (request.result !== null)),
160
- /* This lib only allows string keys, but user could have added other types of keys from outside
161
- * It's OK to cast as the cursor as been tested in the previous operator */
162
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-base-to-string
163
- map(() => request.result.key.toString()),
164
- /* Iterate on the cursor */
165
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
166
- tap(() => { request.result.continue(); }));
167
- /* Listen to error event and if so, throw an error */
168
- const error$ = this.listenError(request);
169
- /* Choose the first event to occur */
170
- return race([success$, error$]);
171
- }));
172
- }
173
- /**
174
- * Check if a key exists in our `indexedDB` store
175
- * @returns An RxJS `Observable` telling if the key exists or not
176
- */
177
- has(key) {
178
- /* Open a transaction in read-only mode */
179
- return this.transaction("readonly").pipe(mergeMap((transactionData) => {
180
- const { store, events } = transactionData;
181
- /* Check if the key exists in the store
182
- * Fixes https://github.com/cyrilletuzi/angular-async-local-storage/issues/69
183
- */
184
- const request = store.getKey(key);
185
- /* Listen to events and return `true` or `false` */
186
- return events.pipe(map(() => (request.result !== undefined) ? true : false));
187
- }),
188
- /* The observable will complete */
189
- first());
190
- }
191
- /**
192
- * Connects to `indexedDB` and creates the object store on first time
193
- */
194
- connect() {
195
- let request;
196
- /* Connect to `indexedDB`
197
- * Will fail in Safari cross-origin iframes
198
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42} */
199
- try {
200
- /* Do NOT explicit `window` here, as `indexedDB` could be used from a web worker too */
201
- request = indexedDB.open(this.dbName, this.dbVersion);
202
- }
203
- catch {
204
- this.database.error(new IDBBrokenError());
205
- return;
206
- }
207
- /* Create store on first connection */
208
- this.createStore(request);
209
- /* Listen to success and error events */
210
- const success$ = fromEvent(request, "success");
211
- const error$ = this.listenError(request);
212
- /* Choose the first to occur */
213
- race([success$, error$])
214
- /* The observable will complete */
215
- .pipe(first())
216
- .subscribe({
217
- next: () => {
218
- /* Register the database connection in the `ReplaySubject` for further access */
219
- this.database.next(request.result);
220
- },
221
- error: () => {
222
- /* Firefox private mode issue: fallback storage if IndexedDb connection is failing
223
- * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}
224
- * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/26} */
225
- this.database.error(new IDBBrokenError());
226
- },
227
- });
228
- }
229
- /**
230
- * Create store on first use of `indexedDB`
231
- * @param request `indexedDB` database opening request
232
- */
233
- createStore(request) {
234
- /* Listen to the event fired on first connection */
235
- fromEvent(request, "upgradeneeded")
236
- /* The observable will complete */
237
- .pipe(first())
238
- .subscribe({
239
- next: () => {
240
- /* Check if the store already exists, to avoid error */
241
- if (!request.result.objectStoreNames.contains(this.storeName)) {
242
- /* Create the object store */
243
- request.result.createObjectStore(this.storeName);
244
- }
245
- }
246
- });
247
- }
248
- /**
249
- * Open an `indexedDB` transaction and get our store
250
- * @param mode `readonly` or `readwrite`
251
- * @returns An `indexedDB` transaction store and events, wrapped in an RxJS `Observable`
252
- */
253
- transaction(mode) {
254
- /* From the `indexedDB` connection, open a transaction and get the store */
255
- return this.database
256
- .pipe(mergeMap((database) => {
257
- let transaction;
258
- try {
259
- transaction = database.transaction([this.storeName], mode);
260
- }
261
- catch (error) {
262
- /* The store could have been deleted from outside */
263
- return throwError(() => error);
264
- }
265
- /* Get the store from the transaction */
266
- const store = transaction.objectStore(this.storeName);
267
- /* Listen transaction `complete` and `error` events */
268
- const events = this.listenTransactionEvents(transaction);
269
- return of({ store, events });
270
- }));
271
- }
272
- /**
273
- * Listen errors on a transaction or request, and throw if trigerred
274
- * @param transactionOrRequest `indexedDb` transaction or request to listen
275
- * @returns An `Observable` listening to errors
276
- */
277
- listenError(transactionOrRequest) {
278
- return fromEvent(transactionOrRequest, "error").pipe(
279
- /* Throw on error to be able to catch errors in RxJS way.
280
- * Here `event.target` must be used, as `transactionOrRequest.error` will be `null`
281
- * if we are on the request and the error is only triggered later by the transaction */
282
- mergeMap((event) => throwError(() => event.target?.error)));
283
- }
284
- /**
285
- * Listen transaction `complete` and `error` events
286
- * @param transaction Transaction to listen
287
- * @returns An `Observable` listening to transaction `complete` and `error` events
288
- */
289
- listenTransactionEvents(transaction) {
290
- /* Listen to the `complete` event */
291
- const complete$ = fromEvent(transaction, "complete");
292
- /* Listen to the `error` event */
293
- const error$ = this.listenError(transaction);
294
- /* Choose the first event to occur */
295
- return race([complete$, error$]);
296
- }
297
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: IndexedDBDatabase, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
298
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: IndexedDBDatabase, providedIn: "root" }); }
299
- }
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: IndexedDBDatabase, decorators: [{
301
- type: Injectable,
302
- args: [{
303
- providedIn: "root"
304
- }]
305
- }], ctorParameters: () => [] });
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZGRiLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9sb2NhbC1zdG9yYWdlL3NyYy9saWIvZGF0YWJhc2VzL2luZGV4ZWRkYi1kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsYUFBYSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFNOUMsTUFBTSxPQUFPLGlCQUFpQjtJQWlDNUI7UUFoQkE7OztXQUdHO1FBQ2dCLGFBQVEsR0FBRyxJQUFJLGFBQWEsQ0FBYyxDQUFDLENBQUMsQ0FBQztRQU9oRTs7V0FFRztRQUNnQixjQUFTLEdBQUcsT0FBTyxDQUFDO1FBSXJDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWxDLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFakIsQ0FBQztJ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LElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFN0MscUNBQXFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFbkMsQ0FBQzs4R0FwYlUsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7MkZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBmcm9tRXZlbnQsIG9mLCByYWNlLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGZpcnN0LCBtYXAsIG1lcmdlTWFwLCB0YWtlV2hpbGUsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgSURCX0RCX05BTUUsIElEQl9EQl9WRVJTSU9OLCBJREJfTk9fV1JBUCwgSURCX1NUT1JFX05BTUUgfSBmcm9tIFwiLi4vdG9rZW5zXCI7XG5pbXBvcnQgeyBJREJCcm9rZW5FcnJvciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IExvY2FsRGF0YWJhc2UgfSBmcm9tIFwiLi9sb2NhbC1kYXRhYmFzZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXG59KVxuZXhwb3J0IGNsYXNzIEluZGV4ZWREQkRhdGFiYXNlIGltcGxlbWVudHMgTG9jYWxEYXRhYmFzZSB7XG5cbiAgLyoqXG4gICAqIGBpbmRleGVkREJgIGRhdGFiYXNlIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkYk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogYGluZGV4ZWREQmAgb2JqZWN0IHN0b3JlIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzdG9yZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogYGluZGV4ZWREQmAgZGF0YWJhc2UgdmVyc2lvbi4gTXVzdCBiZSBhbiB1bnNpZ25lZCAqKmludGVnZXIqKlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRiVmVyc2lvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBgaW5kZXhlZERCYCBkYXRhYmFzZSBjb25uZWN0aW9uLCB3cmFwcGVkIGluIGEgUnhKUyBgUmVwbGF5U3ViamVjdGAgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIGNvbm5lY3Rpb25cbiAgICogZXZlbiBhZnRlciB0aGUgY29ubmVjdGlvbiBzdWNjZXNzIGV2ZW50IGhhcHBlbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YWJhc2UgPSBuZXcgUmVwbGF5U3ViamVjdDxJREJEYXRhYmFzZT4oMSk7XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gbm90IHdyYXAgYGluZGV4ZWREQmAgdmFsdWVzIGZvciBpbnRlcm9wZXJhYmlsaXR5IG9yIHRvIHdyYXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9XcmFwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRleCB1c2VkIHdoZW4gd3JhcHBpbmcgdmFsdWUuICpGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5LipcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB3cmFwSW5kZXggPSBcInZhbHVlXCI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICB0aGlzLmRiTmFtZSA9IGluamVjdChJREJfREJfTkFNRSk7XG4gICAgdGhpcy5zdG9yZU5hbWUgPSBpbmplY3QoSURCX1NUT1JFX05BTUUpO1xuICAgIHRoaXMuZGJWZXJzaW9uID0gaW5qZWN0KElEQl9EQl9WRVJTSU9OKTtcbiAgICB0aGlzLm5vV3JhcCA9IGluamVjdChJREJfTk9fV1JBUCk7XG5cbiAgICAvKiBDb25uZWN0IHRvIGBpbmRleGVkREJgLCB3aXRoIHByZWZpeCBpZiBwcm92aWRlZCBieSB0aGUgdXNlciAqL1xuICAgIHRoaXMuY29ubmVjdCgpO1xuXG4gIH1cblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYGluZGV4ZWREQmAgY29ubmVjdGlvbi4gKk9ubHkgdXNlZnVsIGZvciBpbnRlcm9wZXJhYmlsaXR5LipcbiAgICogQHJldHVybnMgYGluZGV4ZWREQmAgZGF0YWJhc2UgbmFtZSwgc3RvcmUgbmFtZSBhbmQgZGF0YWJhc2UgdmVyc2lvblxuICAgKi9cbiAgZ2V0IGJhY2tpbmdTdG9yZSgpOiB7IGRhdGFiYXNlOiBzdHJpbmcsIHN0b3JlOiBzdHJpbmcsIHZlcnNpb246IG51bWJlcjsgfSB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YWJhc2U6IHRoaXMuZGJOYW1lLFxuICAgICAgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLFxuICAgICAgdmVyc2lvbjogdGhpcy5kYlZlcnNpb24sXG4gICAgfTtcblxuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBpdGVtcyBpbiBvdXIgYGluZGV4ZWREQmAgZGF0YWJhc2UgYW5kIG9iamVjdCBzdG9yZVxuICAgKi9cbiAgZ2V0IHNpemUoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblxuICAgIC8qIE9wZW4gYSB0cmFuc2FjdGlvbiBpbiByZWFkLW9ubHkgbW9kZSAqL1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFwicmVhZG9ubHlcIikucGlwZShcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlLCBldmVudHMgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBSZXF1ZXN0IHRvIGtub3cgdGhlIG51bWJlciBvZiBpdGVtcyAqL1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuY291bnQoKTtcblxuICAgICAgICAvKiBSZXR1cm4gdGhlIHJlc3VsdCAqL1xuICAgICAgICByZXR1cm4gZXZlbnRzLnBpcGUobWFwKCgpID0+IHJlcXVlc3QucmVzdWx0KSk7XG5cbiAgICAgIH0pLFxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGUgZmlyc3QgdmFsdWUgKi9cbiAgICAgIGZpcnN0KCksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gaXRlbSB2YWx1ZSBpbiBvdXIgYGluZGV4ZWREQmAgc3RvcmVcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSdzIHZhbHVlIGlmIHRoZSBrZXkgZXhpc3RzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UsIHdyYXBwZWQgaW4gYW4gUnhKUyBgT2JzZXJ2YWJsZWBcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHJlYWQtb25seSBtb2RlICovXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXCJyZWFkb25seVwiKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKHRyYW5zYWN0aW9uRGF0YSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHsgc3RvcmUsIGV2ZW50cyB9ID0gdHJhbnNhY3Rpb25EYXRhO1xuXG4gICAgICAgIC8qIFJlcXVlc3QgdGhlIHZhbHVlIHdpdGggdGhlIGtleSBwcm92aWRlZCBieSB0aGUgdXNlciAqL1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG5cbiAgICAgICAgLyogTGlzdGVuIGV2ZW50cyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgKi9cbiAgICAgICAgcmV0dXJuIGV2ZW50cy5waXBlKG1hcCgoKTogdW5rbm93biA9PiB7XG5cbiAgICAgICAgICBpZiAoKHJlcXVlc3QucmVzdWx0ICE9PSB1bmRlZmluZWQpICYmIChyZXF1ZXN0LnJlc3VsdCAhPT0gbnVsbCkpIHtcblxuICAgICAgICAgICAgLyogUHJpb3IgdG8gdjgsIHRoZSB2YWx1ZSB3YXMgd3JhcHBlZCBpbiBhbiBgeyB2YWx1ZTogLi4ufWAgb2JqZWN0ICovXG4gICAgICAgICAgICBpZiAoIXRoaXMubm9XcmFwICYmICh0eXBlb2YgcmVxdWVzdC5yZXN1bHQgPT09IFwib2JqZWN0XCIpICYmICh0aGlzLndyYXBJbmRleCBpbiByZXF1ZXN0LnJlc3VsdCkgJiZcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAocmVxdWVzdC5yZXN1bHRbdGhpcy53cmFwSW5kZXhdICE9PSB1bmRlZmluZWQpICYmIChyZXF1ZXN0LnJlc3VsdFt0aGlzLndyYXBJbmRleF0gIT09IG51bGwpKSB7XG5cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXN1bHRbdGhpcy53cmFwSW5kZXhdO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgIC8qIENhc3QgdG8gdGhlIHdhbnRlZCB0eXBlICovXG4gICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnJlc3VsdDtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyogUmV0dXJuIGB1bmRlZmluZWRgIGlmIHRoZSB2YWx1ZSBpcyBlbXB0eSAqL1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgfSkpO1xuXG4gICAgICB9KSxcbiAgICAgIC8qIFRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgYWZ0ZXIgdGhlIGZpcnN0IHZhbHVlICovXG4gICAgICBmaXJzdCgpLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGl0ZW0gaW4gb3VyIGBpbmRleGVkREJgIHN0b3JlXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHBhcmFtIGRhdGEgVGhlIGl0ZW0ncyB2YWx1ZVxuICAgKiBAcmV0dXJucyBBbiBSeEpTIGBPYnNlcnZhYmxlYCB0byB3YWl0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgc2V0KGtleTogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+IHtcblxuICAgIC8qIFN0b3JpbmcgYHVuZGVmaW5lZGAgaW4gYGluZGV4ZWREYmAgY2FuIGNhdXNlIGlzc3VlcyBpbiBzb21lIGJyb3dzZXJzIHNvIHJlbW92aW5nIGl0ZW0gaW5zdGVhZCAqL1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIC8qIE9wZW4gYSB0cmFuc2FjdGlvbiBpbiB3cml0ZSBtb2RlICovXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXCJyZWFkd3JpdGVcIikucGlwZShcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlLCBldmVudHMgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBQcmlvciB0byB2OCwgZGF0YSB3YXMgd3JhcHBlZCBpbiBhIGB7IHZhbHVlOiAuLi4gfWAgb2JqZWN0ICovXG4gICAgICAgIGNvbnN0IGRhdGFUb1N0b3JlID0gdGhpcy5ub1dyYXAgPyBkYXRhIDogeyBbdGhpcy53cmFwSW5kZXhdOiBkYXRhIH07XG5cbiAgICAgICAgLyogQWRkIGlmIHRoZSBpdGVtIGlzIG5vdCBleGlzdGluZyB5ZXQsIG9yIHVwZGF0ZSBvdGhlcndpc2UgKi9cbiAgICAgICAgc3RvcmUucHV0KGRhdGFUb1N0b3JlLCBrZXkpO1xuXG4gICAgICAgIC8qIExpc3RlbiB0byBldmVudHMgYW5kIHJldHVybiBgdW5kZWZpbmVkYCBhcyBubyB2YWx1ZSBpcyBleHBlY3RlZCAqL1xuICAgICAgICByZXR1cm4gZXZlbnRzLnBpcGUobWFwKCgpID0+IHVuZGVmaW5lZCkpO1xuXG4gICAgICB9KSxcbiAgICAgIC8qIFRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgYWZ0ZXIgdGhlIGZpcnN0IHZhbHVlICovXG4gICAgICBmaXJzdCgpLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGl0ZW0gaW4gb3VyIGBpbmRleGVkREJgIHN0b3JlXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgQW4gUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICAvKiBPcGVuIGEgdHJhbnNhY3Rpb24gaW4gd3JpdGUgbW9kZSAqL1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFwicmVhZHdyaXRlXCIpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgodHJhbnNhY3Rpb25EYXRhKSA9PiB7XG5cbiAgICAgICAgY29uc3QgeyBzdG9yZSwgZXZlbnRzIH0gPSB0cmFuc2FjdGlvbkRhdGE7XG5cbiAgICAgICAgLyogRGVsZXRlIHRoZSBpdGVtIGluIHN0b3JlICovXG4gICAgICAgIHN0b3JlLmRlbGV0ZShrZXkpO1xuXG4gICAgICAgIC8qIExpc3RlbiB0byBldmVudHMgYW5kIHJldHVybiBgdW5kZWZpbmVkYCBhcyBubyBkYXRhIGlzIGV4cGVjdGVkIGhlcmUgKi9cbiAgICAgICAgcmV0dXJuIGV2ZW50cy5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgfSksXG4gICAgICAvKiBUaGUgb2JzZXJ2YWJsZSB3aWxsIGNvbXBsZXRlIGFmdGVyIHRoZSBmaXJzdCB2YWx1ZSAqL1xuICAgICAgZmlyc3QoKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgaXRlbXMgZnJvbSBvdXIgYGluZGV4ZWREQmAgb2JqZXQgc3RvcmVcbiAgICogQHJldHVybnMgQW4gUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGNsZWFyKCk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICAvKiBPcGVuIGEgdHJhbnNhY3Rpb24gaW4gd3JpdGUgbW9kZSAqL1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKFwicmVhZHdyaXRlXCIpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgodHJhbnNhY3Rpb25EYXRhKSA9PiB7XG5cbiAgICAgICAgY29uc3QgeyBzdG9yZSwgZXZlbnRzIH0gPSB0cmFuc2FjdGlvbkRhdGE7XG5cbiAgICAgICAgLyogRGVsZXRlIGFsbCBpdGVtcyBpbiBvYmplY3Qgc3RvcmUgKi9cbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcblxuICAgICAgICAvKiBMaXN0ZW4gdG8gZXZlbnRzIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYXMgbm8gZGF0YSBpcyBleHBlY3RlZCBoZXJlICovXG4gICAgICAgIHJldHVybiBldmVudHMucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG5cbiAgICAgIH0pLFxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSAqL1xuICAgICAgZmlyc3QoKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUga2V5cyBpbiBvdXIgYGluZGV4ZWREQmAgc3RvcmVcbiAgICogQHJldHVybnMgQW4gUnhKUyBgT2JzZXJ2YWJsZWAgaXRlcmF0aW5nIG9uIGVhY2gga2V5XG4gICAqL1xuICBrZXlzKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cbiAgICAvKiBPcGVuIGEgdHJhbnNhY3Rpb24gaW4gcmVhZC1vbmx5IG1vZGUgKi9cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbihcInJlYWRvbmx5XCIpLnBpcGUoXG4gICAgICAvKiBgZmlyc3QoKWAgaXMgdXNlZCBhcyB0aGUgZmluYWwgb3BlcmF0b3IgaW4gb3RoZXIgbWV0aG9kcyB0byBjb21wbGV0ZSB0aGUgYE9ic2VydmFibGVgXG4gICAgICAgKiAoYXMgaXQgYWxsIHN0YXJ0cyBmcm9tIGEgYFJlcGxheVN1YmplY3RgIHdoaWNoIG5ldmVyIGVuZHMpLFxuICAgICAgICogYnV0IGFzIHRoaXMgbWV0aG9kIGlzIGl0ZXJhdGluZyBvdmVyIG11bHRpcGxlIHZhbHVlcywgYGZpcnN0KClgICoqbXVzdCoqIGJlIHVzZWQgaGVyZSAqL1xuICAgICAgZmlyc3QoKSxcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlIH0gPSB0cmFuc2FjdGlvbkRhdGE7XG5cbiAgICAgICAgLyogT3BlbiBhIGN1cnNvciBvbiB0aGUgc3RvcmVcbiAgICAgICAgICogQXZvaWQgaXNzdWVzIGxpa2UgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvNjkgKi9cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLm9wZW5LZXlDdXJzb3IoKTtcblxuICAgICAgICAvKiBMaXN0ZW4gdG8gc3VjY2VzcyBldmVudCAqL1xuICAgICAgICBjb25zdCBzdWNjZXNzJCA9IGZyb21FdmVudChyZXF1ZXN0LCBcInN1Y2Nlc3NcIikucGlwZShcbiAgICAgICAgICAvKiBTdG9wIHRoZSBgT2JzZXJ2YWJsZWAgd2hlbiB0aGUgY3Vyc29yIGlzIGBudWxsYCAqL1xuICAgICAgICAgIHRha2VXaGlsZSgoKSA9PiAocmVxdWVzdC5yZXN1bHQgIT09IG51bGwpKSxcbiAgICAgICAgICAvKiBUaGlzIGxpYiBvbmx5IGFsbG93cyBzdHJpbmcga2V5cywgYnV0IHVzZXIgY291bGQgaGF2ZSBhZGRlZCBvdGhlciB0eXBlcyBvZiBrZXlzIGZyb20gb3V0c2lkZVxuICAgICAgICAgICAqIEl0J3MgT0sgdG8gY2FzdCBhcyB0aGUgY3Vyc29yIGFzIGJlZW4gdGVzdGVkIGluIHRoZSBwcmV2aW91cyBvcGVyYXRvciAqL1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICAgICAgICBtYXAoKCkgPT4gcmVxdWVzdC5yZXN1bHQhLmtleS50b1N0cmluZygpKSxcbiAgICAgICAgICAvKiBJdGVyYXRlIG9uIHRoZSBjdXJzb3IgKi9cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgIHRhcCgoKSA9PiB7IHJlcXVlc3QucmVzdWx0IS5jb250aW51ZSgpOyB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKiBMaXN0ZW4gdG8gZXJyb3IgZXZlbnQgYW5kIGlmIHNvLCB0aHJvdyBhbiBlcnJvciAqL1xuICAgICAgICBjb25zdCBlcnJvciQgPSB0aGlzLmxpc3RlbkVycm9yKHJlcXVlc3QpO1xuXG4gICAgICAgIC8qIENob29zZSB0aGUgZmlyc3QgZXZlbnQgdG8gb2NjdXIgKi9cbiAgICAgICAgcmV0dXJuIHJhY2UoW3N1Y2Nlc3MkLCBlcnJvciRdKTtcblxuICAgICAgfSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEga2V5IGV4aXN0cyBpbiBvdXIgYGluZGV4ZWREQmAgc3RvcmVcbiAgICogQHJldHVybnMgQW4gUnhKUyBgT2JzZXJ2YWJsZWAgdGVsbGluZyBpZiB0aGUga2V5IGV4aXN0cyBvciBub3RcbiAgICovXG4gIGhhcyhrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHJlYWQtb25seSBtb2RlICovXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oXCJyZWFkb25seVwiKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKHRyYW5zYWN0aW9uRGF0YSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHsgc3RvcmUsIGV2ZW50cyB9ID0gdHJhbnNhY3Rpb25EYXRhO1xuXG4gICAgICAgIC8qIENoZWNrIGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoZSBzdG9yZVxuICAgICAgICAgKiBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2lzc3Vlcy82OVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldEtleShrZXkpO1xuXG4gICAgICAgIC8qIExpc3RlbiB0byBldmVudHMgYW5kIHJldHVybiBgdHJ1ZWAgb3IgYGZhbHNlYCAqL1xuICAgICAgICByZXR1cm4gZXZlbnRzLnBpcGUobWFwKCgpID0+IChyZXF1ZXN0LnJlc3VsdCAhPT0gdW5kZWZpbmVkKSA/IHRydWUgOiBmYWxzZSkpO1xuXG4gICAgICB9KSxcbiAgICAgIC8qIFRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgKi9cbiAgICAgIGZpcnN0KCksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3RzIHRvIGBpbmRleGVkREJgIGFuZCBjcmVhdGVzIHRoZSBvYmplY3Qgc3RvcmUgb24gZmlyc3QgdGltZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbm5lY3QoKTogdm9pZCB7XG5cbiAgICBsZXQgcmVxdWVzdDogSURCT3BlbkRCUmVxdWVzdDtcblxuICAgIC8qIENvbm5lY3QgdG8gYGluZGV4ZWREQmBcbiAgICAgKiBXaWxsIGZhaWwgaW4gU2FmYXJpIGNyb3NzLW9yaWdpbiBpZnJhbWVzXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvNDJ9ICovXG4gICAgdHJ5IHtcblxuICAgICAgLyogRG8gTk9UIGV4cGxpY2l0IGB3aW5kb3dgIGhlcmUsIGFzIGBpbmRleGVkREJgIGNvdWxkIGJlIHVzZWQgZnJvbSBhIHdlYiB3b3JrZXIgdG9vICovXG4gICAgICByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHRoaXMuZGJWZXJzaW9uKTtcblxuICAgIH0gY2F0Y2gge1xuXG4gICAgICB0aGlzLmRhdGFiYXNlLmVycm9yKG5ldyBJREJCcm9rZW5FcnJvcigpKTtcblxuICAgICAgcmV0dXJuO1xuXG4gICAgfVxuXG4gICAgLyogQ3JlYXRlIHN0b3JlIG9uIGZpcnN0IGNvbm5lY3Rpb24gKi9cbiAgICB0aGlzLmNyZWF0ZVN0b3JlKHJlcXVlc3QpO1xuXG4gICAgLyogTGlzdGVuIHRvIHN1Y2Nlc3MgYW5kIGVycm9yIGV2ZW50cyAqL1xuICAgIGNvbnN0IHN1Y2Nlc3MkID0gZnJvbUV2ZW50KHJlcXVlc3QsIFwic3VjY2Vzc1wiKTtcbiAgICBjb25zdCBlcnJvciQgPSB0aGlzLmxpc3RlbkVycm9yKHJlcXVlc3QpO1xuXG4gICAgLyogQ2hvb3NlIHRoZSBmaXJzdCB0byBvY2N1ciAqL1xuICAgIHJhY2UoW3N1Y2Nlc3MkLCBlcnJvciRdKVxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSAqL1xuICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyogUmVnaXN0ZXIgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaW4gdGhlIGBSZXBsYXlTdWJqZWN0YCBmb3IgZnVydGhlciBhY2Nlc3MgKi9cbiAgICAgICAgICB0aGlzLmRhdGFiYXNlLm5leHQocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIC8qIEZpcmVmb3ggcHJpdmF0ZSBtb2RlIGlzc3VlOiBmYWxsYmFjayBzdG9yYWdlIGlmIEluZGV4ZWREYiBjb25uZWN0aW9uIGlzIGZhaWxpbmdcbiAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTk4Mn1cbiAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzI2fSAqL1xuICAgICAgICAgIHRoaXMuZGF0YWJhc2UuZXJyb3IobmV3IElEQkJyb2tlbkVycm9yKCkpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc3RvcmUgb24gZmlyc3QgdXNlIG9mIGBpbmRleGVkREJgXG4gICAqIEBwYXJhbSByZXF1ZXN0IGBpbmRleGVkREJgIGRhdGFiYXNlIG9wZW5pbmcgcmVxdWVzdFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0b3JlKHJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QpOiB2b2lkIHtcblxuICAgIC8qIExpc3RlbiB0byB0aGUgZXZlbnQgZmlyZWQgb24gZmlyc3QgY29ubmVjdGlvbiAqL1xuICAgIGZyb21FdmVudChyZXF1ZXN0LCBcInVwZ3JhZGVuZWVkZWRcIilcbiAgICAgIC8qIFRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgKi9cbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuXG4gICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHN0b3JlIGFscmVhZHkgZXhpc3RzLCB0byBhdm9pZCBlcnJvciAqL1xuICAgICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLnN0b3JlTmFtZSkpIHtcblxuICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBvYmplY3Qgc3RvcmUgKi9cbiAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKTtcblxuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYW4gYGluZGV4ZWREQmAgdHJhbnNhY3Rpb24gYW5kIGdldCBvdXIgc3RvcmVcbiAgICogQHBhcmFtIG1vZGUgYHJlYWRvbmx5YCBvciBgcmVhZHdyaXRlYFxuICAgKiBAcmV0dXJucyBBbiBgaW5kZXhlZERCYCB0cmFuc2FjdGlvbiBzdG9yZSBhbmQgZXZlbnRzLCB3cmFwcGVkIGluIGFuIFJ4SlMgYE9ic2VydmFibGVgXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb24obW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlKTogT2JzZXJ2YWJsZTx7XG4gICAgc3RvcmU6IElEQk9iamVjdFN0b3JlO1xuICAgIGV2ZW50czogT2JzZXJ2YWJsZTxFdmVudD47XG4gIH0+IHtcblxuICAgIC8qIEZyb20gdGhlIGBpbmRleGVkREJgIGNvbm5lY3Rpb24sIG9wZW4gYSB0cmFuc2FjdGlvbiBhbmQgZ2V0IHRoZSBzdG9yZSAqL1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlXG4gICAgICAucGlwZShtZXJnZU1hcCgoZGF0YWJhc2UpID0+IHtcblxuICAgICAgICBsZXQgdHJhbnNhY3Rpb246IElEQlRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICB0cmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKFt0aGlzLnN0b3JlTmFtZV0sIG1vZGUpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICAgICAgICAvKiBUaGUgc3RvcmUgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSBvdXRzaWRlICovXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IgYXMgRE9NRXhjZXB0aW9uKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgLyogR2V0IHRoZSBzdG9yZSBmcm9tIHRoZSB0cmFuc2FjdGlvbiAqL1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuc3RvcmVOYW1lKTtcblxuICAgICAgICAvKiBMaXN0ZW4gdHJhbnNhY3Rpb24gYGNvbXBsZXRlYCBhbmQgYGVycm9yYCBldmVudHMgKi9cbiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5saXN0ZW5UcmFuc2FjdGlvbkV2ZW50cyh0cmFuc2FjdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIG9mKHsgc3RvcmUsIGV2ZW50cyB9KTtcblxuICAgICAgfSkpO1xuXG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGVycm9ycyBvbiBhIHRyYW5zYWN0aW9uIG9yIHJlcXVlc3QsIGFuZCB0aHJvdyBpZiB0cmlnZXJyZWRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uT3JSZXF1ZXN0IGBpbmRleGVkRGJgIHRyYW5zYWN0aW9uIG9yIHJlcXVlc3QgdG8gbGlzdGVuXG4gICAqIEByZXR1cm5zIEFuIGBPYnNlcnZhYmxlYCBsaXN0ZW5pbmcgdG8gZXJyb3JzXG4gICAqL1xuICBwcm90ZWN0ZWQgbGlzdGVuRXJyb3IodHJhbnNhY3Rpb25PclJlcXVlc3Q6IElEQlRyYW5zYWN0aW9uIHwgSURCUmVxdWVzdCk6IE9ic2VydmFibGU8bmV2ZXI+IHtcblxuICAgIHJldHVybiBmcm9tRXZlbnQodHJhbnNhY3Rpb25PclJlcXVlc3QsIFwiZXJyb3JcIikucGlwZShcbiAgICAgIC8qIFRocm93IG9uIGVycm9yIHRvIGJlIGFibGUgdG8gY2F0Y2ggZXJyb3JzIGluIFJ4SlMgd2F5LlxuICAgICAgICogSGVyZSBgZXZlbnQudGFyZ2V0YCBtdXN0IGJlIHVzZWQsIGFzIGB0cmFuc2FjdGlvbk9yUmVxdWVzdC5lcnJvcmAgd2lsbCBiZSBgbnVsbGBcbiAgICAgICAqIGlmIHdlIGFyZSBvbiB0aGUgcmVxdWVzdCBhbmQgdGhlIGVycm9yIGlzIG9ubHkgdHJpZ2dlcmVkIGxhdGVyIGJ5IHRoZSB0cmFuc2FjdGlvbiAqL1xuICAgICAgbWVyZ2VNYXAoKGV2ZW50KSA9PiB0aHJvd0Vycm9yKCgpID0+IChldmVudC50YXJnZXQgYXMgSURCVHJhbnNhY3Rpb24gfCBJREJSZXF1ZXN0IHwgbnVsbCk/LmVycm9yKSksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0cmFuc2FjdGlvbiBgY29tcGxldGVgIGFuZCBgZXJyb3JgIGV2ZW50c1xuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gdG8gbGlzdGVuXG4gICAqIEByZXR1cm5zIEFuIGBPYnNlcnZhYmxlYCBsaXN0ZW5pbmcgdG8gdHJhbnNhY3Rpb24gYGNvbXBsZXRlYCBhbmQgYGVycm9yYCBldmVudHNcbiAgICovXG4gIHByb3RlY3RlZCBsaXN0ZW5UcmFuc2FjdGlvbkV2ZW50cyh0cmFuc2FjdGlvbjogSURCVHJhbnNhY3Rpb24pOiBPYnNlcnZhYmxlPEV2ZW50PiB7XG5cbiAgICAvKiBMaXN0ZW4gdG8gdGhlIGBjb21wbGV0ZWAgZXZlbnQgKi9cbiAgICBjb25zdCBjb21wbGV0ZSQgPSBmcm9tRXZlbnQodHJhbnNhY3Rpb24sIFwiY29tcGxldGVcIik7XG5cbiAgICAvKiBMaXN0ZW4gdG8gdGhlIGBlcnJvcmAgZXZlbnQgKi9cbiAgICBjb25zdCBlcnJvciQgPSB0aGlzLmxpc3RlbkVycm9yKHRyYW5zYWN0aW9uKTtcblxuICAgIC8qIENob29zZSB0aGUgZmlyc3QgZXZlbnQgdG8gb2NjdXIgKi9cbiAgICByZXR1cm4gcmFjZShbY29tcGxldGUkLCBlcnJvciRdKTtcblxuICB9XG5cbn1cbiJdfQ==