@sinequa/assistant 3.8.5-rc1 → 3.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/chat/styles/assistant.scss +102 -102
  2. package/chat/styles/references.scss +22 -22
  3. package/esm2020/chat/charts/chart/chart.component.mjs +3 -3
  4. package/esm2020/chat/chat-message/chat-message.component.mjs +3 -3
  5. package/esm2020/chat/chat-reference/chat-reference.component.mjs +3 -3
  6. package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +3 -3
  7. package/esm2020/chat/chat.component.mjs +3 -3
  8. package/esm2020/chat/chat.service.mjs +1 -1
  9. package/esm2020/chat/debug-message/debug-message.component.mjs +3 -3
  10. package/esm2020/chat/documents-upload/document-list/document-list.component.mjs +3 -3
  11. package/esm2020/chat/documents-upload/document-overview/document-overview.component.mjs +3 -3
  12. package/esm2020/chat/documents-upload/document-upload/document-upload.component.mjs +3 -3
  13. package/esm2020/chat/documents-upload/documents-upload.model.mjs +1 -1
  14. package/esm2020/chat/documents-upload/documents-upload.service.mjs +1 -1
  15. package/esm2020/chat/format-icon/format-icon.component.mjs +1 -1
  16. package/esm2020/chat/format-icon/icons.mjs +1 -1
  17. package/esm2020/chat/initials-avatar/initials-avatar.component.mjs +3 -3
  18. package/esm2020/chat/instance-manager.service.mjs +1 -1
  19. package/esm2020/chat/messages/de.mjs +1 -1
  20. package/esm2020/chat/messages/en.mjs +1 -1
  21. package/esm2020/chat/messages/fr.mjs +1 -1
  22. package/esm2020/chat/messages/index.mjs +1 -1
  23. package/esm2020/chat/prompt.component.mjs +23 -23
  24. package/esm2020/chat/public-api.mjs +1 -1
  25. package/esm2020/chat/rest-chat.service.mjs +1 -1
  26. package/esm2020/chat/saved-chats/saved-chats.component.mjs +3 -3
  27. package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +3 -3
  28. package/esm2020/chat/types.mjs +1 -1
  29. package/esm2020/chat/websocket-chat.service.mjs +1 -1
  30. package/esm2020/public-api.mjs +1 -1
  31. package/fesm2015/sinequa-assistant-chat.mjs +46 -46
  32. package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
  33. package/fesm2015/sinequa-assistant.mjs.map +1 -1
  34. package/fesm2020/sinequa-assistant-chat.mjs +46 -46
  35. package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
  36. package/fesm2020/sinequa-assistant.mjs.map +1 -1
  37. package/package.json +1 -1
@@ -101,10 +101,10 @@ export class ChatSettingsV3Component {
101
101
  }
102
102
  }
103
103
  ChatSettingsV3Component.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatSettingsV3Component, deps: [], target: i0.ɵɵFactoryTarget.Component });
