@sochdb/sochdb 0.4.0 → 0.4.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.
Files changed (69) hide show
  1. package/README.md +220 -33
  2. package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
  3. package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
  4. package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
  5. package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
  6. package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
  7. package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
  8. package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
  9. package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
  10. package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
  11. package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
  12. package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
  13. package/bin/sochdb-bulk.js +1 -1
  14. package/bin/sochdb-grpc-server.js +1 -1
  15. package/bin/sochdb-server.js +1 -1
  16. package/dist/cjs/context-builder.js +280 -0
  17. package/dist/cjs/database.js +2 -2
  18. package/dist/cjs/embedded/database.js +2 -2
  19. package/dist/cjs/errors.js +99 -7
  20. package/dist/cjs/index.js +40 -3
  21. package/dist/cjs/ipc-client.js +2 -2
  22. package/dist/cjs/memory/consolidation.js +202 -0
  23. package/dist/cjs/memory/extraction.js +181 -0
  24. package/dist/cjs/memory/index.js +26 -0
  25. package/dist/cjs/memory/retrieval.js +232 -0
  26. package/dist/cjs/memory/types.js +69 -0
  27. package/dist/cjs/namespace.js +255 -0
  28. package/dist/cjs/queue.js +289 -0
  29. package/dist/cjs/semantic-cache.js +220 -0
  30. package/dist/esm/context-builder.js +280 -0
  31. package/dist/esm/database.js +2 -2
  32. package/dist/esm/embedded/database.js +2 -2
  33. package/dist/esm/errors.js +107 -7
  34. package/dist/esm/index.js +40 -3
  35. package/dist/esm/ipc-client.js +2 -2
  36. package/dist/esm/memory/consolidation.js +206 -0
  37. package/dist/esm/memory/extraction.js +185 -0
  38. package/dist/esm/memory/index.js +26 -0
  39. package/dist/esm/memory/retrieval.js +243 -0
  40. package/dist/esm/memory/types.js +72 -0
  41. package/dist/esm/namespace.js +262 -0
  42. package/dist/esm/queue.js +291 -0
  43. package/dist/esm/semantic-cache.js +223 -0
  44. package/dist/types/context-builder.d.ts +97 -0
  45. package/dist/types/context-builder.d.ts.map +1 -0
  46. package/dist/types/database.d.ts +1 -1
  47. package/dist/types/embedded/database.d.ts +1 -1
  48. package/dist/types/errors.d.ts +57 -1
  49. package/dist/types/errors.d.ts.map +1 -1
  50. package/dist/types/index.d.ts +12 -2
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/dist/types/ipc-client.d.ts +1 -1
  53. package/dist/types/memory/consolidation.d.ts +66 -0
  54. package/dist/types/memory/consolidation.d.ts.map +1 -0
  55. package/dist/types/memory/extraction.d.ts +82 -0
  56. package/dist/types/memory/extraction.d.ts.map +1 -0
  57. package/dist/types/memory/index.d.ts +10 -0
  58. package/dist/types/memory/index.d.ts.map +1 -0
  59. package/dist/types/memory/retrieval.d.ts +46 -0
  60. package/dist/types/memory/retrieval.d.ts.map +1 -0
  61. package/dist/types/memory/types.d.ts +147 -0
  62. package/dist/types/memory/types.d.ts.map +1 -0
  63. package/dist/types/namespace.d.ts +129 -0
  64. package/dist/types/namespace.d.ts.map +1 -0
  65. package/dist/types/queue.d.ts +120 -0
  66. package/dist/types/queue.d.ts.map +1 -0
  67. package/dist/types/semantic-cache.d.ts +84 -0
  68. package/dist/types/semantic-cache.d.ts.map +1 -0
  69. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -37,9 +37,9 @@
