ngx-kel-agent 0.4.4 → 0.4.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,29 +4,3 @@ This is a client library for Angular applications to integrate with
4
4
  [`kel-agent`](https://github.com/k0swe/kel-agent). It provides an Angular service that creates and
5
5
  manages the websocket connection, and exposes incoming messages as `Observable`s and outgoing
6
6
  messages as method calls.
7
-
8
- ## Code scaffolding
9
-
10
- Run `ng generate component component-name --project ngx-kel-agent` to generate a new component. You
11
- can also
12
- use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-kel-agent`.
13
- > Note: Don't forget to add `--project ngx-kel-agent` or else it will be added to the default project in your `angular.json` file.
14
-
15
- ## Build
16
-
17
- Run `ng build ngx-kel-agent` to build the project. The build artifacts will be stored in the `dist/`
18
- directory.
19
-
20
- ## Publishing
21
-
22
- After building your library with `ng build ngx-kel-agent`, go to the dist
23
- folder `cd dist/ngx-kel-agent` and run `npm publish`.
24
-
25
- ## Running unit tests
26
-
27
- Run `ng test ngx-kel-agent` to execute the unit tests via [Karma](https://karma-runner.github.io).
28
-
29
- ## Further help
30
-
31
- To get more help on the Angular CLI use `ng help` or go check out
32
- the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -229,6 +229,36 @@ export class AgentService {
229
229
  };
230
230
  this.agentWebSocketSubject?.next(wsMsg);
231
231
  }
232
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
233
+ sendWsjtxReply(decode) {
234
+ const wsMsg = {
235
+ wsjtx: {
236
+ type: 'ReplyMessage',
237
+ payload: {
238
+ id: decode.id,
239
+ time: decode.time,
240
+ snr: decode.snr,
241
+ deltaTime: decode.deltaTime,
242
+ deltaFrequency: decode.deltaFrequency,
243
+ mode: decode.mode,
244
+ message: decode.message,
245
+ lowConfidence: decode.lowConfidence,
246
+ },
247
+ },
248
+ };
249
+ this.agentWebSocketSubject?.next(wsMsg);
250
+ }
251
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
252
+ sendWsjtxHighlightCallsign(highlightMsg) {
253
+ highlightMsg.id = this.wsjtxId;
254
+ const wsMsg = {
255
+ wsjtx: {
256
+ type: 'HighlightCallsignMessage',
257
+ payload: highlightMsg,
258
+ },
259
+ };
260
+ this.agentWebSocketSubject?.next(wsMsg);
261
+ }
232
262
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
233
263
  * Activity/Rx Frequency windows. */
234
264
  static formatDecode(msg) {
@@ -253,4 +283,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
253
283
  providedIn: 'root'
254
284
  }]
255
285
  }], ctorParameters: function () { return []; } });
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi9hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxHQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFDLFNBQVMsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFrQjNELE1BQU0sT0FBTyxZQUFZO0lBMkN2QjtRQTFDQSw0Q0FBNEM7UUFDNUIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV0RSxjQUFjO1FBQ2Qsc0RBQXNEO1FBQ3RDLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEUsNERBQTREO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxhQUFhLENBQXdCLENBQUMsQ0FBQyxDQUFDO1FBQzlFLHlEQUF5RDtRQUN6QyxpQkFBWSxHQUFHLElBQUksYUFBYSxDQUFxQixDQUFDLENBQUMsQ0FBQztRQUN4RSx5REFBeUQ7UUFDekMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzFELHdEQUF3RDtRQUN4QyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7UUFDeEQsNERBQTREO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDaEUsd0RBQXdEO1FBQ3hDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUN4RCw2REFBNkQ7UUFDN0MscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQW1C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SyxHQUFHLElBQUksQ0FBQztRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLGdCQUFnQixHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPO2FBQzNELFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUU1RCxPQUFPLEdBQUcsT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTO2FBQ2pFLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDVixRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQ3pELEdBQUcsQ0FBQyxPQUNOLEVBQUUsQ0FBQztJQUNMLENBQUM7O3lHQWhSVSxZQUFZOzZHQUFaLFlBQVksY0FGWCxNQUFNOzJGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRlbGF5LCByZXRyeVdoZW4sIHRhcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge3dlYlNvY2tldCwgV2ViU29ja2V0U3ViamVjdH0gZnJvbSBcInJ4anMvd2ViU29ja2V0XCI7XG5pbXBvcnQge1xuICBIYW1saWJSaWdTdGF0ZSxcbiAgV3NqdHhDbGVhcixcbiAgV3NqdHhDbG9zZSxcbiAgV3NqdHhEZWNvZGUsXG4gIFdzanR4SGFsdFR4LFxuICBXc2p0eEhlYXJ0YmVhdCxcbiAgV3NqdHhMb2dnZWRBZGlmLFxuICBXc2p0eFFzb0xvZ2dlZCxcbiAgV3NqdHhSZXBsYXksXG4gIFdzanR4U3RhdHVzLFxuICBXc2p0eFdzcHJEZWNvZGVcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQWdlbnRTZXJ2aWNlIHtcbiAgLyoqIFdoZXRoZXIgd2UncmUgY29ubmVjdGVkIHRvIHRoZSBhZ2VudC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RlZFN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qICBXU0pULVggICovXG4gIC8qKiBXaGV0aGVyIHdlJ3JlIGdldHRpbmcgYW55IG1lc3NhZ2VzIGZyb20gV1NKVC1YLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJIZWFydGJlYXRcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4SGVhcnRiZWF0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFdzanR4SGVhcnRiZWF0IHwgbnVsbD4oMSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiU3RhdHVzXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eFN0YXR1cyQgPSBuZXcgUmVwbGF5U3ViamVjdDxXc2p0eFN0YXR1cyB8IG51bGw+KDEpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkRlY29kZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhEZWNvZGUkID0gbmV3IFN1YmplY3Q8V3NqdHhEZWNvZGU+KCk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiQ2xlYXJcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4Q2xlYXIkID0gbmV3IFN1YmplY3Q8V3NqdHhDbGVhcj4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJRc29Mb2dnZWRcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4UXNvTG9nZ2VkJCA9IG5ldyBTdWJqZWN0PFdzanR4UXNvTG9nZ2VkPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkNsb3NlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eENsb3NlJCA9IG5ldyBTdWJqZWN0PFdzanR4Q2xvc2U+KCk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiV3NwckRlY29kZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhXc3ByRGVjb2RlJCA9IG5ldyBTdWJqZWN0PFdzanR4V3NwckRlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJMb2dnZWRBZGlmXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eExvZ2dlZEFkaWYkID0gbmV3IFN1YmplY3Q8V3NqdHhMb2dnZWRBZGlmPigpO1xuXG4gIC8qICBIYW1saWIgICovXG4gIC8qKiBXaGV0aGVyIHdlJ3JlIGdldHRpbmcgYW55IG1lc3NhZ2VzIGZyb20gSGFtbGliLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFtbGliU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gSGFtbGliIFwiUmlnU3RhdGVcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbWxpYlJpZ1N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SGFtbGliUmlnU3RhdGUgfCBudWxsPihcbiAgICBudWxsXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QWdlbnRIb3N0ID0gJ2xvY2FsaG9zdCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEFnZW50UG9ydCA9IDgwODE7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxTdG9yYWdlSG9zdEtleSA9ICdhZ2VudC1ob3N0JztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFN0b3JhZ2VQb3J0S2V5ID0gJ2FnZW50LXBvcnQnO1xuXG4gIHByaXZhdGUgYWdlbnRIb3N0OiBzdHJpbmcgPSB0aGlzLmRlZmF1bHRBZ2VudEhvc3Q7XG4gIHByaXZhdGUgYWdlbnRQb3J0OiBudW1iZXIgPSB0aGlzLmRlZmF1bHRBZ2VudFBvcnQ7XG4gIHByaXZhdGUgYWdlbnRXZWJTb2NrZXRTdWJqZWN0OiBXZWJTb2NrZXRTdWJqZWN0PG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhZ2VudFdlYnNvY2tldFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd3NqdHhJZDogc3RyaW5nID0gJ1dTSlQtWCc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFnZW50SG9zdCA9IHRoaXMuZ2V0SG9zdCgpO1xuICAgIHRoaXMuYWdlbnRQb3J0ID0gdGhpcy5nZXRQb3J0KCk7XG4gICAgdGhpcy5zZXR1cFdzanR4QmVoYXZpb3JzKCk7XG4gICAgdGhpcy5zZXR1cEhhbWxpYkJlaGF2aW9ycygpO1xuICAgIHRoaXMuY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFdzanR4QmVoYXZpb3JzKCk6IHZvaWQge1xuICAgIC8vIGlmIHdlIGhhdmVuJ3QgaGVhcmQgZnJvbSBXU0pULVggaW4gMTUgc2Vjb25kcywgY29uc2lkZXIgaXQgXCJkb3duXCJcbiAgICB0aGlzLndzanR4U3RhdGUkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTUwMDApKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLndzanR4U3RhdGUkLm5leHQoZmFsc2UpKTtcbiAgICAvLyBXaGVuIFdTSlQtWCBhbm5vdW5jZXMgaXQncyBjbG9zaW5nLCBzZXQgaXQgdG8gXCJkb3duXCIgaW1tZWRpYXRlbHlcbiAgICB0aGlzLndzanR4Q2xvc2UkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLndzanR4U3RhdGUkLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICAgIC8vIFdoZW4gV1NKVC1YIGdvZXMgZG93biwgY2xlYXIgaXRzIHBlcnNpc3RlbnQgbWVzc2FnZSBzdWJqZWN0c1xuICAgIHRoaXMud3NqdHhTdGF0ZSQuc3Vic2NyaWJlKChpc1VwKSA9PiB7XG4gICAgICBpZiAoIWlzVXApIHtcbiAgICAgICAgdGhpcy53c2p0eEhlYXJ0YmVhdCQubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy53c2p0eFN0YXR1cyQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBIYW1saWJCZWhhdmlvcnMoKTogdm9pZCB7XG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBoZWFyZCBmcm9tIEhhbWxpYiBpbiAxNSBzZWNvbmRzLCBjb25zaWRlciBpdCBkb3duXG4gICAgdGhpcy5oYW1saWJTdGF0ZSQucGlwZShkZWJvdW5jZVRpbWUoMTUwMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5oYW1saWJTdGF0ZSQubmV4dChmYWxzZSk7XG4gICAgfSk7XG4gICAgLy8gV2hlbiBIYW1saWIgZ29lcyBkb3duLCBjbGVhciBpdHMgcGVyc2lzdGVudCBtZXNzYWdlIHN1YmplY3RzXG4gICAgdGhpcy5oYW1saWJTdGF0ZSQuc3Vic2NyaWJlKChpc1VwKSA9PiB7XG4gICAgICBpZiAoIWlzVXApIHtcbiAgICAgICAgdGhpcy5oYW1saWJSaWdTdGF0ZSQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25uZWN0IChvciByZWNvbm5lY3QpIHRoZSB3ZWJzb2NrZXQgdG8gdGhlIGtlbC1hZ2VudCBzZXJ2ZXIuICovXG4gIHB1YmxpYyBjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFnZW50V2Vic29ja2V0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmFnZW50V2Vic29ja2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuYWdlbnRIb3N0ID0gdGhpcy5nZXRIb3N0KCk7XG4gICAgdGhpcy5hZ2VudFBvcnQgPSB0aGlzLmdldFBvcnQoKTtcbiAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMuYWdlbnRIb3N0ID09PSAnbG9jYWxob3N0JyA/ICd3czovLycgOiAnd3NzOi8vJztcbiAgICB0aGlzLmFnZW50V2ViU29ja2V0U3ViamVjdCA9IHdlYlNvY2tldDxvYmplY3Q+KHtcbiAgICAgIHVybDogcHJvdG9jb2wgKyB0aGlzLmFnZW50SG9zdCArICc6JyArIHRoaXMuYWdlbnRQb3J0ICsgJy93ZWJzb2NrZXQnLFxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGVkU3RhdGUkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5hZ2VudFdlYnNvY2tldFN1YnNjcmlwdGlvbiA9IHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgcmV0cnlXaGVuKChlcnJvcnMpID0+XG4gICAgICAgICAgLy8gcmV0cnkgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uIGFmdGVyIDEwIHNlY29uZHNcbiAgICAgICAgICBlcnJvcnMucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmNvbm5lY3RlZFN0YXRlJC5uZXh0KGZhbHNlKSksXG4gICAgICAgICAgICBkZWxheSgxMDAwMClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAobXNnKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZU1lc3NhZ2UobXNnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMuY29ubmVjdGVkU3RhdGUkLm5leHQoZmFsc2UpLFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4gdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dChmYWxzZSksXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWVzc2FnZShtc2c6IGFueSk6IHZvaWQge1xuICAgIGlmIChtc2cud3NqdHggIT0gbnVsbCAmJiBtc2cud3NqdHgudHlwZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLndzanR4U3RhdGUkLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLndzanR4SWQgPSBtc2cud3NqdHgucGF5bG9hZC5pZDtcbiAgICAgIHN3aXRjaCAobXNnLndzanR4LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnSGVhcnRiZWF0TWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eEhlYXJ0YmVhdCQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eEhlYXJ0YmVhdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdTdGF0dXNNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4U3RhdHVzJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4U3RhdHVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0RlY29kZU1lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhEZWNvZGUkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhEZWNvZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnQ2xlYXJNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4Q2xlYXIkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhDbGVhcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdRc29Mb2dnZWRNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4UXNvTG9nZ2VkJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4UXNvTG9nZ2VkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0Nsb3NlTWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eENsb3NlJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4Q2xvc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnV1NQUkRlY29kZU1lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhXc3ByRGVjb2RlJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4V3NwckRlY29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdMb2dnZWRBZGlmTWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eExvZ2dlZEFkaWYkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhMb2dnZWRBZGlmKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtc2cuaGFtbGliICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmhhbWxpYlN0YXRlJC5uZXh0KHRydWUpO1xuICAgICAgc3dpdGNoIChtc2cuaGFtbGliLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnUmlnU3RhdGUnOlxuICAgICAgICAgIHRoaXMuaGFtbGliUmlnU3RhdGUkLm5leHQobXNnLmhhbWxpYi5wYXlsb2FkIGFzIEhhbWxpYlJpZ1N0YXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQga2VsLWFnZW50IGhvc3QuICovXG4gIHB1YmxpYyBnZXRIb3N0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSG9zdEtleSkgfHwgdGhpcy5kZWZhdWx0QWdlbnRIb3N0O1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQga2VsLWFnZW50IHBvcnQuICovXG4gIHB1YmxpYyBnZXRQb3J0KCk6IG51bWJlciB7XG4gICAgbGV0IHBvcnRTdHIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZVBvcnRLZXkpO1xuICAgIGlmIChwb3J0U3RyID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRBZ2VudFBvcnQ7XG4gICAgfVxuICAgIGxldCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydFN0ciwgMTApO1xuICAgIGlmIChpc05hTihwb3J0TnVtKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEFnZW50UG9ydDtcbiAgICB9XG4gICAgcmV0dXJuIHBvcnROdW07XG4gIH1cblxuICAvKiogU2V0IHRoZSBrZWwtYWdlbnQgaG9zdC4gKi9cbiAgcHVibGljIHNldEhvc3QoaG9zdDogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIb3N0S2V5LCBob3N0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGtlbC1hZ2VudCBwb3J0LiAqL1xuICBwdWJsaWMgc2V0UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZVBvcnRLZXksIFN0cmluZyhwb3J0KSk7XG4gICAgdGhpcy5jb25uZWN0KCk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBCYW5kIEFjdGl2aXR5IHdpbmRvdy4gKi9cbiAgcHVibGljIHNlbmRXc2p0eENsZWFyQmFuZEFjdGl2aXR5KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0NsZWFyTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eENsZWFyPntpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIFJ4IEZyZXF1ZW5jeSB3aW5kb3cuICovXG4gIHB1YmxpYyBzZW5kV3NqdHhDbGVhclJ4RnJlcVdpbmRvdygpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdDbGVhck1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhDbGVhcj57aWQ6IHRoaXMud3NqdHhJZCwgd2luZG93OiAxfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmFnZW50V2ViU29ja2V0U3ViamVjdD8ubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBCYW5kIEFjdGl2aXR5IGFuZCBSeCBGcmVxdWVuY3kgd2luZG93cy4gKi9cbiAgcHVibGljIHNlbmRXc2p0eENsZWFyQWxsKCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0NsZWFyTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eENsZWFyPntpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDJ9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbGF5IG1lc3NhZ2VzLiBVc2VmdWwgZm9yIGEgZnJlc2ggY2xpZW50IHRoYXQgd2FudHMgdG8gaGVhclxuICAgKiBwcmV2aW91cyBXU0pULVggZGVjb2Rlcy4gKi9cbiAgcHVibGljIHNlbmRXc2p0eFJlcGxheSgpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4UmVwbGF5PntpZDogdGhpcy53c2p0eElkfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmFnZW50V2ViU29ja2V0U3ViamVjdD8ubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGhhbHQgYW55IHRyYW5zbWlzc2lvbnMgaW1tZWRpYXRlbHkuICovXG4gIHB1YmxpYyBzZW5kV3NqdHhIYWx0VHhOb3coKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnSGFsdFR4TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eEhhbHRUeD57aWQ6IHRoaXMud3NqdHhJZCwgYXV0b1R4T25seTogZmFsc2V9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gc3RvcCBhdXRvLXRyYW5zbWl0dGluZyBhZnRlciBmaW5pc2hpbmcgdGhlIGN1cnJlbnQgcm91bmQuICovXG4gIHB1YmxpYyBzZW5kV3NqdHhIYWx0VHhBZnRlckN1cnJlbnQoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnSGFsdFR4TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eEhhbHRUeD57aWQ6IHRoaXMud3NqdHhJZCwgYXV0b1R4T25seTogdHJ1ZX0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIEdpdmVuIGEgZGVjb2RlIG1lc3NhZ2UsIGZvcm1hdCBhIHN0cmluZyB0aGUgc2FtZSB3YXkgYXMgZGlzcGxheWVkIGluIHRoZSBXU0pULVggQmFuZFxuICAgKiBBY3Rpdml0eS9SeCBGcmVxdWVuY3kgd2luZG93cy4gKi9cbiAgcHVibGljIHN0YXRpYyBmb3JtYXREZWNvZGUobXNnOiBXc2p0eERlY29kZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlTWlkbmlnaHQgPSBNYXRoLmZsb29yKG1zZy50aW1lIC8gMTAwMCk7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHNlY29uZHNTaW5jZU1pZG5pZ2h0IC8gMzYwMCk7XG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlSG91ciA9IHNlY29uZHNTaW5jZU1pZG5pZ2h0IC0gaG91cnMgKiAzNjAwO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHNTaW5jZUhvdXIgLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IHNlY29uZHNTaW5jZUhvdXIgLSBtaW51dGVzICogNjA7XG4gICAgY29uc3QgdGltZVN0ciA9IGAke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0ke21pbnV0ZXNcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKX0ke3NlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG5cbiAgICByZXR1cm4gYCR7dGltZVN0cn0gJHttc2cuc25yLnRvU3RyaW5nKCkucGFkU3RhcnQoMyl9ICR7bXNnLmRlbHRhVGltZVxuICAgICAgLnRvRml4ZWQoMSlcbiAgICAgIC5wYWRTdGFydCg0KX0gJHttc2cuZGVsdGFGcmVxdWVuY3kudG9TdHJpbmcoKS5wYWRTdGFydCg0KX0gfiAgJHtcbiAgICAgIG1zZy5tZXNzYWdlXG4gICAgfWA7XG4gIH1cbn1cbiJdfQ==
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi9hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxHQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFDLFNBQVMsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFvQjNELE1BQU0sT0FBTyxZQUFZO0lBMkN2QjtRQTFDQSw0Q0FBNEM7UUFDNUIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV0RSxjQUFjO1FBQ2Qsc0RBQXNEO1FBQ3RDLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEUsNERBQTREO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxhQUFhLENBQXdCLENBQUMsQ0FBQyxDQUFDO1FBQzlFLHlEQUF5RDtRQUN6QyxpQkFBWSxHQUFHLElBQUksYUFBYSxDQUFxQixDQUFDLENBQUMsQ0FBQztRQUN4RSx5REFBeUQ7UUFDekMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzFELHdEQUF3RDtRQUN4QyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7UUFDeEQsNERBQTREO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDaEUsd0RBQXdEO1FBQ3hDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUN4RCw2REFBNkQ7UUFDN0MscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQW1C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QUcsQ0FBQyxHQUFHLE9BQU87YUFDM0QsUUFBUSxFQUFFO2FBQ1YsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRTVELE9BQU8sR0FBRyxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLFNBQVM7YUFDakUsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNWLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FDekQsR0FBRyxDQUFDLE9BQ04sRUFBRSxDQUFDO0lBQ0wsQ0FBQzs7eUdBaFRVLFlBQVk7NkdBQVosWUFBWSxjQUZYLE1BQU07MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbix9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGVsYXksIHJldHJ5V2hlbiwgdGFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7d2ViU29ja2V0LCBXZWJTb2NrZXRTdWJqZWN0fSBmcm9tIFwicnhqcy93ZWJTb2NrZXRcIjtcbmltcG9ydCB7XG4gIEhhbWxpYlJpZ1N0YXRlLFxuICBXc2p0eENsZWFyLFxuICBXc2p0eENsb3NlLFxuICBXc2p0eERlY29kZSxcbiAgV3NqdHhIYWx0VHgsXG4gIFdzanR4SGVhcnRiZWF0LFxuICBXc2p0eEhpZ2hsaWdodENhbGxzaWduLFxuICBXc2p0eExvZ2dlZEFkaWYsXG4gIFdzanR4UXNvTG9nZ2VkLFxuICBXc2p0eFJlcGxheSxcbiAgV3NqdHhSZXBseSxcbiAgV3NqdHhTdGF0dXMsXG4gIFdzanR4V3NwckRlY29kZVxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBZ2VudFNlcnZpY2Uge1xuICAvKiogV2hldGhlciB3ZSdyZSBjb25uZWN0ZWQgdG8gdGhlIGFnZW50LiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGVkU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyogIFdTSlQtWCAgKi9cbiAgLyoqIFdoZXRoZXIgd2UncmUgZ2V0dGluZyBhbnkgbWVzc2FnZXMgZnJvbSBXU0pULVguICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eFN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkhlYXJ0YmVhdFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhIZWFydGJlYXQkID0gbmV3IFJlcGxheVN1YmplY3Q8V3NqdHhIZWFydGJlYXQgfCBudWxsPigxKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJTdGF0dXNcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4U3RhdHVzJCA9IG5ldyBSZXBsYXlTdWJqZWN0PFdzanR4U3RhdHVzIHwgbnVsbD4oMSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiRGVjb2RlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eERlY29kZSQgPSBuZXcgU3ViamVjdDxXc2p0eERlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJDbGVhclwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhDbGVhciQgPSBuZXcgU3ViamVjdDxXc2p0eENsZWFyPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIlFzb0xvZ2dlZFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhRc29Mb2dnZWQkID0gbmV3IFN1YmplY3Q8V3NqdHhRc29Mb2dnZWQ+KCk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiQ2xvc2VcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4Q2xvc2UkID0gbmV3IFN1YmplY3Q8V3NqdHhDbG9zZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJXc3ByRGVjb2RlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eFdzcHJEZWNvZGUkID0gbmV3IFN1YmplY3Q8V3NqdHhXc3ByRGVjb2RlPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkxvZ2dlZEFkaWZcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4TG9nZ2VkQWRpZiQgPSBuZXcgU3ViamVjdDxXc2p0eExvZ2dlZEFkaWY+KCk7XG5cbiAgLyogIEhhbWxpYiAgKi9cbiAgLyoqIFdoZXRoZXIgd2UncmUgZ2V0dGluZyBhbnkgbWVzc2FnZXMgZnJvbSBIYW1saWIuICovXG4gIHB1YmxpYyByZWFkb25seSBoYW1saWJTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBIYW1saWIgXCJSaWdTdGF0ZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFtbGliUmlnU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxIYW1saWJSaWdTdGF0ZSB8IG51bGw+KFxuICAgIG51bGxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBZ2VudEhvc3QgPSAnbG9jYWxob3N0JztcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QWdlbnRQb3J0ID0gODA4MTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFN0b3JhZ2VIb3N0S2V5ID0gJ2FnZW50LWhvc3QnO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU3RvcmFnZVBvcnRLZXkgPSAnYWdlbnQtcG9ydCc7XG5cbiAgcHJpdmF0ZSBhZ2VudEhvc3Q6IHN0cmluZyA9IHRoaXMuZGVmYXVsdEFnZW50SG9zdDtcbiAgcHJpdmF0ZSBhZ2VudFBvcnQ6IG51bWJlciA9IHRoaXMuZGVmYXVsdEFnZW50UG9ydDtcbiAgcHJpdmF0ZSBhZ2VudFdlYlNvY2tldFN1YmplY3Q6IFdlYlNvY2tldFN1YmplY3Q8b2JqZWN0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFnZW50V2Vic29ja2V0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3c2p0eElkOiBzdHJpbmcgPSAnV1NKVC1YJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWdlbnRIb3N0ID0gdGhpcy5nZXRIb3N0KCk7XG4gICAgdGhpcy5hZ2VudFBvcnQgPSB0aGlzLmdldFBvcnQoKTtcbiAgICB0aGlzLnNldHVwV3NqdHhCZWhhdmlvcnMoKTtcbiAgICB0aGlzLnNldHVwSGFtbGliQmVoYXZpb3JzKCk7XG4gICAgdGhpcy5jb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwV3NqdHhCZWhhdmlvcnMoKTogdm9pZCB7XG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBoZWFyZCBmcm9tIFdTSlQtWCBpbiAxNSBzZWNvbmRzLCBjb25zaWRlciBpdCBcImRvd25cIlxuICAgIHRoaXMud3NqdHhTdGF0ZSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNTAwMCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMud3NqdHhTdGF0ZSQubmV4dChmYWxzZSkpO1xuICAgIC8vIFdoZW4gV1NKVC1YIGFubm91bmNlcyBpdCdzIGNsb3NpbmcsIHNldCBpdCB0byBcImRvd25cIiBpbW1lZGlhdGVseVxuICAgIHRoaXMud3NqdHhDbG9zZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMud3NqdHhTdGF0ZSQubmV4dChmYWxzZSk7XG4gICAgfSk7XG4gICAgLy8gV2hlbiBXU0pULVggZ29lcyBkb3duLCBjbGVhciBpdHMgcGVyc2lzdGVudCBtZXNzYWdlIHN1YmplY3RzXG4gICAgdGhpcy53c2p0eFN0YXRlJC5zdWJzY3JpYmUoKGlzVXApID0+IHtcbiAgICAgIGlmICghaXNVcCkge1xuICAgICAgICB0aGlzLndzanR4SGVhcnRiZWF0JC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLndzanR4U3RhdHVzJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEhhbWxpYkJlaGF2aW9ycygpOiB2b2lkIHtcbiAgICAvLyBpZiB3ZSBoYXZlbid0IGhlYXJkIGZyb20gSGFtbGliIGluIDE1IHNlY29uZHMsIGNvbnNpZGVyIGl0IGRvd25cbiAgICB0aGlzLmhhbWxpYlN0YXRlJC5waXBlKGRlYm91bmNlVGltZSgxNTAwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmhhbWxpYlN0YXRlJC5uZXh0KGZhbHNlKTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIEhhbWxpYiBnb2VzIGRvd24sIGNsZWFyIGl0cyBwZXJzaXN0ZW50IG1lc3NhZ2Ugc3ViamVjdHNcbiAgICB0aGlzLmhhbWxpYlN0YXRlJC5zdWJzY3JpYmUoKGlzVXApID0+IHtcbiAgICAgIGlmICghaXNVcCkge1xuICAgICAgICB0aGlzLmhhbWxpYlJpZ1N0YXRlJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbm5lY3QgKG9yIHJlY29ubmVjdCkgdGhlIHdlYnNvY2tldCB0byB0aGUga2VsLWFnZW50IHNlcnZlci4gKi9cbiAgcHVibGljIGNvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWdlbnRXZWJzb2NrZXRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYWdlbnRXZWJzb2NrZXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5hZ2VudEhvc3QgPSB0aGlzLmdldEhvc3QoKTtcbiAgICB0aGlzLmFnZW50UG9ydCA9IHRoaXMuZ2V0UG9ydCgpO1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5hZ2VudEhvc3QgPT09ICdsb2NhbGhvc3QnID8gJ3dzOi8vJyA6ICd3c3M6Ly8nO1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0ID0gd2ViU29ja2V0PG9iamVjdD4oe1xuICAgICAgdXJsOiBwcm90b2NvbCArIHRoaXMuYWdlbnRIb3N0ICsgJzonICsgdGhpcy5hZ2VudFBvcnQgKyAnL3dlYnNvY2tldCcsXG4gICAgfSk7XG4gICAgdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmFnZW50V2Vic29ja2V0U3Vic2NyaXB0aW9uID0gdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICByZXRyeVdoZW4oKGVycm9ycykgPT5cbiAgICAgICAgICAvLyByZXRyeSB0aGUgd2Vic29ja2V0IGNvbm5lY3Rpb24gYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgICAgIGVycm9ycy5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuY29ubmVjdGVkU3RhdGUkLm5leHQoZmFsc2UpKSxcbiAgICAgICAgICAgIGRlbGF5KDEwMDAwKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChtc2cpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3RlZFN0YXRlJC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZShtc2cpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dChmYWxzZSksXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB0aGlzLmNvbm5lY3RlZFN0YXRlJC5uZXh0KGZhbHNlKSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKG1zZzogYW55KTogdm9pZCB7XG4gICAgaWYgKG1zZy53c2p0eCAhPSBudWxsICYmIG1zZy53c2p0eC50eXBlICE9IG51bGwpIHtcbiAgICAgIHRoaXMud3NqdHhTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMud3NqdHhJZCA9IG1zZy53c2p0eC5wYXlsb2FkLmlkO1xuICAgICAgc3dpdGNoIChtc2cud3NqdHgudHlwZSkge1xuICAgICAgICBjYXNlICdIZWFydGJlYXRNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4SGVhcnRiZWF0JC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4SGVhcnRiZWF0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ1N0YXR1c01lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhTdGF0dXMkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhTdGF0dXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eERlY29kZSQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eERlY29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdDbGVhck1lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhDbGVhciQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eENsZWFyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ1Fzb0xvZ2dlZE1lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhRc29Mb2dnZWQkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhRc29Mb2dnZWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnQ2xvc2VNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4Q2xvc2UkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhDbG9zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdXU1BSRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eFdzcHJEZWNvZGUkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhXc3ByRGVjb2RlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0xvZ2dlZEFkaWZNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4TG9nZ2VkQWRpZiQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eExvZ2dlZEFkaWYpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1zZy5oYW1saWIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGFtbGliU3RhdGUkLm5leHQodHJ1ZSk7XG4gICAgICBzd2l0Y2ggKG1zZy5oYW1saWIudHlwZSkge1xuICAgICAgICBjYXNlICdSaWdTdGF0ZSc6XG4gICAgICAgICAgdGhpcy5oYW1saWJSaWdTdGF0ZSQubmV4dChtc2cuaGFtbGliLnBheWxvYWQgYXMgSGFtbGliUmlnU3RhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBrZWwtYWdlbnQgaG9zdC4gKi9cbiAgcHVibGljIGdldEhvc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIb3N0S2V5KSB8fCB0aGlzLmRlZmF1bHRBZ2VudEhvc3Q7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBrZWwtYWdlbnQgcG9ydC4gKi9cbiAgcHVibGljIGdldFBvcnQoKTogbnVtYmVyIHtcbiAgICBsZXQgcG9ydFN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlUG9ydEtleSk7XG4gICAgaWYgKHBvcnRTdHIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEFnZW50UG9ydDtcbiAgICB9XG4gICAgbGV0IHBvcnROdW0gPSBwYXJzZUludChwb3J0U3RyLCAxMCk7XG4gICAgaWYgKGlzTmFOKHBvcnROdW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QWdlbnRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gcG9ydE51bTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGtlbC1hZ2VudCBob3N0LiAqL1xuICBwdWJsaWMgc2V0SG9zdChob3N0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUhvc3RLZXksIGhvc3QpO1xuICAgIHRoaXMuY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUga2VsLWFnZW50IHBvcnQuICovXG4gIHB1YmxpYyBzZXRQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlUG9ydEtleSwgU3RyaW5nKHBvcnQpKTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgd2luZG93LiAqL1xuICBwdWJsaWMgc2VuZFdzanR4Q2xlYXJCYW5kQWN0aXZpdHkoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+e2lkOiB0aGlzLndzanR4SWQsIHdpbmRvdzogMH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBjbGVhciB0aGUgUnggRnJlcXVlbmN5IHdpbmRvdy4gKi9cbiAgcHVibGljIHNlbmRXc2p0eENsZWFyUnhGcmVxV2luZG93KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0NsZWFyTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eENsZWFyPntpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDF9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgYW5kIFJ4IEZyZXF1ZW5jeSB3aW5kb3dzLiAqL1xuICBwdWJsaWMgc2VuZFdzanR4Q2xlYXJBbGwoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+e2lkOiB0aGlzLndzanR4SWQsIHdpbmRvdzogMn0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byByZXBsYXkgbWVzc2FnZXMuIFVzZWZ1bCBmb3IgYSBmcmVzaCBjbGllbnQgdGhhdCB3YW50cyB0byBoZWFyXG4gICAqIHByZXZpb3VzIFdTSlQtWCBkZWNvZGVzLiAqL1xuICBwdWJsaWMgc2VuZFdzanR4UmVwbGF5KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhSZXBsYXk+e2lkOiB0aGlzLndzanR4SWR9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gaGFsdCBhbnkgdHJhbnNtaXNzaW9ucyBpbW1lZGlhdGVseS4gKi9cbiAgcHVibGljIHNlbmRXc2p0eEhhbHRUeE5vdygpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIYWx0VHhNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4SGFsdFR4PntpZDogdGhpcy53c2p0eElkLCBhdXRvVHhPbmx5OiBmYWxzZX0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBzdG9wIGF1dG8tdHJhbnNtaXR0aW5nIGFmdGVyIGZpbmlzaGluZyB0aGUgY3VycmVudCByb3VuZC4gKi9cbiAgcHVibGljIHNlbmRXc2p0eEhhbHRUeEFmdGVyQ3VycmVudCgpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIYWx0VHhNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4SGFsdFR4PntpZDogdGhpcy53c2p0eElkLCBhdXRvVHhPbmx5OiB0cnVlfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmFnZW50V2ViU29ja2V0U3ViamVjdD8ubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHJlcGx5IHRvIHRoZSBnaXZlbiBkZWNvZGUuIFRoZSBtZXNzYWdlIG11c3QgaW5jbHVkZSBDUSBvciBRUlouICovXG4gIHB1YmxpYyBzZW5kV3NqdHhSZXBseShkZWNvZGU6IFdzanR4RGVjb2RlKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnUmVwbHlNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4UmVwbHk+e1xuICAgICAgICAgIGlkOiBkZWNvZGUuaWQsXG4gICAgICAgICAgdGltZTogZGVjb2RlLnRpbWUsXG4gICAgICAgICAgc25yOiBkZWNvZGUuc25yLFxuICAgICAgICAgIGRlbHRhVGltZTogZGVjb2RlLmRlbHRhVGltZSxcbiAgICAgICAgICBkZWx0YUZyZXF1ZW5jeTogZGVjb2RlLmRlbHRhRnJlcXVlbmN5LFxuICAgICAgICAgIG1vZGU6IGRlY29kZS5tb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGRlY29kZS5tZXNzYWdlLFxuICAgICAgICAgIGxvd0NvbmZpZGVuY2U6IGRlY29kZS5sb3dDb25maWRlbmNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbHkgdG8gdGhlIGdpdmVuIGRlY29kZS4gVGhlIG1lc3NhZ2UgbXVzdCBpbmNsdWRlIENRIG9yIFFSWi4gKi9cbiAgcHVibGljIHNlbmRXc2p0eEhpZ2hsaWdodENhbGxzaWduKGhpZ2hsaWdodE1zZzogV3NqdHhIaWdobGlnaHRDYWxsc2lnbikge1xuICAgIGhpZ2hsaWdodE1zZy5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIaWdobGlnaHRDYWxsc2lnbk1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiBoaWdobGlnaHRNc2csXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIEdpdmVuIGEgZGVjb2RlIG1lc3NhZ2UsIGZvcm1hdCBhIHN0cmluZyB0aGUgc2FtZSB3YXkgYXMgZGlzcGxheWVkIGluIHRoZSBXU0pULVggQmFuZFxuICAgKiBBY3Rpdml0eS9SeCBGcmVxdWVuY3kgd2luZG93cy4gKi9cbiAgcHVibGljIHN0YXRpYyBmb3JtYXREZWNvZGUobXNnOiBXc2p0eERlY29kZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlTWlkbmlnaHQgPSBNYXRoLmZsb29yKG1zZy50aW1lIC8gMTAwMCk7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHNlY29uZHNTaW5jZU1pZG5pZ2h0IC8gMzYwMCk7XG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlSG91ciA9IHNlY29uZHNTaW5jZU1pZG5pZ2h0IC0gaG91cnMgKiAzNjAwO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHNTaW5jZUhvdXIgLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IHNlY29uZHNTaW5jZUhvdXIgLSBtaW51dGVzICogNjA7XG4gICAgY29uc3QgdGltZVN0ciA9IGAke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0ke21pbnV0ZXNcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKX0ke3NlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG5cbiAgICByZXR1cm4gYCR7dGltZVN0cn0gJHttc2cuc25yLnRvU3RyaW5nKCkucGFkU3RhcnQoMyl9ICR7bXNnLmRlbHRhVGltZVxuICAgICAgLnRvRml4ZWQoMSlcbiAgICAgIC5wYWRTdGFydCg0KX0gJHttc2cuZGVsdGFGcmVxdWVuY3kudG9TdHJpbmcoKS5wYWRTdGFydCg0KX0gfiAgJHtcbiAgICAgIG1zZy5tZXNzYWdlXG4gICAgfWA7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gta2VsLWFnZW50L3NyYy9saWIvbWVzc2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGhlYXJ0YmVhdCAgbWVzc2FnZSBzaGFsbCBiZSAgc2VudCBvbiBhIHBlcmlvZGljICBiYXNpcyBldmVyeVxuICogICAgMTUgICBzZWNvbmRzLiAgVGhpc1xuICogICAgbWVzc2FnZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZlcnMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZVxuICogICAgb2YgYSAgY2xpZW50IGFuZCBhbHNvICB0aGUgdW5leHBlY3RlZCBkaXNhcHBlYXJhbmNlIG9mICBhIGNsaWVudFxuICogICAgYW5kICBieSBjbGllbnRzICB0byBsZWFybiAgdGhlIHNjaGVtYSAgbmVnb3RpYXRlZCBieSAgdGhlIHNlcnZlclxuICogICAgYWZ0ZXIgaXQgcmVjZWl2ZXMgIHRoZSBpbml0aWFsIGhlYXJ0YmVhdCBtZXNzYWdlICBmcm9tIGEgY2xpZW50LlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS84Zjk5ZmNjZWZmYzc2Yzk4NjQxM2UyMmVkMjViOTNlZjNmYzY2ZjFlL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDExMCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhIZWFydGJlYXQge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBXU0pULVggY2xpZW50J3Mgc3VwcG9ydGVkIHNjaGVtYSB2ZXJzaW9uICovXG4gIG1heFNjaGVtYVZlcnNpb246IG51bWJlcjtcbiAgLyoqIFdTSlQtWCBjbGllbnQncyBjb21taXQgaGFzaCAqL1xuICByZXZpc2lvbjogc3RyaW5nO1xuICAvKiogV1NKVC1YIGNsaWVudCdzIHNlbWFudGljIHZlcnNpb24gKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdTSlQtWCAgc2VuZHMgdGhpcyAgc3RhdHVzIG1lc3NhZ2UgIHdoZW4gdmFyaW91cyAgaW50ZXJuYWwgc3RhdGVcbiAqIGNoYW5nZXMgdG8gYWxsb3cgdGhlIHNlcnZlciB0byAgdHJhY2sgdGhlIHJlbGV2YW50IHN0YXRlIG9mIGVhY2hcbiAqIGNsaWVudCB3aXRob3V0IHRoZSBuZWVkIGZvciAgcG9sbGluZyBjb21tYW5kcy5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvOGY5OWZjY2VmZmM3NmM5ODY0MTNlMjJlZDI1YjkzZWYzZmM2NmYxZS90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wxNDEpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4U3RhdHVzIHtcbiAgY29uZmlnTmFtZTogc3RyaW5nO1xuICAvKiogTG9jYWwgc3RhdGlvbidzIGNhbGxzaWduICovXG4gIGRlQ2FsbDogc3RyaW5nO1xuICAvKiogTG9jYWwgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkZUdyaWQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgV1NKVC1YIGlzIGN1cnJlbnRseSBkZWNvZGluZyAqL1xuICBkZWNvZGluZzogYm9vbGVhbjtcbiAgLyoqIFRoZSBjb25uZWN0ZWQgdHJhbnNjZWl2ZXIncyBkaWFsIGZyZXF1ZW5jeSBpbiBoZXJ0eiAqL1xuICBkaWFsRnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBSZW1vdGUgc3RhdGlvbidzIGNhbGxzaWduICovXG4gIGR4Q2FsbDogc3RyaW5nO1xuICAvKiogUmVtb3RlIHN0YXRpb24ncyBNYWlkZW5oZWFkIGdyaWQgKi9cbiAgZHhHcmlkOiBzdHJpbmc7XG4gIGZhc3RNb2RlOiBib29sZWFuO1xuICBmcmVxdWVuY3lUb2xlcmFuY2U6IG51bWJlcjtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIHJlY2VpdmUgcHJvdG9jb2wgdGhhdCBXU0pULVggaXMgZGVjb2RpbmcgKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogVGhlIGxvY2FsIHN0YXRpb24ncyBzaWduYWwgcmVwb3J0IGZvciB0aGUgcmVtb3RlIHN0YXRpb24gKi9cbiAgcmVwb3J0OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGlzdGVuaW5nIGZyZXF1ZW5jeSBpbiBoZXJ0eiBhYm92ZSB0aGUgZGlhbCBmcmVxdWVuY3kgKi9cbiAgcnhEZWx0YUZyZXE6IG51bWJlcjtcbiAgLyoqIElmIG5vbi16ZXJvLCBXU0pULVggaXMgaW4gYSBzcGVjaWFsIG1vZGUgbGlrZSBGb3gvSG91bmQgb3IgRmllbGQgRGF5ICovXG4gIHNwZWNpYWxNb2RlOiBudW1iZXI7XG4gIHN1Ym1vZGU6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgV1NKVC1YIGlzIHRyYW5zbWl0dGluZyAqL1xuICB0cmFuc21pdHRpbmc6IGJvb2xlYW47XG4gIC8qKiBUaGUgdHJhbnNtaXQgZnJlcXVlbmN5IGluIGhlcnR6IGFib3ZlIHRoZSBkaWFsIGZyZXF1ZW5jeSAqL1xuICB0eERlbHRhRnJlcTogbnVtYmVyO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgYWxsb3dlZCB0byB0cmFuc21pdCBkdXJpbmcgdGhlIG5leHQgd2luZG93ICovXG4gIHR4RW5hYmxlZDogYm9vbGVhbjtcbiAgdHhNb2RlOiBzdHJpbmc7XG4gIHR4UnhQZXJpb2Q6IG51bWJlcjtcbiAgdHhXYXRjaGRvZzogYm9vbGVhbjtcbiAgLyoqIFRoZSBtZXNzYWdlIGJlaW5nIHRyYW5zbWl0dGVkICovXG4gIHR4TWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWNvZGUgbWVzc2FnZSBpcyBzZW50IHdoZW4gIGEgbmV3IGRlY29kZSBpcyBjb21wbGV0ZWQsIGluXG4gKiB0aGlzIGNhc2UgdGhlICdOZXcnIGZpZWxkIGlzIHRydWUuIEl0IGlzIGFsc28gdXNlZCBpbiByZXNwb25zZVxuICogdG8gIGEgXCJSZXBsYXlcIiAgbWVzc2FnZSB3aGVyZSAgZWFjaCAgb2xkIGRlY29kZSAgaW4gdGhlICBcIkJhbmRcbiAqIGFjdGl2aXR5XCIgd2luZG93LCB0aGF0ICBoYXMgbm90IGJlZW4gZXJhc2VkLCBpcyAgc2VudCBpbiBvcmRlclxuICogYXMgYSBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgIHdpdGggdGhlICdOZXcnIGZpZWxkIHNldCB0byBmYWxzZS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvOGY5OWZjY2VmZmM3NmM5ODY0MTNlMjJlZDI1YjkzZWYzZmM2NmYxZS90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wyMDYpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4RGVjb2RlIHtcbiAgLyoqIFRoZSBkZWNvZGUncyBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIGRlbHRhRnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBUaGUgcGVyY2VpdmVkIGNsb2NrIGRpZmZlcmVudGlhbCBiZXR3ZWVuIHRoZSBsb2NhbCBzdGF0aW9uIGFuZCByZW1vdGUgc3RhdGlvbiwgaW4gc2Vjb25kcy4gKi9cbiAgZGVsdGFUaW1lOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgbG93Q29uZmlkZW5jZTogYm9vbGVhbjtcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVGhlIHByb3RvY29sIG9mIHRoZSBkZWNvZGVkIG1lc3NhZ2UgKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBkZWNvZGUgY2FtZSBmcm9tIHBsYXliYWNrIG9mIGEgcmVjb3JkaW5nICovXG4gIG9mZkFpcjogYm9vbGVhbjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogQ2xvY2sgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgKi9cbiAgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyAgc2VuZCB3aGVuIGFsbCBwcmlvciBcIkRlY29kZVwiICBtZXNzYWdlcyBpbiB0aGVcbiAqIFwiQmFuZCBBY3Rpdml0eVwiICB3aW5kb3cgaGF2ZSBiZWVuIGRpc2NhcmRlZCAgYW5kIHRoZXJlZm9yZSBhcmVcbiAqIG5vIGxvbmcgYXZhaWxhYmxlIGZvciBhY3Rpb25pbmcgIHdpdGggYSBcIlJlcGx5XCIgbWVzc2FnZS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvOGY5OWZjY2VmZmM3NmM5ODY0MTNlMjJlZDI1YjkzZWYzZmM2NmYxZS90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wyMzIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4Q2xlYXIge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBXaGljaCB3aW5kb3cgdG8gY2xlYXIgKHNlbmQgb25seSkuIFNlbmQgMCB0byBjbGVhciBCYW5kIEFjdGl2aXR5LCAxIHRvIGNsZWFyIFJ4IEZyZXF1ZW5jeSwgKi9cbiAgLyoqIG9yIDIgdG8gY2xlYXIgYm90aC4gKi9cbiAgd2luZG93OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIFFTTyBsb2dnZWQgbWVzc2FnZSBpcyBzZW50IHdoZW4gdGhlIFdTSlQtWCB1c2VyIGFjY2VwdHMgdGhlIFwiTG9nICBRU09cIiBkaWFsb2cgYnkgY2xpY2tpbmdcbiAqIHRoZSBcIk9LXCIgYnV0dG9uLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS84Zjk5ZmNjZWZmYzc2Yzk4NjQxM2UyMmVkMjViOTNlZjNmYzY2ZjFlL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDI5MykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhRc29Mb2dnZWQge1xuICBjb21tZW50czogc3RyaW5nO1xuICBkYXRlVGltZU9mZjogRGF0ZTtcbiAgZGF0ZVRpbWVPbjogRGF0ZTtcbiAgLyoqIHJlbW90ZSBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZHhDYWxsOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkeEdyaWQ6IHN0cmluZztcbiAgLyoqIGNvbnRlc3QgZXhjaGFuZ2UgcmVjZWl2ZWQgKi9cbiAgZXhjaGFuZ2VSZWNlaXZlZDogc3RyaW5nO1xuICAvKiogY29udGVzdCBleGNoYW5nZSBzZW50ICovXG4gIGV4Y2hhbmdlU2VudDogc3RyaW5nO1xuICBtb2RlOiBzdHJpbmc7XG4gIC8qKiBsb2NhbCBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgbXlDYWxsOiBzdHJpbmc7XG4gIC8qKiBsb2NhbCBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIG15R3JpZDogc3RyaW5nO1xuICAvKiogcmVtb3RlIHN0YXRpb24ncyBvcGVyYXRvcidzIG5hbWUgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogcmVtb3RlIHN0YXRpb25zIG9wZXJhdG9yJ3MgY2FsbHNpZ24gKGlmIGRpZmZlcmVudCBmcm9tIHN0YXRpb24pICovXG4gIG9wZXJhdG9yQ2FsbDogc3RyaW5nO1xuICAvKiogc2lnbmFsIHJlcG9ydCByZWNlaXZlZCAqL1xuICByZXBvcnRSZWNlaXZlZDogc3RyaW5nO1xuICAvKiogc2lnbmFsIHJlcG9ydCBzZW50ICovXG4gIHJlcG9ydFNlbnQ6IHN0cmluZztcbiAgLyoqIGZyZXF1ZW5jeSBpbiBoZXJ0eiAqL1xuICB0eEZyZXF1ZW5jeTogbnVtYmVyO1xuICAvKiogcG93ZXIgaW4gd2F0dHMgKi9cbiAgdHhQb3dlcjogc3RyaW5nO1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xvc2UgaXMgIHNlbnQgYnkgIGEgY2xpZW50IGltbWVkaWF0ZWx5ICBwcmlvciB0byAgaXQgc2h1dHRpbmdcbiAqIGRvd24gZ3JhY2VmdWxseS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvOGY5OWZjY2VmZmM3NmM5ODY0MTNlMjJlZDI1YjkzZWYzZmM2NmYxZS90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzMTgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4Q2xvc2Uge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hlbiBhIHNlcnZlciBzdGFydHMgaXQgbWF5ICBiZSB1c2VmdWwgZm9yIGl0IHRvIGRldGVybWluZSB0aGVcbiAqIHN0YXRlICBvZiBwcmVleGlzdGluZyAgY2xpZW50cy4gU2VuZGluZyAgdGhpcyBtZXNzYWdlICB0byBlYWNoXG4gKiBjbGllbnQgYXMgaXQgaXMgZGlzY292ZXJlZCAgd2lsbCBjYXVzZSB0aGF0IGNsaWVudCAoV1NKVC1YKSB0b1xuICogc2VuZCBhIFwiRGVjb2RlXCIgbWVzc2FnZSBmb3IgZWFjaCBkZWNvZGUgY3VycmVudGx5IGluIGl0cyBcIkJhbmRcbiAqIGFjdGl2aXR5XCIgIHdpbmRvdy4gRWFjaCAgXCJEZWNvZGVcIiBtZXNzYWdlICBzZW50IHdpbGwgIGhhdmUgdGhlXG4gKiBcIk5ld1wiIGZsYWcgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhleSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tXG4gKiBuZXcgZGVjb2Rlcy4gQWZ0ZXIgIGFsbCB0aGUgb2xkIGRlY29kZXMgaGF2ZSAgYmVlbiBicm9hZGNhc3QgYVxuICogXCJTdGF0dXNcIiBtZXNzYWdlICBpcyBhbHNvIGJyb2FkY2FzdC4gIElmIHRoZSBzZXJ2ZXIgIHdpc2hlcyB0b1xuICogZGV0ZXJtaW5lICB0aGUgIHN0YXR1cyAgb2YgIGEgbmV3bHkgIGRpc2NvdmVyZWQgIGNsaWVudDsgIHRoaXNcbiAqIG1lc3NhZ2Ugc2hvdWxkIGJlIHVzZWQuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDMyOCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhSZXBsYXkge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlciBtYXkgc3RvcCBhIGNsaWVudCBmcm9tIHRyYW5zbWl0dGluZyBtZXNzYWdlcyBlaXRoZXJcbiAqIGltbWVkaWF0ZWx5IG9yIGF0ICB0aGUgZW5kIG9mIHRoZSAgY3VycmVudCB0cmFuc21pc3Npb24gcGVyaW9kXG4gKiB1c2luZyB0aGlzIG1lc3NhZ2UuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDM0MykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhIYWx0VHgge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBJZiBgZmFsc2VgLCBzdG9wIHRoZSBvbmdvaW5nIHRyYW5zbWlzc2lvbiBpbW1lZGlhdGVseS4gSWYgYHRydWVgLCB0aGlzIGRvZXNuJ3QgaGFsdCB0aGVcbiAgICogY3VycmVudCB0cmFuc21pc3Npb24sIGl0IGp1c3QgZGlzYWJsZXMgV1NKVC1YIGZyb20gdHJhbnNtaXR0aW5nIGFmdGVyIHRoZSBjdXJyZW50IHJvdW5kLiAqL1xuICBhdXRvVHhPbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBkZWNvZGUgbWVzc2FnZSBpcyBzZW50IHdoZW4gIGEgbmV3IGRlY29kZSBpcyBjb21wbGV0ZWQsIGluXG4gKiB0aGlzIGNhc2UgdGhlICdOZXcnIGZpZWxkIGlzIHRydWUuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpLzhmOTlmY2NlZmZjNzZjOTg2NDEzZTIyZWQyNWI5M2VmM2ZjNjZmMWUvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzgxKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eFdzcHJEZWNvZGUge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBkZWNvZGUgaXMgbmV3IG9yIHJlcGxheWVkICovXG4gIG5ldzogYm9vbGVhbjtcbiAgLyoqIENsb2NrIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0ICovXG4gIHRpbWU6IG51bWJlcjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogVGhlIHBlcmNlaXZlZCBjbG9jayBkaWZmZXJlbnRpYWwgYmV0d2VlbiB0aGUgbG9jYWwgc3RhdGlvbiBhbmQgcmVtb3RlIHN0YXRpb24sIGluIHNlY29uZHMuICovXG4gIGRlbHRhVGltZTogbnVtYmVyO1xuICBmcmVxdWVuY3k6IG51bWJlcjtcbiAgZHJpZnQ6IG51bWJlcjtcbiAgLyoqIHJlbW90ZSBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgY2FsbHNpZ246IHN0cmluZztcbiAgLyoqIHJlbW90ZSBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGdyaWQ6IHN0cmluZztcbiAgLyoqIHBvd2VyIGluIGRCbSAqL1xuICBwb3dlcjogbnVtYmVyO1xuICAvKiogd2hldGhlciB0aGUgZGVjb2RlIGNhbWUgZnJvbSBwbGF5YmFjayBvZiBhIHJlY29yZGluZyAqL1xuICBvZmZBaXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlICBsb2dnZWQgQURJRiAgbWVzc2FnZSBpcyAgc2VudCB0byAgdGhlIHNlcnZlcihzKSAgd2hlbiB0aGVcbiAqIFdTSlQtWCB1c2VyIGFjY2VwdHMgdGhlIFwiTG9nICBRU09cIiBkaWFsb2cgYnkgY2xpY2tpbmcgdGhlIFwiT0tcIlxuICogYnV0dG9uLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS84Zjk5ZmNjZWZmYzc2Yzk4NjQxM2UyMmVkMjViOTNlZjNmYzY2ZjFlL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQyMSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhMb2dnZWRBZGlmIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogQURJRiBlbmNvZGVkIFFTTyBkYXRhICovXG4gIGFkaWY6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYW1saWJSaWdTdGF0ZSB7XG4gIC8qKiBUcmFuc2NlaXZlciBtb2RlbCBuYW1lICovXG4gIG1vZGVsOiBzdHJpbmc7XG4gIC8qKiBEaWFsIGZyZXF1ZW5jeSBvZiB0aGUgXCJjdXJyZW50XCIgVkZPIGluIEh6ICovXG4gIGZyZXF1ZW5jeTogbnVtYmVyO1xuICAvKiogTW9kZSBuYW1lIG9mIHRoZSBcImN1cnJlbnRcIiBWRk8gKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogV2lkdGggb2YgdGhlIGN1cnJlbnQgcGFzc2JhbmQgZmlsdGVyIGluIEh6ICovXG4gIHBhc3NiYW5kV2lkdGhIejogbnVtYmVyO1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gta2VsLWFnZW50L3NyYy9saWIvbWVzc2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGhlYXJ0YmVhdCAgbWVzc2FnZSBzaGFsbCBiZSAgc2VudCBvbiBhIHBlcmlvZGljICBiYXNpcyBldmVyeVxuICogICAgMTUgICBzZWNvbmRzLiAgVGhpc1xuICogICAgbWVzc2FnZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZlcnMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZVxuICogICAgb2YgYSAgY2xpZW50IGFuZCBhbHNvICB0aGUgdW5leHBlY3RlZCBkaXNhcHBlYXJhbmNlIG9mICBhIGNsaWVudFxuICogICAgYW5kICBieSBjbGllbnRzICB0byBsZWFybiAgdGhlIHNjaGVtYSAgbmVnb3RpYXRlZCBieSAgdGhlIHNlcnZlclxuICogICAgYWZ0ZXIgaXQgcmVjZWl2ZXMgIHRoZSBpbml0aWFsIGhlYXJ0YmVhdCBtZXNzYWdlICBmcm9tIGEgY2xpZW50LlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wxMTApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4SGVhcnRiZWF0IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV1NKVC1YIGNsaWVudCdzIHN1cHBvcnRlZCBzY2hlbWEgdmVyc2lvbiAqL1xuICBtYXhTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50J3MgY29tbWl0IGhhc2ggKi9cbiAgcmV2aXNpb246IHN0cmluZztcbiAgLyoqIFdTSlQtWCBjbGllbnQncyBzZW1hbnRpYyB2ZXJzaW9uICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBXU0pULVggIHNlbmRzIHRoaXMgIHN0YXR1cyBtZXNzYWdlICB3aGVuIHZhcmlvdXMgIGludGVybmFsIHN0YXRlXG4gKiBjaGFuZ2VzIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gIHRyYWNrIHRoZSByZWxldmFudCBzdGF0ZSBvZiBlYWNoXG4gKiBjbGllbnQgd2l0aG91dCB0aGUgbmVlZCBmb3IgIHBvbGxpbmcgY29tbWFuZHMuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDE0MSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhTdGF0dXMge1xuICBjb25maWdOYW1lOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZGVDYWxsOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGRlR3JpZDogc3RyaW5nO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgY3VycmVudGx5IGRlY29kaW5nICovXG4gIGRlY29kaW5nOiBib29sZWFuO1xuICAvKiogVGhlIGNvbm5lY3RlZCB0cmFuc2NlaXZlcidzIGRpYWwgZnJlcXVlbmN5IGluIGhlcnR6ICovXG4gIGRpYWxGcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIFJlbW90ZSBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZHhDYWxsOiBzdHJpbmc7XG4gIC8qKiBSZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkeEdyaWQ6IHN0cmluZztcbiAgZmFzdE1vZGU6IGJvb2xlYW47XG4gIGZyZXF1ZW5jeVRvbGVyYW5jZTogbnVtYmVyO1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVjZWl2ZSBwcm90b2NvbCB0aGF0IFdTSlQtWCBpcyBkZWNvZGluZyAqL1xuICBtb2RlOiBzdHJpbmc7XG4gIC8qKiBUaGUgbG9jYWwgc3RhdGlvbidzIHNpZ25hbCByZXBvcnQgZm9yIHRoZSByZW1vdGUgc3RhdGlvbiAqL1xuICByZXBvcnQ6IHN0cmluZztcbiAgLyoqIFRoZSBsaXN0ZW5pbmcgZnJlcXVlbmN5IGluIGhlcnR6IGFib3ZlIHRoZSBkaWFsIGZyZXF1ZW5jeSAqL1xuICByeERlbHRhRnJlcTogbnVtYmVyO1xuICAvKiogSWYgbm9uLXplcm8sIFdTSlQtWCBpcyBpbiBhIHNwZWNpYWwgbW9kZSBsaWtlIEZveC9Ib3VuZCBvciBGaWVsZCBEYXkgKi9cbiAgc3BlY2lhbE1vZGU6IG51bWJlcjtcbiAgc3VibW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgdHJhbnNtaXR0aW5nICovXG4gIHRyYW5zbWl0dGluZzogYm9vbGVhbjtcbiAgLyoqIFRoZSB0cmFuc21pdCBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIHR4RGVsdGFGcmVxOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIFdTSlQtWCBpcyBhbGxvd2VkIHRvIHRyYW5zbWl0IGR1cmluZyB0aGUgbmV4dCB3aW5kb3cgKi9cbiAgdHhFbmFibGVkOiBib29sZWFuO1xuICB0eE1vZGU6IHN0cmluZztcbiAgdHhSeFBlcmlvZDogbnVtYmVyO1xuICB0eFdhdGNoZG9nOiBib29sZWFuO1xuICAvKiogVGhlIG1lc3NhZ2UgYmVpbmcgdHJhbnNtaXR0ZWQgKi9cbiAgdHhNZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlY29kZSBtZXNzYWdlIGlzIHNlbnQgd2hlbiAgYSBuZXcgZGVjb2RlIGlzIGNvbXBsZXRlZCwgaW5cbiAqIHRoaXMgY2FzZSB0aGUgJ05ldycgZmllbGQgaXMgdHJ1ZS4gSXQgaXMgYWxzbyB1c2VkIGluIHJlc3BvbnNlXG4gKiB0byAgYSBcIlJlcGxheVwiICBtZXNzYWdlIHdoZXJlICBlYWNoICBvbGQgZGVjb2RlICBpbiB0aGUgIFwiQmFuZFxuICogYWN0aXZpdHlcIiB3aW5kb3csIHRoYXQgIGhhcyBub3QgYmVlbiBlcmFzZWQsIGlzICBzZW50IGluIG9yZGVyXG4gKiBhcyBhIG9uZSBvZiB0aGVzZSBtZXNzYWdlcyAgd2l0aCB0aGUgJ05ldycgZmllbGQgc2V0IHRvIGZhbHNlLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wyMDgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4RGVjb2RlIHtcbiAgLyoqIFRoZSBkZWNvZGUncyBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIGRlbHRhRnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBUaGUgcGVyY2VpdmVkIGNsb2NrIGRpZmZlcmVudGlhbCBiZXR3ZWVuIHRoZSBsb2NhbCBzdGF0aW9uIGFuZCByZW1vdGUgc3RhdGlvbiwgaW4gc2Vjb25kcy4gKi9cbiAgZGVsdGFUaW1lOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgbG93Q29uZmlkZW5jZTogYm9vbGVhbjtcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVGhlIHByb3RvY29sIG9mIHRoZSBkZWNvZGVkIG1lc3NhZ2UgKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBkZWNvZGUgY2FtZSBmcm9tIHBsYXliYWNrIG9mIGEgcmVjb3JkaW5nICovXG4gIG9mZkFpcjogYm9vbGVhbjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogQ2xvY2sgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgKi9cbiAgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyAgc2VuZCB3aGVuIGFsbCBwcmlvciBcIkRlY29kZVwiICBtZXNzYWdlcyBpbiB0aGVcbiAqIFwiQmFuZCBBY3Rpdml0eVwiICB3aW5kb3cgaGF2ZSBiZWVuIGRpc2NhcmRlZCAgYW5kIHRoZXJlZm9yZSBhcmVcbiAqIG5vIGxvbmcgYXZhaWxhYmxlIGZvciBhY3Rpb25pbmcgIHdpdGggYSBcIlJlcGx5XCIgbWVzc2FnZS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMjM0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENsZWFyIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hpY2ggd2luZG93IHRvIGNsZWFyIChzZW5kIG9ubHkpLiBTZW5kIDAgdG8gY2xlYXIgQmFuZCBBY3Rpdml0eSwgMSB0byBjbGVhciBSeCBGcmVxdWVuY3ksICovXG4gIC8qKiBvciAyIHRvIGNsZWFyIGJvdGguICovXG4gIHdpbmRvdzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluIG9yZGVyIGZvciBhIHNlcnZlciAgdG8gcHJvdmlkZSBhIHVzZWZ1bCBjb29wZXJhdGl2ZSBzZXJ2aWNlXG4gKiB0byBXU0pULVggaXQgIGlzIHBvc3NpYmxlIGZvciBpdCB0byBpbml0aWF0ZSAgYSBRU08gYnkgc2VuZGluZ1xuICogdGhpcyBtZXNzYWdlIHRvIGEgY2xpZW50LiBXU0pULVggZmlsdGVycyB0aGlzIG1lc3NhZ2UgYW5kIG9ubHlcbiAqIGFjdHMgdXBvbiBpdCAgaWYgdGhlIG1lc3NhZ2UgZXhhY3RseSBkZXNjcmliZXMgIGEgcHJpb3IgZGVjb2RlXG4gKiBhbmQgdGhhdCBkZWNvZGUgIGlzIGEgQ1Egb3IgUVJaIG1lc3NhZ2UuICAgVGhlIGFjdGlvbiB0YWtlbiBpc1xuICogZXhhY3RseSBlcXVpdmFsZW50IHRvIHRoZSB1c2VyICBkb3VibGUgY2xpY2tpbmcgdGhlIG1lc3NhZ2UgaW5cbiAqIHRoZSBcIkJhbmQgYWN0aXZpdHlcIiB3aW5kb3cuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDI1NSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhSZXBseSB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIENsb2NrIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0ICovXG4gIHRpbWU6IG51bWJlcjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogVGhlIHBlcmNlaXZlZCBjbG9jayBkaWZmZXJlbnRpYWwgYmV0d2VlbiB0aGUgbG9jYWwgc3RhdGlvbiBhbmQgcmVtb3RlIHN0YXRpb24sIGluIHNlY29uZHMuICovXG4gIGRlbHRhVGltZTogbnVtYmVyO1xuICAvKiogVGhlIGRlY29kZSdzIGZyZXF1ZW5jeSBpbiBoZXJ0eiBhYm92ZSB0aGUgZGlhbCBmcmVxdWVuY3kgKi9cbiAgZGVsdGFGcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIFRoZSBwcm90b2NvbCBvZiB0aGUgZGVjb2RlZCBtZXNzYWdlICovXG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICBsb3dDb25maWRlbmNlOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlICBNb2RpZmllcnMgICBmaWVsZCAgYWxsb3dzICB0aGUgIGVxdWl2YWxlbnQgICBvZiAga2V5Ym9hcmRcbiAgICogbW9kaWZpZXJzIHRvIGJlIHNlbnQgXCJhcyBpZlwiIHRob3NlIG1vZGlmaWVyIGtleXMgd2hlcmUgcHJlc3NlZFxuICAgKiB3aGlsZSAgZG91YmxlLWNsaWNraW5nICB0aGUgIHNwZWNpZmllZCAgZGVjb2RlZCAgbWVzc2FnZS4gU2VlXG4gICAqIHRoZSBXU0pULVggc291cmNlIGxpbmsgYWJvdmUuICovXG4gIG1vZGlmaWVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBRU08gbG9nZ2VkIG1lc3NhZ2UgaXMgc2VudCB3aGVuIHRoZSBXU0pULVggdXNlciBhY2NlcHRzIHRoZSBcIkxvZyAgUVNPXCIgZGlhbG9nIGJ5IGNsaWNraW5nXG4gKiB0aGUgXCJPS1wiIGJ1dHRvbi5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMjk1KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eFFzb0xvZ2dlZCB7XG4gIGNvbW1lbnRzOiBzdHJpbmc7XG4gIGRhdGVUaW1lT2ZmOiBEYXRlO1xuICBkYXRlVGltZU9uOiBEYXRlO1xuICAvKiogcmVtb3RlIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBkeENhbGw6IHN0cmluZztcbiAgLyoqIHJlbW90ZSBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGR4R3JpZDogc3RyaW5nO1xuICAvKiogY29udGVzdCBleGNoYW5nZSByZWNlaXZlZCAqL1xuICBleGNoYW5nZVJlY2VpdmVkOiBzdHJpbmc7XG4gIC8qKiBjb250ZXN0IGV4Y2hhbmdlIHNlbnQgKi9cbiAgZXhjaGFuZ2VTZW50OiBzdHJpbmc7XG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIGxvY2FsIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBteUNhbGw6IHN0cmluZztcbiAgLyoqIGxvY2FsIHN0YXRpb24ncyBNYWlkZW5oZWFkIGdyaWQgKi9cbiAgbXlHcmlkOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIG9wZXJhdG9yJ3MgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbnMgb3BlcmF0b3IncyBjYWxsc2lnbiAoaWYgZGlmZmVyZW50IGZyb20gc3RhdGlvbikgKi9cbiAgb3BlcmF0b3JDYWxsOiBzdHJpbmc7XG4gIC8qKiBzaWduYWwgcmVwb3J0IHJlY2VpdmVkICovXG4gIHJlcG9ydFJlY2VpdmVkOiBzdHJpbmc7XG4gIC8qKiBzaWduYWwgcmVwb3J0IHNlbnQgKi9cbiAgcmVwb3J0U2VudDogc3RyaW5nO1xuICAvKiogZnJlcXVlbmN5IGluIGhlcnR6ICovXG4gIHR4RnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBwb3dlciBpbiB3YXR0cyAqL1xuICB0eFBvd2VyOiBzdHJpbmc7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFByb3BhZ2F0aW9uIG1vZGUgdXNpbmcgQURJRiBlbnVtZXJhdGlvbnMgKi9cbiAgcHJvcGFnYXRpb25Nb2RlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xvc2UgaXMgIHNlbnQgYnkgIGEgY2xpZW50IGltbWVkaWF0ZWx5ICBwcmlvciB0byAgaXQgc2h1dHRpbmdcbiAqIGRvd24gZ3JhY2VmdWxseS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzIwKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENsb3NlIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZW4gYSBzZXJ2ZXIgc3RhcnRzIGl0IG1heSAgYmUgdXNlZnVsIGZvciBpdCB0byBkZXRlcm1pbmUgdGhlXG4gKiBzdGF0ZSAgb2YgcHJlZXhpc3RpbmcgIGNsaWVudHMuIFNlbmRpbmcgIHRoaXMgbWVzc2FnZSAgdG8gZWFjaFxuICogY2xpZW50IGFzIGl0IGlzIGRpc2NvdmVyZWQgIHdpbGwgY2F1c2UgdGhhdCBjbGllbnQgKFdTSlQtWCkgdG9cbiAqIHNlbmQgYSBcIkRlY29kZVwiIG1lc3NhZ2UgZm9yIGVhY2ggZGVjb2RlIGN1cnJlbnRseSBpbiBpdHMgXCJCYW5kXG4gKiBhY3Rpdml0eVwiICB3aW5kb3cuIEVhY2ggIFwiRGVjb2RlXCIgbWVzc2FnZSAgc2VudCB3aWxsICBoYXZlIHRoZVxuICogXCJOZXdcIiBmbGFnIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbVxuICogbmV3IGRlY29kZXMuIEFmdGVyICBhbGwgdGhlIG9sZCBkZWNvZGVzIGhhdmUgIGJlZW4gYnJvYWRjYXN0IGFcbiAqIFwiU3RhdHVzXCIgbWVzc2FnZSAgaXMgYWxzbyBicm9hZGNhc3QuICBJZiB0aGUgc2VydmVyICB3aXNoZXMgdG9cbiAqIGRldGVybWluZSAgdGhlICBzdGF0dXMgIG9mICBhIG5ld2x5ICBkaXNjb3ZlcmVkICBjbGllbnQ7ICB0aGlzXG4gKiBtZXNzYWdlIHNob3VsZCBiZSB1c2VkLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzMjgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4UmVwbGF5IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgbWF5IHN0b3AgYSBjbGllbnQgZnJvbSB0cmFuc21pdHRpbmcgbWVzc2FnZXMgZWl0aGVyXG4gKiBpbW1lZGlhdGVseSBvciBhdCAgdGhlIGVuZCBvZiB0aGUgIGN1cnJlbnQgdHJhbnNtaXNzaW9uIHBlcmlvZFxuICogdXNpbmcgdGhpcyBtZXNzYWdlLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzNDMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4SGFsdFR4IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSWYgYGZhbHNlYCwgc3RvcCB0aGUgb25nb2luZyB0cmFuc21pc3Npb24gaW1tZWRpYXRlbHkuIElmIGB0cnVlYCwgdGhpcyBkb2Vzbid0IGhhbHQgdGhlXG4gICAqIGN1cnJlbnQgdHJhbnNtaXNzaW9uLCBpdCBqdXN0IGRpc2FibGVzIFdTSlQtWCBmcm9tIHRyYW5zbWl0dGluZyBhZnRlciB0aGUgY3VycmVudCByb3VuZC4gKi9cbiAgYXV0b1R4T25seTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgIGFsbG93cyB0aGUgc2VydmVyICB0byBzZXQgdGhlIGN1cnJlbnQgIGZyZWUgdGV4dFxuICogbWVzc2FnZSBjb250ZW50LiBTZW5kaW5nIHRoaXMgIG1lc3NhZ2Ugd2l0aCBhIG5vbi1lbXB0eSBcIlRleHRcIlxuICogZmllbGQgaXMgZXF1aXZhbGVudCB0byB0eXBpbmcgIGEgbmV3IG1lc3NhZ2UgKG9sZCBjb250ZW50cyBhcmVcbiAqIGRpc2NhcmRlZCkgaW4gdG8gIHRoZSBXU0pULVggZnJlZSB0ZXh0IG1lc3NhZ2UgIGZpZWxkIG9yIFwiVHg1XCJcbiAqIGZpZWxkIChib3RoICBhcmUgdXBkYXRlZCkgYW5kIGlmICB0aGUgXCJTZW5kXCIgZmxhZyBpcyAgc2V0IHRoZW5cbiAqIGNsaWNraW5nIHRoZSBcIk5vd1wiIHJhZGlvIGJ1dHRvbiBmb3IgdGhlIFwiVHg1XCIgZmllbGQgaWYgdGFiIG9uZVxuICogaXMgY3VycmVudCBvciBjbGlja2luZyB0aGUgXCJGcmVlICBtc2dcIiByYWRpbyBidXR0b24gaWYgdGFiIHR3b1xuICogaXMgY3VycmVudC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzUyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eEZyZWVUZXh0IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogQ3VzdG9tIHRleHQgdG8gc2VuZC4gTWF5IGJlIHRydW5jYXRlZCBpZiB0b28gbG9uZyAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIGFsc28gY2xpY2sgXCJOb3dcIiB0byBiZWdpbiB0cmFuc21pdHRpbmcgd2hlbiBhcHByb3ByaWF0ZSAqL1xuICBzZW5kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBkZWNvZGUgbWVzc2FnZSBpcyBzZW50IHdoZW4gIGEgbmV3IGRlY29kZSBpcyBjb21wbGV0ZWQsIGluXG4gKiB0aGlzIGNhc2UgdGhlICdOZXcnIGZpZWxkIGlzIHRydWUuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDM4MykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhXc3ByRGVjb2RlIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBDbG9jayB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCAqL1xuICB0aW1lOiBudW1iZXI7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgcGVyY2VpdmVkIHNpZ25hbCB0byBub2lzZSByYXRpbyAqL1xuICBzbnI6IG51bWJlcjtcbiAgLyoqIFRoZSBwZXJjZWl2ZWQgY2xvY2sgZGlmZmVyZW50aWFsIGJldHdlZW4gdGhlIGxvY2FsIHN0YXRpb24gYW5kIHJlbW90ZSBzdGF0aW9uLCBpbiBzZWNvbmRzLiAqL1xuICBkZWx0YVRpbWU6IG51bWJlcjtcbiAgZnJlcXVlbmN5OiBudW1iZXI7XG4gIGRyaWZ0OiBudW1iZXI7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIGNhbGxzaWduICovXG4gIGNhbGxzaWduOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBncmlkOiBzdHJpbmc7XG4gIC8qKiBwb3dlciBpbiBkQm0gKi9cbiAgcG93ZXI6IG51bWJlcjtcbiAgLyoqIHdoZXRoZXIgdGhlIGRlY29kZSBjYW1lIGZyb20gcGxheWJhY2sgb2YgYSByZWNvcmRpbmcgKi9cbiAgb2ZmQWlyOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoaXMgIG1lc3NhZ2UgYWxsb3dzICB0aGUgc2VydmVyICB0byBzZXQgIHRoZSBjdXJyZW50ICBjdXJyZW50XG4gKiBnZW9ncmFwaGljYWwgbG9jYXRpb24gIG9mIG9wZXJhdGlvbi4gVGhlIHN1cHBsaWVkICBsb2NhdGlvbiBpc1xuICogbm90IHBlcnNpc3RlbnQgYnV0ICBpcyB1c2VkIGFzIGEgIHNlc3Npb24gbGlmZXRpbWUgcmVwbGFjZW1lbnRcbiAqIGxvY3Rpb24gdGhhdCBvdmVycmlkZXMgdGhlIE1haWRlbmhlYWQgIGdyaWQgbG9jYXRlciBzZXQgaW4gdGhlXG4gKiBhcHBsaWNhdGlvbiAgc2V0dGluZ3MuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQwNikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhMb2NhdGlvbiB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIE1haWRlbmhlYWQgZ3JpZCB0byBzZXQgYXMgdGhlIGxvY2FsIHN0YXRpb24ncyBwb3NpdGlvbiAqL1xuICBsb2NhdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSAgbG9nZ2VkIEFESUYgIG1lc3NhZ2UgaXMgIHNlbnQgdG8gIHRoZSBzZXJ2ZXIocykgIHdoZW4gdGhlXG4gKiBXU0pULVggdXNlciBhY2NlcHRzIHRoZSBcIkxvZyAgUVNPXCIgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSBcIk9LXCJcbiAqIGJ1dHRvbi5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDIzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eExvZ2dlZEFkaWYge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBBRElGIGVuY29kZWQgUVNPIGRhdGEgKi9cbiAgYWRpZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgIG1heSBzZW5kICB0aGlzIG1lc3NhZ2UgYXQgIGFueSB0aW1lLiAgIFRoZSBtZXNzYWdlXG4gKiBzcGVjaWZpZXMgIHRoZSBiYWNrZ3JvdW5kICBhbmQgZm9yZWdyb3VuZCAgY29sb3IgdGhhdCAgd2lsbCBiZVxuICogdXNlZCAgdG8gIGhpZ2hsaWdodCAgdGhlICBzcGVjaWZpZWQgY2FsbHNpZ24gIGluICB0aGUgIGRlY29kZWRcbiAqIG1lc3NhZ2VzICBwcmludGVkICBpbiB0aGUgIEJhbmQgIEFjdGl2aXR5ICBwYW5lbC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDQ0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eEhpZ2hsaWdodENhbGxzaWduIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hpY2ggY2FsbHNpZ24gdG8gaGlnaGxpZ2h0ICovXG4gIGNhbGxzaWduOiBzdHJpbmc7XG4gIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLiBBbGwgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCA0IGZvcm1hdHMgc2hvdWxkIGJlIHZhbGlkLlxuICAgKiBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci00LyAqL1xuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgLyoqIEZvcmVncm91bmQgY29sb3IuIEFsbCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDQgZm9ybWF0cyBzaG91bGQgYmUgdmFsaWQuXG4gICAqIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTQvICovXG4gIGZvcmVncm91bmRDb2xvcjogc3RyaW5nO1xuICAvKiogVGhlIFwiSGlnaGxpZ2h0IGxhc3RcIiAgZmllbGQgYWxsb3dzIHRoZSBzZW5kZXIgIHRvIHJlcXVlc3QgdGhhdFxuICAgKiBhbGwgaW5zdGFuY2VzIG9mICBcIkNhbGxzaWduXCIgaW4gdGhlIGxhc3QgIHBlcmlvZCBvbmx5LCBpbnN0ZWFkXG4gICAqIG9mIGFsbCBpbnN0YW5jZXMgaW4gYWxsIHBlcmlvZHMsIGJlIGhpZ2hsaWdodGVkLiAqL1xuICBoaWdobGlnaHRMYXN0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byByZXNldCB0aGUgaGlnaGxpZ2h0aW5nIHRvIGRlZmF1bHQgKG92ZXJyaWRlcyBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycykgKi9cbiAgcmVzZXQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNlcnZlciAgbWF5IHNlbmQgIHRoaXMgbWVzc2FnZSBhdCAgYW55IHRpbWUuICAgVGhlIG1lc3NhZ2VcbiAqIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgIGNvbmZpZ3VyYXRpb24gdG8gc3dpdGNoIHRvLiBUaGUgbmV3XG4gKiBjb25maWd1cmF0aW9uIG11c3QgZXhpc3QuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQ0NSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhTd2l0Y2hDb25maWd1cmF0aW9uIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogTmV3IGNvbmZpZ3VyYXRpb24gc2V0IHRvIHVzZSAobXVzdCBhbHJlYWR5IGV4aXN0KSAqL1xuICBjb25maWd1cmF0aW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgIG1heSBzZW5kICB0aGlzIG1lc3NhZ2UgYXQgIGFueSB0aW1lLiAgIFRoZSBtZXNzYWdlXG4gKiBzcGVjaWZpZXMgIHZhcmlvdXMgIGNvbmZpZ3VyYXRpb24gIG9wdGlvbnMuICBGb3IgIHV0ZjggIHN0cmluZ1xuICogZmllbGRzIGFuIGVtcHR5IHZhbHVlIGltcGxpZXMgbm8gY2hhbmdlLCBmb3IgdGhlIHF1aW50MzIgUnggREZcbiAqIGFuZCAgRnJlcXVlbmN5ICBUb2xlcmFuY2UgIGZpZWxkcyB0aGUgIG1heGltdW0gIHF1aW50MzIgIHZhbHVlXG4gKiBpbXBsaWVzICBubyBjaGFuZ2UuICAgSW52YWxpZCBvciAgdW5yZWNvZ25pemVkIHZhbHVlcyAgd2lsbCBiZVxuICogc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDc5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENvbmZpZ3VyZSB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFdoaWNoIHByb3RvY29sIHRvIGRlY29kZSBhbmQgc2VuZCAqL1xuICBtb2RlOiBzdHJpbmc7XG4gIGZyZXF1ZW5jeVRvbGVyYW5jZTogbnVtYmVyO1xuICAvKiogV2hpY2ggc3ViLXByb3RvY29sIHRvIGRlY29kZSBhbmQgc2VuZCAqL1xuICBzdWJtb2RlOiBzdHJpbmc7XG4gIGZhc3RNb2RlOiBib29sZWFuO1xuICAvKiogV2hpY2ggcHJvdG9jb2wgdG8gZGVjb2RlIGFuZCBzZW5kICovXG4gIHRyUGVyaW9kOiBudW1iZXI7XG4gIC8qKiBSZWNlaXZlIGRlbHRhIChhYm92ZSBkaWFsKSBmcmVxdWVuY3kgaW4gaGVydHooPykgKi9cbiAgcnhERjogbnVtYmVyXG4gIC8qKiBUaGUgcmVtb3RlIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBkeENhbGw6IHN0cmluZztcbiAgLyoqIFRoZSByZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkeEdyaWQ6IHN0cmluZztcbiAgLyoqIFJlZ2VuZXJhdGUgdGhlIHN0YW5kYXJkIG1lc3NhZ2VzICovXG4gIGdlbmVyYXRlTWVzc2FnZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFtbGliUmlnU3RhdGUge1xuICAvKiogVHJhbnNjZWl2ZXIgbW9kZWwgbmFtZSAqL1xuICBtb2RlbDogc3RyaW5nO1xuICAvKiogRGlhbCBmcmVxdWVuY3kgb2YgdGhlIFwiY3VycmVudFwiIFZGTyBpbiBIeiAqL1xuICBmcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIE1vZGUgbmFtZSBvZiB0aGUgXCJjdXJyZW50XCIgVkZPICovXG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIFdpZHRoIG9mIHRoZSBjdXJyZW50IHBhc3NiYW5kIGZpbHRlciBpbiBIeiAqL1xuICBwYXNzYmFuZFdpZHRoSHo6IG51bWJlcjtcbn1cbiJdfQ==
@@ -3,4 +3,6 @@
3
3
  */
4
4
  export * from './lib/agent.service';
5
5
  export * from './lib/messages';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5neC1rZWwtYWdlbnRcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hZ2VudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc3NhZ2VzJztcbiJdfQ==
6
+ // export * from './lib/ngx-kel-agent.component';
7
+ // export * from './lib/ngx-kel-agent.module';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsaURBQWlEO0FBQ2pELDhDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWtlbC1hZ2VudFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2FnZW50LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWVzc2FnZXMnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWtlbC1hZ2VudC5jb21wb25lbnQnO1xuLy8gZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWtlbC1hZ2VudC5tb2R1bGUnO1xuIl19
@@ -236,6 +236,38 @@ class AgentService {
236
236
  };
237
237
  (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
238
238
  }
239
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
240
+ sendWsjtxReply(decode) {
241
+ var _a;
242
+ const wsMsg = {
243
+ wsjtx: {
244
+ type: 'ReplyMessage',
245
+ payload: {
246
+ id: decode.id,
247
+ time: decode.time,
248
+ snr: decode.snr,
249
+ deltaTime: decode.deltaTime,
250
+ deltaFrequency: decode.deltaFrequency,
251
+ mode: decode.mode,
252
+ message: decode.message,
253
+ lowConfidence: decode.lowConfidence,
254
+ },
255
+ },
256
+ };
257
+ (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
258
+ }
259
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
260
+ sendWsjtxHighlightCallsign(highlightMsg) {
261
+ var _a;
262
+ highlightMsg.id = this.wsjtxId;
263
+ const wsMsg = {
264
+ wsjtx: {
265
+ type: 'HighlightCallsignMessage',
266
+ payload: highlightMsg,
267
+ },
268
+ };
269
+ (_a = this.agentWebSocketSubject) === null || _a === void 0 ? void 0 : _a.next(wsMsg);
270
+ }
239
271
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
240
272
  * Activity/Rx Frequency windows. */
241
273
  static formatDecode(msg) {
@@ -264,9 +296,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
264
296
  /*
265
297
  * Public API Surface of ngx-kel-agent
266
298
  */
299
+ // export * from './lib/ngx-kel-agent.component';
300
+ // export * from './lib/ngx-kel-agent.module';
267
301
 
268
302
  /**
269
303
  * Generated bundle index. Do not edit.
270
304
  */
271
305
 
272
306
  export { AgentService };
307
+ //# sourceMappingURL=ngx-kel-agent.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {BehaviorSubject, ReplaySubject, Subject, Subscription,} from \"rxjs\";\nimport {debounceTime, delay, retryWhen, tap} from \"rxjs/operators\";\nimport {webSocket, WebSocketSubject} from \"rxjs/webSocket\";\nimport {\n HamlibRigState,\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxStatus,\n WsjtxWsprDecode\n} from \"./messages\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /** Whether we're getting any messages from WSJT-X. */\n public readonly wsjtxState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly wsjtxHeartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly wsjtxStatus$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly wsjtxDecode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly wsjtxClear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly wsjtxQsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly wsjtxClose$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsjtxWsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly wsjtxLoggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n /* Hamlib */\n /** Whether we're getting any messages from Hamlib. */\n public readonly hamlibState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly hamlibRigState$ = new BehaviorSubject<HamlibRigState | null>(\n null\n );\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n private wsjtxId: string = 'WSJT-X';\n\n constructor() {\n }\n\n public init(): void {\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.setupWsjtxBehaviors();\n this.setupHamlibBehaviors();\n this.connect();\n }\n\n private setupWsjtxBehaviors(): void {\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.wsjtxState$\n .pipe(debounceTime(15000))\n .subscribe(() => this.wsjtxState$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.wsjtxClose$.subscribe(() => {\n this.wsjtxState$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.wsjtxState$.subscribe((isUp) => {\n if (!isUp) {\n this.wsjtxHeartbeat$.next(null);\n this.wsjtxStatus$.next(null);\n }\n });\n }\n\n private setupHamlibBehaviors(): void {\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {\n this.hamlibState$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.hamlibState$.subscribe((isUp) => {\n if (!isUp) {\n this.hamlibRigState$.next(null);\n }\n });\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.handleMessage(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n private handleMessage(msg: any): void {\n if (msg.wsjtx != null && msg.wsjtx.type != null) {\n this.wsjtxState$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.wsjtxHeartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.wsjtxStatus$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.wsjtxDecode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.wsjtxClear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.wsjtxQsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.wsjtxClose$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsjtxWsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.wsjtxLoggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n if (msg.hamlib !== null) {\n this.hamlibState$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.hamlibRigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public sendWsjtxClearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 0},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public sendWsjtxClearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 1},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public sendWsjtxClearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 2},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public sendWsjtxReplay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{id: this.wsjtxId},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public sendWsjtxHaltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: false},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public sendWsjtxHaltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: true},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const secondsSinceMidnight = Math.floor(msg.time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n const timeStr = `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/messages';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {BehaviorSubject, ReplaySubject, Subject, Subscription,} from \"rxjs\";\nimport {debounceTime, delay, retryWhen, tap} from \"rxjs/operators\";\nimport {webSocket, WebSocketSubject} from \"rxjs/webSocket\";\nimport {\n HamlibRigState,\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxWsprDecode\n} from \"./messages\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /** Whether we're getting any messages from WSJT-X. */\n public readonly wsjtxState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly wsjtxHeartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly wsjtxStatus$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly wsjtxDecode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly wsjtxClear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly wsjtxQsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly wsjtxClose$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsjtxWsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly wsjtxLoggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n /* Hamlib */\n /** Whether we're getting any messages from Hamlib. */\n public readonly hamlibState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly hamlibRigState$ = new BehaviorSubject<HamlibRigState | null>(\n null\n );\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n private wsjtxId: string = 'WSJT-X';\n\n constructor() {\n }\n\n public init(): void {\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.setupWsjtxBehaviors();\n this.setupHamlibBehaviors();\n this.connect();\n }\n\n private setupWsjtxBehaviors(): void {\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.wsjtxState$\n .pipe(debounceTime(15000))\n .subscribe(() => this.wsjtxState$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.wsjtxClose$.subscribe(() => {\n this.wsjtxState$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.wsjtxState$.subscribe((isUp) => {\n if (!isUp) {\n this.wsjtxHeartbeat$.next(null);\n this.wsjtxStatus$.next(null);\n }\n });\n }\n\n private setupHamlibBehaviors(): void {\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {\n this.hamlibState$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.hamlibState$.subscribe((isUp) => {\n if (!isUp) {\n this.hamlibRigState$.next(null);\n }\n });\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.handleMessage(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n private handleMessage(msg: any): void {\n if (msg.wsjtx != null && msg.wsjtx.type != null) {\n this.wsjtxState$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.wsjtxHeartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.wsjtxStatus$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.wsjtxDecode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.wsjtxClear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.wsjtxQsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.wsjtxClose$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsjtxWsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.wsjtxLoggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n if (msg.hamlib !== null) {\n this.hamlibState$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.hamlibRigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public sendWsjtxClearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 0},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public sendWsjtxClearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 1},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public sendWsjtxClearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 2},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public sendWsjtxReplay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{id: this.wsjtxId},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public sendWsjtxHaltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: false},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public sendWsjtxHaltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: true},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public sendWsjtxReply(decode: WsjtxDecode) {\n const wsMsg = {\n wsjtx: {\n type: 'ReplyMessage',\n payload: <WsjtxReply>{\n id: decode.id,\n time: decode.time,\n snr: decode.snr,\n deltaTime: decode.deltaTime,\n deltaFrequency: decode.deltaFrequency,\n mode: decode.mode,\n message: decode.message,\n lowConfidence: decode.lowConfidence,\n },\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const secondsSinceMidnight = Math.floor(msg.time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n const timeStr = `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/messages';\n// export * from './lib/ngx-kel-agent.component';\n// export * from './lib/ngx-kel-agent.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -230,6 +230,36 @@ class AgentService {
230
230
  };
231
231
  this.agentWebSocketSubject?.next(wsMsg);
232
232
  }
233
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
234
+ sendWsjtxReply(decode) {
235
+ const wsMsg = {
236
+ wsjtx: {
237
+ type: 'ReplyMessage',
238
+ payload: {
239
+ id: decode.id,
240
+ time: decode.time,
241
+ snr: decode.snr,
242
+ deltaTime: decode.deltaTime,
243
+ deltaFrequency: decode.deltaFrequency,
244
+ mode: decode.mode,
245
+ message: decode.message,
246
+ lowConfidence: decode.lowConfidence,
247
+ },
248
+ },
249
+ };
250
+ this.agentWebSocketSubject?.next(wsMsg);
251
+ }
252
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
253
+ sendWsjtxHighlightCallsign(highlightMsg) {
254
+ highlightMsg.id = this.wsjtxId;
255
+ const wsMsg = {
256
+ wsjtx: {
257
+ type: 'HighlightCallsignMessage',
258
+ payload: highlightMsg,
259
+ },
260
+ };
261
+ this.agentWebSocketSubject?.next(wsMsg);
262
+ }
233
263
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
234
264
  * Activity/Rx Frequency windows. */
235
265
  static formatDecode(msg) {
@@ -258,9 +288,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
258
288
  /*
259
289
  * Public API Surface of ngx-kel-agent
260
290
  */
291
+ // export * from './lib/ngx-kel-agent.component';
292
+ // export * from './lib/ngx-kel-agent.module';
261
293
 
262
294
  /**
263
295
  * Generated bundle index. Do not edit.
264
296
  */
265
297
 
266
298
  export { AgentService };
299
+ //# sourceMappingURL=ngx-kel-agent.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {BehaviorSubject, ReplaySubject, Subject, Subscription,} from \"rxjs\";\nimport {debounceTime, delay, retryWhen, tap} from \"rxjs/operators\";\nimport {webSocket, WebSocketSubject} from \"rxjs/webSocket\";\nimport {\n HamlibRigState,\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxStatus,\n WsjtxWsprDecode\n} from \"./messages\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /** Whether we're getting any messages from WSJT-X. */\n public readonly wsjtxState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly wsjtxHeartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly wsjtxStatus$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly wsjtxDecode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly wsjtxClear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly wsjtxQsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly wsjtxClose$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsjtxWsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly wsjtxLoggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n /* Hamlib */\n /** Whether we're getting any messages from Hamlib. */\n public readonly hamlibState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly hamlibRigState$ = new BehaviorSubject<HamlibRigState | null>(\n null\n );\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n private wsjtxId: string = 'WSJT-X';\n\n constructor() {\n }\n\n public init(): void {\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.setupWsjtxBehaviors();\n this.setupHamlibBehaviors();\n this.connect();\n }\n\n private setupWsjtxBehaviors(): void {\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.wsjtxState$\n .pipe(debounceTime(15000))\n .subscribe(() => this.wsjtxState$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.wsjtxClose$.subscribe(() => {\n this.wsjtxState$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.wsjtxState$.subscribe((isUp) => {\n if (!isUp) {\n this.wsjtxHeartbeat$.next(null);\n this.wsjtxStatus$.next(null);\n }\n });\n }\n\n private setupHamlibBehaviors(): void {\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {\n this.hamlibState$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.hamlibState$.subscribe((isUp) => {\n if (!isUp) {\n this.hamlibRigState$.next(null);\n }\n });\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.handleMessage(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n private handleMessage(msg: any): void {\n if (msg.wsjtx != null && msg.wsjtx.type != null) {\n this.wsjtxState$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.wsjtxHeartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.wsjtxStatus$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.wsjtxDecode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.wsjtxClear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.wsjtxQsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.wsjtxClose$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsjtxWsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.wsjtxLoggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n if (msg.hamlib !== null) {\n this.hamlibState$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.hamlibRigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public sendWsjtxClearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 0},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public sendWsjtxClearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 1},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public sendWsjtxClearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 2},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public sendWsjtxReplay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{id: this.wsjtxId},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public sendWsjtxHaltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: false},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public sendWsjtxHaltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: true},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const secondsSinceMidnight = Math.floor(msg.time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n const timeStr = `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/messages';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {BehaviorSubject, ReplaySubject, Subject, Subscription,} from \"rxjs\";\nimport {debounceTime, delay, retryWhen, tap} from \"rxjs/operators\";\nimport {webSocket, WebSocketSubject} from \"rxjs/webSocket\";\nimport {\n HamlibRigState,\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxWsprDecode\n} from \"./messages\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /** Whether we're getting any messages from WSJT-X. */\n public readonly wsjtxState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly wsjtxHeartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly wsjtxStatus$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly wsjtxDecode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly wsjtxClear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly wsjtxQsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly wsjtxClose$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsjtxWsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly wsjtxLoggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n /* Hamlib */\n /** Whether we're getting any messages from Hamlib. */\n public readonly hamlibState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly hamlibRigState$ = new BehaviorSubject<HamlibRigState | null>(\n null\n );\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n private wsjtxId: string = 'WSJT-X';\n\n constructor() {\n }\n\n public init(): void {\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.setupWsjtxBehaviors();\n this.setupHamlibBehaviors();\n this.connect();\n }\n\n private setupWsjtxBehaviors(): void {\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.wsjtxState$\n .pipe(debounceTime(15000))\n .subscribe(() => this.wsjtxState$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.wsjtxClose$.subscribe(() => {\n this.wsjtxState$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.wsjtxState$.subscribe((isUp) => {\n if (!isUp) {\n this.wsjtxHeartbeat$.next(null);\n this.wsjtxStatus$.next(null);\n }\n });\n }\n\n private setupHamlibBehaviors(): void {\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {\n this.hamlibState$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.hamlibState$.subscribe((isUp) => {\n if (!isUp) {\n this.hamlibRigState$.next(null);\n }\n });\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.handleMessage(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n private handleMessage(msg: any): void {\n if (msg.wsjtx != null && msg.wsjtx.type != null) {\n this.wsjtxState$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.wsjtxHeartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.wsjtxStatus$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.wsjtxDecode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.wsjtxClear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.wsjtxQsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.wsjtxClose$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsjtxWsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.wsjtxLoggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n if (msg.hamlib !== null) {\n this.hamlibState$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.hamlibRigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public sendWsjtxClearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 0},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public sendWsjtxClearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 1},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public sendWsjtxClearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 2},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public sendWsjtxReplay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{id: this.wsjtxId},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public sendWsjtxHaltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: false},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public sendWsjtxHaltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: true},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public sendWsjtxReply(decode: WsjtxDecode) {\n const wsMsg = {\n wsjtx: {\n type: 'ReplyMessage',\n payload: <WsjtxReply>{\n id: decode.id,\n time: decode.time,\n snr: decode.snr,\n deltaTime: decode.deltaTime,\n deltaFrequency: decode.deltaFrequency,\n mode: decode.mode,\n message: decode.message,\n lowConfidence: decode.lowConfidence,\n },\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const secondsSinceMidnight = Math.floor(msg.time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n const timeStr = `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/messages';\n// export * from './lib/ngx-kel-agent.component';\n// export * from './lib/ngx-kel-agent.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { BehaviorSubject, ReplaySubject, Subject } from "rxjs";
2
- import { HamlibRigState, WsjtxClear, WsjtxClose, WsjtxDecode, WsjtxHeartbeat, WsjtxLoggedAdif, WsjtxQsoLogged, WsjtxStatus, WsjtxWsprDecode } from "./messages";
2
+ import { HamlibRigState, WsjtxClear, WsjtxClose, WsjtxDecode, WsjtxHeartbeat, WsjtxHighlightCallsign, WsjtxLoggedAdif, WsjtxQsoLogged, WsjtxStatus, WsjtxWsprDecode } from "./messages";
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class AgentService {
5
5
  /** Whether we're connected to the agent. */
@@ -63,6 +63,10 @@ export declare class AgentService {
63
63
  sendWsjtxHaltTxNow(): void;
64
64
  /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
65
65
  sendWsjtxHaltTxAfterCurrent(): void;
66
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
67
+ sendWsjtxReply(decode: WsjtxDecode): void;
68
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
69
+ sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign): void;
66
70
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
67
71
  * Activity/Rx Frequency windows. */
68
72
  static formatDecode(msg: WsjtxDecode): string;
package/lib/messages.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * after it receives the initial heartbeat message from a client.
8
8
  *
9
9
  * See
10
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l110).
10
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l110).
11
11
  */
12
12
  export interface WsjtxHeartbeat {
13
13
  /** WSJT-X client name */
@@ -25,7 +25,7 @@ export interface WsjtxHeartbeat {
25
25
  * client without the need for polling commands.
26
26
  *
27
27
  * See
28
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l141).
28
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l141).
29
29
  */
30
30
  export interface WsjtxStatus {
31
31
  configName: string;
@@ -74,7 +74,7 @@ export interface WsjtxStatus {
74
74
  * as a one of these messages with the 'New' field set to false.
75
75
  *
76
76
  * See
77
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l206).
77
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l208).
78
78
  */
79
79
  export interface WsjtxDecode {
80
80
  /** The decode's frequency in hertz above the dial frequency */
@@ -103,7 +103,7 @@ export interface WsjtxDecode {
103
103
  * no long available for actioning with a "Reply" message.
104
104
  *
105
105
  * See
106
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l232).
106
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l234).
107
107
  */
108
108
  export interface WsjtxClear {
109
109
  /** WSJT-X client name */
@@ -112,12 +112,47 @@ export interface WsjtxClear {
112
112
  /** or 2 to clear both. */
113
113
  window: number;
114
114
  }
115
+ /**
116
+ * In order for a server to provide a useful cooperative service
117
+ * to WSJT-X it is possible for it to initiate a QSO by sending
118
+ * this message to a client. WSJT-X filters this message and only
119
+ * acts upon it if the message exactly describes a prior decode
120
+ * and that decode is a CQ or QRZ message. The action taken is
121
+ * exactly equivalent to the user double clicking the message in
122
+ * the "Band activity" window.
123
+ *
124
+ * See
125
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l255).
126
+ */
127
+ export interface WsjtxReply {
128
+ /** WSJT-X client name */
129
+ id: string;
130
+ /** Clock time in milliseconds since midnight */
131
+ time: number;
132
+ /** Local station's perceived signal to noise ratio */
133
+ snr: number;
134
+ /** The perceived clock differential between the local station and remote station, in seconds. */
135
+ deltaTime: number;
136
+ /** The decode's frequency in hertz above the dial frequency */
137
+ deltaFrequency: number;
138
+ /** The protocol of the decoded message */
139
+ mode: string;
140
+ /** The message payload contained in the decode */
141
+ message: string;
142
+ lowConfidence: boolean;
143
+ /**
144
+ * The Modifiers field allows the equivalent of keyboard
145
+ * modifiers to be sent "as if" those modifier keys where pressed
146
+ * while double-clicking the specified decoded message. See
147
+ * the WSJT-X source link above. */
148
+ modifiers: number;
149
+ }
115
150
  /**
116
151
  * The QSO logged message is sent when the WSJT-X user accepts the "Log QSO" dialog by clicking
117
152
  * the "OK" button.
118
153
  *
119
154
  * See
120
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l293).
155
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l295).
121
156
  */
122
157
  export interface WsjtxQsoLogged {
123
158
  comments: string;
@@ -150,13 +185,15 @@ export interface WsjtxQsoLogged {
150
185
  txPower: string;
151
186
  /** WSJT-X client name */
152
187
  id: string;
188
+ /** Propagation mode using ADIF enumerations */
189
+ propagationMode: string;
153
190
  }
154
191
  /**
155
192
  * Close is sent by a client immediately prior to it shutting
156
193
  * down gracefully.
157
194
  *
158
195
  * See
159
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l318).
196
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l320).
160
197
  */
161
198
  export interface WsjtxClose {
162
199
  /** WSJT-X client name */
@@ -196,12 +233,33 @@ export interface WsjtxHaltTx {
196
233
  * current transmission, it just disables WSJT-X from transmitting after the current round. */
197
234
  autoTxOnly: boolean;
198
235
  }
236
+ /**
237
+ * This message allows the server to set the current free text
238
+ * message content. Sending this message with a non-empty "Text"
239
+ * field is equivalent to typing a new message (old contents are
240
+ * discarded) in to the WSJT-X free text message field or "Tx5"
241
+ * field (both are updated) and if the "Send" flag is set then
242
+ * clicking the "Now" radio button for the "Tx5" field if tab one
243
+ * is current or clicking the "Free msg" radio button if tab two
244
+ * is current.
245
+ *
246
+ * See
247
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l352).
248
+ */
249
+ export interface WsjtxFreeText {
250
+ /** WSJT-X client name */
251
+ id: string;
252
+ /** Custom text to send. May be truncated if too long */
253
+ text: string;
254
+ /** Whether to also click "Now" to begin transmitting when appropriate */
255
+ send: boolean;
256
+ }
199
257
  /**
200
258
  * The decode message is sent when a new decode is completed, in
201
259
  * this case the 'New' field is true.
202
260
  *
203
261
  * See
204
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l381).
262
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l383).
205
263
  */
206
264
  export interface WsjtxWsprDecode {
207
265
  /** WSJT-X client name */
@@ -225,13 +283,29 @@ export interface WsjtxWsprDecode {
225
283
  /** whether the decode came from playback of a recording */
226
284
  offAir: boolean;
227
285
  }
286
+ /**
287
+ * This message allows the server to set the current current
288
+ * geographical location of operation. The supplied location is
289
+ * not persistent but is used as a session lifetime replacement
290
+ * loction that overrides the Maidenhead grid locater set in the
291
+ * application settings.
292
+ *
293
+ * See
294
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l406).
295
+ */
296
+ export interface WsjtxLocation {
297
+ /** WSJT-X client name */
298
+ id: string;
299
+ /** Maidenhead grid to set as the local station's position */
300
+ location: string;
301
+ }
228
302
  /**
229
303
  * The logged ADIF message is sent to the server(s) when the
230
304
  * WSJT-X user accepts the "Log QSO" dialog by clicking the "OK"
231
305
  * button.
232
306
  *
233
307
  * See
234
- * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/8f99fcceffc76c986413e22ed25b93ef3fc66f1e/tree/Network/NetworkMessage.hpp#l421).
308
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l423).
235
309
  */
236
310
  export interface WsjtxLoggedAdif {
237
311
  /** WSJT-X client name */
@@ -239,6 +313,78 @@ export interface WsjtxLoggedAdif {
239
313
  /** ADIF encoded QSO data */
240
314
  adif: string;
241
315
  }
316
+ /**
317
+ * The server may send this message at any time. The message
318
+ * specifies the background and foreground color that will be
319
+ * used to highlight the specified callsign in the decoded
320
+ * messages printed in the Band Activity panel.
321
+ *
322
+ * See
323
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l444).
324
+ */
325
+ export interface WsjtxHighlightCallsign {
326
+ /** WSJT-X client name */
327
+ id: string;
328
+ /** Which callsign to highlight */
329
+ callsign: string;
330
+ /** Background color. All CSS Color Module Level 4 formats should be valid.
331
+ * See https://www.w3.org/TR/css-color-4/ */
332
+ backgroundColor: string;
333
+ /** Foreground color. All CSS Color Module Level 4 formats should be valid.
334
+ * See https://www.w3.org/TR/css-color-4/ */
335
+ foregroundColor: string;
336
+ /** The "Highlight last" field allows the sender to request that
337
+ * all instances of "Callsign" in the last period only, instead
338
+ * of all instances in all periods, be highlighted. */
339
+ highlightLast: boolean;
340
+ /** Whether to reset the highlighting to default (overrides background and foreground colors) */
341
+ reset: boolean;
342
+ }
343
+ /**
344
+ * The server may send this message at any time. The message
345
+ * specifies the name of the configuration to switch to. The new
346
+ * configuration must exist.
347
+ *
348
+ * See
349
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l445).
350
+ */
351
+ export interface WsjtxSwitchConfiguration {
352
+ /** WSJT-X client name */
353
+ id: string;
354
+ /** New configuration set to use (must already exist) */
355
+ configurationName: string;
356
+ }
357
+ /**
358
+ * The server may send this message at any time. The message
359
+ * specifies various configuration options. For utf8 string
360
+ * fields an empty value implies no change, for the quint32 Rx DF
361
+ * and Frequency Tolerance fields the maximum quint32 value
362
+ * implies no change. Invalid or unrecognized values will be
363
+ * silently ignored.
364
+ *
365
+ * See
366
+ * [WSJT-X source](https://sourceforge.net/p/wsjt/wsjtx/ci/wsjtx-2.5.2/tree/Network/NetworkMessage.hpp#l479).
367
+ */
368
+ export interface WsjtxConfigure {
369
+ /** WSJT-X client name */
370
+ id: string;
371
+ /** Which protocol to decode and send */
372
+ mode: string;
373
+ frequencyTolerance: number;
374
+ /** Which sub-protocol to decode and send */
375
+ submode: string;
376
+ fastMode: boolean;
377
+ /** Which protocol to decode and send */
378
+ trPeriod: number;
379
+ /** Receive delta (above dial) frequency in hertz(?) */
380
+ rxDF: number;
381
+ /** The remote station's callsign */
382
+ dxCall: string;
383
+ /** The remote station's Maidenhead grid */
384
+ dxGrid: string;
385
+ /** Regenerate the standard messages */
386
+ generateMessages: boolean;
387
+ }
242
388
  export interface HamlibRigState {
243
389
  /** Transceiver model name */
244
390
  model: string;
package/package.json CHANGED
@@ -1,13 +1,26 @@
1
1
  {
2
2
  "name": "ngx-kel-agent",
3
- "version": "0.4.4",
3
+ "version": "0.4.10",
4
+ "license": "Apache-2.0",
5
+ "homepage": "https://github.com/k0swe/ngx-kel-agent/tree/main/projects/ngx-kel-agent#readme",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "github:k0swe/ngx-kel-agent"
9
+ },
10
+ "keywords": [
11
+ "amateur radio",
12
+ "angular",
13
+ "ham radio",
14
+ "hamlib",
15
+ "wsjtx"
16
+ ],
4
17
  "peerDependencies": {
5
18
  "@angular/common": "^12",
6
19
  "@angular/core": "^12",
7
20
  "rxjs": "~6.x"
8
21
  },
9
22
  "dependencies": {
10
- "tslib": "^2.3.0"
23
+ "tslib": "2.3.1"
11
24
  },
12
25
  "module": "fesm2015/ngx-kel-agent.mjs",
13
26
  "es2020": "fesm2020/ngx-kel-agent.mjs",