104
- ChatSettingsV3Component.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatSettingsV3Component, isStandalone: true, selector: "sq-chat-settings-v3", inputs: { instanceId: "instanceId" }, outputs: { _update: "update", _cancel: "cancel" }, ngImport: i0, template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\r\n <div class=\"settings-panel card-body small\" *ngIf=\"config\">\r\n\r\n <h5 *ngIf=\"hasModel\">Model</h5>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\r\n <label for=\"gllmModel\" class=\"form-label\">Model</label>\r\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\r\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\r\n <label for=\"gllmFunctions\" class=\"form-label\">Functions</label>\r\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\r\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\r\n <label class=\"form-check-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\r\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\r\n <label class=\"form-check-label\" for=\"debug\">Debug</label>\r\n </div>\r\n\r\n <details *ngIf=\"hasAdvancedParameters\">\r\n <summary>Advanced parameters</summary>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\r\n <label for=\"temperature\" class=\"form-label\">Temperature: {{config.defaultValues.temperature}}</label>\r\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\r\n [(ngModel)]=\"config.defaultValues.temperature\">\r\n </div>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\r\n <label for=\"top-p\" class=\"form-label\">Top P: {{config.defaultValues.top_p}}</label>\r\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\r\n [(ngModel)]=\"config.defaultValues.top_p\">\r\n </div>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\r\n <label for=\"max-tokens\" class=\"form-label\">Max generated tokens per answer:\r\n {{config.defaultValues.max_tokens}}</label>\r\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\r\n [(ngModel)]=\"config.defaultValues.max_tokens\">\r\n </div>\r\n </details>\r\n\r\n <hr>\r\n\r\n <h5 *ngIf=\"hasPrompts\">Prompts</h5>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\r\n <label for=\"initialSystemPrompt\" class=\"form-label\">System prompt (hidden)</label>\r\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\r\n </div>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\r\n <label for=\"initialUserPrompt\" class=\"form-label\">Initial user prompt</label>\r\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"buttons-panel d-flex justify-content-end\">\r\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">Save</button>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
104
+ ChatSettingsV3Component.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatSettingsV3Component, isStandalone: true, selector: "sq-chat-settings-v3", inputs: { instanceId: "instanceId" }, outputs: { _update: "update", _cancel: "cancel" }, ngImport: i0, template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\n <div class=\"settings-panel card-body small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">Model</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">Model</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">Functions</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-check-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">Debug</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>Advanced parameters</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">Temperature: {{config.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">Top P: {{config.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">Max generated tokens per answer:\n {{config.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">Prompts</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">System prompt (hidden)</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">Initial user prompt</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">Save</button>\n </div>\n\n</div>\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
105
105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatSettingsV3Component, decorators: [{
106
106
  type: Component,
107
- args: [{ selector: 'sq-chat-settings-v3', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\r\n <div class=\"settings-panel card-body small\" *ngIf=\"config\">\r\n\r\n <h5 *ngIf=\"hasModel\">Model</h5>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\r\n <label for=\"gllmModel\" class=\"form-label\">Model</label>\r\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\r\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\r\n <label for=\"gllmFunctions\" class=\"form-label\">Functions</label>\r\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\r\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\r\n <label class=\"form-check-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\r\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\r\n <label class=\"form-check-label\" for=\"debug\">Debug</label>\r\n </div>\r\n\r\n <details *ngIf=\"hasAdvancedParameters\">\r\n <summary>Advanced parameters</summary>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\r\n <label for=\"temperature\" class=\"form-label\">Temperature: {{config.defaultValues.temperature}}</label>\r\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\r\n [(ngModel)]=\"config.defaultValues.temperature\">\r\n </div>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\r\n <label for=\"top-p\" class=\"form-label\">Top P: {{config.defaultValues.top_p}}</label>\r\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\r\n [(ngModel)]=\"config.defaultValues.top_p\">\r\n </div>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\r\n <label for=\"max-tokens\" class=\"form-label\">Max generated tokens per answer:\r\n {{config.defaultValues.max_tokens}}</label>\r\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\r\n [(ngModel)]=\"config.defaultValues.max_tokens\">\r\n </div>\r\n </details>\r\n\r\n <hr>\r\n\r\n <h5 *ngIf=\"hasPrompts\">Prompts</h5>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\r\n <label for=\"initialSystemPrompt\" class=\"form-label\">System prompt (hidden)</label>\r\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\r\n </div>\r\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\r\n <label for=\"initialUserPrompt\" class=\"form-label\">Initial user prompt</label>\r\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"buttons-panel d-flex justify-content-end\">\r\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">Save</button>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}\n"] }]
107
+ args: [{ selector: 'sq-chat-settings-v3', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\n <div class=\"settings-panel card-body small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">Model</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">Model</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.name}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">Functions</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-check-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"showDebugToggle\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">Debug</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>Advanced parameters</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">Temperature: {{config.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">Top P: {{config.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">Max generated tokens per answer:\n {{config.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">Prompts</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">System prompt (hidden)</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">Initial user prompt</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">Save</button>\n </div>\n\n</div>\n", styles: [":host{display:block;width:var(--ast-chat-settings-width, 100%);max-width:100%;height:100%;margin-left:auto;margin-right:auto;padding-top:var(--ast-chat-settings-padding-top, 0);padding-bottom:var(--ast-chat-settings-padding-bottom, 0)}.sq-chat-settings{display:flex;flex-direction:column;height:100%}.sq-chat-settings .settings-panel{flex-grow:1;overflow:auto}.sq-chat-settings .buttons-panel{padding-top:.5rem}\n"] }]
108
108
  }], propDecorators: { instanceId: [{
109
109
  type: Input
110
110
  }], _update: [{
@@ -114,4 +114,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
114
114
  type: Output,
115
115
  args: ["cancel"]
116
116
  }] } });
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1zZXR0aW5ncy12My9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFVckUsTUFBTSxPQUFPLHVCQUF1QjtJQVBwQztRQVdvQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN6QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUkzRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEMsY0FBUyxHQUF1QyxFQUFF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QW9CLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDOztvSEFsSFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsd0tDckJwQywyd0hBaUVBLHNkRDlDWSxZQUFZLCtQQUFFLFdBQVc7MkZBRXhCLHVCQUF1QjtrQkFQbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FHbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQzs4QkFJM0IsVUFBVTtzQkFBbEIsS0FBSztnQkFFWSxPQUFPO3NCQUF4QixNQUFNO3VCQUFDLFFBQVE7Z0JBQ0UsT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZmlsdGVyLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYXBwLXV0aWxzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYmFzZVwiO1xyXG5pbXBvcnQgeyBMb2dpblNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9sb2dpblwiO1xyXG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XHJcblxyXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9jaGF0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSW5zdGFuY2VNYW5hZ2VyU2VydmljZSB9IGZyb20gXCIuLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ2hhdENvbmZpZywgR2xsbU1vZGVsRGVzY3JpcHRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3EtY2hhdC1zZXR0aW5ncy12MycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1wiLi9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0U2V0dGluZ3NWM0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBhcHByb3ByaWF0ZSBjaGF0U2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGZyb20gaW5zdGFuY2VNYW5hZ2VyU2VydmljZSAqL1xyXG4gIEBJbnB1dCgpIGluc3RhbmNlSWQ6IHN0cmluZztcclxuXHJcbiAgQE91dHB1dChcInVwZGF0ZVwiKSBfdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29uZmlnPigpO1xyXG4gIEBPdXRwdXQoXCJjYW5jZWxcIikgX2NhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdENvbmZpZz4oKTtcclxuXHJcbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xyXG4gIGNvbmZpZzogQ2hhdENvbmZpZztcclxuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgc2VsZWN0ZWRNb2RlbDogR2xsbU1vZGVsRGVzY3JpcHRpb24gfCB1bmRlZmluZWQ7XHJcbiAgZnVuY3Rpb25zOiB7bmFtZTogc3RyaW5nLCBlbmFibGVkOiBib29sZWFufVtdID0gW107XHJcbiAgaXNBZG1pbiA9IGZhbHNlO1xyXG4gIHNob3dEZWJ1Z1RvZ2dsZSA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgbG9naW5TZXJ2aWNlID0gaW5qZWN0KExvZ2luU2VydmljZSk7XHJcbiAgcHVibGljIGluc3RhbmNlTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoSW5zdGFuY2VNYW5hZ2VyU2VydmljZSk7XHJcbiAgcHVibGljIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsV2ViU2VydmljZSk7XHJcbiAgcHVibGljIGFwcFNlcnZpY2UgPSBpbmplY3QoQXBwU2VydmljZSk7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICB0aGlzLmxvZ2luU2VydmljZS5ldmVudHMucGlwZShcclxuICAgICAgICBmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxyXG4gICAgICAgIHRhcChfID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckKSxcclxuICAgICAgICBmaWx0ZXIoY29uZmlnID0+ICEhY29uZmlnKVxyXG4gICAgICApLnN1YnNjcmliZShfID0+IHtcclxuICAgICAgICB0aGlzLmlzQWRtaW4gPSB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsIS5pc0FkbWluaXN0cmF0b3I7XHJcbiAgICAgICAgLy8gSW5pdCBjb25maWcgd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGNoYXQgY29uZmlnLCBzbyB0aGF0IGl0IHdvbid0IGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyIHVudGlsIGhlIGNsaWNrcyBvbiBzYXZlXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSkpO1xyXG4gICAgICAgIC8vIFNob3cgZGVidWcgdG9nZ2xlIHdoZXRoZXIgdGhlIHVzZXIgaXMgYW4gYWRtaW4gb3IgYSBkZWxlZ2F0ZWQgYWRtaW4gd2l0aCB0aGUgZGVidWcgbW9kZSBlbmFibGVkIGluIHRoZSB1aVNldHRpbmdzXHJcbiAgICAgICAgdGhpcy5zaG93RGVidWdUb2dnbGUgPSAoXHJcbiAgICAgICAgICB0aGlzLmlzQWRtaW4gfHwgISF0aGlzLmNoYXRTZXJ2aWNlLnVzZXJPdmVycmlkZSQudmFsdWUgfHwgKHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwhLmlzRGVsZWdhdGVkQWRtaW4gJiYgdGhpcy5jb25maWcudWlTZXR0aW5ncy5kZWJ1ZylcclxuICAgICAgICApID8/IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0TW9kZWwodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLCB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkKTtcclxuICAgICAgICB0aGlzLmluaXRGdW5jdGlvbnNMaXN0KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc1Byb21wdHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXHJcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kaXNwbGF5U3lzdGVtUHJvbXB0XHJcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdDtcclxuICB9XHJcblxyXG4gIGdldCBoYXNBZHZhbmNlZFBhcmFtZXRlcnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXHJcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy50ZW1wZXJhdHVyZVxyXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudG9wX3BcclxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLm1heF90b2tlbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzTW9kZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0FkbWluXHJcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5zZXJ2aWNlc01vZGVsc1xyXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MuZnVuY3Rpb25zXHJcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kZWJ1Z1xyXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudGVtcGVyYXR1cmVcclxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRvcF9wXHJcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5tYXhfdG9rZW5zO1xyXG4gIH1cclxuXHJcbiAgaW5zdGFudGlhdGVDaGF0U2VydmljZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2UuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKTtcclxuICB9XHJcblxyXG4gIG9uQ2hhdE1vZGVsQ2hhbmdlKHNlbGVjdGVkTW9kZWw6IEdsbG1Nb2RlbERlc2NyaXB0aW9uKSB7XHJcbiAgICAvLyBVcGRhdGUgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgbW9kZWxcclxuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc2VydmljZV9pZCA9IHNlbGVjdGVkTW9kZWwuc2VydmljZUlkO1xyXG4gICAgdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCA9IHNlbGVjdGVkTW9kZWwubW9kZWxJZDtcclxuICB9XHJcblxyXG4gIGdldEZ1bmN0aW9uRGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXRTZXJ2aWNlLmZ1bmN0aW9ucz8uZmluZChmbiA9PiBmbi5mdW5jdGlvbk5hbWUgPT09IG5hbWUpPy5kZXNjcmlwdGlvbiB8fCBcIlwiO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRnVuY3Rpb25zU2VsZWN0aW9uKG5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gVXBkYXRlIHRoZSBlbmFibGVkIHByb3BlcnR5IG9mIHRoZSBmdW5jdGlvblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucy5maW5kSW5kZXgoZnVuYyA9PiBmdW5jLm5hbWUgPT09IG5hbWUpO1xyXG4gICAgdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnNbaW5kZXhdLmVuYWJsZWQgPSB0aGlzLmZ1bmN0aW9uc1tpbmRleF0uZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEZ1bmN0aW9uc0xpc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZ1bmN0aW9ucyA9IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zLmZpbHRlcihmdW5jID0+ICEhdGhpcy5jaGF0U2VydmljZS5mdW5jdGlvbnM/LmZpbmQoZm4gPT4gZm4uZnVuY3Rpb25OYW1lID09PSBmdW5jLm5hbWUpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhdmUgdGhlIG5ldyBjaGF0IGNvbmZpZyBpbiB0aGUgY2hhdCBzZXJ2aWNlIGFuZCB0aGUgdXNlciBwcmVmZXJlbmNlc1xyXG4gICAqIElmIHRoZSB1c2VyIGhhcyBuZXZlciBtb2RpZmllZCB0aGUgZGVmYXVsdCB2YWx1ZXMsIHdlIG5lZWQgdG8gc2F2ZSB0aGUgaGFzaCBvZiB0aGUgc3RhbmRhcmQgZGVmYXVsdCB2YWx1ZXMsIGFzIGRlZmluZWQgYnkgdGhlIGFkbWluLCBpbiBvcmRlciB0byBwcm9wZXJseSB0cmFjayBjaGFuZ2VzIGFmdGVyd2FyZHMuXHJcbiAgICovXHJcbiAgc2F2ZSgpIHtcclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nc0NvbmZpZyA9IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50c1t0aGlzLmluc3RhbmNlSWRdIHx8IHt9O1xyXG4gICAgaWYgKCF1c2VyU2V0dGluZ3NDb25maWcuZGVmYXVsdFZhbHVlcykgeyAvLyBBdCB0aGlzIHBvaW50LCBpdCBpcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRoZSB1c2VyIG1ha2VzIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzXHJcbiAgICAgIGNvbnN0IHN0YW5kYXJkQ2hhdENvbmZpZyA9IHRoaXMuYXBwU2VydmljZS5hcHA/LmRhdGE/LmFzc2lzdGFudHM/Llt0aGlzLmluc3RhbmNlSWRdO1xyXG4gICAgICBjb25zdCBoYXNoZXMgPSB7IC4uLnVzZXJTZXR0aW5nc0NvbmZpZy5oYXNoZXMsIFwiYXBwbGllZC1kZWZhdWx0VmFsdWVzLWhhc2hcIjogVXRpbHMuc2hhNTEyKEpTT04uc3RyaW5naWZ5KHN0YW5kYXJkQ2hhdENvbmZpZy5kZWZhdWx0VmFsdWVzKSkgfTtcclxuICAgICAgdGhpcy5jaGF0U2VydmljZS51cGRhdGVDaGF0Q29uZmlnKHRoaXMuY29uZmlnLCBoYXNoZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaGF0U2VydmljZS51cGRhdGVDaGF0Q29uZmlnKHRoaXMuY29uZmlnKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KFwiY29uZmlndXJhdGlvbi5lZGl0XCIsIHsgJ2NvbmZpZ3VyYXRpb24nOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZykgfSk7XHJcbiAgICB0aGlzLl91cGRhdGUuZW1pdCh0aGlzLmNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYW5jZWwgdGhlIGN1cnJlbnQgY2hhbmdlc1xyXG4gICAqL1xyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMuX2NhbmNlbC5lbWl0KHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzcS1jaGF0LXNldHRpbmdzXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLmRpc3BsYXlcIj5cclxuICA8ZGl2IGNsYXNzPVwic2V0dGluZ3MtcGFuZWwgY2FyZC1ib2R5IHNtYWxsXCIgKm5nSWY9XCJjb25maWdcIj5cclxuXHJcbiAgICA8aDUgKm5nSWY9XCJoYXNNb2RlbFwiPk1vZGVsPC9oNT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnNlcnZpY2VzTW9kZWxzXCI+XHJcbiAgICAgIDxsYWJlbCBmb3I9XCJnbGxtTW9kZWxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Nb2RlbDwvbGFiZWw+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwiZ2xsbU1vZGVsXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE1vZGVsXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGF0TW9kZWxDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vZGVsIG9mIGNoYXRTZXJ2aWNlLm1vZGVsc1wiIFtuZ1ZhbHVlXT1cIm1vZGVsXCI+e3ttb2RlbC5uYW1lfX08L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItNFwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5mdW5jdGlvbnNcIj5cclxuICAgICAgPGxhYmVsIGZvcj1cImdsbG1GdW5jdGlvbnNcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5GdW5jdGlvbnM8L2xhYmVsPlxyXG4gICAgICA8ZGl2IGlkPVwiZ2xsbUZ1bmN0aW9uc1wiICpuZ0Zvcj1cImxldCBmdW5jIG9mIGZ1bmN0aW9uc1wiIGNsYXNzPVwibXVsdGktb3B0aW9uIGZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgcm9sZT1cInN3aXRjaFwiIFtpZF09XCJmdW5jLm5hbWVcIiBbKG5nTW9kZWwpXT1cImZ1bmMuZW5hYmxlZFwiXHJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVGdW5jdGlvbnNTZWxlY3Rpb24oZnVuYy5uYW1lKVwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImZ1bmMubmFtZVwiIFt0aXRsZV09XCJnZXRGdW5jdGlvbkRlc2NyaXB0aW9uKGZ1bmMubmFtZSlcIj57eyBmdW5jLm5hbWUgfX08L2xhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1iLTJcIiAqbmdJZj1cInNob3dEZWJ1Z1RvZ2dsZVwiPlxyXG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgcm9sZT1cInN3aXRjaFwiIGlkPVwiZGVidWdcIiBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLmRlYnVnXCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJkZWJ1Z1wiPkRlYnVnPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkZXRhaWxzICpuZ0lmPVwiaGFzQWR2YW5jZWRQYXJhbWV0ZXJzXCI+XHJcbiAgICAgIDxzdW1tYXJ5PkFkdmFuY2VkIHBhcmFtZXRlcnM8L3N1bW1hcnk+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXCI+XHJcbiAgICAgICAgPGxhYmVsIGZvcj1cInRlbXBlcmF0dXJlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VGVtcGVyYXR1cmU6IHt7Y29uZmlnLmRlZmF1bHRWYWx1ZXMudGVtcGVyYXR1cmV9fTwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZm9ybS1yYW5nZSBmb3JtLXJhbmdlLXNtXCIgbWluPVwiMFwiIG1heD1cIjJcIiBzdGVwPVwiMC4xXCIgaWQ9XCJ0ZW1wZXJhdHVyZVwiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy50b3BfcFwiPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJ0b3AtcFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlRvcCBQOiB7e2NvbmZpZy5kZWZhdWx0VmFsdWVzLnRvcF9wfX08L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZvcm0tcmFuZ2UgZm9ybS1yYW5nZS1zbVwiIG1pbj1cIjBcIiBtYXg9XCIxXCIgc3RlcD1cIjAuMDVcIiBpZD1cInRvcC1wXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudG9wX3BcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLm1heF90b2tlbnNcIj5cclxuICAgICAgICA8bGFiZWwgZm9yPVwibWF4LXRva2Vuc1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPk1heCBnZW5lcmF0ZWQgdG9rZW5zIHBlciBhbnN3ZXI6XHJcbiAgICAgICAgICB7e2NvbmZpZy5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnN9fTwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZm9ybS1yYW5nZSBmb3JtLXJhbmdlLXNtXCIgbWluPVwiMVwiIG1heD1cIjIwNDhcIiBzdGVwPVwiMVwiIGlkPVwibWF4LXRva2Vuc1wiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnNcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2RldGFpbHM+XHJcblxyXG4gICAgPGhyPlxyXG5cclxuICAgIDxoNSAqbmdJZj1cImhhc1Byb21wdHNcIj5Qcm9tcHRzPC9oNT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLmRpc3BsYXlTeXN0ZW1Qcm9tcHRcIj5cclxuICAgICAgPGxhYmVsIGZvcj1cImluaXRpYWxTeXN0ZW1Qcm9tcHRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TeXN0ZW0gcHJvbXB0IChoaWRkZW4pPC9sYWJlbD5cclxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbml0aWFsU3lzdGVtUHJvbXB0XCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5zeXN0ZW1Qcm9tcHRcIj48L3RleHRhcmVhPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdFwiPlxyXG4gICAgICA8bGFiZWwgZm9yPVwiaW5pdGlhbFVzZXJQcm9tcHRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Jbml0aWFsIHVzZXIgcHJvbXB0PC9sYWJlbD5cclxuICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbml0aWFsVXNlclByb21wdFwiIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudXNlclByb21wdFwiPjwvdGV4dGFyZWE+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJidXR0b25zLXBhbmVsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBtZS0xXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCJjb25maWdcIiAoY2xpY2spPVwic2F2ZSgpXCI+U2F2ZTwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1zZXR0aW5ncy12My5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LXNldHRpbmdzLXYzL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1zZXR0aW5ncy12My9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFVckUsTUFBTSxPQUFPLHVCQUF1QjtJQVBwQztRQVdvQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN6QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUkzRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEMsY0FBUyxHQUF1QyxFQUFF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QW9CLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDOztvSEFsSFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsd0tDckJwQyx5b0hBaUVBLHNkRDlDWSxZQUFZLCtQQUFFLFdBQVc7MkZBRXhCLHVCQUF1QjtrQkFQbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FHbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQzs4QkFJM0IsVUFBVTtzQkFBbEIsS0FBSztnQkFFWSxPQUFPO3NCQUF4QixNQUFNO3VCQUFDLFFBQVE7Z0JBQ0UsT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZmlsdGVyLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9hcHAtdXRpbHNcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYmFzZVwiO1xuaW1wb3J0IHsgTG9naW5TZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbG9naW5cIjtcbmltcG9ydCB7IFByaW5jaXBhbFdlYlNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS93ZWItc2VydmljZXNcIjtcblxuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi4vY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL2luc3RhbmNlLW1hbmFnZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdENvbmZpZywgR2xsbU1vZGVsRGVzY3JpcHRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3EtY2hhdC1zZXR0aW5ncy12MycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LXNldHRpbmdzLXYzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXCIuL2NoYXQtc2V0dGluZ3MtdjMuY29tcG9uZW50LnNjc3NcIl0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBDaGF0U2V0dGluZ3NWM0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIERlZmluZSB0aGUga2V5IGJhc2VkIG9uIGl0LCB0aGUgYXBwcm9wcmlhdGUgY2hhdFNlcnZpY2UgaW5zdGFuY2Ugd2lsbCBiZSByZXR1cm5lZCBmcm9tIGluc3RhbmNlTWFuYWdlclNlcnZpY2UgKi9cbiAgQElucHV0KCkgaW5zdGFuY2VJZDogc3RyaW5nO1xuXG4gIEBPdXRwdXQoXCJ1cGRhdGVcIikgX3VwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdENvbmZpZz4oKTtcbiAgQE91dHB1dChcImNhbmNlbFwiKSBfY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29uZmlnPigpO1xuXG4gIGNoYXRTZXJ2aWNlOiBDaGF0U2VydmljZTtcbiAgY29uZmlnOiBDaGF0Q29uZmlnO1xuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHNlbGVjdGVkTW9kZWw6IEdsbG1Nb2RlbERlc2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBmdW5jdGlvbnM6IHtuYW1lOiBzdHJpbmcsIGVuYWJsZWQ6IGJvb2xlYW59W10gPSBbXTtcbiAgaXNBZG1pbiA9IGZhbHNlO1xuICBzaG93RGVidWdUb2dnbGUgPSBmYWxzZTtcblxuICBwdWJsaWMgbG9naW5TZXJ2aWNlID0gaW5qZWN0KExvZ2luU2VydmljZSk7XG4gIHB1YmxpYyBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEluc3RhbmNlTWFuYWdlclNlcnZpY2UpO1xuICBwdWJsaWMgcHJpbmNpcGFsU2VydmljZSA9IGluamVjdChQcmluY2lwYWxXZWJTZXJ2aWNlKTtcbiAgcHVibGljIGFwcFNlcnZpY2UgPSBpbmplY3QoQXBwU2VydmljZSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICAgIGZpbHRlcihlID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICAgIHRhcChfID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJCksXG4gICAgICAgIGZpbHRlcihjb25maWcgPT4gISFjb25maWcpXG4gICAgICApLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgdGhpcy5pc0FkbWluID0gdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbCEuaXNBZG1pbmlzdHJhdG9yO1xuICAgICAgICAvLyBJbml0IGNvbmZpZyB3aXRoIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgY2hhdCBjb25maWcsIHNvIHRoYXQgaXQgd29uJ3QgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIgdW50aWwgaGUgY2xpY2tzIG9uIHNhdmVcbiAgICAgICAgdGhpcy5jb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJC52YWx1ZSkpO1xuICAgICAgICAvLyBTaG93IGRlYnVnIHRvZ2dsZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGFuIGFkbWluIG9yIGEgZGVsZWdhdGVkIGFkbWluIHdpdGggdGhlIGRlYnVnIG1vZGUgZW5hYmxlZCBpbiB0aGUgdWlTZXR0aW5nc1xuICAgICAgICB0aGlzLnNob3dEZWJ1Z1RvZ2dsZSA9IChcbiAgICAgICAgICB0aGlzLmlzQWRtaW4gfHwgISF0aGlzLmNoYXRTZXJ2aWNlLnVzZXJPdmVycmlkZSQudmFsdWUgfHwgKHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwhLmlzRGVsZWdhdGVkQWRtaW4gJiYgdGhpcy5jb25maWcudWlTZXR0aW5ncy5kZWJ1ZylcbiAgICAgICAgKSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gdGhpcy5jaGF0U2VydmljZS5nZXRNb2RlbCh0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLnNlcnZpY2VfaWQsIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMubW9kZWxfaWQpO1xuICAgICAgICB0aGlzLmluaXRGdW5jdGlvbnNMaXN0KCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0IGhhc1Byb21wdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBZG1pblxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLmRpc3BsYXlTeXN0ZW1Qcm9tcHRcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdDtcbiAgfVxuXG4gIGdldCBoYXNBZHZhbmNlZFBhcmFtZXRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBZG1pblxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLnRlbXBlcmF0dXJlXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudG9wX3BcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5tYXhfdG9rZW5zO1xuICB9XG5cbiAgZ2V0IGhhc01vZGVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWRtaW5cbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy5zZXJ2aWNlc01vZGVsc1xuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLmZ1bmN0aW9uc1xuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLmRlYnVnXG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnVpU2V0dGluZ3MudGVtcGVyYXR1cmVcbiAgICAgIHx8ICEhdGhpcy5jb25maWcudWlTZXR0aW5ncy50b3BfcFxuICAgICAgfHwgISF0aGlzLmNvbmZpZy51aVNldHRpbmdzLm1heF90b2tlbnM7XG4gIH1cblxuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2UuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKTtcbiAgfVxuXG4gIG9uQ2hhdE1vZGVsQ2hhbmdlKHNlbGVjdGVkTW9kZWw6IEdsbG1Nb2RlbERlc2NyaXB0aW9uKSB7XG4gICAgLy8gVXBkYXRlIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIHNlbGVjdGVkIG1vZGVsXG4gICAgdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkID0gc2VsZWN0ZWRNb2RlbC5zZXJ2aWNlSWQ7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCA9IHNlbGVjdGVkTW9kZWwubW9kZWxJZDtcbiAgfVxuXG4gIGdldEZ1bmN0aW9uRGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGF0U2VydmljZS5mdW5jdGlvbnM/LmZpbmQoZm4gPT4gZm4uZnVuY3Rpb25OYW1lID09PSBuYW1lKT8uZGVzY3JpcHRpb24gfHwgXCJcIjtcbiAgfVxuXG4gIHRvZ2dsZUZ1bmN0aW9uc1NlbGVjdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGVuYWJsZWQgcHJvcGVydHkgb2YgdGhlIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucy5maW5kSW5kZXgoZnVuYyA9PiBmdW5jLm5hbWUgPT09IG5hbWUpO1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuZnVuY3Rpb25zW2luZGV4XS5lbmFibGVkID0gdGhpcy5mdW5jdGlvbnNbaW5kZXhdLmVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGluaXRGdW5jdGlvbnNMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuZnVuY3Rpb25zID0gdGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5mdW5jdGlvbnMuZmlsdGVyKGZ1bmMgPT4gISF0aGlzLmNoYXRTZXJ2aWNlLmZ1bmN0aW9ucz8uZmluZChmbiA9PiBmbi5mdW5jdGlvbk5hbWUgPT09IGZ1bmMubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIG5ldyBjaGF0IGNvbmZpZyBpbiB0aGUgY2hhdCBzZXJ2aWNlIGFuZCB0aGUgdXNlciBwcmVmZXJlbmNlc1xuICAgKiBJZiB0aGUgdXNlciBoYXMgbmV2ZXIgbW9kaWZpZWQgdGhlIGRlZmF1bHQgdmFsdWVzLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIGhhc2ggb2YgdGhlIHN0YW5kYXJkIGRlZmF1bHQgdmFsdWVzLCBhcyBkZWZpbmVkIGJ5IHRoZSBhZG1pbiwgaW4gb3JkZXIgdG8gcHJvcGVybHkgdHJhY2sgY2hhbmdlcyBhZnRlcndhcmRzLlxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NDb25maWcgPSB0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudHNbdGhpcy5pbnN0YW5jZUlkXSB8fCB7fTtcbiAgICBpZiAoIXVzZXJTZXR0aW5nc0NvbmZpZy5kZWZhdWx0VmFsdWVzKSB7IC8vIEF0IHRoaXMgcG9pbnQsIGl0IGlzIHRoZSB2ZXJ5IGZpcnN0IHRpbWUgdGhlIHVzZXIgbWFrZXMgY2hhbmdlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGNvbnN0IHN0YW5kYXJkQ2hhdENvbmZpZyA9IHRoaXMuYXBwU2VydmljZS5hcHA/LmRhdGE/LmFzc2lzdGFudHM/Llt0aGlzLmluc3RhbmNlSWRdO1xuICAgICAgY29uc3QgaGFzaGVzID0geyAuLi51c2VyU2V0dGluZ3NDb25maWcuaGFzaGVzLCBcImFwcGxpZWQtZGVmYXVsdFZhbHVlcy1oYXNoXCI6IFV0aWxzLnNoYTUxMihKU09OLnN0cmluZ2lmeShzdGFuZGFyZENoYXRDb25maWcuZGVmYXVsdFZhbHVlcykpIH07XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnVwZGF0ZUNoYXRDb25maWcodGhpcy5jb25maWcsIGhhc2hlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UudXBkYXRlQ2hhdENvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2VuZXJhdGVBdWRpdEV2ZW50KFwiY29uZmlndXJhdGlvbi5lZGl0XCIsIHsgJ2NvbmZpZ3VyYXRpb24nOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZykgfSk7XG4gICAgdGhpcy5fdXBkYXRlLmVtaXQodGhpcy5jb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCB0aGUgY3VycmVudCBjaGFuZ2VzXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5fY2FuY2VsLmVtaXQodGhpcy5jaGF0U2VydmljZS5hc3Npc3RhbnRDb25maWckLnZhbHVlKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNxLWNoYXQtc2V0dGluZ3NcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVwiPlxuICA8ZGl2IGNsYXNzPVwic2V0dGluZ3MtcGFuZWwgY2FyZC1ib2R5IHNtYWxsXCIgKm5nSWY9XCJjb25maWdcIj5cblxuICAgIDxoNSAqbmdJZj1cImhhc01vZGVsXCI+TW9kZWw8L2g1PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLnNlcnZpY2VzTW9kZWxzXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiZ2xsbU1vZGVsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TW9kZWw8L2xhYmVsPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJnbGxtTW9kZWxcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTW9kZWxcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYXRNb2RlbENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vZGVsIG9mIGNoYXRTZXJ2aWNlLm1vZGVsc1wiIFtuZ1ZhbHVlXT1cIm1vZGVsXCI+e3ttb2RlbC5uYW1lfX08L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZnVuY3Rpb25zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiZ2xsbUZ1bmN0aW9uc1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkZ1bmN0aW9uczwvbGFiZWw+XG4gICAgICA8ZGl2IGlkPVwiZ2xsbUZ1bmN0aW9uc1wiICpuZ0Zvcj1cImxldCBmdW5jIG9mIGZ1bmN0aW9uc1wiIGNsYXNzPVwibXVsdGktb3B0aW9uIGZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBbaWRdPVwiZnVuYy5uYW1lXCIgWyhuZ01vZGVsKV09XCJmdW5jLmVuYWJsZWRcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZUZ1bmN0aW9uc1NlbGVjdGlvbihmdW5jLm5hbWUpXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImZ1bmMubmFtZVwiIFt0aXRsZV09XCJnZXRGdW5jdGlvbkRlc2NyaXB0aW9uKGZ1bmMubmFtZSlcIj57eyBmdW5jLm5hbWUgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBtYi0yXCIgKm5nSWY9XCJzaG93RGVidWdUb2dnbGVcIj5cbiAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiByb2xlPVwic3dpdGNoXCIgaWQ9XCJkZWJ1Z1wiIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMuZGVidWdcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJkZWJ1Z1wiPkRlYnVnPC9sYWJlbD5cbiAgICA8L2Rpdj5cblxuICAgIDxkZXRhaWxzICpuZ0lmPVwiaGFzQWR2YW5jZWRQYXJhbWV0ZXJzXCI+XG4gICAgICA8c3VtbWFyeT5BZHZhbmNlZCBwYXJhbWV0ZXJzPC9zdW1tYXJ5PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MudGVtcGVyYXR1cmVcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cInRlbXBlcmF0dXJlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VGVtcGVyYXR1cmU6IHt7Y29uZmlnLmRlZmF1bHRWYWx1ZXMudGVtcGVyYXR1cmV9fTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZvcm0tcmFuZ2UgZm9ybS1yYW5nZS1zbVwiIG1pbj1cIjBcIiBtYXg9XCIyXCIgc3RlcD1cIjAuMVwiIGlkPVwidGVtcGVyYXR1cmVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMudGVtcGVyYXR1cmVcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MudG9wX3BcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cInRvcC1wXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VG9wIFA6IHt7Y29uZmlnLmRlZmF1bHRWYWx1ZXMudG9wX3B9fTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZvcm0tcmFuZ2UgZm9ybS1yYW5nZS1zbVwiIG1pbj1cIjBcIiBtYXg9XCIxXCIgc3RlcD1cIjAuMDVcIiBpZD1cInRvcC1wXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kZWZhdWx0VmFsdWVzLnRvcF9wXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJpc0FkbWluIHx8IGNvbmZpZy51aVNldHRpbmdzLm1heF90b2tlbnNcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cIm1heC10b2tlbnNcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5NYXggZ2VuZXJhdGVkIHRva2VucyBwZXIgYW5zd2VyOlxuICAgICAgICAgIHt7Y29uZmlnLmRlZmF1bHRWYWx1ZXMubWF4X3Rva2Vuc319PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZm9ybS1yYW5nZSBmb3JtLXJhbmdlLXNtXCIgbWluPVwiMVwiIG1heD1cIjIwNDhcIiBzdGVwPVwiMVwiIGlkPVwibWF4LXRva2Vuc1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy5tYXhfdG9rZW5zXCI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2RldGFpbHM+XG5cbiAgICA8aHI+XG5cbiAgICA8aDUgKm5nSWY9XCJoYXNQcm9tcHRzXCI+UHJvbXB0czwvaDU+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTJcIiAqbmdJZj1cImlzQWRtaW4gfHwgY29uZmlnLnVpU2V0dGluZ3MuZGlzcGxheVN5c3RlbVByb21wdFwiPlxuICAgICAgPGxhYmVsIGZvcj1cImluaXRpYWxTeXN0ZW1Qcm9tcHRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TeXN0ZW0gcHJvbXB0IChoaWRkZW4pPC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiaW5pdGlhbFN5c3RlbVByb21wdFwiIFsobmdNb2RlbCldPVwiY29uZmlnLmRlZmF1bHRWYWx1ZXMuc3lzdGVtUHJvbXB0XCI+PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwiaXNBZG1pbiB8fCBjb25maWcudWlTZXR0aW5ncy5kaXNwbGF5VXNlclByb21wdFwiPlxuICAgICAgPGxhYmVsIGZvcj1cImluaXRpYWxVc2VyUHJvbXB0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+SW5pdGlhbCB1c2VyIHByb21wdDwvbGFiZWw+XG4gICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImluaXRpYWxVc2VyUHJvbXB0XCIgWyhuZ01vZGVsKV09XCJjb25maWcuZGVmYXVsdFZhbHVlcy51c2VyUHJvbXB0XCI+PC90ZXh0YXJlYT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1wYW5lbCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTFcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCJjb25maWdcIiAoY2xpY2spPVwic2F2ZSgpXCI+U2F2ZTwvYnV0dG9uPlxuICA8L2Rpdj5cblxuPC9kaXY+XG4iXX0=