37
37
  * ```
38
38
  */
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.GrpcClient = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.Database = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
40
+ exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.NamespacePolicy = exports.AllowedSet = exports.HybridRetriever = exports.Consolidator = exports.ExtractionPipeline = exports.createContextBuilder = exports.TruncationStrategy = exports.ContextOutputFormat = exports.ContextQueryBuilder = exports.SemanticCache = exports.createQueue = exports.TaskState = exports.PriorityQueue = exports.CollectionExistsError = exports.CollectionNotFoundError = exports.NamespaceExistsError = exports.NamespaceNotFoundError = exports.DistanceMetric = exports.Collection = exports.Namespace = exports.Database = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
41
41
  // Version
42
- exports.VERSION = '0.4.0';
42
+ exports.VERSION = '0.4.1';
43
43
  // Embedded mode (FFI) - NEW
44
44
  var embedded_1 = require("./embedded");
45
45
  Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
@@ -48,6 +48,36 @@ Object.defineProperty(exports, "EmbeddedTransaction", { enumerable: true, get: f
48
48
  // Embedded mode (FFI) - Convenience alias
49
49
  var embedded_3 = require("./embedded");
50
50
  Object.defineProperty(exports, "Database", { enumerable: true, get: function () { return embedded_3.EmbeddedDatabase; } });
51
+ // Namespace API (v0.4.1)
52
+ var namespace_1 = require("./namespace");
53
+ Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return namespace_1.Namespace; } });
54
+ Object.defineProperty(exports, "Collection", { enumerable: true, get: function () { return namespace_1.Collection; } });
55
+ Object.defineProperty(exports, "DistanceMetric", { enumerable: true, get: function () { return namespace_1.DistanceMetric; } });
56
+ Object.defineProperty(exports, "NamespaceNotFoundError", { enumerable: true, get: function () { return namespace_1.NamespaceNotFoundError; } });
57
+ Object.defineProperty(exports, "NamespaceExistsError", { enumerable: true, get: function () { return namespace_1.NamespaceExistsError; } });
58
+ Object.defineProperty(exports, "CollectionNotFoundError", { enumerable: true, get: function () { return namespace_1.CollectionNotFoundError; } });
59
+ Object.defineProperty(exports, "CollectionExistsError", { enumerable: true, get: function () { return namespace_1.CollectionExistsError; } });
60
+ // Queue API (v0.4.1)
61
+ var queue_1 = require("./queue");
62
+ Object.defineProperty(exports, "PriorityQueue", { enumerable: true, get: function () { return queue_1.PriorityQueue; } });
63
+ Object.defineProperty(exports, "TaskState", { enumerable: true, get: function () { return queue_1.TaskState; } });
64
+ Object.defineProperty(exports, "createQueue", { enumerable: true, get: function () { return queue_1.createQueue; } });
65
+ // Semantic Cache (v0.4.1)
66
+ var semantic_cache_1 = require("./semantic-cache");
67
+ Object.defineProperty(exports, "SemanticCache", { enumerable: true, get: function () { return semantic_cache_1.SemanticCache; } });
68
+ // Context Builder (v0.4.1)
69
+ var context_builder_1 = require("./context-builder");
70
+ Object.defineProperty(exports, "ContextQueryBuilder", { enumerable: true, get: function () { return context_builder_1.ContextQueryBuilder; } });
71
+ Object.defineProperty(exports, "ContextOutputFormat", { enumerable: true, get: function () { return context_builder_1.ContextOutputFormat; } });
72
+ Object.defineProperty(exports, "TruncationStrategy", { enumerable: true, get: function () { return context_builder_1.TruncationStrategy; } });
73
+ Object.defineProperty(exports, "createContextBuilder", { enumerable: true, get: function () { return context_builder_1.createContextBuilder; } });
74
+ // Memory System (v0.4.2)
75
+ var memory_1 = require("./memory");
76
+ Object.defineProperty(exports, "ExtractionPipeline", { enumerable: true, get: function () { return memory_1.ExtractionPipeline; } });
77
+ Object.defineProperty(exports, "Consolidator", { enumerable: true, get: function () { return memory_1.Consolidator; } });
78
+ Object.defineProperty(exports, "HybridRetriever", { enumerable: true, get: function () { return memory_1.HybridRetriever; } });
79
+ Object.defineProperty(exports, "AllowedSet", { enumerable: true, get: function () { return memory_1.AllowedSet; } });
80
+ Object.defineProperty(exports, "NamespacePolicy", { enumerable: true, get: function () { return memory_1.NamespacePolicy; } });
51
81
  // Server mode (gRPC/IPC)
52
82
  var grpc_client_1 = require("./grpc-client");
53
83
  Object.defineProperty(exports, "SochDBClient", { enumerable: true, get: function () { return grpc_client_1.SochDBClient; } });
@@ -69,7 +99,14 @@ Object.defineProperty(exports, "ConnectionError", { enumerable: true, get: funct
69
99
  Object.defineProperty(exports, "TransactionError", { enumerable: true, get: function () { return errors_1.TransactionError; } });
70
100
  Object.defineProperty(exports, "ProtocolError", { enumerable: true, get: function () { return errors_1.ProtocolError; } });
71
101
  Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return errors_1.DatabaseError; } });
102
+ // Lock errors (v0.4.1)
103
+ Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function () { return errors_1.ErrorCode; } });
104
+ Object.defineProperty(exports, "LockError", { enumerable: true, get: function () { return errors_1.LockError; } });
105
+ Object.defineProperty(exports, "DatabaseLockedError", { enumerable: true, get: function () { return errors_1.DatabaseLockedError; } });
106
+ Object.defineProperty(exports, "LockTimeoutError", { enumerable: true, get: function () { return errors_1.LockTimeoutError; } });
107
+ Object.defineProperty(exports, "EpochMismatchError", { enumerable: true, get: function () { return errors_1.EpochMismatchError; } });
108
+ Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: function () { return errors_1.SplitBrainError; } });
72
109
  // Convenience alias
73
110
  var grpc_client_2 = require("./grpc-client");
74
111
  Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7OztBQUVILFVBQVU7QUFDRyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFL0IsNEJBQTRCO0FBQzVCLHVDQUFzRTtBQUE3RCw0R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFFNUIsMENBQTBDO0FBQzFDLHVDQUEwRDtBQUFqRCxvR0FBQSxnQkFBZ0IsT0FBWTtBQUVyQyx5QkFBeUI7QUFDekIsNkNBQTZDO0FBQXBDLDJHQUFBLFlBQVksT0FBQTtBQVFyQiwyQ0FBeUM7QUFBaEMsdUdBQUEsU0FBUyxPQUFBO0FBRWxCLG1CQUFtQjtBQUNuQixtQ0FNa0I7QUFMaEIsb0dBQUEsVUFBVSxPQUFBO0FBQ1YsdUdBQUEsYUFBYSxPQUFBO0FBQ2IseUdBQUEsZUFBZSxPQUFBO0FBQ2YsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsK0dBQUEscUJBQXFCLE9BQUE7QUFHdkIsbUJBQW1CO0FBQ25CLGlDQUFnQztBQUF2Qiw4RkFBQSxLQUFLLE9BQUE7QUFHZCxtQ0FNa0I7QUFMaEIscUdBQUEsV0FBVyxPQUFBO0FBQ1gseUdBQUEsZUFBZSxPQUFBO0FBQ2YsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsdUdBQUEsYUFBYSxPQUFBO0FBQ2IsdUdBQUEsYUFBYSxPQUFBO0FBR2Ysb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC40LjBcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBTZXJ2ZXIgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBDb25uZWN0IHRvIHNlcnZlclxuICogY29uc3QgY2xpZW50ID0gbmV3IFNvY2hEQkNsaWVudCh7IGFkZHJlc3M6ICdsb2NhbGhvc3Q6NTAwNTEnIH0pO1xuICogYXdhaXQgY2xpZW50LnB1dEt2KCdrZXknLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBWZXJzaW9uXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjQuMCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBORVdcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIEVtYmVkZGVkRGF0YWJhc2VDb25maWcgfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gRW1iZWRkZWQgbW9kZSAoRkZJKSAtIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIGFzIERhdGFiYXNlIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIFNlcnZlciBtb2RlIChnUlBDL0lQQylcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuZXhwb3J0IHR5cGUge1xuICBTZWFyY2hSZXN1bHQsXG4gIERvY3VtZW50LFxuICBHcmFwaE5vZGUsXG4gIEdyYXBoRWRnZSxcbn0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5cbmV4cG9ydCB7IElwY0NsaWVudCB9IGZyb20gJy4vaXBjLWNsaWVudCc7XG5cbi8vIEZvcm1hdCB1dGlsaXRpZXNcbmV4cG9ydCB7XG4gIFdpcmVGb3JtYXQsXG4gIENvbnRleHRGb3JtYXQsXG4gIENhbm9uaWNhbEZvcm1hdCxcbiAgRm9ybWF0Q2FwYWJpbGl0aWVzLFxuICBGb3JtYXRDb252ZXJzaW9uRXJyb3IsXG59IGZyb20gJy4vZm9ybWF0JztcblxuLy8gVHlwZSBkZWZpbml0aW9uc1xuZXhwb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCB0eXBlIHsgUXVlcnlSZXN1bHQgfSBmcm9tICcuL3F1ZXJ5JztcblxuZXhwb3J0IHtcbiAgU29jaERCRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25FcnJvcixcbiAgUHJvdG9jb2xFcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgU29jaERCQ2xpZW50IGFzIEdycGNDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7OztBQUVILFVBQVU7QUFDRyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFL0IsNEJBQTRCO0FBQzVCLHVDQUFzRTtBQUE3RCw0R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFFNUIsMENBQTBDO0FBQzFDLHVDQUEwRDtBQUFqRCxvR0FBQSxnQkFBZ0IsT0FBWTtBQUVyQyx5QkFBeUI7QUFDekIseUNBUXFCO0FBUG5CLHNHQUFBLFNBQVMsT0FBQTtBQUNULHVHQUFBLFVBQVUsT0FBQTtBQUNWLDJHQUFBLGNBQWMsT0FBQTtBQUNkLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGlIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLG9IQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLGtIQUFBLHFCQUFxQixPQUFBO0FBU3ZCLHFCQUFxQjtBQUNyQixpQ0FJaUI7QUFIZixzR0FBQSxhQUFhLE9BQUE7QUFDYixrR0FBQSxTQUFTLE9BQUE7QUFDVCxvR0FBQSxXQUFXLE9BQUE7QUFTYiwwQkFBMEI7QUFDMUIsbURBRTBCO0FBRHhCLCtHQUFBLGFBQWEsT0FBQTtBQVFmLDJCQUEyQjtBQUMzQixxREFLMkI7QUFKekIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIscUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIsdUhBQUEsb0JBQW9CLE9BQUE7QUFNdEIseUJBQXlCO0FBQ3pCLG1DQU1rQjtBQUxoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQixzR0FBQSxZQUFZLE9BQUE7QUFDWix5R0FBQSxlQUFlLE9BQUE7QUFDZixvR0FBQSxVQUFVLE9BQUE7QUFDVix5R0FBQSxlQUFlLE9BQUE7QUFpQmpCLHlCQUF5QjtBQUN6Qiw2Q0FBNkM7QUFBcEMsMkdBQUEsWUFBWSxPQUFBO0FBUXJCLDJDQUF5QztBQUFoQyx1R0FBQSxTQUFTLE9BQUE7QUFFbEIsbUJBQW1CO0FBQ25CLG1DQU1rQjtBQUxoQixvR0FBQSxVQUFVLE9BQUE7QUFDVix1R0FBQSxhQUFhLE9BQUE7QUFDYix5R0FBQSxlQUFlLE9BQUE7QUFDZiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQiwrR0FBQSxxQkFBcUIsT0FBQTtBQUd2QixtQkFBbUI7QUFDbkIsaUNBQWdDO0FBQXZCLDhGQUFBLEtBQUssT0FBQTtBQUdkLG1DQWFrQjtBQVpoQixxR0FBQSxXQUFXLE9BQUE7QUFDWCx5R0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQix1R0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxhQUFhLE9BQUE7QUFDYix1QkFBdUI7QUFDdkIsbUdBQUEsU0FBUyxPQUFBO0FBQ1QsbUdBQUEsU0FBUyxPQUFBO0FBQ1QsNkdBQUEsbUJBQW1CLE9BQUE7QUFDbkIsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIseUdBQUEsZUFBZSxPQUFBO0FBR2pCLG9CQUFvQjtBQUNwQiw2Q0FBMkQ7QUFBbEQseUdBQUEsWUFBWSxPQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgTm9kZS5qcyBTREsgdjAuNC4wXG4gKiBcbiAqIER1YWwtbW9kZSBhcmNoaXRlY3R1cmU6IEVtYmVkZGVkIChGRkkpICsgU2VydmVyIChnUlBDL0lQQylcbiAqIFxuICogQXJjaGl0ZWN0dXJlOiBGbGV4aWJsZSBEZXBsb3ltZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBUaGlzIFNESyBzdXBwb3J0cyBCT1RIIG1vZGVzOlxuICogXG4gKiAxLiBFbWJlZGRlZCBNb2RlIChGRkkpIC0gRm9yIHNpbmdsZS1wcm9jZXNzIGFwcHM6XG4gKiAgICAtIERpcmVjdCBGRkkgYmluZGluZ3MgdG8gUnVzdCBsaWJyYXJpZXNcbiAqICAgIC0gTm8gc2VydmVyIHJlcXVpcmVkIC0ganVzdCBucG0gaW5zdGFsbCBhbmQgcnVuXG4gKiAgICAtIEJlc3QgZm9yOiBMb2NhbCBkZXZlbG9wbWVudCwgc2ltcGxlIGFwcHNcbiAqIFxuICogMi4gU2VydmVyIE1vZGUgKGdSUEMvSVBDKSAtIEZvciBkaXN0cmlidXRlZCBzeXN0ZW1zOlxuICogICAgLSBUaGluIGNsaWVudCBjb25uZWN0aW5nIHRvIHNvY2hkYi1ncnBjIHNlcnZlclxuICogICAgLSBCZXN0IGZvcjogUHJvZHVjdGlvbiwgbXVsdGktbGFuZ3VhZ2UsIHNjYWxhYmlsaXR5XG4gKiBcbiAqIEBleGFtcGxlIEVtYmVkZGVkIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBEaXJlY3QgRkZJIC0gbm8gc2VydmVyIG5lZWRlZFxuICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC40LjEnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgRW1iZWRkZWREYXRhYmFzZSBhcyBEYXRhYmFzZSB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG4gIE5hbWVzcGFjZVBvbGljeSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuZXhwb3J0IHR5cGUge1xuICBFbnRpdHksXG4gIFJlbGF0aW9uLFxuICBBc3NlcnRpb24sXG4gIFJhd0Fzc2VydGlvbixcbiAgQ2Fub25pY2FsRmFjdCxcbiAgRXh0cmFjdGlvblJlc3VsdCxcbiAgRXh0cmFjdGlvblNjaGVtYSxcbiAgQ29uc29saWRhdGlvbkNvbmZpZyxcbiAgUmV0cmlldmFsQ29uZmlnLFxuICBSZXRyaWV2YWxSZXN1bHQsXG4gIFJldHJpZXZhbFJlc3BvbnNlLFxuICBOYW1lc3BhY2VHcmFudCxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBTZXJ2ZXIgbW9kZSAoZ1JQQy9JUEMpXG5leHBvcnQgeyBTb2NoREJDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbmV4cG9ydCB0eXBlIHtcbiAgU2VhcmNoUmVzdWx0LFxuICBEb2N1bWVudCxcbiAgR3JhcGhOb2RlLFxuICBHcmFwaEVkZ2UsXG59IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuXG5leHBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICcuL2lwYy1jbGllbnQnO1xuXG4vLyBGb3JtYXQgdXRpbGl0aWVzXG5leHBvcnQge1xuICBXaXJlRm9ybWF0LFxuICBDb250ZXh0Rm9ybWF0LFxuICBDYW5vbmljYWxGb3JtYXQsXG4gIEZvcm1hdENhcGFiaWxpdGllcyxcbiAgRm9ybWF0Q29udmVyc2lvbkVycm9yLFxufSBmcm9tICcuL2Zvcm1hdCc7XG5cbi8vIFR5cGUgZGVmaW5pdGlvbnNcbmV4cG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5leHBvcnQgdHlwZSB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9xdWVyeSc7XG5cbmV4cG9ydCB7XG4gIFNvY2hEQkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uRXJyb3IsXG4gIFByb3RvY29sRXJyb3IsXG4gIERhdGFiYXNlRXJyb3IsXG4gIC8vIExvY2sgZXJyb3JzICh2MC40LjEpXG4gIEVycm9yQ29kZSxcbiAgTG9ja0Vycm9yLFxuICBEYXRhYmFzZUxvY2tlZEVycm9yLFxuICBMb2NrVGltZW91dEVycm9yLFxuICBFcG9jaE1pc21hdGNoRXJyb3IsXG4gIFNwbGl0QnJhaW5FcnJvcixcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgU29jaERCQ2xpZW50IGFzIEdycGNDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbiJdfQ==
@@ -112,7 +112,7 @@ const MAX_MESSAGE_SIZE = 16 * 1024 * 1024; // 16 MB
112
112
  *
113
113
  * @example
114
114
  * ```typescript
115
- * import { IpcClient } from '@sushanth/sochdb';
115
+ * import { IpcClient } from '@sochdb/sochdb';
116
116
  *
117
117
  * const client = await IpcClient.connect('/tmp/sochdb.sock');
118
118
  *
@@ -501,4 +501,4 @@ class IpcClient {
501
501
  }
502
502
  }
503
503
  exports.IpcClient = IpcClient;
