@decaf-ts/decorator-validation 1.7.17 → 1.7.18

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.
@@ -3,6 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ModelContextProtocol = void 0;
4
4
  const fastmcp_1 = require("fastmcp");
5
5
  const logging_1 = require("@decaf-ts/logging");
6
+ /**
7
+ * @description Validates and normalizes a semantic version string.
8
+ * @summary Ensures the provided version follows semantic versioning (major.minor.patch) and returns a tuple-like template string typed as `${number}.${number}.${number}`.
9
+ * @template
10
+ * @param {string} version The version string to validate, expected in the form MAJOR.MINOR.PATCH.
11
+ * @return {string} The normalized version string if valid.
12
+ * @function validateVersion
13
+ * @memberOf module:decorator-validation
14
+ */
6
15
  function validateVersion(version) {
7
16
  const regexp = /(\d+)\.(\d+)\.(\d+)/g;
8
17
  const match = regexp.exec(version);
@@ -10,21 +19,69 @@ function validateVersion(version) {
10
19
  throw new Error(`Invalid version string. should obey semantic versioning: ${version}`);
11
20
  return `${match[1]}.${match[2]}.${match[3]}`;
12
21
  }
22
+ /**
23
+ * @description Fluent builder for creating a configured ModelContextProtocol instance.
24
+ * @summary Collects MCP configuration including a semantic version, a name, and a registry of tools, offering chainable methods and a final build step to produce a ready-to-use ModelContextProtocol.
25
+ * @param {string} [name] The name of the MCP instance to build.
26
+ * @param {string} [version] The semantic version of the MCP instance.
27
+ * @param {Record<string, Tool<any, any>>} [tools] A map of tool configurations indexed by tool name.
28
+ * @class
29
+ * @example
30
+ * // Build a new MCP with a single tool
31
+ * const mcp = ModelContextProtocol.builder
32
+ * .setName("Example")
33
+ * .setVersion("1.0.0")
34
+ * .addTool({ name: "do", description: "", parameters: z.any(), execute: async () => "ok" })
35
+ * .build();
36
+ * @mermaid
37
+ * sequenceDiagram
38
+ * participant Dev as Developer
39
+ * participant B as Builder
40
+ * participant MCP as ModelContextProtocol
41
+ * Dev->>B: setName("Example")
42
+ * B-->>Dev: Builder
43
+ * Dev->>B: setVersion("1.0.0")
44
+ * B-->>Dev: Builder
45
+ * Dev->>B: addTool(tool)
46
+ * B-->>Dev: Builder
47
+ * Dev->>B: build()
48
+ * B->>MCP: new ModelContextProtocol(FastMCP)
49
+ * B-->>Dev: ModelContextProtocol
50
+ */
13
51
  class Builder {
14
52
  constructor() {
15
53
  this.tools = {};
16
54
  this.log = logging_1.Logging.for("MCP Builder");
17
55
  }
56
+ /**
57
+ * @description Sets the MCP instance name.
58
+ * @summary Assigns a human-readable identifier to the builder configuration and enables method chaining.
59
+ * @param {string} value The name to assign to the MCP instance.
60
+ * @return {this} The current builder instance for chaining.
61
+ */
18
62
  setName(value) {
19
63
  this.name = value;
20
64
  this.log.debug(`name set to ${value}`);
21
65
  return this;
22
66
  }
67
+ /**
68
+ * @description Sets and validates the semantic version for the MCP instance.
69
+ * @summary Parses the provided value against semantic versioning and stores the normalized version; enables method chaining.
70
+ * @param {string} value The semantic version string (e.g., "1.2.3").
71
+ * @return {this} The current builder instance for chaining.
72
+ */
23
73
  setVersion(value) {
24
74
  this.version = validateVersion(value);
25
75
  this.log.debug(`version set to ${value}`);
26
76
  return this;
27
77
  }
78
+ /**
79
+ * @description Registers a new tool in the builder.
80
+ * @summary Adds a tool configuration by its unique name to the internal registry, throwing if a tool with the same name already exists.
81
+ * @template Auth extends FastMCPSessionAuth
82
+ * @param {Tool<Auth, any>} config The tool configuration object, including a unique name and an execute handler.
83
+ * @return {this} The current builder instance for chaining.
84
+ */
28
85
  addTool(config) {
29
86
  const { name } = config;
30
87
  if (name in this.tools)
@@ -33,6 +90,12 @@ class Builder {
33
90
  this.log.debug(`tool ${name} added`);
34
91
  return this;
35
92
  }
93
+ /**
94
+ * @description Finalizes the configuration and produces a ModelContextProtocol instance.
95
+ * @summary Validates required fields (name and version), constructs a FastMCP instance, registers all configured tools, and returns a ModelContextProtocol wrapping the MCP.
96
+ * @template Auth extends FastMCPSessionAuth
97
+ * @return {ModelContextProtocol<Auth>} A fully initialized ModelContextProtocol instance.
98
+ */
36
99
  build() {
37
100
  if (!this.name)
38
101
  throw new Error("name is required");
@@ -55,20 +118,66 @@ class Builder {
55
118
  return new ModelContextProtocol(mcp);
56
119
  }
57
120
  }
121
+ /**
122
+ * @description A thin wrapper around FastMCP providing a typed interface for model-centric protocols.
123
+ * @summary Encapsulates a configured FastMCP instance and exposes factory utilities via a static Builder for constructing MCPs with tools, versioning, and naming semantics.
124
+ * @template Auth extends FastMCPSessionAuth Authentication payload type stored in the MCP session, or undefined for no auth.
125
+ * @param {FastMCP<Auth>} mcp The underlying FastMCP instance used to register and run tools.
126
+ * @class
127
+ * @example
128
+ * // Using the builder
129
+ * const protocol = ModelContextProtocol.builder
130
+ * .setName("Validator")
131
+ * .setVersion("1.2.3")
132
+ * .addTool({ name: "ping", description: "", parameters: z.any(), execute: async () => "pong" })
133
+ * .build();
134
+ * @mermaid
135
+ * sequenceDiagram
136
+ * participant Dev as Developer
137
+ * participant B as ModelContextProtocol.Builder
138
+ * participant MCP as FastMCP
139
+ * participant Proto as ModelContextProtocol
140
+ * Dev->>B: setName()/setVersion()/addTool()
141
+ * Dev->>B: build()
142
+ * B->>MCP: new FastMCP({ name, version })
143
+ * B->>MCP: addTool(tool...)
144
+ * B->>Proto: new ModelContextProtocol(MCP)
145
+ * B-->>Dev: ModelContextProtocol
146
+ */
58
147
  class ModelContextProtocol {
148
+ /**
149
+ * @description Lazily obtains a logger instance for this protocol wrapper.
150
+ * @summary Uses the Logging facility to create a context-aware Logger bound to this instance.
151
+ * @return {Logger} A logger instance for this class.
152
+ */
59
153
  get log() {
60
154
  return logging_1.Logging.for(this);
61
155
  }
62
156
  constructor(mcp) {
63
157
  this.mcp = mcp;
64
158
  }
159
+ /**
160
+ * @description Alias to the inner Builder class for external access.
161
+ * @summary Exposes the builder type to consumers to enable typed construction of ModelContextProtocol instances.
162
+ */
65
163
  static { this.Builder = Builder; }
164
+ /**
165
+ * @description Factory accessor for a new Builder instance.
166
+ * @summary Creates a new builder to fluently configure and construct a ModelContextProtocol.
167
+ * @return {Builder} A new builder instance.
168
+ */
66
169
  static get builder() {
67
170
  return new ModelContextProtocol.Builder();
68
171
  }
172
+ /**
173
+ * @description Validates a semantic version string.
174
+ * @summary Utility wrapper around the module-level validateVersion to keep a typed validator close to the class API.
175
+ * @param {string} version The version string to validate.
176
+ * @return {string} The normalized semantic version string.
177
+ */
69
178
  static validateVersion(version) {
70
179
  return validateVersion(version);
71
180
  }
72
181
  }
73
182
  exports.ModelContextProtocol = ModelContextProtocol;
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxDb250ZXh0UHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWNwL01vZGVsQ29udGV4dFByb3RvY29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUF3QztBQUN4QywrQ0FBb0Q7QUFHcEQsU0FBUyxlQUFlLENBQUMsT0FBZTtJQUN0QyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLO1FBQ1IsTUFBTSxJQUFJLEtBQUssQ0FDYiw0REFBNEQsT0FBTyxFQUFFLENBQ3RFLENBQUM7SUFDSixPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQXFDLENBQUM7QUFDbEYsQ0FBQztBQUVELE1BQU0sT0FBTztJQU9YO1FBSkEsVUFBSyxHQUFtQyxFQUFFLENBQUM7UUFFM0MsUUFBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRWxCLENBQUM7SUFFaEIsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUF1QjtRQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSztRQUdILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBTyxDQUFPO1lBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUM7Z0JBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixDQUFDO1lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osR0FBRyxJQUFJLENBQUMsSUFBSSwyQkFBMkIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQzVFLENBQUM7UUFDRixPQUFPLElBQUksb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBRUQsTUFBYSxvQkFBb0I7SUFDL0IsSUFBYyxHQUFHO1FBQ2YsT0FBTyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxJQUFXLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBK0IsR0FBa0I7UUFBbEIsUUFBRyxHQUFILEdBQUcsQ0FBZTtJQUFHLENBQUM7YUFFckMsWUFBTyxHQUFHLE9BQU8sQ0FBQztJQUVsQyxNQUFNLEtBQUssT0FBTztRQUNoQixPQUFPLElBQUksb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQzVCLE9BQWU7UUFFZixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDOztBQWpCSCxvREFrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXN0TUNQLCBUb29sIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFzdE1DUFNlc3Npb25BdXRoIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb246IHN0cmluZyk6IGAke251bWJlcn0uJHtudW1iZXJ9LiR7bnVtYmVyfWAge1xuICBjb25zdCByZWdleHAgPSAvKFxcZCspXFwuKFxcZCspXFwuKFxcZCspL2c7XG4gIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWModmVyc2lvbik7XG4gIGlmICghbWF0Y2gpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgdmVyc2lvbiBzdHJpbmcuIHNob3VsZCBvYmV5IHNlbWFudGljIHZlcnNpb25pbmc6ICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgcmV0dXJuIGAke21hdGNoWzFdfS4ke21hdGNoWzJdfS4ke21hdGNoWzNdfWAgYXMgYCR7bnVtYmVyfS4ke251bWJlcn0uJHtudW1iZXJ9YDtcbn1cblxuY2xhc3MgQnVpbGRlciB7XG4gIG5hbWUhOiBzdHJpbmc7XG4gIHZlcnNpb24hOiBgJHtudW1iZXJ9LiR7bnVtYmVyfS4ke251bWJlcn1gO1xuICB0b29sczogUmVjb3JkPHN0cmluZywgVG9vbDxhbnksIGFueT4+ID0ge307XG5cbiAgbG9nID0gTG9nZ2luZy5mb3IoXCJNQ1AgQnVpbGRlclwiKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc2V0TmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gdmFsdWU7XG4gICAgdGhpcy5sb2cuZGVidWcoYG5hbWUgc2V0IHRvICR7dmFsdWV9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRWZXJzaW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2YWxpZGF0ZVZlcnNpb24odmFsdWUpO1xuICAgIHRoaXMubG9nLmRlYnVnKGB2ZXJzaW9uIHNldCB0byAke3ZhbHVlfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkVG9vbDxBdXRoIGV4dGVuZHMgRmFzdE1DUFNlc3Npb25BdXRoID0gdW5kZWZpbmVkPihcbiAgICBjb25maWc6IFRvb2w8QXV0aCwgYW55PlxuICApIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGNvbmZpZztcbiAgICBpZiAobmFtZSBpbiB0aGlzLnRvb2xzKSB0aHJvdyBuZXcgRXJyb3IoYHRvb2wgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLnRvb2xzW25hbWVdID0gY29uZmlnO1xuICAgIHRoaXMubG9nLmRlYnVnKGB0b29sICR7bmFtZX0gYWRkZWRgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkPFxuICAgIEF1dGggZXh0ZW5kcyBGYXN0TUNQU2Vzc2lvbkF1dGggPSB1bmRlZmluZWQsXG4gID4oKTogTW9kZWxDb250ZXh0UHJvdG9jb2w8QXV0aD4ge1xuICAgIGlmICghdGhpcy5uYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIGlmICghdGhpcy52ZXJzaW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJ2ZXJzaW9uIGlzIHJlcXVpcmVkXCIpO1xuICAgIGNvbnN0IG1jcCA9IG5ldyBGYXN0TUNQPEF1dGg+KHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICB9KTtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudG9vbHMpLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1jcC5hZGRUb29sKHRvb2wpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBhZGQgdG9vbCAke3Rvb2wubmFtZX06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmxvZy5pbmZvKGAke3RoaXMubmFtZX0gTUNQIGJ1aWx0YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgJHt0aGlzLm5hbWV9IE1DUCAtIGF2YWlsYWJsZSB0b29sczogJHtPYmplY3Qua2V5cyh0aGlzLnRvb2xzKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnRleHRQcm90b2NvbChtY3ApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbENvbnRleHRQcm90b2NvbDxBdXRoIGV4dGVuZHMgRmFzdE1DUFNlc3Npb25BdXRoID0gdW5kZWZpbmVkPiB7XG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBtY3A6IEZhc3RNQ1A8QXV0aD4pIHt9XG5cbiAgc3RhdGljIHJlYWRvbmx5IEJ1aWxkZXIgPSBCdWlsZGVyO1xuXG4gIHN0YXRpYyBnZXQgYnVpbGRlcigpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsQ29udGV4dFByb3RvY29sLkJ1aWxkZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlVmVyc2lvbihcbiAgICB2ZXJzaW9uOiBzdHJpbmdcbiAgKTogYCR7bnVtYmVyfS4ke251bWJlcn0uJHtudW1iZXJ9YCB7XG4gICAgcmV0dXJuIHZhbGlkYXRlVmVyc2lvbih2ZXJzaW9uKTtcbiAgfVxufVxuIl19
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxDb250ZXh0UHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWNwL01vZGVsQ29udGV4dFByb3RvY29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUF3QztBQUN4QywrQ0FBb0Q7QUFHcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxPQUFlO0lBQ3RDLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLEtBQUs7UUFDUixNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RCxPQUFPLEVBQUUsQ0FDdEUsQ0FBQztJQUNKLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBcUMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxNQUFNLE9BQU87SUFPWDtRQUpBLFVBQUssR0FBbUMsRUFBRSxDQUFDO1FBRTNDLFFBQUcsR0FBRyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVsQixDQUFDO0lBRWhCOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUNMLE1BQXVCO1FBRXZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDeEIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUs7UUFHSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQU8sQ0FBTztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDO2dCQUNILEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQztZQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLEdBQUcsSUFBSSxDQUFDLElBQUksMkJBQTJCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM1RSxDQUFDO1FBQ0YsT0FBTyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBYSxvQkFBb0I7SUFDL0I7Ozs7T0FJRztJQUNILElBQWMsR0FBRztRQUNmLE9BQU8saUJBQU8sQ0FBQyxHQUFHLENBQUMsSUFBVyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFlBQStCLEdBQWtCO1FBQWxCLFFBQUcsR0FBSCxHQUFHLENBQWU7SUFBRyxDQUFDO0lBRXJEOzs7T0FHRzthQUNhLFlBQU8sR0FBRyxPQUFPLENBQUM7SUFFbEM7Ozs7T0FJRztJQUNILE1BQU0sS0FBSyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxNQUFNLENBQUMsZUFBZSxDQUM1QixPQUFlO1FBRWYsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7QUFyQ0gsb0RBc0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmFzdE1DUCwgVG9vbCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhc3RNQ1BTZXNzaW9uQXV0aCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhbmQgbm9ybWFsaXplcyBhIHNlbWFudGljIHZlcnNpb24gc3RyaW5nLlxuICogQHN1bW1hcnkgRW5zdXJlcyB0aGUgcHJvdmlkZWQgdmVyc2lvbiBmb2xsb3dzIHNlbWFudGljIHZlcnNpb25pbmcgKG1ham9yLm1pbm9yLnBhdGNoKSBhbmQgcmV0dXJucyBhIHR1cGxlLWxpa2UgdGVtcGxhdGUgc3RyaW5nIHR5cGVkIGFzIGAke251bWJlcn0uJHtudW1iZXJ9LiR7bnVtYmVyfWAuXG4gKiBAdGVtcGxhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIHN0cmluZyB0byB2YWxpZGF0ZSwgZXhwZWN0ZWQgaW4gdGhlIGZvcm0gTUFKT1IuTUlOT1IuUEFUQ0guXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub3JtYWxpemVkIHZlcnNpb24gc3RyaW5nIGlmIHZhbGlkLlxuICogQGZ1bmN0aW9uIHZhbGlkYXRlVmVyc2lvblxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogYCR7bnVtYmVyfS4ke251bWJlcn0uJHtudW1iZXJ9YCB7XG4gIGNvbnN0IHJlZ2V4cCA9IC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvZztcbiAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyh2ZXJzaW9uKTtcbiAgaWYgKCFtYXRjaClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCB2ZXJzaW9uIHN0cmluZy4gc2hvdWxkIG9iZXkgc2VtYW50aWMgdmVyc2lvbmluZzogJHt2ZXJzaW9ufWBcbiAgICApO1xuICByZXR1cm4gYCR7bWF0Y2hbMV19LiR7bWF0Y2hbMl19LiR7bWF0Y2hbM119YCBhcyBgJHtudW1iZXJ9LiR7bnVtYmVyfS4ke251bWJlcn1gO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGbHVlbnQgYnVpbGRlciBmb3IgY3JlYXRpbmcgYSBjb25maWd1cmVkIE1vZGVsQ29udGV4dFByb3RvY29sIGluc3RhbmNlLlxuICogQHN1bW1hcnkgQ29sbGVjdHMgTUNQIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGEgc2VtYW50aWMgdmVyc2lvbiwgYSBuYW1lLCBhbmQgYSByZWdpc3RyeSBvZiB0b29scywgb2ZmZXJpbmcgY2hhaW5hYmxlIG1ldGhvZHMgYW5kIGEgZmluYWwgYnVpbGQgc3RlcCB0byBwcm9kdWNlIGEgcmVhZHktdG8tdXNlIE1vZGVsQ29udGV4dFByb3RvY29sLlxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSBUaGUgbmFtZSBvZiB0aGUgTUNQIGluc3RhbmNlIHRvIGJ1aWxkLlxuICogQHBhcmFtIHtzdHJpbmd9IFt2ZXJzaW9uXSBUaGUgc2VtYW50aWMgdmVyc2lvbiBvZiB0aGUgTUNQIGluc3RhbmNlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBUb29sPGFueSwgYW55Pj59IFt0b29sc10gQSBtYXAgb2YgdG9vbCBjb25maWd1cmF0aW9ucyBpbmRleGVkIGJ5IHRvb2wgbmFtZS5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIEJ1aWxkIGEgbmV3IE1DUCB3aXRoIGEgc2luZ2xlIHRvb2xcbiAqIGNvbnN0IG1jcCA9IE1vZGVsQ29udGV4dFByb3RvY29sLmJ1aWxkZXJcbiAqICAgLnNldE5hbWUoXCJFeGFtcGxlXCIpXG4gKiAgIC5zZXRWZXJzaW9uKFwiMS4wLjBcIilcbiAqICAgLmFkZFRvb2woeyBuYW1lOiBcImRvXCIsIGRlc2NyaXB0aW9uOiBcIlwiLCBwYXJhbWV0ZXJzOiB6LmFueSgpLCBleGVjdXRlOiBhc3luYyAoKSA9PiBcIm9rXCIgfSlcbiAqICAgLmJ1aWxkKCk7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IERldiBhcyBEZXZlbG9wZXJcbiAqICAgcGFydGljaXBhbnQgQiBhcyBCdWlsZGVyXG4gKiAgIHBhcnRpY2lwYW50IE1DUCBhcyBNb2RlbENvbnRleHRQcm90b2NvbFxuICogICBEZXYtPj5COiBzZXROYW1lKFwiRXhhbXBsZVwiKVxuICogICBCLS0+PkRldjogQnVpbGRlclxuICogICBEZXYtPj5COiBzZXRWZXJzaW9uKFwiMS4wLjBcIilcbiAqICAgQi0tPj5EZXY6IEJ1aWxkZXJcbiAqICAgRGV2LT4+QjogYWRkVG9vbCh0b29sKVxuICogICBCLS0+PkRldjogQnVpbGRlclxuICogICBEZXYtPj5COiBidWlsZCgpXG4gKiAgIEItPj5NQ1A6IG5ldyBNb2RlbENvbnRleHRQcm90b2NvbChGYXN0TUNQKVxuICogICBCLS0+PkRldjogTW9kZWxDb250ZXh0UHJvdG9jb2xcbiAqL1xuY2xhc3MgQnVpbGRlciB7XG4gIG5hbWUhOiBzdHJpbmc7XG4gIHZlcnNpb24hOiBgJHtudW1iZXJ9LiR7bnVtYmVyfS4ke251bWJlcn1gO1xuICB0b29sczogUmVjb3JkPHN0cmluZywgVG9vbDxhbnksIGFueT4+ID0ge307XG5cbiAgbG9nID0gTG9nZ2luZy5mb3IoXCJNQ1AgQnVpbGRlclwiKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBNQ1AgaW5zdGFuY2UgbmFtZS5cbiAgICogQHN1bW1hcnkgQXNzaWducyBhIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXIgdG8gdGhlIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBhbmQgZW5hYmxlcyBtZXRob2QgY2hhaW5pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgbmFtZSB0byBhc3NpZ24gdG8gdGhlIE1DUCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7dGhpc30gVGhlIGN1cnJlbnQgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzZXROYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgbmFtZSBzZXQgdG8gJHt2YWx1ZX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBhbmQgdmFsaWRhdGVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIGZvciB0aGUgTUNQIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIHByb3ZpZGVkIHZhbHVlIGFnYWluc3Qgc2VtYW50aWMgdmVyc2lvbmluZyBhbmQgc3RvcmVzIHRoZSBub3JtYWxpemVkIHZlcnNpb247IGVuYWJsZXMgbWV0aG9kIGNoYWluaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHNlbWFudGljIHZlcnNpb24gc3RyaW5nIChlLmcuLCBcIjEuMi4zXCIpLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgY3VycmVudCBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHNldFZlcnNpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmVyc2lvbiA9IHZhbGlkYXRlVmVyc2lvbih2YWx1ZSk7XG4gICAgdGhpcy5sb2cuZGVidWcoYHZlcnNpb24gc2V0IHRvICR7dmFsdWV9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG5ldyB0b29sIGluIHRoZSBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBBZGRzIGEgdG9vbCBjb25maWd1cmF0aW9uIGJ5IGl0cyB1bmlxdWUgbmFtZSB0byB0aGUgaW50ZXJuYWwgcmVnaXN0cnksIHRocm93aW5nIGlmIGEgdG9vbCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuXG4gICAqIEB0ZW1wbGF0ZSBBdXRoIGV4dGVuZHMgRmFzdE1DUFNlc3Npb25BdXRoXG4gICAqIEBwYXJhbSB7VG9vbDxBdXRoLCBhbnk+fSBjb25maWcgVGhlIHRvb2wgY29uZmlndXJhdGlvbiBvYmplY3QsIGluY2x1ZGluZyBhIHVuaXF1ZSBuYW1lIGFuZCBhbiBleGVjdXRlIGhhbmRsZXIuXG4gICAqIEByZXR1cm4ge3RoaXN9IFRoZSBjdXJyZW50IGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgYWRkVG9vbDxBdXRoIGV4dGVuZHMgRmFzdE1DUFNlc3Npb25BdXRoID0gdW5kZWZpbmVkPihcbiAgICBjb25maWc6IFRvb2w8QXV0aCwgYW55PlxuICApIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGNvbmZpZztcbiAgICBpZiAobmFtZSBpbiB0aGlzLnRvb2xzKSB0aHJvdyBuZXcgRXJyb3IoYHRvb2wgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLnRvb2xzW25hbWVdID0gY29uZmlnO1xuICAgIHRoaXMubG9nLmRlYnVnKGB0b29sICR7bmFtZX0gYWRkZWRgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmluYWxpemVzIHRoZSBjb25maWd1cmF0aW9uIGFuZCBwcm9kdWNlcyBhIE1vZGVsQ29udGV4dFByb3RvY29sIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgcmVxdWlyZWQgZmllbGRzIChuYW1lIGFuZCB2ZXJzaW9uKSwgY29uc3RydWN0cyBhIEZhc3RNQ1AgaW5zdGFuY2UsIHJlZ2lzdGVycyBhbGwgY29uZmlndXJlZCB0b29scywgYW5kIHJldHVybnMgYSBNb2RlbENvbnRleHRQcm90b2NvbCB3cmFwcGluZyB0aGUgTUNQLlxuICAgKiBAdGVtcGxhdGUgQXV0aCBleHRlbmRzIEZhc3RNQ1BTZXNzaW9uQXV0aFxuICAgKiBAcmV0dXJuIHtNb2RlbENvbnRleHRQcm90b2NvbDxBdXRoPn0gQSBmdWxseSBpbml0aWFsaXplZCBNb2RlbENvbnRleHRQcm90b2NvbCBpbnN0YW5jZS5cbiAgICovXG4gIGJ1aWxkPFxuICAgIEF1dGggZXh0ZW5kcyBGYXN0TUNQU2Vzc2lvbkF1dGggPSB1bmRlZmluZWQsXG4gID4oKTogTW9kZWxDb250ZXh0UHJvdG9jb2w8QXV0aD4ge1xuICAgIGlmICghdGhpcy5uYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIGlmICghdGhpcy52ZXJzaW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJ2ZXJzaW9uIGlzIHJlcXVpcmVkXCIpO1xuICAgIGNvbnN0IG1jcCA9IG5ldyBGYXN0TUNQPEF1dGg+KHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICB9KTtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudG9vbHMpLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1jcC5hZGRUb29sKHRvb2wpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBhZGQgdG9vbCAke3Rvb2wubmFtZX06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmxvZy5pbmZvKGAke3RoaXMubmFtZX0gTUNQIGJ1aWx0YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgJHt0aGlzLm5hbWV9IE1DUCAtIGF2YWlsYWJsZSB0b29sczogJHtPYmplY3Qua2V5cyh0aGlzLnRvb2xzKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnRleHRQcm90b2NvbChtY3ApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdGhpbiB3cmFwcGVyIGFyb3VuZCBGYXN0TUNQIHByb3ZpZGluZyBhIHR5cGVkIGludGVyZmFjZSBmb3IgbW9kZWwtY2VudHJpYyBwcm90b2NvbHMuXG4gKiBAc3VtbWFyeSBFbmNhcHN1bGF0ZXMgYSBjb25maWd1cmVkIEZhc3RNQ1AgaW5zdGFuY2UgYW5kIGV4cG9zZXMgZmFjdG9yeSB1dGlsaXRpZXMgdmlhIGEgc3RhdGljIEJ1aWxkZXIgZm9yIGNvbnN0cnVjdGluZyBNQ1BzIHdpdGggdG9vbHMsIHZlcnNpb25pbmcsIGFuZCBuYW1pbmcgc2VtYW50aWNzLlxuICogQHRlbXBsYXRlIEF1dGggZXh0ZW5kcyBGYXN0TUNQU2Vzc2lvbkF1dGggQXV0aGVudGljYXRpb24gcGF5bG9hZCB0eXBlIHN0b3JlZCBpbiB0aGUgTUNQIHNlc3Npb24sIG9yIHVuZGVmaW5lZCBmb3Igbm8gYXV0aC5cbiAqIEBwYXJhbSB7RmFzdE1DUDxBdXRoPn0gbWNwIFRoZSB1bmRlcmx5aW5nIEZhc3RNQ1AgaW5zdGFuY2UgdXNlZCB0byByZWdpc3RlciBhbmQgcnVuIHRvb2xzLlxuICogQGNsYXNzXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgdGhlIGJ1aWxkZXJcbiAqIGNvbnN0IHByb3RvY29sID0gTW9kZWxDb250ZXh0UHJvdG9jb2wuYnVpbGRlclxuICogICAuc2V0TmFtZShcIlZhbGlkYXRvclwiKVxuICogICAuc2V0VmVyc2lvbihcIjEuMi4zXCIpXG4gKiAgIC5hZGRUb29sKHsgbmFtZTogXCJwaW5nXCIsIGRlc2NyaXB0aW9uOiBcIlwiLCBwYXJhbWV0ZXJzOiB6LmFueSgpLCBleGVjdXRlOiBhc3luYyAoKSA9PiBcInBvbmdcIiB9KVxuICogICAuYnVpbGQoKTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRGV2IGFzIERldmVsb3BlclxuICogICBwYXJ0aWNpcGFudCBCIGFzIE1vZGVsQ29udGV4dFByb3RvY29sLkJ1aWxkZXJcbiAqICAgcGFydGljaXBhbnQgTUNQIGFzIEZhc3RNQ1BcbiAqICAgcGFydGljaXBhbnQgUHJvdG8gYXMgTW9kZWxDb250ZXh0UHJvdG9jb2xcbiAqICAgRGV2LT4+Qjogc2V0TmFtZSgpL3NldFZlcnNpb24oKS9hZGRUb29sKClcbiAqICAgRGV2LT4+QjogYnVpbGQoKVxuICogICBCLT4+TUNQOiBuZXcgRmFzdE1DUCh7IG5hbWUsIHZlcnNpb24gfSlcbiAqICAgQi0+Pk1DUDogYWRkVG9vbCh0b29sLi4uKVxuICogICBCLT4+UHJvdG86IG5ldyBNb2RlbENvbnRleHRQcm90b2NvbChNQ1ApXG4gKiAgIEItLT4+RGV2OiBNb2RlbENvbnRleHRQcm90b2NvbFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxDb250ZXh0UHJvdG9jb2w8QXV0aCBleHRlbmRzIEZhc3RNQ1BTZXNzaW9uQXV0aCA9IHVuZGVmaW5lZD4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExhemlseSBvYnRhaW5zIGEgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGlzIHByb3RvY29sIHdyYXBwZXIuXG4gICAqIEBzdW1tYXJ5IFVzZXMgdGhlIExvZ2dpbmcgZmFjaWxpdHkgdG8gY3JlYXRlIGEgY29udGV4dC1hd2FyZSBMb2dnZXIgYm91bmQgdG8gdGhpcyBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TG9nZ2VyfSBBIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBtY3A6IEZhc3RNQ1A8QXV0aD4pIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyB0byB0aGUgaW5uZXIgQnVpbGRlciBjbGFzcyBmb3IgZXh0ZXJuYWwgYWNjZXNzLlxuICAgKiBAc3VtbWFyeSBFeHBvc2VzIHRoZSBidWlsZGVyIHR5cGUgdG8gY29uc3VtZXJzIHRvIGVuYWJsZSB0eXBlZCBjb25zdHJ1Y3Rpb24gb2YgTW9kZWxDb250ZXh0UHJvdG9jb2wgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IEJ1aWxkZXIgPSBCdWlsZGVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmFjdG9yeSBhY2Nlc3NvciBmb3IgYSBuZXcgQnVpbGRlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBidWlsZGVyIHRvIGZsdWVudGx5IGNvbmZpZ3VyZSBhbmQgY29uc3RydWN0IGEgTW9kZWxDb250ZXh0UHJvdG9jb2wuXG4gICAqIEByZXR1cm4ge0J1aWxkZXJ9IEEgbmV3IGJ1aWxkZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0IGJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnRleHRQcm90b2NvbC5CdWlsZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhIHNlbWFudGljIHZlcnNpb24gc3RyaW5nLlxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IHdyYXBwZXIgYXJvdW5kIHRoZSBtb2R1bGUtbGV2ZWwgdmFsaWRhdGVWZXJzaW9uIHRvIGtlZXAgYSB0eXBlZCB2YWxpZGF0b3IgY2xvc2UgdG8gdGhlIGNsYXNzIEFQSS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gVGhlIHZlcnNpb24gc3RyaW5nIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub3JtYWxpemVkIHNlbWFudGljIHZlcnNpb24gc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdGVWZXJzaW9uKFxuICAgIHZlcnNpb246IHN0cmluZ1xuICApOiBgJHtudW1iZXJ9LiR7bnVtYmVyfS4ke251bWJlcn1gIHtcbiAgICByZXR1cm4gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24pO1xuICB9XG59XG4iXX0=
@@ -1,23 +1,123 @@
1
1
  import { FastMCP, Tool } from "fastmcp";
2
2
  import { Logger } from "@decaf-ts/logging";
3
3
  import { FastMCPSessionAuth } from "./types";
4
+ /**
5
+ * @description Fluent builder for creating a configured ModelContextProtocol instance.
6
+ * @summary Collects MCP configuration including a semantic version, a name, and a registry of tools, offering chainable methods and a final build step to produce a ready-to-use ModelContextProtocol.
7
+ * @param {string} [name] The name of the MCP instance to build.
8
+ * @param {string} [version] The semantic version of the MCP instance.
9
+ * @param {Record<string, Tool<any, any>>} [tools] A map of tool configurations indexed by tool name.
10
+ * @class
11
+ * @example
12
+ * // Build a new MCP with a single tool
13
+ * const mcp = ModelContextProtocol.builder
14
+ * .setName("Example")
15
+ * .setVersion("1.0.0")
16
+ * .addTool({ name: "do", description: "", parameters: z.any(), execute: async () => "ok" })
17
+ * .build();
18
+ * @mermaid
19
+ * sequenceDiagram
20
+ * participant Dev as Developer
21
+ * participant B as Builder
22
+ * participant MCP as ModelContextProtocol
23
+ * Dev->>B: setName("Example")
24
+ * B-->>Dev: Builder
25
+ * Dev->>B: setVersion("1.0.0")
26
+ * B-->>Dev: Builder
27
+ * Dev->>B: addTool(tool)
28
+ * B-->>Dev: Builder
29
+ * Dev->>B: build()
30
+ * B->>MCP: new ModelContextProtocol(FastMCP)
31
+ * B-->>Dev: ModelContextProtocol
32
+ */
4
33
  declare class Builder {
5
34
  name: string;
6
35
  version: `${number}.${number}.${number}`;
7
36
  tools: Record<string, Tool<any, any>>;
8
37
  log: Logger;
9
38
  constructor();
39
+ /**
40
+ * @description Sets the MCP instance name.
41
+ * @summary Assigns a human-readable identifier to the builder configuration and enables method chaining.
42
+ * @param {string} value The name to assign to the MCP instance.
43
+ * @return {this} The current builder instance for chaining.
44
+ */
10
45
  setName(value: string): this;
46
+ /**
47
+ * @description Sets and validates the semantic version for the MCP instance.
48
+ * @summary Parses the provided value against semantic versioning and stores the normalized version; enables method chaining.
49
+ * @param {string} value The semantic version string (e.g., "1.2.3").
50
+ * @return {this} The current builder instance for chaining.
51
+ */
11
52
  setVersion(value: string): this;
53
+ /**
54
+ * @description Registers a new tool in the builder.
55
+ * @summary Adds a tool configuration by its unique name to the internal registry, throwing if a tool with the same name already exists.
56
+ * @template Auth extends FastMCPSessionAuth
57
+ * @param {Tool<Auth, any>} config The tool configuration object, including a unique name and an execute handler.
58
+ * @return {this} The current builder instance for chaining.
59
+ */
12
60
  addTool<Auth extends FastMCPSessionAuth = undefined>(config: Tool<Auth, any>): this;
61
+ /**
62
+ * @description Finalizes the configuration and produces a ModelContextProtocol instance.
63
+ * @summary Validates required fields (name and version), constructs a FastMCP instance, registers all configured tools, and returns a ModelContextProtocol wrapping the MCP.
64
+ * @template Auth extends FastMCPSessionAuth
65
+ * @return {ModelContextProtocol<Auth>} A fully initialized ModelContextProtocol instance.
66
+ */
13
67
  build<Auth extends FastMCPSessionAuth = undefined>(): ModelContextProtocol<Auth>;
14
68
  }
69
+ /**
70
+ * @description A thin wrapper around FastMCP providing a typed interface for model-centric protocols.
71
+ * @summary Encapsulates a configured FastMCP instance and exposes factory utilities via a static Builder for constructing MCPs with tools, versioning, and naming semantics.
72
+ * @template Auth extends FastMCPSessionAuth Authentication payload type stored in the MCP session, or undefined for no auth.
73
+ * @param {FastMCP<Auth>} mcp The underlying FastMCP instance used to register and run tools.
74
+ * @class
75
+ * @example
76
+ * // Using the builder
77
+ * const protocol = ModelContextProtocol.builder
78
+ * .setName("Validator")
79
+ * .setVersion("1.2.3")
80
+ * .addTool({ name: "ping", description: "", parameters: z.any(), execute: async () => "pong" })
81
+ * .build();
82
+ * @mermaid
83
+ * sequenceDiagram
84
+ * participant Dev as Developer
85
+ * participant B as ModelContextProtocol.Builder
86
+ * participant MCP as FastMCP
87
+ * participant Proto as ModelContextProtocol
88
+ * Dev->>B: setName()/setVersion()/addTool()
89
+ * Dev->>B: build()
90
+ * B->>MCP: new FastMCP({ name, version })
91
+ * B->>MCP: addTool(tool...)
92
+ * B->>Proto: new ModelContextProtocol(MCP)
93
+ * B-->>Dev: ModelContextProtocol
94
+ */
15
95
  export declare class ModelContextProtocol<Auth extends FastMCPSessionAuth = undefined> {
16
96
  protected readonly mcp: FastMCP<Auth>;
97
+ /**
98
+ * @description Lazily obtains a logger instance for this protocol wrapper.
99
+ * @summary Uses the Logging facility to create a context-aware Logger bound to this instance.
100
+ * @return {Logger} A logger instance for this class.
101
+ */
17
102
  protected get log(): Logger;
18
103
  constructor(mcp: FastMCP<Auth>);
104
+ /**
105
+ * @description Alias to the inner Builder class for external access.
106
+ * @summary Exposes the builder type to consumers to enable typed construction of ModelContextProtocol instances.
107
+ */
19
108
  static readonly Builder: typeof Builder;
109
+ /**
110
+ * @description Factory accessor for a new Builder instance.
111
+ * @summary Creates a new builder to fluently configure and construct a ModelContextProtocol.
112
+ * @return {Builder} A new builder instance.
113
+ */
20
114
  static get builder(): Builder;
115
+ /**
116
+ * @description Validates a semantic version string.
117
+ * @summary Utility wrapper around the module-level validateVersion to keep a typed validator close to the class API.
118
+ * @param {string} version The version string to validate.
119
+ * @return {string} The normalized semantic version string.
120
+ */
21
121
  private static validateVersion;
22
122
  }
23
123
  export {};
@@ -2,60 +2,69 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.jsTypes = exports.ReservedModels = exports.Primitives = void 0;
4
4
  /**
5
- * @summary References the relevant JS primitives
6
- *
5
+ * @description Enumeration of JavaScript primitive type identifiers used by the model system.
6
+ * @summary References the relevant JS primitives and standardizes their string representations across the library.
7
7
  * @property {string} STRING references the string primitive
8
8
  * @property {string} NUMBER references the number primitive
9
9
  * @property {string} BOOLEAN references the boolean primitive
10
10
  * @property {string} BIGINT references the bigint primitive
11
- *
12
- * @constant Primitives
11
+ * @enum Primitives
12
+ * @readonly
13
13
  * @memberOf module:decorator-validation
14
14
  */
15
15
  var Primitives;
16
16
  (function (Primitives) {
17
+ /** references the string primitive */
17
18
  Primitives["STRING"] = "string";
19
+ /** references the number primitive */
18
20
  Primitives["NUMBER"] = "number";
21
+ /** references the boolean primitive */
19
22
  Primitives["BOOLEAN"] = "boolean";
23
+ /** references the bigint primitive */
20
24
  Primitives["BIGINT"] = "bigint";
21
25
  })(Primitives || (exports.Primitives = Primitives = {}));
22
26
  /**
23
- * @summary References the Reserved model names to ignore during Model rebuilding
24
- *
27
+ * @description Reserved model names which are excluded from model rebuilding.
28
+ * @summary References the Reserved model names to ignore during Model rebuilding to avoid interfering with native types and special cases.
25
29
  * @property {string} STRING
26
30
  * @property {string} OBJECT
27
31
  * @property {string} NUMBER
28
32
  * @property {string} BOOLEAN
29
33
  * @property {string} BIGINT
30
34
  * @property {string} DATE
31
- *
32
- * @constant ReservedModels
35
+ * @enum ReservedModels
36
+ * @readonly
33
37
  * @memberOf module:decorator-validation
34
38
  */
35
39
  var ReservedModels;
36
40
  (function (ReservedModels) {
41
+ /** reserved name for string */
37
42
  ReservedModels["STRING"] = "string";
43
+ /** reserved name for object */
38
44
  ReservedModels["OBJECT"] = "object";
45
+ /** reserved name for number */
39
46
  ReservedModels["NUMBER"] = "number";
47
+ /** reserved name for boolean */
40
48
  ReservedModels["BOOLEAN"] = "boolean";
49
+ /** reserved name for bigint */
41
50
  ReservedModels["BIGINT"] = "bigint";
51
+ /** reserved name for Date */
42
52
  ReservedModels["DATE"] = "date";
43
53
  })(ReservedModels || (exports.ReservedModels = ReservedModels = {}));
44
54
  /**
45
- * @summary References the basic supported js types
46
- *
47
- * @property {string} string
48
- * @property {string} array
49
- * @property {string} number
50
- * @property {string} boolean
51
- * @property {string} symbol
52
- * @property {string} function
53
- * @property {string} object
54
- * @property {string} undefined
55
- * @property {string} null
56
- * @property {string} BIGINT
57
- *
58
- * @constant jsTypes
55
+ * @description Basic supported JavaScript types used by the validation system.
56
+ * @summary References the basic supported JS types as strings that can be used for type checking and metadata.
57
+ * @typedef {Object} JsTypes
58
+ * @property {"string"} string String primitive identifier
59
+ * @property {"array"} array Array type identifier
60
+ * @property {"number"} number Number primitive identifier
61
+ * @property {"boolean"} boolean Boolean primitive identifier
62
+ * @property {"symbol"} symbol Symbol primitive identifier
63
+ * @property {"function"} function Function type identifier
64
+ * @property {"object"} object Object type identifier
65
+ * @property {"undefined"} undefined Undefined type identifier
66
+ * @property {"null"} null Null value identifier
67
+ * @property {"bigint"} BIGINT BigInt primitive identifier
59
68
  * @memberOf module:decorator-validation
60
69
  */
61
70
  exports.jsTypes = [
@@ -70,4 +79,4 @@ exports.jsTypes = [
70
79
  "null",
71
80
  "bigint",
72
81
  ];
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLCtCQUFpQixDQUFBO0lBQ2pCLCtCQUFpQixDQUFBO0lBQ2pCLGlDQUFtQixDQUFBO0lBQ25CLCtCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxVQUFVLDBCQUFWLFVBQVUsUUFLckI7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxJQUFZLGNBT1g7QUFQRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIsbUNBQWlCLENBQUE7SUFDakIsbUNBQWlCLENBQUE7SUFDakIscUNBQW1CLENBQUE7SUFDbkIsbUNBQWlCLENBQUE7SUFDakIsK0JBQWEsQ0FBQTtBQUNmLENBQUMsRUFQVyxjQUFjLDhCQUFkLGNBQWMsUUFPekI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNVLFFBQUEsT0FBTyxHQUFHO0lBQ3JCLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsTUFBTTtJQUNOLFFBQVE7Q0FDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSByZWxldmFudCBKUyBwcmltaXRpdmVzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNUUklORyByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIHJlZmVyZW5jZXMgdGhlIG51bWJlciBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOIHJlZmVyZW5jZXMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UIHJlZmVyZW5jZXMgdGhlIGJpZ2ludCBwcmltaXRpdmVcbiAqXG4gKiBAY29uc3RhbnQgUHJpbWl0aXZlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBQcmltaXRpdmVzIHtcbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgTlVNQkVSID0gXCJudW1iZXJcIixcbiAgQk9PTEVBTiA9IFwiYm9vbGVhblwiLFxuICBCSUdJTlQgPSBcImJpZ2ludFwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIFJlc2VydmVkIG1vZGVsIG5hbWVzIHRvIGlnbm9yZSBkdXJpbmcgTW9kZWwgcmVidWlsZGluZ1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVxuICpcbiAqIEBjb25zdGFudCBSZXNlcnZlZE1vZGVsc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZW51bSBSZXNlcnZlZE1vZGVscyB7XG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIE9CSkVDVCA9IFwib2JqZWN0XCIsXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIEJPT0xFQU4gPSBcImJvb2xlYW5cIixcbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbiAgREFURSA9IFwiZGF0ZVwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIGJhc2ljIHN1cHBvcnRlZCBqcyB0eXBlc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcnJheVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG51bWJlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJvb2xlYW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW1ib2xcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmdW5jdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdJTlRcbiAqXG4gKiBAY29uc3RhbnQganNUeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QganNUeXBlcyA9IFtcbiAgXCJzdHJpbmdcIixcbiAgXCJhcnJheVwiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG4iXX0=
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsSUFBWSxVQVNYO0FBVEQsV0FBWSxVQUFVO0lBQ3BCLHNDQUFzQztJQUN0QywrQkFBaUIsQ0FBQTtJQUNqQixzQ0FBc0M7SUFDdEMsK0JBQWlCLENBQUE7SUFDakIsdUNBQXVDO0lBQ3ZDLGlDQUFtQixDQUFBO0lBQ25CLHNDQUFzQztJQUN0QywrQkFBaUIsQ0FBQTtBQUNuQixDQUFDLEVBVFcsVUFBVSwwQkFBVixVQUFVLFFBU3JCO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsSUFBWSxjQWFYO0FBYkQsV0FBWSxjQUFjO0lBQ3hCLCtCQUErQjtJQUMvQixtQ0FBaUIsQ0FBQTtJQUNqQiwrQkFBK0I7SUFDL0IsbUNBQWlCLENBQUE7SUFDakIsK0JBQStCO0lBQy9CLG1DQUFpQixDQUFBO0lBQ2pCLGdDQUFnQztJQUNoQyxxQ0FBbUIsQ0FBQTtJQUNuQiwrQkFBK0I7SUFDL0IsbUNBQWlCLENBQUE7SUFDakIsNkJBQTZCO0lBQzdCLCtCQUFhLENBQUE7QUFDZixDQUFDLEVBYlcsY0FBYyw4QkFBZCxjQUFjLFFBYXpCO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ1UsUUFBQSxPQUFPLEdBQUc7SUFDckIsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxNQUFNO0lBQ04sUUFBUTtDQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBKYXZhU2NyaXB0IHByaW1pdGl2ZSB0eXBlIGlkZW50aWZpZXJzIHVzZWQgYnkgdGhlIG1vZGVsIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIHJlbGV2YW50IEpTIHByaW1pdGl2ZXMgYW5kIHN0YW5kYXJkaXplcyB0aGVpciBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGFjcm9zcyB0aGUgbGlicmFyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkcgcmVmZXJlbmNlcyB0aGUgc3RyaW5nIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUiByZWZlcmVuY2VzIHRoZSBudW1iZXIgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTiByZWZlcmVuY2VzIHRoZSBib29sZWFuIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVCByZWZlcmVuY2VzIHRoZSBiaWdpbnQgcHJpbWl0aXZlXG4gKiBAZW51bSBQcmltaXRpdmVzXG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gUHJpbWl0aXZlcyB7XG4gIC8qKiByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlICovXG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIC8qKiByZWZlcmVuY2VzIHRoZSBudW1iZXIgcHJpbWl0aXZlICovXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIC8qKiByZWZlcmVuY2VzIHRoZSBib29sZWFuIHByaW1pdGl2ZSAqL1xuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIC8qKiByZWZlcmVuY2VzIHRoZSBiaWdpbnQgcHJpbWl0aXZlICovXG4gIEJJR0lOVCA9IFwiYmlnaW50XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlc2VydmVkIG1vZGVsIG5hbWVzIHdoaWNoIGFyZSBleGNsdWRlZCBmcm9tIG1vZGVsIHJlYnVpbGRpbmcuXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBSZXNlcnZlZCBtb2RlbCBuYW1lcyB0byBpZ25vcmUgZHVyaW5nIE1vZGVsIHJlYnVpbGRpbmcgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBuYXRpdmUgdHlwZXMgYW5kIHNwZWNpYWwgY2FzZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1RSSU5HXG4gKiBAcHJvcGVydHkge3N0cmluZ30gT0JKRUNUXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVFxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEVcbiAqIEBlbnVtIFJlc2VydmVkTW9kZWxzXG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gUmVzZXJ2ZWRNb2RlbHMge1xuICAvKiogcmVzZXJ2ZWQgbmFtZSBmb3Igc3RyaW5nICovXG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIC8qKiByZXNlcnZlZCBuYW1lIGZvciBvYmplY3QgKi9cbiAgT0JKRUNUID0gXCJvYmplY3RcIixcbiAgLyoqIHJlc2VydmVkIG5hbWUgZm9yIG51bWJlciAqL1xuICBOVU1CRVIgPSBcIm51bWJlclwiLFxuICAvKiogcmVzZXJ2ZWQgbmFtZSBmb3IgYm9vbGVhbiAqL1xuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIC8qKiByZXNlcnZlZCBuYW1lIGZvciBiaWdpbnQgKi9cbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbiAgLyoqIHJlc2VydmVkIG5hbWUgZm9yIERhdGUgKi9cbiAgREFURSA9IFwiZGF0ZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNpYyBzdXBwb3J0ZWQgSmF2YVNjcmlwdCB0eXBlcyB1c2VkIGJ5IHRoZSB2YWxpZGF0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIGJhc2ljIHN1cHBvcnRlZCBKUyB0eXBlcyBhcyBzdHJpbmdzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIG1ldGFkYXRhLlxuICogQHR5cGVkZWYge09iamVjdH0gSnNUeXBlc1xuICogQHByb3BlcnR5IHtcInN0cmluZ1wifSBzdHJpbmcgU3RyaW5nIHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wiYXJyYXlcIn0gYXJyYXkgQXJyYXkgdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wibnVtYmVyXCJ9IG51bWJlciBOdW1iZXIgcHJpbWl0aXZlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7XCJib29sZWFuXCJ9IGJvb2xlYW4gQm9vbGVhbiBwcmltaXRpdmUgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtcInN5bWJvbFwifSBzeW1ib2wgU3ltYm9sIHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wiZnVuY3Rpb25cIn0gZnVuY3Rpb24gRnVuY3Rpb24gdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wib2JqZWN0XCJ9IG9iamVjdCBPYmplY3QgdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1widW5kZWZpbmVkXCJ9IHVuZGVmaW5lZCBVbmRlZmluZWQgdHlwZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge1wibnVsbFwifSBudWxsIE51bGwgdmFsdWUgaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtcImJpZ2ludFwifSBCSUdJTlQgQmlnSW50IHByaW1pdGl2ZSBpZGVudGlmaWVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBqc1R5cGVzID0gW1xuICBcInN0cmluZ1wiLFxuICBcImFycmF5XCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiYm9vbGVhblwiLFxuICBcInN5bWJvbFwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwib2JqZWN0XCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwibnVsbFwiLFxuICBcImJpZ2ludFwiLFxuXTtcbiJdfQ==
@@ -1,56 +1,65 @@
1
1
  /**
2
- * @summary References the relevant JS primitives
3
- *
2
+ * @description Enumeration of JavaScript primitive type identifiers used by the model system.
3
+ * @summary References the relevant JS primitives and standardizes their string representations across the library.
4
4
  * @property {string} STRING references the string primitive
5
5
  * @property {string} NUMBER references the number primitive
6
6
  * @property {string} BOOLEAN references the boolean primitive
7
7
  * @property {string} BIGINT references the bigint primitive
8
- *
9
- * @constant Primitives
8
+ * @enum Primitives
9
+ * @readonly
10
10
  * @memberOf module:decorator-validation
11
11
  */
12
12
  export declare enum Primitives {
13
+ /** references the string primitive */
13
14
  STRING = "string",
15
+ /** references the number primitive */
14
16
  NUMBER = "number",
17
+ /** references the boolean primitive */
15
18
  BOOLEAN = "boolean",
19
+ /** references the bigint primitive */
16
20
  BIGINT = "bigint"
17
21
  }
18
22
  /**
19
- * @summary References the Reserved model names to ignore during Model rebuilding
20
- *
23
+ * @description Reserved model names which are excluded from model rebuilding.
24
+ * @summary References the Reserved model names to ignore during Model rebuilding to avoid interfering with native types and special cases.
21
25
  * @property {string} STRING
22
26
  * @property {string} OBJECT
23
27
  * @property {string} NUMBER
24
28
  * @property {string} BOOLEAN
25
29
  * @property {string} BIGINT
26
30
  * @property {string} DATE
27
- *
28
- * @constant ReservedModels
31
+ * @enum ReservedModels
32
+ * @readonly
29
33
  * @memberOf module:decorator-validation
30
34
  */
31
35
  export declare enum ReservedModels {
36
+ /** reserved name for string */
32
37
  STRING = "string",
38
+ /** reserved name for object */
33
39
  OBJECT = "object",
40
+ /** reserved name for number */
34
41
  NUMBER = "number",
42
+ /** reserved name for boolean */
35
43
  BOOLEAN = "boolean",
44
+ /** reserved name for bigint */
36
45
  BIGINT = "bigint",
46
+ /** reserved name for Date */
37
47
  DATE = "date"
38
48
  }
39
49
  /**
40
- * @summary References the basic supported js types
41
- *
42
- * @property {string} string
43
- * @property {string} array
44
- * @property {string} number
45
- * @property {string} boolean
46
- * @property {string} symbol
47
- * @property {string} function
48
- * @property {string} object
49
- * @property {string} undefined
50
- * @property {string} null
51
- * @property {string} BIGINT
52
- *
53
- * @constant jsTypes
50
+ * @description Basic supported JavaScript types used by the validation system.
51
+ * @summary References the basic supported JS types as strings that can be used for type checking and metadata.
52
+ * @typedef {Object} JsTypes
53
+ * @property {"string"} string String primitive identifier
54
+ * @property {"array"} array Array type identifier
55
+ * @property {"number"} number Number primitive identifier
56
+ * @property {"boolean"} boolean Boolean primitive identifier
57
+ * @property {"symbol"} symbol Symbol primitive identifier
58
+ * @property {"function"} function Function type identifier
59
+ * @property {"object"} object Object type identifier
60
+ * @property {"undefined"} undefined Undefined type identifier
61
+ * @property {"null"} null Null value identifier
62
+ * @property {"bigint"} BIGINT BigInt primitive identifier
54
63
  * @memberOf module:decorator-validation
55
64
  */
56
65
  export declare const jsTypes: string[];
@@ -5,14 +5,12 @@ exports.findLastProtoBeforeObject = findLastProtoBeforeObject;
5
5
  exports.bindModelPrototype = bindModelPrototype;
6
6
  const Model_1 = require("./Model.cjs");
7
7
  /**
8
- * @summary Helper Function to override constructors
9
- *
8
+ * @description Helper function to create an instance by invoking a constructor with dynamic arguments.
9
+ * @summary Overrides standard construction patterns by wrapping the given constructor to allow spread argument invocation while preserving the prototype chain.
10
10
  * @template M the model instance type
11
- *
12
- * @param {Function} constructor
13
- * @param {any[]} [args]
14
- * @return {M} the new instance
15
- *
11
+ * @param {any} constructor The constructor function to invoke.
12
+ * @param {...any[]} args Optional arguments to pass to the constructor.
13
+ * @return {M} The newly constructed instance.
16
14
  * @function construct
17
15
  * @memberOf module:decorator-validation
18
16
  */
@@ -22,9 +20,10 @@ function construct(constructor, ...args) {
22
20
  return _constr(...args);
23
21
  }
24
22
  /**
25
- * @summary Recursively finds the last prototype before Object
26
- * @param {object} obj
27
- *
23
+ * @description Recursively finds the last prototype in the chain before reaching Object.prototype.
24
+ * @summary Walks up the prototype chain to locate the most derived prototype that still precedes the base Object prototype.
25
+ * @param {object} obj The object whose prototype chain will be inspected.
26
+ * @return {object} The last prototype before Object.prototype, or the input object if its prototype is Object.prototype.
28
27
  * @function findLastProtoBeforeObject
29
28
  * @memberOf module:decorator-validation
30
29
  */
@@ -42,11 +41,27 @@ function findLastProtoBeforeObject(obj) {
42
41
  throw new Error("Could not find proper prototype");
43
42
  }
44
43
  /**
45
- * @sumary binds the {@link Model} class as a root prototype of the provided instance
46
- *
47
- * @param {unknown} obj
48
- *
44
+ * @description Binds the Model class as the root prototype of the provided instance when not already a Model.
45
+ * @summary Ensures objects created outside of the Model inheritance chain gain Model as their ultimate prototype to access model utilities.
46
+ * @param {unknown} obj The object to bind to the Model prototype chain.
47
+ * @return {void}
49
48
  * @function bindModelPrototype
49
+ * @mermaid
50
+ * sequenceDiagram
51
+ * participant Caller
52
+ * participant Fn as bindModelPrototype
53
+ * participant M as Model.prototype
54
+ * Caller->>Fn: obj
55
+ * alt obj instanceof Model
56
+ * Fn-->>Caller: return
57
+ * else obj chain ends at Object.prototype
58
+ * Fn->>Fn: setPrototypeOf(obj, M)
59
+ * Fn-->>Caller: return
60
+ * else deep prototype chain
61
+ * Fn->>Fn: walk prototypes
62
+ * Fn->>Fn: setPrototypeOf(last, M)
63
+ * Fn-->>Caller: return
64
+ * end
50
65
  * @memberOf module:decorator-validation
51
66
  */
52
67
  function bindModelPrototype(obj) {
@@ -68,4 +83,4 @@ function bindModelPrototype(obj) {
68
83
  }
69
84
  throw new Error("Could not find proper prototype to bind");
70
85
  }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLDhCQU9DO0FBU0QsOERBU0M7QUFVRCxnREFxQkM7QUF0RUQsdUNBQWdDO0FBRWhDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixXQUFnQixFQUNoQixHQUFHLElBQVc7SUFFZCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUMxQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxHQUFXO0lBQ25ELElBQUksU0FBUyxHQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMvQyxPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNyRCxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsR0FBWTtJQUM3QyxJQUFJLEdBQUcsWUFBWSxhQUFLO1FBQUUsT0FBTztJQUVqQyxTQUFTLGFBQWEsQ0FBQyxhQUFzQixFQUFFLFNBQWlCO1FBQzlELE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBUSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxPQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsYUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUNFLElBQUksS0FBSyxNQUFNLENBQUMsU0FBUztZQUN6QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQ2hELENBQUM7WUFDRCxPQUFPLGFBQWEsQ0FBQyxTQUFTLEVBQUUsYUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIEZ1bmN0aW9uIHRvIG92ZXJyaWRlIGNvbnN0cnVjdG9yc1xuICpcbiAqIEB0ZW1wbGF0ZSBNIHRoZSBtb2RlbCBpbnN0YW5jZSB0eXBlXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7YW55W119IFthcmdzXVxuICogQHJldHVybiB7TX0gdGhlIG5ldyBpbnN0YW5jZVxuICpcbiAqIEBmdW5jdGlvbiBjb25zdHJ1Y3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBjb25zdHJ1Y3RvcjogYW55LFxuICAuLi5hcmdzOiBhbnlbXVxuKTogTSB7XG4gIGNvbnN0IF9jb25zdHIgPSAoLi4uYXJnejogYW55W10pID0+IG5ldyBjb25zdHJ1Y3RvciguLi5hcmd6KTtcbiAgX2NvbnN0ci5wcm90b3R5cGUgPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBfY29uc3RyKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlY3Vyc2l2ZWx5IGZpbmRzIHRoZSBsYXN0IHByb3RvdHlwZSBiZWZvcmUgT2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRMYXN0UHJvdG9CZWZvcmVPYmplY3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0UHJvdG9CZWZvcmVPYmplY3Qob2JqOiBvYmplY3QpOiBvYmplY3Qge1xuICBsZXQgcHJvdG90eXBlOiBhbnkgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIG9iajtcbiAgd2hpbGUgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBwcm90b3R5cGU7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gcHJvdG90eXBlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHByb3BlciBwcm90b3R5cGVcIik7XG59XG5cbi8qKlxuICogQHN1bWFyeSBiaW5kcyB0aGUge0BsaW5rIE1vZGVsfSBjbGFzcyBhcyBhIHJvb3QgcHJvdG90eXBlIG9mIHRoZSBwcm92aWRlZCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqXG4gKlxuICogQGZ1bmN0aW9uIGJpbmRNb2RlbFByb3RvdHlwZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlKG9iajogdW5rbm93bikge1xuICBpZiAob2JqIGluc3RhbmNlb2YgTW9kZWwpIHJldHVybjtcblxuICBmdW5jdGlvbiBiaW5kUHJvdG90eXBlKG9ialRvT3ZlcnJpZGU6IHVua25vd24sIHByb3RvdHlwZTogb2JqZWN0KSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG9ialRvT3ZlcnJpZGUsIHByb3RvdHlwZSk7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGJpbmRQcm90b3R5cGUob2JqLCBNb2RlbC5wcm90b3R5cGUpO1xuICB9XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBjb25zdCBwcm90ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKFxuICAgICAgcHJvdCA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3QpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICByZXR1cm4gYmluZFByb3RvdHlwZShwcm90b3R5cGUsIE1vZGVsLnByb3RvdHlwZSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHByb3BlciBwcm90b3R5cGUgdG8gYmluZFwiKTtcbn1cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDhCQU9DO0FBVUQsOERBU0M7QUEwQkQsZ0RBcUJDO0FBckZELHVDQUFnQztBQUVoQzs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixTQUFTLENBQ3ZCLFdBQWdCLEVBQ2hCLEdBQUcsSUFBVztJQUVkLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQzFDLE9BQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxHQUFXO0lBQ25ELElBQUksU0FBUyxHQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMvQyxPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNyRCxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFZO0lBQzdDLElBQUksR0FBRyxZQUFZLGFBQUs7UUFBRSxPQUFPO0lBRWpDLFNBQVMsYUFBYSxDQUFDLGFBQXNCLEVBQUUsU0FBaUI7UUFDOUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25DLE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxhQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQ0UsSUFBSSxLQUFLLE1BQU0sQ0FBQyxTQUFTO1lBQ3pCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFDaEQsQ0FBQztZQUNELE9BQU8sYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBieSBpbnZva2luZyBhIGNvbnN0cnVjdG9yIHdpdGggZHluYW1pYyBhcmd1bWVudHMuXG4gKiBAc3VtbWFyeSBPdmVycmlkZXMgc3RhbmRhcmQgY29uc3RydWN0aW9uIHBhdHRlcm5zIGJ5IHdyYXBwaW5nIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciB0byBhbGxvdyBzcHJlYWQgYXJndW1lbnQgaW52b2NhdGlvbiB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gKiBAdGVtcGxhdGUgTSB0aGUgbW9kZWwgaW5zdGFuY2UgdHlwZVxuICogQHBhcmFtIHthbnl9IGNvbnN0cnVjdG9yIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm4ge019IFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBpbnN0YW5jZS5cbiAqIEBmdW5jdGlvbiBjb25zdHJ1Y3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdDxNIGV4dGVuZHMgTW9kZWw+KFxuICBjb25zdHJ1Y3RvcjogYW55LFxuICAuLi5hcmdzOiBhbnlbXVxuKTogTSB7XG4gIGNvbnN0IF9jb25zdHIgPSAoLi4uYXJnejogYW55W10pID0+IG5ldyBjb25zdHJ1Y3RvciguLi5hcmd6KTtcbiAgX2NvbnN0ci5wcm90b3R5cGUgPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBfY29uc3RyKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBmaW5kcyB0aGUgbGFzdCBwcm90b3R5cGUgaW4gdGhlIGNoYWluIGJlZm9yZSByZWFjaGluZyBPYmplY3QucHJvdG90eXBlLlxuICogQHN1bW1hcnkgV2Fsa3MgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBsb2NhdGUgdGhlIG1vc3QgZGVyaXZlZCBwcm90b3R5cGUgdGhhdCBzdGlsbCBwcmVjZWRlcyB0aGUgYmFzZSBPYmplY3QgcHJvdG90eXBlLlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdob3NlIHByb3RvdHlwZSBjaGFpbiB3aWxsIGJlIGluc3BlY3RlZC5cbiAqIEByZXR1cm4ge29iamVjdH0gVGhlIGxhc3QgcHJvdG90eXBlIGJlZm9yZSBPYmplY3QucHJvdG90eXBlLCBvciB0aGUgaW5wdXQgb2JqZWN0IGlmIGl0cyBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZS5cbiAqIEBmdW5jdGlvbiBmaW5kTGFzdFByb3RvQmVmb3JlT2JqZWN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdFByb3RvQmVmb3JlT2JqZWN0KG9iajogb2JqZWN0KTogb2JqZWN0IHtcbiAgbGV0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBvYmo7XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gcHJvdG90eXBlO1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBwcm9wZXIgcHJvdG90eXBlXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCaW5kcyB0aGUgTW9kZWwgY2xhc3MgYXMgdGhlIHJvb3QgcHJvdG90eXBlIG9mIHRoZSBwcm92aWRlZCBpbnN0YW5jZSB3aGVuIG5vdCBhbHJlYWR5IGEgTW9kZWwuXG4gKiBAc3VtbWFyeSBFbnN1cmVzIG9iamVjdHMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBNb2RlbCBpbmhlcml0YW5jZSBjaGFpbiBnYWluIE1vZGVsIGFzIHRoZWlyIHVsdGltYXRlIHByb3RvdHlwZSB0byBhY2Nlc3MgbW9kZWwgdXRpbGl0aWVzLlxuICogQHBhcmFtIHt1bmtub3dufSBvYmogVGhlIG9iamVjdCB0byBiaW5kIHRvIHRoZSBNb2RlbCBwcm90b3R5cGUgY2hhaW4uXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIGJpbmRNb2RlbFByb3RvdHlwZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRm4gYXMgYmluZE1vZGVsUHJvdG90eXBlXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWwucHJvdG90eXBlXG4gKiAgIENhbGxlci0+PkZuOiBvYmpcbiAqICAgYWx0IG9iaiBpbnN0YW5jZW9mIE1vZGVsXG4gKiAgICAgRm4tLT4+Q2FsbGVyOiByZXR1cm5cbiAqICAgZWxzZSBvYmogY2hhaW4gZW5kcyBhdCBPYmplY3QucHJvdG90eXBlXG4gKiAgICAgRm4tPj5Gbjogc2V0UHJvdG90eXBlT2Yob2JqLCBNKVxuICogICAgIEZuLS0+PkNhbGxlcjogcmV0dXJuXG4gKiAgIGVsc2UgZGVlcCBwcm90b3R5cGUgY2hhaW5cbiAqICAgICBGbi0+PkZuOiB3YWxrIHByb3RvdHlwZXNcbiAqICAgICBGbi0+PkZuOiBzZXRQcm90b3R5cGVPZihsYXN0LCBNKVxuICogICAgIEZuLS0+PkNhbGxlcjogcmV0dXJuXG4gKiAgIGVuZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlKG9iajogdW5rbm93bikge1xuICBpZiAob2JqIGluc3RhbmNlb2YgTW9kZWwpIHJldHVybjtcblxuICBmdW5jdGlvbiBiaW5kUHJvdG90eXBlKG9ialRvT3ZlcnJpZGU6IHVua25vd24sIHByb3RvdHlwZTogb2JqZWN0KSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG9ialRvT3ZlcnJpZGUsIHByb3RvdHlwZSk7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGJpbmRQcm90b3R5cGUob2JqLCBNb2RlbC5wcm90b3R5cGUpO1xuICB9XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBjb25zdCBwcm90ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKFxuICAgICAgcHJvdCA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3QpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICByZXR1cm4gYmluZFByb3RvdHlwZShwcm90b3R5cGUsIE1vZGVsLnByb3RvdHlwZSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHByb3BlciBwcm90b3R5cGUgdG8gYmluZFwiKTtcbn1cbiJdfQ==