504
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGMtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx5Q0FBMkI7QUFDM0IscUNBQTRFO0FBQzVFLG1DQUFnQztBQUVoQzs7R0FFRztBQUNVLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLGdFQUFnRTtJQUNoRSxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLElBQUk7SUFFVixrQkFBa0I7SUFDbEIsRUFBRSxFQUFFLElBQUk7SUFDUixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxHQUFHLEVBQUUsSUFBSTtJQUNULFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsSUFBSTtDQUNGLENBQUM7QUFFWCxrREFBa0Q7QUFDbEQsTUFBTSxjQUFjLEdBQUc7SUFDckIsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsTUFB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O0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sTUFBTSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM3QixJQUFJLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhjRCw4QkFnY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBJUEMgQ2xpZW50XG4gKlxuICogQ29ubmVjdHMgdG8gYSBTb2NoREIgSVBDIHNlcnZlciB2aWEgVW5peCBkb21haW4gc29ja2V0LlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5pbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUHJvdG9jb2xFcnJvciwgVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5cbi8qKlxuICogV2lyZSBwcm90b2NvbCBvcGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgT3BDb2RlID0ge1xuICAvLyBDbGllbnQg4oaSIFNlcnZlciAobXVzdCBtYXRjaCBzb2NoZGItc3RvcmFnZS9zcmMvaXBjX3NlcnZlci5ycylcbiAgUHV0OiAweDAxLFxuICBHZXQ6IDB4MDIsXG4gIERlbGV0ZTogMHgwMyxcbiAgQmVnaW5UeG46IDB4MDQsXG4gIENvbW1pdFR4bjogMHgwNSxcbiAgQWJvcnRUeG46IDB4MDYsXG4gIFF1ZXJ5OiAweDA3LFxuICBDcmVhdGVUYWJsZTogMHgwOCxcbiAgUHV0UGF0aDogMHgwOSxcbiAgR2V0UGF0aDogMHgwQSxcbiAgU2NhbjogMHgwQixcbiAgQ2hlY2twb2ludDogMHgwQyxcbiAgU3RhdHM6IDB4MEQsXG4gIFBpbmc6IDB4MEUsXG5cbiAgLy8gU2VydmVyIOKGkiBDbGllbnRcbiAgT0s6IDB4ODAsXG4gIEVycm9yOiAweDgxLFxuICBWYWx1ZTogMHg4MixcbiAgVHhuSWQ6IDB4ODMsXG4gIFJvdzogMHg4NCxcbiAgRW5kU3RyZWFtOiAweDg1LFxuICBTdGF0c1Jlc3A6IDB4ODYsXG4gIFBvbmc6IDB4ODcsXG59IGFzIGNvbnN0O1xuXG4vLyBJbnRlcm5hbCBPcENvZGUgbWFwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgSW50ZXJuYWxPcENvZGUgPSB7XG4gIFBVVDogT3BDb2RlLlB1dCxcbiAgR0VUOiBPcENvZGUuR2V0LFxuICBERUxFVEU6IE9wQ29kZS5EZWxldGUsXG4gIEJFR0lOX1RYTjogT3BDb2RlLkJlZ2luVHhuLFxuICBDT01NSVRfVFhOOiBPcENvZGUuQ29tbWl0VHhuLFxuICBBQk9SVF9UWE46IE9wQ29kZS5BYm9ydFR4bixcbiAgUVVFUlk6IE9wQ29kZS5RdWVyeSxcbiAgUFVUX1BBVEg6IE9wQ29kZS5QdXRQYXRoLFxuICBHRVRfUEFUSDogT3BDb2RlLkdldFBhdGgsXG4gIFNDQU46IE9wQ29kZS5TY2FuLFxuICBDSEVDS1BPSU5UOiBPcENvZGUuQ2hlY2twb2ludCxcbiAgU1RBVFM6IE9wQ29kZS5TdGF0cyxcbiAgUElORzogT3BDb2RlLlBpbmcsXG4gIE9LOiBPcENvZGUuT0ssXG4gIEVSUk9SOiBPcENvZGUuRXJyb3IsXG4gIFZBTFVFOiBPcENvZGUuVmFsdWUsXG4gIFRYTl9JRDogT3BDb2RlLlR4bklkLFxuICBST1c6IE9wQ29kZS5Sb3csXG4gIEVORF9TVFJFQU06IE9wQ29kZS5FbmRTdHJlYW0sXG4gIFNUQVRTX1JFU1A6IE9wQ29kZS5TdGF0c1Jlc3AsXG4gIFBPTkc6IE9wQ29kZS5Qb25nLFxufSBhcyBjb25zdDtcblxuY29uc3QgTUFYX01FU1NBR0VfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7IC8vIDE2IE1CXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBJcGNDbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBjQ2xpZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gVW5peCBkb21haW4gc29ja2V0ICovXG4gIHNvY2tldFBhdGg6IHN0cmluZztcbiAgLyoqIENvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIGNvbm5lY3RUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogUmVhZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAwMDApICovXG4gIHJlYWRUaW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIElQQyBDbGllbnQgZm9yIFNvY2hEQi5cbiAqXG4gKiBDb25uZWN0cyB0byBhIFNvY2hEQiBzZXJ2ZXIgdmlhIFVuaXggZG9tYWluIHNvY2tldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnQHN1c2hhbnRoL3NvY2hkYic7XG4gKlxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgSXBjQ2xpZW50LmNvbm5lY3QoJy90bXAvc29jaGRiLnNvY2snKTtcbiAqXG4gKiBhd2FpdCBjbGllbnQucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBjbGllbnQuZ2V0KEJ1ZmZlci5mcm9tKCdrZXknKSk7XG4gKlxuICogYXdhaXQgY2xpZW50LmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElwY0NsaWVudCB7XG4gIHByaXZhdGUgX3NvY2tldDogbmV0LlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9jb25maWc6IFJlcXVpcmVkPElwY0NsaWVudENvbmZpZz47XG4gIHByaXZhdGUgX3BlbmRpbmdSZWFkczogQXJyYXk8e1xuICAgIHJlc29sdmU6IChidWY6IEJ1ZmZlcikgPT4gdm9pZDtcbiAgICByZWplY3Q6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIF9yZWFkQnVmZmVyOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gIHByaXZhdGUgX2Nsb3NlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY29uZmlnOiBJcGNDbGllbnRDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICBjb25uZWN0VGltZW91dDogNTAwMCxcbiAgICAgIHJlYWRUaW1lb3V0OiAzMDAwMCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gYSBTb2NoREIgSVBDIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHNvY2tldFBhdGggLSBQYXRoIHRvIHRoZSBVbml4IGRvbWFpbiBzb2NrZXRcbiAgICogQHJldHVybnMgQSBjb25uZWN0ZWQgSXBjQ2xpZW50IGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2xpZW50ID0gYXdhaXQgSXBjQ2xpZW50LmNvbm5lY3QoJy90bXAvc29jaGRiLnNvY2snKTtcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY29ubmVjdChzb2NrZXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElwY0NsaWVudD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBJcGNDbGllbnQoeyBzb2NrZXRQYXRoIH0pO1xuICAgIGF3YWl0IGNsaWVudC5fY29ubmVjdCgpO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgeyBwYXRoOiB0aGlzLl9jb25maWcuc29ja2V0UGF0aCB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgc29ja2V0LnNldFRpbWVvdXQodGhpcy5fY29uZmlnLmNvbm5lY3RUaW1lb3V0KTtcblxuICAgICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignQ29ubmVjdGlvbiB0aW1lb3V0JykpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKGBDb25uZWN0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX3JlYWRCdWZmZXIsIGRhdGFdKTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUmVhZHMpIHtcbiAgICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMgPSBbXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc0J1ZmZlcigpOiB2b2lkIHtcbiAgICAvLyBQcm9jZXNzIGNvbXBsZXRlIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlclxuICAgIHdoaWxlICh0aGlzLl9yZWFkQnVmZmVyLmxlbmd0aCA+PSA1ICYmIHRoaXMuX3BlbmRpbmdSZWFkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl9yZWFkQnVmZmVyLnJlYWRVSW50MzJMRSgxKTtcbiAgICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gNSArIGxlbmd0aDtcblxuICAgICAgaWYgKHRoaXMuX3JlYWRCdWZmZXIubGVuZ3RoID49IHRvdGFsTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl9yZWFkQnVmZmVyLnN1YmFycmF5KDAsIHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fcmVhZEJ1ZmZlciA9IHRoaXMuX3JlYWRCdWZmZXIuc3ViYXJyYXkodG90YWxMZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nUmVhZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICBwZW5kaW5nLnJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3NlbmQob3Bjb2RlOiBudW1iZXIsIHBheWxvYWQ6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCAhdGhpcy5fc29ja2V0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdOb3QgY29ubmVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gRW5jb2RlIG1lc3NhZ2U6IG9wY29kZSAoMSkgKyBsZW5ndGggKDQgTEUpICsgcGF5bG9hZFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuYWxsb2MoNSArIHBheWxvYWQubGVuZ3RoKTtcbiAgICBtZXNzYWdlLndyaXRlVUludDgob3Bjb2RlLCAwKTtcbiAgICBtZXNzYWdlLndyaXRlVUludDMyTEUocGF5bG9hZC5sZW5ndGgsIDEpO1xuICAgIHBheWxvYWQuY29weShtZXNzYWdlLCA1KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVhZHMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcblxuICAgICAgdGhpcy5fc29ja2V0IS53cml0ZShtZXNzYWdlLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMucG9wKCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoYFdyaXRlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdGltZW91dCBmb3IgcmVzcG9uc2VcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9wZW5kaW5nUmVhZHMuZmluZEluZGV4KChwKSA9PiBwLnJlc29sdmUgPT09IHJlc29sdmUpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZWFkcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignUmVhZCB0aW1lb3V0JykpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLl9jb25maWcucmVhZFRpbWVvdXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VSZXNwb25zZShyZXNwb25zZTogQnVmZmVyKTogeyBvcGNvZGU6IG51bWJlcjsgcGF5bG9hZDogQnVmZmVyIH0ge1xuICAgIGNvbnN0IG9wY29kZSA9IHJlc3BvbnNlLnJlYWRVSW50OCgwKTtcbiAgICBjb25zdCBsZW5ndGggPSByZXNwb25zZS5yZWFkVUludDMyTEUoMSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHJlc3BvbnNlLnN1YmFycmF5KDUsIDUgKyBsZW5ndGgpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuRVJST1IpIHtcbiAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKHBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3Bjb2RlLCBwYXlsb2FkIH07XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGEga2V5IGZvciB0aGUgd2lyZSBwcm90b2NvbC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgZW5jb2RlS2V5KGtleTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICAvLyBGb3JtYXQ6IFtsZW5ndGg6NF1bb3A6MV1ba2V5X2xlbjo0XVtrZXk6Li4uXVxuICAgIGNvbnN0IG1zZ0xlbiA9IDEgKyA0ICsga2V5Lmxlbmd0aDtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuYWxsb2MoNCArIG1zZ0xlbik7XG4gICAgbXNnLndyaXRlVUludDMyQkUobXNnTGVuLCAwKTtcbiAgICBtc2cud3JpdGVVSW50OChJbnRlcm5hbE9wQ29kZS5HRVQsIDQpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKGtleS5sZW5ndGgsIDUpO1xuICAgIGtleS5jb3B5KG1zZywgOSk7XG4gICAgcmV0dXJuIG1zZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgYSBrZXktdmFsdWUgcGFpciBmb3IgdGhlIHdpcmUgcHJvdG9jb2wuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGVuY29kZUtleVZhbHVlKGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICAvLyBGb3JtYXQ6IFtsZW5ndGg6NF1bb3A6MV1ba2V5X2xlbjo0XVtrZXk6Li4uXVt2YWx1ZV9sZW46NF1bdmFsdWU6Li4uXVxuICAgIGNvbnN0IG1zZ0xlbiA9IDEgKyA0ICsga2V5Lmxlbmd0aCArIDQgKyB2YWx1ZS5sZW5ndGg7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmFsbG9jKDQgKyBtc2dMZW4pO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKG1zZ0xlbiwgMCk7XG4gICAgbXNnLndyaXRlVUludDgoSW50ZXJuYWxPcENvZGUuUFVULCA0KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShrZXkubGVuZ3RoLCA1KTtcbiAgICBrZXkuY29weShtc2csIDkpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKHZhbHVlLmxlbmd0aCwgOSArIGtleS5sZW5ndGgpO1xuICAgIHZhbHVlLmNvcHkobXNnLCAxMyArIGtleS5sZW5ndGgpO1xuICAgIHJldHVybiBtc2c7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkga2V5LlxuICAgKi9cbiAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkdFVCwga2V5KTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5WQUxVRSkge1xuICAgICAgLy8gSWYgcGF5bG9hZCBpcyBlbXB0eSwgdGhlIGtleSBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAocGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIuXG4gICAqL1xuICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFbmNvZGU6IGtleV9sZW4gKDQgTEUpICsga2V5ICsgdmFsdWVcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDQgKyBrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUoa2V5Lmxlbmd0aCwgMCk7XG4gICAga2V5LmNvcHkocGF5bG9hZCwgNCk7XG4gICAgdmFsdWUuY29weShwYXlsb2FkLCA0ICsga2V5Lmxlbmd0aCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUFVULCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBrZXkuXG4gICAqL1xuICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuREVMRVRFLCBrZXkpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IHBhdGguXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2NvdW50KDIgTEUpICsgW3BhdGhfbGVuKDIgTEUpICsgcGF0aF9zZWdtZW50XS4uLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAvLyBFbmNvZGUgcGF0aCBhcyBzaW5nbGUgc2VnbWVudCBmb3Igbm93IChjb3VsZCBzcGxpdCBvbiAnLycgZm9yIG11bHRpLXNlZ21lbnQpXG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYygyICsgMiArIHBhdGhCdWYubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoMSwgMCk7IC8vIHBhdGhfY291bnQgPSAxXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKHBhdGhCdWYubGVuZ3RoLCAyKTsgLy8gcGF0aF9sZW5cbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgNCk7IC8vIHBhdGhcbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuR0VUX1BBVEgsIHBheWxvYWQpO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkOiByZXNwb25zZVBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVkFMVUUpIHtcbiAgICAgIC8vIElmIHBheWxvYWQgaXMgZW1wdHksIHRoZSBrZXkgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKHJlc3BvbnNlUGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VQYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSB2YWx1ZSBhdCBhIHBhdGguXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2NvdW50KDIgTEUpICsgW3BhdGhfbGVuKDIgTEUpICsgcGF0aF9zZWdtZW50XS4uLiArIHZhbHVlXG4gICAqL1xuICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMiArIDIgKyBwYXRoQnVmLmxlbmd0aCArIHZhbHVlLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKDEsIDApOyAvLyBwYXRoX2NvdW50ID0gMVxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgMik7IC8vIHBhdGhfbGVuXG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIDQpOyAvLyBwYXRoXG4gICAgdmFsdWUuY29weShwYXlsb2FkLCA0ICsgcGF0aEJ1Zi5sZW5ndGgpOyAvLyB2YWx1ZVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBVVF9QQVRILCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHJldHVybiBUT09OLWZvcm1hdHRlZCByZXN1bHRzLlxuICAgKiBcbiAgICogV2lyZSBmb3JtYXQ6IHBhdGhfbGVuKDIpICsgcGF0aCArIGxpbWl0KDQpICsgb2Zmc2V0KDQpICsgY29sc19jb3VudCgyKSArIFtjb2xfbGVuKDIpICsgY29sXS4uLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgcGF0aFByZWZpeDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXI7IGNvbHVtbnM/OiBzdHJpbmdbXSB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGhQcmVmaXgsICd1dGY4Jyk7XG4gICAgY29uc3QgY29sdW1ucyA9IG9wdHMuY29sdW1ucyB8fCBbXTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgcGF5bG9hZCBzaXplXG4gICAgbGV0IHNpemUgPSAyICsgcGF0aEJ1Zi5sZW5ndGggKyA0ICsgNCArIDI7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgc2l6ZSArPSAyICsgQnVmZmVyLmJ5dGVMZW5ndGgoY29sLCAndXRmOCcpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIFxuICAgIC8vIFBhdGg6IHBhdGhfbGVuKDIgTEUpICsgcGF0aFxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMjtcbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gcGF0aEJ1Zi5sZW5ndGg7XG4gICAgXG4gICAgLy8gTGltaXQgKDQgTEUpIC0gMCBtZWFucyBubyBsaW1pdFxuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShvcHRzLmxpbWl0IHx8IDAsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDQ7XG4gICAgXG4gICAgLy8gT2Zmc2V0ICg0IExFKVxuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShvcHRzLm9mZnNldCB8fCAwLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIFxuICAgIC8vIENvbHVtbnM6IGNvdW50KDIgTEUpICsgW2NvbF9sZW4oMiBMRSkgKyBjb2xdLi4uXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKGNvbHVtbnMubGVuZ3RoLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbEJ1ZiA9IEJ1ZmZlci5mcm9tKGNvbCwgJ3V0ZjgnKTtcbiAgICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShjb2xCdWYubGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBjb2xCdWYuY29weShwYXlsb2FkLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGNvbEJ1Zi5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlFVRVJZLCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IHBheWxvYWQ6IHJlc3VsdFBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgcmV0dXJuIHJlc3VsdFBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FuIGZvciBrZXlzIHdpdGggYSBwcmVmaXgsIHJldHVybmluZyBrZXktdmFsdWUgcGFpcnMuXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNpbXBsZSBwcmVmaXgtYmFzZWQgaXRlcmF0aW9uLlxuICAgKiBcbiAgICogV2lyZSBmb3JtYXQ6IHByZWZpeCBzdHJpbmdcbiAgICogUmVzcG9uc2UgZm9ybWF0OiBjb3VudCg0IExFKSArIFtrZXlfbGVuKDIgTEUpICsga2V5ICsgdmFsX2xlbig0IExFKSArIHZhbF0uLi5cbiAgICovXG4gIGFzeW5jIHNjYW4ocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHsga2V5OiBCdWZmZXI7IHZhbHVlOiBCdWZmZXIgfT4+IHtcbiAgICBjb25zdCBwcmVmaXhCdWYgPSBCdWZmZXIuZnJvbShwcmVmaXgsICd1dGY4Jyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlNDQU4sIHByZWZpeEJ1Zik7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSAhPT0gSW50ZXJuYWxPcENvZGUuVkFMVUUgJiYgb3Bjb2RlICE9PSBJbnRlcm5hbE9wQ29kZS5PSykge1xuICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoYFVuZXhwZWN0ZWQgc2NhbiByZXNwb25zZSBvcGNvZGU6IDB4JHtvcGNvZGUudG9TdHJpbmcoMTYpfWApO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gRW1wdHkgcmVzdWx0XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgcmVzcG9uc2U6IGNvdW50KDQgTEUpICsgW2tleV9sZW4oMiBMRSkgKyBrZXkgKyB2YWxfbGVuKDQgTEUpICsgdmFsXS4uLlxuICAgIGNvbnN0IGNvdW50ID0gcGF5bG9hZC5yZWFkVUludDMyTEUoMCk7XG4gICAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBrZXk6IEJ1ZmZlcjsgdmFsdWU6IEJ1ZmZlciB9PiA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSA0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBpZiAob2Zmc2V0ICsgMiA+IHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKCdUcnVuY2F0ZWQgc2NhbiByZXNwb25zZSAoa2V5X2xlbiknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleUxlbiA9IHBheWxvYWQucmVhZFVJbnQxNkxFKG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMjtcblxuICAgICAgaWYgKG9mZnNldCArIGtleUxlbiArIDQgPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKGtleSt2YWxfbGVuKScpO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gcGF5bG9hZC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGtleUxlbik7XG4gICAgICBvZmZzZXQgKz0ga2V5TGVuO1xuXG4gICAgICBjb25zdCB2YWxMZW4gPSBwYXlsb2FkLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDQ7XG5cbiAgICAgIGlmIChvZmZzZXQgKyB2YWxMZW4gPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKHZhbHVlKScpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBwYXlsb2FkLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgdmFsTGVuKTtcbiAgICAgIG9mZnNldCArPSB2YWxMZW47XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7IGtleSwgdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHF1ZXJ5QnVpbGRlcihwYXRoUHJlZml4OiBzdHJpbmcpOiBRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLCBwYXRoUHJlZml4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbiBhIG5ldyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQkVHSU5fVFhOKTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5UWE5fSUQpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnJlYWRCaWdVSW50NjRMRSgwKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXJyb3IoJ0ZhaWxlZCB0byBiZWdpbiB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgY29tbWl0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcGF5bG9hZC53cml0ZUJpZ1VJbnQ2NExFKHR4bklkLCAwKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQ09NTUlUX1RYTiwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGFib3J0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcGF5bG9hZC53cml0ZUJpZ1VJbnQ2NExFKHR4bklkLCAwKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQUJPUlRfVFhOLCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIGNoZWNrcG9pbnQuXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5DSEVDS1BPSU5UKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzLlxuICAgKi9cbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM6IG51bWJlcjtcbiAgICB3YWxTaXplQnl0ZXM6IG51bWJlcjtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgfT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5TVEFUUyk7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShwYXlsb2FkLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIHJldHVybiB7XG4gICAgICBtZW10YWJsZVNpemVCeXRlczoganNvbi5tZW10YWJsZV9zaXplX2J5dGVzIHx8IDAsXG4gICAgICB3YWxTaXplQnl0ZXM6IGpzb24ud2FsX3NpemVfYnl0ZXMgfHwgMCxcbiAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczoganNvbi5hY3RpdmVfdHJhbnNhY3Rpb25zIHx8IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBhc3luYyBwaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUElORyk7XG4gICAgICBjb25zdCB7IG9wY29kZSB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICByZXR1cm4gb3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5QT05HO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuX3NvY2tldCEuZW5kKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9zb2NrZXQgPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGMtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx5Q0FBMkI7QUFDM0IscUNBQTRFO0FBQzVFLG1DQUFnQztBQUVoQzs7R0FFRztBQUNVLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLGdFQUFnRTtJQUNoRSxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLElBQUk7SUFFVixrQkFBa0I7SUFDbEIsRUFBRSxFQUFFLElBQUk7SUFDUixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxHQUFHLEVBQUUsSUFBSTtJQUNULFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsSUFBSTtDQUNGLENBQUM7QUFFWCxrREFBa0Q7QUFDbEQsTUFBTSxjQUFjLEdBQUc7SUFDckIsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsTUFB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O0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sTUFBTSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM3QixJQUFJLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhjRCw4QkFnY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBJUEMgQ2xpZW50XG4gKlxuICogQ29ubmVjdHMgdG8gYSBTb2NoREIgSVBDIHNlcnZlciB2aWEgVW5peCBkb21haW4gc29ja2V0LlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5pbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUHJvdG9jb2xFcnJvciwgVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5cbi8qKlxuICogV2lyZSBwcm90b2NvbCBvcGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgT3BDb2RlID0ge1xuICAvLyBDbGllbnQg4oaSIFNlcnZlciAobXVzdCBtYXRjaCBzb2NoZGItc3RvcmFnZS9zcmMvaXBjX3NlcnZlci5ycylcbiAgUHV0OiAweDAxLFxuICBHZXQ6IDB4MDIsXG4gIERlbGV0ZTogMHgwMyxcbiAgQmVnaW5UeG46IDB4MDQsXG4gIENvbW1pdFR4bjogMHgwNSxcbiAgQWJvcnRUeG46IDB4MDYsXG4gIFF1ZXJ5OiAweDA3LFxuICBDcmVhdGVUYWJsZTogMHgwOCxcbiAgUHV0UGF0aDogMHgwOSxcbiAgR2V0UGF0aDogMHgwQSxcbiAgU2NhbjogMHgwQixcbiAgQ2hlY2twb2ludDogMHgwQyxcbiAgU3RhdHM6IDB4MEQsXG4gIFBpbmc6IDB4MEUsXG5cbiAgLy8gU2VydmVyIOKGkiBDbGllbnRcbiAgT0s6IDB4ODAsXG4gIEVycm9yOiAweDgxLFxuICBWYWx1ZTogMHg4MixcbiAgVHhuSWQ6IDB4ODMsXG4gIFJvdzogMHg4NCxcbiAgRW5kU3RyZWFtOiAweDg1LFxuICBTdGF0c1Jlc3A6IDB4ODYsXG4gIFBvbmc6IDB4ODcsXG59IGFzIGNvbnN0O1xuXG4vLyBJbnRlcm5hbCBPcENvZGUgbWFwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgSW50ZXJuYWxPcENvZGUgPSB7XG4gIFBVVDogT3BDb2RlLlB1dCxcbiAgR0VUOiBPcENvZGUuR2V0LFxuICBERUxFVEU6IE9wQ29kZS5EZWxldGUsXG4gIEJFR0lOX1RYTjogT3BDb2RlLkJlZ2luVHhuLFxuICBDT01NSVRfVFhOOiBPcENvZGUuQ29tbWl0VHhuLFxuICBBQk9SVF9UWE46IE9wQ29kZS5BYm9ydFR4bixcbiAgUVVFUlk6IE9wQ29kZS5RdWVyeSxcbiAgUFVUX1BBVEg6IE9wQ29kZS5QdXRQYXRoLFxuICBHRVRfUEFUSDogT3BDb2RlLkdldFBhdGgsXG4gIFNDQU46IE9wQ29kZS5TY2FuLFxuICBDSEVDS1BPSU5UOiBPcENvZGUuQ2hlY2twb2ludCxcbiAgU1RBVFM6IE9wQ29kZS5TdGF0cyxcbiAgUElORzogT3BDb2RlLlBpbmcsXG4gIE9LOiBPcENvZGUuT0ssXG4gIEVSUk9SOiBPcENvZGUuRXJyb3IsXG4gIFZBTFVFOiBPcENvZGUuVmFsdWUsXG4gIFRYTl9JRDogT3BDb2RlLlR4bklkLFxuICBST1c6IE9wQ29kZS5Sb3csXG4gIEVORF9TVFJFQU06IE9wQ29kZS5FbmRTdHJlYW0sXG4gIFNUQVRTX1JFU1A6IE9wQ29kZS5TdGF0c1Jlc3AsXG4gIFBPTkc6IE9wQ29kZS5Qb25nLFxufSBhcyBjb25zdDtcblxuY29uc3QgTUFYX01FU1NBR0VfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7IC8vIDE2IE1CXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBJcGNDbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBjQ2xpZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gVW5peCBkb21haW4gc29ja2V0ICovXG4gIHNvY2tldFBhdGg6IHN0cmluZztcbiAgLyoqIENvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIGNvbm5lY3RUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogUmVhZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMzAwMDApICovXG4gIHJlYWRUaW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIElQQyBDbGllbnQgZm9yIFNvY2hEQi5cbiAqXG4gKiBDb25uZWN0cyB0byBhIFNvY2hEQiBzZXJ2ZXIgdmlhIFVuaXggZG9tYWluIHNvY2tldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICpcbiAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IElwY0NsaWVudC5jb25uZWN0KCcvdG1wL3NvY2hkYi5zb2NrJyk7XG4gKlxuICogYXdhaXQgY2xpZW50LnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGNvbnN0IHZhbHVlID0gYXdhaXQgY2xpZW50LmdldChCdWZmZXIuZnJvbSgna2V5JykpO1xuICpcbiAqIGF3YWl0IGNsaWVudC5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJcGNDbGllbnQge1xuICBwcml2YXRlIF9zb2NrZXQ6IG5ldC5Tb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY29uZmlnOiBSZXF1aXJlZDxJcGNDbGllbnRDb25maWc+O1xuICBwcml2YXRlIF9wZW5kaW5nUmVhZHM6IEFycmF5PHtcbiAgICByZXNvbHZlOiAoYnVmOiBCdWZmZXIpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcbiAgfT4gPSBbXTtcbiAgcHJpdmF0ZSBfcmVhZEJ1ZmZlcjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICBwcml2YXRlIF9jbG9zZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGNvbmZpZzogSXBjQ2xpZW50Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgY29ubmVjdFRpbWVvdXQ6IDUwMDAsXG4gICAgICByZWFkVGltZW91dDogMzAwMDAsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgU29jaERCIElQQyBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzb2NrZXRQYXRoIC0gUGF0aCB0byB0aGUgVW5peCBkb21haW4gc29ja2V0XG4gICAqIEByZXR1cm5zIEEgY29ubmVjdGVkIElwY0NsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IElwY0NsaWVudC5jb25uZWN0KCcvdG1wL3NvY2hkYi5zb2NrJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNvbm5lY3Qoc29ja2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxJcGNDbGllbnQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgSXBjQ2xpZW50KHsgc29ja2V0UGF0aCB9KTtcbiAgICBhd2FpdCBjbGllbnQuX2Nvbm5lY3QoKTtcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24oXG4gICAgICAgIHsgcGF0aDogdGhpcy5fY29uZmlnLnNvY2tldFBhdGggfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRoaXMuX2NvbmZpZy5jb25uZWN0VGltZW91dCk7XG5cbiAgICAgIHNvY2tldC5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoJ0Nvbm5lY3Rpb24gdGltZW91dCcpKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcihgQ29ubmVjdGlvbiBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlYWRCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLl9yZWFkQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NCdWZmZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHBlbmRpbmcgb2YgdGhpcy5fcGVuZGluZ1JlYWRzKSB7XG4gICAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignQ29ubmVjdGlvbiBjbG9zZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzID0gW107XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NCdWZmZXIoKTogdm9pZCB7XG4gICAgLy8gUHJvY2VzcyBjb21wbGV0ZSBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXJcbiAgICB3aGlsZSAodGhpcy5fcmVhZEJ1ZmZlci5sZW5ndGggPj0gNSAmJiB0aGlzLl9wZW5kaW5nUmVhZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fcmVhZEJ1ZmZlci5yZWFkVUludDMyTEUoMSk7XG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IDUgKyBsZW5ndGg7XG5cbiAgICAgIGlmICh0aGlzLl9yZWFkQnVmZmVyLmxlbmd0aCA+PSB0b3RhbExlbmd0aCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fcmVhZEJ1ZmZlci5zdWJhcnJheSgwLCB0b3RhbExlbmd0aCk7XG4gICAgICAgIHRoaXMuX3JlYWRCdWZmZXIgPSB0aGlzLl9yZWFkQnVmZmVyLnN1YmFycmF5KHRvdGFsTGVuZ3RoKTtcblxuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fcGVuZGluZ1JlYWRzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgcGVuZGluZy5yZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9zZW5kKG9wY29kZTogbnVtYmVyLCBwYXlsb2FkOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCkpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICh0aGlzLl9jbG9zZWQgfHwgIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcignTm90IGNvbm5lY3RlZCcpO1xuICAgIH1cblxuICAgIC8vIEVuY29kZSBtZXNzYWdlOiBvcGNvZGUgKDEpICsgbGVuZ3RoICg0IExFKSArIHBheWxvYWRcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmFsbG9jKDUgKyBwYXlsb2FkLmxlbmd0aCk7XG4gICAgbWVzc2FnZS53cml0ZVVJbnQ4KG9wY29kZSwgMCk7XG4gICAgbWVzc2FnZS53cml0ZVVJbnQzMkxFKHBheWxvYWQubGVuZ3RoLCAxKTtcbiAgICBwYXlsb2FkLmNvcHkobWVzc2FnZSwgNSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7XG5cbiAgICAgIHRoaXMuX3NvY2tldCEud3JpdGUobWVzc2FnZSwgKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzLnBvcCgpO1xuICAgICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKGBXcml0ZSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHRpbWVvdXQgZm9yIHJlc3BvbnNlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5fcGVuZGluZ1JlYWRzLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvbHZlID09PSByZXNvbHZlKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoJ1JlYWQgdGltZW91dCcpKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcy5fY29uZmlnLnJlYWRUaW1lb3V0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlUmVzcG9uc2UocmVzcG9uc2U6IEJ1ZmZlcik6IHsgb3Bjb2RlOiBudW1iZXI7IHBheWxvYWQ6IEJ1ZmZlciB9IHtcbiAgICBjb25zdCBvcGNvZGUgPSByZXNwb25zZS5yZWFkVUludDgoMCk7XG4gICAgY29uc3QgbGVuZ3RoID0gcmVzcG9uc2UucmVhZFVJbnQzMkxFKDEpO1xuICAgIGNvbnN0IHBheWxvYWQgPSByZXNwb25zZS5zdWJhcnJheSg1LCA1ICsgbGVuZ3RoKTtcblxuICAgIGlmIChvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLkVSUk9SKSB7XG4gICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcihwYXlsb2FkLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIH1cblxuICAgIHJldHVybiB7IG9wY29kZSwgcGF5bG9hZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhIGtleSBmb3IgdGhlIHdpcmUgcHJvdG9jb2wuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGVuY29kZUtleShrZXk6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gRm9ybWF0OiBbbGVuZ3RoOjRdW29wOjFdW2tleV9sZW46NF1ba2V5Oi4uLl1cbiAgICBjb25zdCBtc2dMZW4gPSAxICsgNCArIGtleS5sZW5ndGg7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmFsbG9jKDQgKyBtc2dMZW4pO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKG1zZ0xlbiwgMCk7XG4gICAgbXNnLndyaXRlVUludDgoSW50ZXJuYWxPcENvZGUuR0VULCA0KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShrZXkubGVuZ3RoLCA1KTtcbiAgICBrZXkuY29weShtc2csIDkpO1xuICAgIHJldHVybiBtc2c7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGEga2V5LXZhbHVlIHBhaXIgZm9yIHRoZSB3aXJlIHByb3RvY29sLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBlbmNvZGVLZXlWYWx1ZShrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gRm9ybWF0OiBbbGVuZ3RoOjRdW29wOjFdW2tleV9sZW46NF1ba2V5Oi4uLl1bdmFsdWVfbGVuOjRdW3ZhbHVlOi4uLl1cbiAgICBjb25zdCBtc2dMZW4gPSAxICsgNCArIGtleS5sZW5ndGggKyA0ICsgdmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IG1zZyA9IEJ1ZmZlci5hbGxvYyg0ICsgbXNnTGVuKTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShtc2dMZW4sIDApO1xuICAgIG1zZy53cml0ZVVJbnQ4KEludGVybmFsT3BDb2RlLlBVVCwgNCk7XG4gICAgbXNnLndyaXRlVUludDMyQkUoa2V5Lmxlbmd0aCwgNSk7XG4gICAga2V5LmNvcHkobXNnLCA5KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRSh2YWx1ZS5sZW5ndGgsIDkgKyBrZXkubGVuZ3RoKTtcbiAgICB2YWx1ZS5jb3B5KG1zZywgMTMgKyBrZXkubGVuZ3RoKTtcbiAgICByZXR1cm4gbXNnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IGtleS5cbiAgICovXG4gIGFzeW5jIGdldChrZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5HRVQsIGtleSk7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVkFMVUUpIHtcbiAgICAgIC8vIElmIHBheWxvYWQgaXMgZW1wdHksIHRoZSBrZXkgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyLlxuICAgKi9cbiAgYXN5bmMgcHV0KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRW5jb2RlOiBrZXlfbGVuICg0IExFKSArIGtleSArIHZhbHVlXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg0ICsga2V5Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQzMkxFKGtleS5sZW5ndGgsIDApO1xuICAgIGtleS5jb3B5KHBheWxvYWQsIDQpO1xuICAgIHZhbHVlLmNvcHkocGF5bG9hZCwgNCArIGtleS5sZW5ndGgpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBVVCwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEga2V5LlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkRFTEVURSwga2V5KTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWx1ZSBieSBwYXRoLlxuICAgKiBXaXJlIGZvcm1hdDogcGF0aF9jb3VudCgyIExFKSArIFtwYXRoX2xlbigyIExFKSArIHBhdGhfc2VnbWVudF0uLi5cbiAgICovXG4gIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgLy8gRW5jb2RlIHBhdGggYXMgc2luZ2xlIHNlZ21lbnQgZm9yIG5vdyAoY291bGQgc3BsaXQgb24gJy8nIGZvciBtdWx0aS1zZWdtZW50KVxuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMiArIDIgKyBwYXRoQnVmLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKDEsIDApOyAvLyBwYXRoX2NvdW50ID0gMVxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgMik7IC8vIHBhdGhfbGVuXG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIDQpOyAvLyBwYXRoXG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkdFVF9QQVRILCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZDogcmVzcG9uc2VQYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIGlmIChvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLlZBTFVFKSB7XG4gICAgICAvLyBJZiBwYXlsb2FkIGlzIGVtcHR5LCB0aGUga2V5IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGlmIChyZXNwb25zZVBheWxvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlUGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEgdmFsdWUgYXQgYSBwYXRoLlxuICAgKiBXaXJlIGZvcm1hdDogcGF0aF9jb3VudCgyIExFKSArIFtwYXRoX2xlbigyIExFKSArIHBhdGhfc2VnbWVudF0uLi4gKyB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRoQnVmID0gQnVmZmVyLmZyb20ocGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDIgKyAyICsgcGF0aEJ1Zi5sZW5ndGggKyB2YWx1ZS5sZW5ndGgpO1xuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRSgxLCAwKTsgLy8gcGF0aF9jb3VudCA9IDFcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUocGF0aEJ1Zi5sZW5ndGgsIDIpOyAvLyBwYXRoX2xlblxuICAgIHBhdGhCdWYuY29weShwYXlsb2FkLCA0KTsgLy8gcGF0aFxuICAgIHZhbHVlLmNvcHkocGF5bG9hZCwgNCArIHBhdGhCdWYubGVuZ3RoKTsgLy8gdmFsdWVcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5QVVRfUEFUSCwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHF1ZXJ5IGFuZCByZXR1cm4gVE9PTi1mb3JtYXR0ZWQgcmVzdWx0cy5cbiAgICogXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2xlbigyKSArIHBhdGggKyBsaW1pdCg0KSArIG9mZnNldCg0KSArIGNvbHNfY291bnQoMikgKyBbY29sX2xlbigyKSArIGNvbF0uLi5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIHBhdGhQcmVmaXg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlcjsgb2Zmc2V0PzogbnVtYmVyOyBjb2x1bW5zPzogc3RyaW5nW10gfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoUHJlZml4LCAndXRmOCcpO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBvcHRzLmNvbHVtbnMgfHwgW107XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHBheWxvYWQgc2l6ZVxuICAgIGxldCBzaXplID0gMiArIHBhdGhCdWYubGVuZ3RoICsgNCArIDQgKyAyO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIHNpemUgKz0gMiArIEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbCwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBcbiAgICAvLyBQYXRoOiBwYXRoX2xlbigyIExFKSArIHBhdGhcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUocGF0aEJ1Zi5sZW5ndGgsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDI7XG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHBhdGhCdWYubGVuZ3RoO1xuICAgIFxuICAgIC8vIExpbWl0ICg0IExFKSAtIDAgbWVhbnMgbm8gbGltaXRcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUob3B0cy5saW1pdCB8fCAwLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIFxuICAgIC8vIE9mZnNldCAoNCBMRSlcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUob3B0cy5vZmZzZXQgfHwgMCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcbiAgICBcbiAgICAvLyBDb2x1bW5zOiBjb3VudCgyIExFKSArIFtjb2xfbGVuKDIgTEUpICsgY29sXS4uLlxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShjb2x1bW5zLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMjtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2xCdWYgPSBCdWZmZXIuZnJvbShjb2wsICd1dGY4Jyk7XG4gICAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoY29sQnVmLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSAyO1xuICAgICAgY29sQnVmLmNvcHkocGF5bG9hZCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSBjb2xCdWYubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5RVUVSWSwgcGF5bG9hZCk7XG4gICAgY29uc3QgeyBwYXlsb2FkOiByZXN1bHRQYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIHJldHVybiByZXN1bHRQYXlsb2FkLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2NhbiBmb3Iga2V5cyB3aXRoIGEgcHJlZml4LCByZXR1cm5pbmcga2V5LXZhbHVlIHBhaXJzLlxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBzaW1wbGUgcHJlZml4LWJhc2VkIGl0ZXJhdGlvbi5cbiAgICogXG4gICAqIFdpcmUgZm9ybWF0OiBwcmVmaXggc3RyaW5nXG4gICAqIFJlc3BvbnNlIGZvcm1hdDogY291bnQoNCBMRSkgKyBba2V5X2xlbigyIExFKSArIGtleSArIHZhbF9sZW4oNCBMRSkgKyB2YWxdLi4uXG4gICAqL1xuICBhc3luYyBzY2FuKHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTx7IGtleTogQnVmZmVyOyB2YWx1ZTogQnVmZmVyIH0+PiB7XG4gICAgY29uc3QgcHJlZml4QnVmID0gQnVmZmVyLmZyb20ocHJlZml4LCAndXRmOCcpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5TQ0FOLCBwcmVmaXhCdWYpO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIGlmIChvcGNvZGUgIT09IEludGVybmFsT3BDb2RlLlZBTFVFICYmIG9wY29kZSAhPT0gSW50ZXJuYWxPcENvZGUuT0spIHtcbiAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKGBVbmV4cGVjdGVkIHNjYW4gcmVzcG9uc2Ugb3Bjb2RlOiAweCR7b3Bjb2RlLnRvU3RyaW5nKDE2KX1gKTtcbiAgICB9XG5cbiAgICBpZiAocGF5bG9hZC5sZW5ndGggPCA0KSB7XG4gICAgICByZXR1cm4gW107IC8vIEVtcHR5IHJlc3VsdFxuICAgIH1cblxuICAgIC8vIFBhcnNlIHJlc3BvbnNlOiBjb3VudCg0IExFKSArIFtrZXlfbGVuKDIgTEUpICsga2V5ICsgdmFsX2xlbig0IExFKSArIHZhbF0uLi5cbiAgICBjb25zdCBjb3VudCA9IHBheWxvYWQucmVhZFVJbnQzMkxFKDApO1xuICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsga2V5OiBCdWZmZXI7IHZhbHVlOiBCdWZmZXIgfT4gPSBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gNDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgaWYgKG9mZnNldCArIDIgPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKGtleV9sZW4pJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlMZW4gPSBwYXlsb2FkLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgIGlmIChvZmZzZXQgKyBrZXlMZW4gKyA0ID4gcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ1RydW5jYXRlZCBzY2FuIHJlc3BvbnNlIChrZXkrdmFsX2xlbiknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IHBheWxvYWQuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBrZXlMZW4pO1xuICAgICAgb2Zmc2V0ICs9IGtleUxlbjtcblxuICAgICAgY29uc3QgdmFsTGVuID0gcGF5bG9hZC5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA0O1xuXG4gICAgICBpZiAob2Zmc2V0ICsgdmFsTGVuID4gcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ1RydW5jYXRlZCBzY2FuIHJlc3BvbnNlICh2YWx1ZSknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gcGF5bG9hZC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHZhbExlbik7XG4gICAgICBvZmZzZXQgKz0gdmFsTGVuO1xuXG4gICAgICByZXN1bHRzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqL1xuICBxdWVyeUJ1aWxkZXIocGF0aFByZWZpeDogc3RyaW5nKTogUXVlcnkge1xuICAgIHJldHVybiBuZXcgUXVlcnkodGhpcywgcGF0aFByZWZpeCk7XG4gIH1cblxuICAvKipcbiAgICogQmVnaW4gYSBuZXcgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkJFR0lOX1RYTik7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVFhOX0lEKSB7XG4gICAgICByZXR1cm4gcGF5bG9hZC5yZWFkQmlnVUludDY0TEUoMCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbkVycm9yKCdGYWlsZWQgdG8gYmVnaW4gdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKHR4bklkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHBheWxvYWQud3JpdGVCaWdVSW50NjRMRSh0eG5JZCwgMCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkNPTU1JVF9UWE4sIHBheWxvYWQpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGEgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBhYm9ydFRyYW5zYWN0aW9uKHR4bklkOiBiaWdpbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHBheWxvYWQud3JpdGVCaWdVSW50NjRMRSh0eG5JZCwgMCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkFCT1JUX1RYTiwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgYSBjaGVja3BvaW50LlxuICAgKi9cbiAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQ0hFQ0tQT0lOVCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0b3JhZ2Ugc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8e1xuICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgd2FsU2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuU1RBVFMpO1xuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UocGF5bG9hZC50b1N0cmluZygndXRmOCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IGpzb24ubWVtdGFibGVfc2l6ZV9ieXRlcyB8fCAwLFxuICAgICAgd2FsU2l6ZUJ5dGVzOiBqc29uLndhbF9zaXplX2J5dGVzIHx8IDAsXG4gICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IGpzb24uYWN0aXZlX3RyYW5zYWN0aW9ucyB8fCAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGluZyB0aGUgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBJTkcpO1xuICAgICAgY29uc3QgeyBvcGNvZGUgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuUE9ORztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm47XG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLl9zb2NrZXQhLmVuZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * Consolidator for Memory System
4
+ *
5
+ * Event-sourced consolidation with append-only events and derived canonical facts.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.Consolidator = void 0;
9
+ const crypto_1 = require("crypto");
10
+ /**
11
+ * Consolidator for managing facts
12
+ */
13
+ class Consolidator {
14
+ constructor(db, namespace, config) {
15
+ this.db = db;
16
+ this.namespace = namespace;
17
+ this.config = {
18
+ similarityThreshold: config?.similarityThreshold || 0.85,
19
+ useTemporalUpdates: config?.useTemporalUpdates !== false,
20
+ maxConflictAge: config?.maxConflictAge || 86400, // 24 hours default
21
+ };
22
+ this.prefix = Buffer.from(`consolidation:${namespace}:`);
23
+ }
24
+ /**
25
+ * Create consolidator from database
26
+ */
27
+ static fromDatabase(db, namespace, config) {
28
+ return new Consolidator(db, namespace, config);
29
+ }
30
+ /**
31
+ * Add a raw assertion (immutable event)
32
+ */
33
+ async add(assertion) {
34
+ const id = assertion.id || this.generateAssertionId(assertion);
35
+ const timestamp = assertion.timestamp || Date.now();
36
+ const storedAssertion = {
37
+ ...assertion,
38
+ id,
39
+ timestamp,
40
+ };
41
+ const key = Buffer.concat([this.prefix, Buffer.from(`assertion:${id}`)]);
42
+ await this.db.put(key, Buffer.from(JSON.stringify(storedAssertion)));
43
+ return id;
44
+ }
45
+ /**
46
+ * Add assertion with contradiction handling
47
+ */
48
+ async addWithContradiction(newAssertion, contradicts) {
49
+ const id = await this.add(newAssertion);
50
+ // Mark contradicted assertions
51
+ for (const contradictedId of contradicts) {
52
+ const contradictionKey = Buffer.concat([
53
+ this.prefix,
54
+ Buffer.from(`contradiction:${contradictedId}:${id}`),
55
+ ]);
56
+ await this.db.put(contradictionKey, Buffer.from(JSON.stringify({
57
+ from: contradictedId,
58
+ to: id,
59
+ timestamp: Date.now(),
60
+ })));
61
+ }
62
+ return id;
63
+ }
64
+ /**
65
+ * Run consolidation to update canonical view
66
+ */
67
+ async consolidate() {
68
+ const assertions = await this.getAllAssertions();
69
+ const contradictions = await this.getContradictions();
70
+ // Group assertions by subject
71
+ const groups = new Map();
72
+ for (const assertion of assertions) {
73
+ const subject = JSON.stringify(assertion.fact);
74
+ const group = groups.get(subject) || [];
75
+ group.push(assertion);
76
+ groups.set(subject, group);
77
+ }
78
+ let updated = 0;
79
+ // Create canonical facts
80
+ for (const [subject, group] of groups) {
81
+ // Sort by confidence and timestamp
82
+ group.sort((a, b) => {
83
+ if (b.confidence !== a.confidence) {
84
+ return b.confidence - a.confidence;
85
+ }
86
+ return (b.timestamp || 0) - (a.timestamp || 0);
87
+ });
88
+ // Check for contradictions
89
+ const validAssertions = group.filter(a => {
90
+ const isContradicted = contradictions.some(c => c.from === a.id);
91
+ if (isContradicted && this.config.useTemporalUpdates) {
92
+ // Find the contradicting assertion
93
+ const contradiction = contradictions.find(c => c.from === a.id);
94
+ if (contradiction) {
95
+ const age = Date.now() - (contradiction.timestamp || 0);
96
+ return age > this.config.maxConflictAge;
97
+ }
98
+ }
99
+ return !isContradicted;
100
+ });
101
+ if (validAssertions.length > 0) {
102
+ const canonical = {
103
+ id: this.generateCanonicalId(validAssertions[0]),
104
+ mergedFact: validAssertions[0].fact,
105
+ confidence: this.mergeConfidence(validAssertions),
106
+ sources: validAssertions.map(a => a.source),
107
+ validFrom: Math.min(...validAssertions.map(a => a.timestamp || 0)),
108
+ validUntil: undefined,
109
+ };
110
+ const key = Buffer.concat([this.prefix, Buffer.from(`canonical:${canonical.id}`)]);
111
+ await this.db.put(key, Buffer.from(JSON.stringify(canonical)));
112
+ updated++;
113
+ }
114
+ }
115
+ return updated;
116
+ }
117
+ /**
118
+ * Get canonical facts
119
+ */
120
+ async getCanonicalFacts() {
121
+ const facts = [];
122
+ const canonicalPrefix = Buffer.concat([this.prefix, Buffer.from('canonical:')]);
123
+ for await (const [_, value] of this.db.scanPrefix(canonicalPrefix)) {
124
+ facts.push(JSON.parse(value.toString()));
125
+ }
126
+ return facts;
127
+ }
128
+ /**
129
+ * Explain provenance of a fact
130
+ */
131
+ async explain(factId) {
132
+ const key = Buffer.concat([this.prefix, Buffer.from(`canonical:${factId}`)]);
133
+ const value = await this.db.get(key);
134
+ if (!value) {
135
+ return { evidenceCount: 0, sources: [], confidence: 0 };
136
+ }
137
+ const fact = JSON.parse(value.toString());
138
+ return {
139
+ evidenceCount: fact.sources.length,
140
+ sources: fact.sources,
141
+ confidence: fact.confidence,
142
+ };
143
+ }
144
+ /**
145
+ * Get all raw assertions
146
+ */
147
+ async getAllAssertions() {
148
+ const assertions = [];
149
+ const assertionPrefix = Buffer.concat([this.prefix, Buffer.from('assertion:')]);
150
+ for await (const [_, value] of this.db.scanPrefix(assertionPrefix)) {
151
+ assertions.push(JSON.parse(value.toString()));
152
+ }
153
+ return assertions;
154
+ }
155
+ /**
156
+ * Get all contradictions
157
+ */
158
+ async getContradictions() {
159
+ const contradictions = [];
160
+ const contradictionPrefix = Buffer.concat([this.prefix, Buffer.from('contradiction:')]);
161
+ for await (const [_, value] of this.db.scanPrefix(contradictionPrefix)) {
162
+ contradictions.push(JSON.parse(value.toString()));
163
+ }
164
+ return contradictions;
165
+ }
166
+ /**
167
+ * Merge confidence from multiple assertions
168
+ */
169
+ mergeConfidence(assertions) {
170
+ if (assertions.length === 0)
171
+ return 0;
172
+ if (assertions.length === 1)
173
+ return assertions[0].confidence;
174
+ // Average with weight toward higher confidence
175
+ const sorted = [...assertions].sort((a, b) => b.confidence - a.confidence);
176
+ const weights = sorted.map((_, i) => 1 / (i + 1));
177
+ const totalWeight = weights.reduce((a, b) => a + b, 0);
178
+ return sorted.reduce((acc, assertion, i) => {
179
+ return acc + (assertion.confidence * weights[i]) / totalWeight;
180
+ }, 0);
181
+ }
182
+ /**
183
+ * Generate deterministic assertion ID
184
+ */
185
+ generateAssertionId(assertion) {
186
+ return (0, crypto_1.createHash)('sha256')
187
+ .update(JSON.stringify(assertion.fact) + assertion.source)
188
+ .digest('hex')
189
+ .substring(0, 16);
190
+ }
191
+ /**
192
+ * Generate deterministic canonical fact ID
193
+ */
194
+ generateCanonicalId(assertion) {
195
+ return (0, crypto_1.createHash)('sha256')
196
+ .update(JSON.stringify(assertion.fact))
197
+ .digest('hex')
198
+ .substring(0, 16);
199
+ }
200
+ }
201
+ exports.Consolidator = Consolidator;
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29saWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1vcnkvY29uc29saWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBUUgsbUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBYSxZQUFZO0lBTXZCLFlBQVksRUFBb0IsRUFBRSxTQUFpQixFQUFFLE1BQTRCO1FBQy9FLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxtQkFBbUIsSUFBSSxJQUFJO1lBQ3hELGtCQUFrQixFQUFFLE1BQU0sRUFBRSxrQkFBa0IsS0FBSyxLQUFLO1lBQ3hELGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxJQUFJLEtBQUssRUFBRSxtQkFBbUI7U0FDckUsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQW9CLEVBQUUsU0FBaUIsRUFBRSxNQUE0QjtRQUN2RixPQUFPLElBQUksWUFBWSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUF1QjtRQUMvQixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwRCxNQUFNLGVBQWUsR0FBaUI7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QUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE9BQU8sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDakUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CLENBQUMsU0FBdUI7UUFDakQsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDO2FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQ3pELE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLFNBQXVCO1FBQ2pELE9BQU8sSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQzthQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBL05ELG9DQStOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uc29saWRhdG9yIGZvciBNZW1vcnkgU3lzdGVtXG4gKiBcbiAqIEV2ZW50LXNvdXJjZWQgY29uc29saWRhdGlvbiB3aXRoIGFwcGVuZC1vbmx5IGV2ZW50cyBhbmQgZGVyaXZlZCBjYW5vbmljYWwgZmFjdHMuXG4gKi9cblxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJy4uL2VtYmVkZGVkJztcbmltcG9ydCB7XG4gIFJhd0Fzc2VydGlvbixcbiAgQ2Fub25pY2FsRmFjdCxcbiAgQ29uc29saWRhdGlvbkNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqXG4gKiBDb25zb2xpZGF0b3IgZm9yIG1hbmFnaW5nIGZhY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xpZGF0b3Ige1xuICBwcml2YXRlIGRiOiBFbWJlZGRlZERhdGFiYXNlO1xuICBwcml2YXRlIG5hbWVzcGFjZTogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZzogQ29uc29saWRhdGlvbkNvbmZpZztcbiAgcHJpdmF0ZSBwcmVmaXg6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihkYjogRW1iZWRkZWREYXRhYmFzZSwgbmFtZXNwYWNlOiBzdHJpbmcsIGNvbmZpZz86IENvbnNvbGlkYXRpb25Db25maWcpIHtcbiAgICB0aGlzLmRiID0gZGI7XG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBzaW1pbGFyaXR5VGhyZXNob2xkOiBjb25maWc/LnNpbWlsYXJpdHlUaHJlc2hvbGQgfHwgMC44NSxcbiAgICAgIHVzZVRlbXBvcmFsVXBkYXRlczogY29uZmlnPy51c2VUZW1wb3JhbFVwZGF0ZXMgIT09IGZhbHNlLFxuICAgICAgbWF4Q29uZmxpY3RBZ2U6IGNvbmZpZz8ubWF4Q29uZmxpY3RBZ2UgfHwgODY0MDAsIC8vIDI0IGhvdXJzIGRlZmF1bHRcbiAgICB9O1xuICAgIHRoaXMucHJlZml4ID0gQnVmZmVyLmZyb20oYGNvbnNvbGlkYXRpb246JHtuYW1lc3BhY2V9OmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjb25zb2xpZGF0b3IgZnJvbSBkYXRhYmFzZVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRhYmFzZShkYjogRW1iZWRkZWREYXRhYmFzZSwgbmFtZXNwYWNlOiBzdHJpbmcsIGNvbmZpZz86IENvbnNvbGlkYXRpb25Db25maWcpOiBDb25zb2xpZGF0b3Ige1xuICAgIHJldHVybiBuZXcgQ29uc29saWRhdG9yKGRiLCBuYW1lc3BhY2UsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcmF3IGFzc2VydGlvbiAoaW1tdXRhYmxlIGV2ZW50KVxuICAgKi9cbiAgYXN5bmMgYWRkKGFzc2VydGlvbjogUmF3QXNzZXJ0aW9uKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpZCA9IGFzc2VydGlvbi5pZCB8fCB0aGlzLmdlbmVyYXRlQXNzZXJ0aW9uSWQoYXNzZXJ0aW9uKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBhc3NlcnRpb24udGltZXN0YW1wIHx8IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdG9yZWRBc3NlcnRpb246IFJhd0Fzc2VydGlvbiA9IHtcbiAgICAgIC4uLmFzc2VydGlvbixcbiAgICAgIGlkLFxuICAgICAgdGltZXN0YW1wLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXkgPSBCdWZmZXIuY29uY2F0KFt0aGlzLnByZWZpeCwgQnVmZmVyLmZyb20oYGFzc2VydGlvbjoke2lkfWApXSk7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShzdG9yZWRBc3NlcnRpb24pKSk7XG5cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFzc2VydGlvbiB3aXRoIGNvbnRyYWRpY3Rpb24gaGFuZGxpbmdcbiAgICovXG4gIGFzeW5jIGFkZFdpdGhDb250cmFkaWN0aW9uKG5ld0Fzc2VydGlvbjogUmF3QXNzZXJ0aW9uLCBjb250cmFkaWN0czogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5hZGQobmV3QXNzZXJ0aW9uKTtcblxuICAgIC8vIE1hcmsgY29udHJhZGljdGVkIGFzc2VydGlvbnNcbiAgICBmb3IgKGNvbnN0IGNvbnRyYWRpY3RlZElkIG9mIGNvbnRyYWRpY3RzKSB7XG4gICAgICBjb25zdCBjb250cmFkaWN0aW9uS2V5ID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIHRoaXMucHJlZml4LFxuICAgICAgICBCdWZmZXIuZnJvbShgY29udHJhZGljdGlvbjoke2NvbnRyYWRpY3RlZElkfToke2lkfWApLFxuICAgICAgXSk7XG4gICAgICBhd2FpdCB0aGlzLmRiLnB1dChjb250cmFkaWN0aW9uS2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGZyb206IGNvbnRyYWRpY3RlZElkLFxuICAgICAgICB0bzogaWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBjb25zb2xpZGF0aW9uIHRvIHVwZGF0ZSBjYW5vbmljYWwgdmlld1xuICAgKi9cbiAgYXN5bmMgY29uc29saWRhdGUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBhc3NlcnRpb25zID0gYXdhaXQgdGhpcy5nZXRBbGxBc3NlcnRpb25zKCk7XG4gICAgY29uc3QgY29udHJhZGljdGlvbnMgPSBhd2FpdCB0aGlzLmdldENvbnRyYWRpY3Rpb25zKCk7XG4gICAgXG4gICAgLy8gR3JvdXAgYXNzZXJ0aW9ucyBieSBzdWJqZWN0XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFJhd0Fzc2VydGlvbltdPigpO1xuICAgIGZvciAoY29uc3QgYXNzZXJ0aW9uIG9mIGFzc2VydGlvbnMpIHtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBKU09OLnN0cmluZ2lmeShhc3NlcnRpb24uZmFjdCk7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3Vwcy5nZXQoc3ViamVjdCkgfHwgW107XG4gICAgICBncm91cC5wdXNoKGFzc2VydGlvbik7XG4gICAgICBncm91cHMuc2V0KHN1YmplY3QsIGdyb3VwKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZCA9IDA7XG5cbiAgICAvLyBDcmVhdGUgY2Fub25pY2FsIGZhY3RzXG4gICAgZm9yIChjb25zdCBbc3ViamVjdCwgZ3JvdXBdIG9mIGdyb3Vwcykge1xuICAgICAgLy8gU29ydCBieSBjb25maWRlbmNlIGFuZCB0aW1lc3RhbXBcbiAgICAgIGdyb3VwLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGIuY29uZmlkZW5jZSAhPT0gYS5jb25maWRlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIGIuY29uZmlkZW5jZSAtIGEuY29uZmlkZW5jZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGIudGltZXN0YW1wIHx8IDApIC0gKGEudGltZXN0YW1wIHx8IDApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb250cmFkaWN0aW9uc1xuICAgICAgY29uc3QgdmFsaWRBc3NlcnRpb25zID0gZ3JvdXAuZmlsdGVyKGEgPT4ge1xuICAgICAgICBjb25zdCBpc0NvbnRyYWRpY3RlZCA9IGNvbnRyYWRpY3Rpb25zLnNvbWUoYyA9PiBjLmZyb20gPT09IGEuaWQpO1xuICAgICAgICBpZiAoaXNDb250cmFkaWN0ZWQgJiYgdGhpcy5jb25maWcudXNlVGVtcG9yYWxVcGRhdGVzKSB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgY29udHJhZGljdGluZyBhc3NlcnRpb25cbiAgICAgICAgICBjb25zdCBjb250cmFkaWN0aW9uID0gY29udHJhZGljdGlvbnMuZmluZChjID0+IGMuZnJvbSA9PT0gYS5pZCk7XG4gICAgICAgICAgaWYgKGNvbnRyYWRpY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSAoY29udHJhZGljdGlvbi50aW1lc3RhbXAgfHwgMCk7XG4gICAgICAgICAgICByZXR1cm4gYWdlID4gdGhpcy5jb25maWcubWF4Q29uZmxpY3RBZ2UhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzQ29udHJhZGljdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh2YWxpZEFzc2VydGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjYW5vbmljYWw6IENhbm9uaWNhbEZhY3QgPSB7XG4gICAgICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVDYW5vbmljYWxJZCh2YWxpZEFzc2VydGlvbnNbMF0pLFxuICAgICAgICAgIG1lcmdlZEZhY3Q6IHZhbGlkQXNzZXJ0aW9uc1swXS5mYWN0LFxuICAgICAgICAgIGNvbmZpZGVuY2U6IHRoaXMubWVyZ2VDb25maWRlbmNlKHZhbGlkQXNzZXJ0aW9ucyksXG4gICAgICAgICAgc291cmNlczogdmFsaWRBc3NlcnRpb25zLm1hcChhID0+IGEuc291cmNlKSxcbiAgICAgICAgICB2YWxpZEZyb206IE1hdGgubWluKC4uLnZhbGlkQXNzZXJ0aW9ucy5tYXAoYSA9PiBhLnRpbWVzdGFtcCB8fCAwKSksXG4gICAgICAgICAgdmFsaWRVbnRpbDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbShgY2Fub25pY2FsOiR7Y2Fub25pY2FsLmlkfWApXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsKSkpO1xuICAgICAgICB1cGRhdGVkKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhbm9uaWNhbCBmYWN0c1xuICAgKi9cbiAgYXN5bmMgZ2V0Q2Fub25pY2FsRmFjdHMoKTogUHJvbWlzZTxDYW5vbmljYWxGYWN0W10+IHtcbiAgICBjb25zdCBmYWN0czogQ2Fub25pY2FsRmFjdFtdID0gW107XG4gICAgY29uc3QgY2Fub25pY2FsUHJlZml4ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKCdjYW5vbmljYWw6JyldKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgoY2Fub25pY2FsUHJlZml4KSkge1xuICAgICAgZmFjdHMucHVzaChKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFjdHM7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiBwcm92ZW5hbmNlIG9mIGEgZmFjdFxuICAgKi9cbiAgYXN5bmMgZXhwbGFpbihmYWN0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBldmlkZW5jZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHN0cmluZ1tdOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbShgY2Fub25pY2FsOiR7ZmFjdElkfWApXSk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmRiLmdldChrZXkpO1xuICAgIFxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IGV2aWRlbmNlQ291bnQ6IDAsIHNvdXJjZXM6IFtdLCBjb25maWRlbmNlOiAwIH07XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdDogQ2Fub25pY2FsRmFjdCA9IEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2aWRlbmNlQ291bnQ6IGZhY3Quc291cmNlcy5sZW5ndGgsXG4gICAgICBzb3VyY2VzOiBmYWN0LnNvdXJjZXMsXG4gICAgICBjb25maWRlbmNlOiBmYWN0LmNvbmZpZGVuY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJhdyBhc3NlcnRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFsbEFzc2VydGlvbnMoKTogUHJvbWlzZTxSYXdBc3NlcnRpb25bXT4ge1xuICAgIGNvbnN0IGFzc2VydGlvbnM6IFJhd0Fzc2VydGlvbltdID0gW107XG4gICAgY29uc3QgYXNzZXJ0aW9uUHJlZml4ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKCdhc3NlcnRpb246JyldKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgoYXNzZXJ0aW9uUHJlZml4KSkge1xuICAgICAgYXNzZXJ0aW9ucy5wdXNoKEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY29udHJhZGljdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29udHJhZGljdGlvbnMoKTogUHJvbWlzZTxBcnJheTx7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgdGltZXN0YW1wOiBudW1iZXIgfT4+IHtcbiAgICBjb25zdCBjb250cmFkaWN0aW9uczogQXJyYXk8eyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3QgY29udHJhZGljdGlvblByZWZpeCA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbSgnY29udHJhZGljdGlvbjonKV0pO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBbXywgdmFsdWVdIG9mIHRoaXMuZGIuc2NhblByZWZpeChjb250cmFkaWN0aW9uUHJlZml4KSkge1xuICAgICAgY29udHJhZGljdGlvbnMucHVzaChKU09OLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJhZGljdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgY29uZmlkZW5jZSBmcm9tIG11bHRpcGxlIGFzc2VydGlvbnNcbiAgICovXG4gIHByaXZhdGUgbWVyZ2VDb25maWRlbmNlKGFzc2VydGlvbnM6IFJhd0Fzc2VydGlvbltdKTogbnVtYmVyIHtcbiAgICBpZiAoYXNzZXJ0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIGlmIChhc3NlcnRpb25zLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGFzc2VydGlvbnNbMF0uY29uZmlkZW5jZTtcblxuICAgIC8vIEF2ZXJhZ2Ugd2l0aCB3ZWlnaHQgdG93YXJkIGhpZ2hlciBjb25maWRlbmNlXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmFzc2VydGlvbnNdLnNvcnQoKGEsIGIpID0+IGIuY29uZmlkZW5jZSAtIGEuY29uZmlkZW5jZSk7XG4gICAgY29uc3Qgd2VpZ2h0cyA9IHNvcnRlZC5tYXAoKF8sIGkpID0+IDEgLyAoaSArIDEpKTtcbiAgICBjb25zdCB0b3RhbFdlaWdodCA9IHdlaWdodHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgXG4gICAgcmV0dXJuIHNvcnRlZC5yZWR1Y2UoKGFjYywgYXNzZXJ0aW9uLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYWNjICsgKGFzc2VydGlvbi5jb25maWRlbmNlICogd2VpZ2h0c1tpXSkgLyB0b3RhbFdlaWdodDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGFzc2VydGlvbiBJRFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFzc2VydGlvbklkKGFzc2VydGlvbjogUmF3QXNzZXJ0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgIC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoYXNzZXJ0aW9uLmZhY3QpICsgYXNzZXJ0aW9uLnNvdXJjZSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpXG4gICAgICAuc3Vic3RyaW5nKDAsIDE2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGNhbm9uaWNhbCBmYWN0IElEXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQ2Fub25pY2FsSWQoYXNzZXJ0aW9uOiBSYXdBc3NlcnRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKVxuICAgICAgLnVwZGF0ZShKU09OLnN0cmluZ2lmeShhc3NlcnRpb24uZmFjdCkpXG4gICAgICAuZGlnZXN0KCdoZXgnKVxuICAgICAgLnN1YnN0cmluZygwLCAxNik7XG4gIH1cbn1cbiJdfQ==