@hivegpt/hiveai-angular 0.0.595 → 0.0.596

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.
@@ -74,9 +74,8 @@ export class VoiceAgentModalComponent {
74
74
  this.subscriptions.push(this.voiceAgentService.audioLevels$.subscribe(levels => {
75
75
  this.audioLevels = levels;
76
76
  }));
77
- // Modal opens in idle state, then immediately starts connecting.
78
- this.voiceAgentService.resetToIdle();
79
- void this.startCall();
77
+ // Always start from a fresh voice session to avoid stale/disconnected state flashes.
78
+ void this.openFreshCallSession();
80
79
  }
81
80
  ngOnDestroy() {
82
81
  this.subscriptions.forEach(sub => sub.unsubscribe());
@@ -99,6 +98,10 @@ export class VoiceAgentModalComponent {
99
98
  async disconnect() {
100
99
  await this.voiceAgentService.disconnect();
101
100
  }
101
+ async openFreshCallSession() {
102
+ await this.voiceAgentService.prepareFreshSession();
103
+ await this.startCall();
104
+ }
102
105
  toggleMic() {
103
106
  this.voiceAgentService.toggleMic();
104
107
  }
@@ -130,9 +133,8 @@ export class VoiceAgentModalComponent {
130
133
  }
131
134
  }
132
135
  /** Call Again: reset to idle then start a new call. */
133
- callAgain() {
134
- this.voiceAgentService.resetToIdle();
135
- this.startCall();
136
+ async callAgain() {
137
+ await this.openFreshCallSession();
136
138
  }
137
139
  /** Back to Chat: close modal and disconnect. */
138
140
  backToChat() {
@@ -142,17 +144,17 @@ export class VoiceAgentModalComponent {
142
144
  hangUp() {
143
145
  this.disconnect();
144
146
  }
145
- endCall() {
146
- this.disconnect();
147
+ async endCall() {
148
+ await this.disconnect();
147
149
  this.onCloseCallback?.();
148
150
  this.close.emit();
149
151
  }
150
152
  }
151
153
  VoiceAgentModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VoiceAgentModalComponent, deps: [{ token: i1.VoiceAgentService }, { token: i2.AudioAnalyzerService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
152
- VoiceAgentModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: VoiceAgentModalComponent, selector: "hivegpt-voice-agent-modal", inputs: { apiUrl: "apiUrl", token: "token", botId: "botId", conversationId: "conversationId", apiKey: "apiKey", eventToken: "eventToken", eventId: "eventId", eventUrl: "eventUrl", domainAuthority: "domainAuthority", agentName: "agentName", agentRole: "agentRole", agentAvatar: "agentAvatar", usersApiUrl: "usersApiUrl" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"voice-agent-modal-overlay\" (click)=\"endCall()\">\n <div\n class=\"voice-container voice-agent-modal\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 1C8.13 1 5 4.13 5 8V14C5 17.87 8.13 21 12 21C15.87 21 19 17.87 19 14V8C19 4.13 15.87 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23C10.34 23 9 21.66 9 20H15C15 21.66 13.66 23 12 23Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n <span class=\"header-title\">Voice</span>\n </div>\n <button\n class=\"close-button\"\n (click)=\"endCall()\"\n type=\"button\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Avatar Section with glow -->\n <div class=\"avatar-section\">\n <div class=\"avatar-glow\" [class.glow-talking]=\"isBotTalking\" [class.glow-listening]=\"callState === 'listening'\"></div>\n\n <!-- Particle ring \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"particles-container\">\n <span *ngFor=\"let i of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\"\n class=\"particle\"\n [style.--i]=\"i\"\n [style.animationDelay]=\"(i * 0.15) + 's'\">\n </span>\n </div>\n\n <div class=\"avatar-wrapper\" [class.speaking]=\"isBotTalking\" [class.listening]=\"callState === 'listening'\">\n <img class=\"avatar-image\" [src]=\"displayAvatarUrl\" alt=\"Nia\" />\n </div>\n </div>\n\n <!-- Agent Info: Nia + Collaboration Manager AI Agent Specialist -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">\n Nia\n <span class=\"ai-badge\">AI</span>\n </div>\n <p class=\"agent-role\">COP30 AI Agent </p>\n </div>\n\n <!-- Start Call (when idle only) -->\n <div *ngIf=\"callState === 'idle'\" class=\"start-call-section\">\n <p *ngIf=\"statusText === 'Connection failed'\" class=\"error-message\">\n {{ statusText }}\n </p>\n <button\n class=\"start-call-button\"\n type=\"button\"\n [disabled]=\"isConnecting\"\n (click)=\"startCall()\"\n >\n <span *ngIf=\"isConnecting\">Connecting...</span>\n <span *ngIf=\"!isConnecting && statusText === 'Connection failed'\"\n >Retry</span\n >\n <span *ngIf=\"!isConnecting && statusText !== 'Connection failed'\"\n >Start Call</span\n >\n </button>\n </div>\n\n <!-- Call Ended: status + Call Again / Back to Chat -->\n <div *ngIf=\"callState === 'ended'\" class=\"call-ended-section\">\n <p class=\"call-ended-status\">\n <span class=\"status-text\">Call Ended</span>\n <span class=\"status-timer\">{{ duration }}</span>\n </p>\n <div class=\"call-ended-controls\">\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"callAgain()\"\n title=\"Call Again\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n Call Again\n </button>\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"backToChat()\"\n title=\"Back to Chat\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n Back to Chat\n </button>\n </div>\n </div>\n\n <!-- Status (when connecting or in-call: Talking... / Listening / Connected + timer) -->\n <div\n class=\"status-indicator status-inline\"\n *ngIf=\"callState !== 'idle' && callState !== 'ended'\"\n >\n <div *ngIf=\"callState === 'connecting'\" class=\"status-connecting\">\n <svg\n class=\"spinner\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"31.416\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 31.416;15.708 15.708;0 31.416;0 31.416\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-15.708;-31.416;-31.416\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n <span class=\"status-text\">{{ statusText }}</span>\n </div>\n <div\n *ngIf=\"callState !== 'connecting'\"\n class=\"status-connected status-inline-row\"\n >\n <span class=\"status-text\" [class.status-talking]=\"isBotTalking\" [class.status-listening]=\"callState === 'listening'\" [class.status-processing]=\"isProcessing\">\n {{ statusLabel }}\n </span>\n\n <!-- Animated bars \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"voice-visualizer\">\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n </div>\n\n <!-- Bouncing dots \u2014 visible during processing pause -->\n <div *ngIf=\"isProcessing\" class=\"processing-dots\">\n <span></span><span></span><span></span>\n </div>\n\n <span class=\"status-timer\">{{ duration }}</span>\n </div>\n </div>\n\n <!-- Waveform: always visible during an active call, active (coloured) when user speaks -->\n <div\n *ngIf=\"callState === 'connected' || callState === 'listening' || callState === 'talking'\"\n class=\"waveform-container\"\n >\n <div class=\"waveform-bars\">\n <div\n *ngFor=\"let level of audioLevels; let i = index\"\n class=\"waveform-bar\"\n [class.active]=\"isUserActive\"\n [style.height.px]=\"getWaveformHeight(level, i)\"\n ></div>\n </div>\n </div>\n\n <!-- Call Controls (when connected) -->\n <div\n class=\"controls\"\n *ngIf=\"\n callState === 'connected' ||\n callState === 'listening' ||\n callState === 'talking'\n \"\n >\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn mic-btn\"\n [class.muted]=\"isMicMuted\"\n (click)=\"toggleMic()\"\n type=\"button\"\n [title]=\"isMicMuted ? 'Unmute' : 'Mute'\"\n >\n <!-- Microphone icon (unmuted) -->\n <svg\n *ngIf=\"!isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n </svg>\n <!-- Microphone icon (muted) -->\n <svg\n *ngIf=\"isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n <path\n d=\"M2 2 L30 30\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Mute</span>\n </div>\n\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn end-call-btn\"\n (click)=\"hangUp()\"\n type=\"button\"\n title=\"End Call\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">End Call</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.voice-agent-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;justify-content:flex-end;align-items:flex-end;z-index:99999;backdrop-filter:blur(4px);padding:24px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.voice-container.voice-agent-modal{width:100%;max-width:440px;background:white;border-radius:30px;padding:30px;box-shadow:0 10px 40px #0000001a;text-align:center;position:relative;display:flex;flex-direction:column;align-items:center;min-height:600px;animation:modalEnter .3s ease-out}@keyframes modalEnter{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.header{width:100%;display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:28px;height:28px;background:#0f172a;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center}.header-title{font-size:18px;font-weight:500;color:#0f172a}.close-button{background:none;border:none;cursor:pointer;padding:8px;color:#0f172a;display:flex;align-items:center;justify-content:center;transition:color .2s}.close-button:hover{color:#475569}.avatar-section{position:relative;margin-bottom:24px}.avatar-wrapper{width:180px;height:180px;border-radius:50%;padding:6px;background:#0ea5a4;background:linear-gradient(135deg,#ccfbf1 0%,#0ea5a4 100%);display:flex;align-items:center;justify-content:center;position:relative}.avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover;border:4px solid white}.avatar-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:240px;height:240px;background:radial-gradient(circle,rgba(14,165,164,.2) 0%,transparent 70%);z-index:-1;pointer-events:none;transition:opacity .4s ease}.avatar-glow.glow-talking{width:280px;height:280px;background:radial-gradient(circle,rgba(14,165,164,.35) 0%,transparent 65%);animation:glowPulse 1.5s ease-in-out infinite}.avatar-glow.glow-listening{background:radial-gradient(circle,rgba(99,102,241,.25) 0%,transparent 65%)}@keyframes glowPulse{0%,to{opacity:.7;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}}.avatar-wrapper.speaking{animation:avatarPulse 1.4s ease-in-out infinite}.avatar-wrapper.listening{animation:avatarListenPulse 1.8s ease-in-out infinite}@keyframes avatarPulse{0%,to{box-shadow:0 0 #0ea5a480}50%{box-shadow:0 0 0 18px #0ea5a400}}@keyframes avatarListenPulse{0%,to{box-shadow:0 0 #6366f166}50%{box-shadow:0 0 0 14px #6366f100}}.particles-container{position:absolute;top:50%;left:50%;width:0;height:0;z-index:2;pointer-events:none}.particle{position:absolute;width:7px;height:7px;border-radius:50%;background:#0ea5a4;opacity:0;animation:particleOrbit 2.4s ease-in-out infinite;animation-delay:var(--delay, 0s);transform-origin:0 0}@keyframes particleOrbit{0%{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg)) translateY(-108px) scale(.4)}25%{opacity:.9}75%{opacity:.9}to{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg + 45deg)) translateY(-108px) scale(.4)}}.agent-info{margin-bottom:40px}.agent-name{font-size:24px;font-weight:700;color:#0f172a;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:8px}.ai-badge{background:#0ea5a4;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px}.agent-role{font-size:16px;color:#0f172a;font-weight:500;margin:0}.start-call-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.error-message{color:#dc2626;font-size:14px;margin:0}.start-call-button{padding:14px 32px;font-size:16px;font-weight:600;color:#fff;background:#0ea5a4;border:none;border-radius:12px;cursor:pointer;transition:background .2s}.start-call-button:hover:not(:disabled){background:#0d9488}.start-call-button:disabled{opacity:.7;cursor:not-allowed!important}.status-indicator{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:10px}.status-connecting{display:flex;align-items:center;gap:12px}.spinner{color:#0ea5a4;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-text{font-size:16px;color:#0f172a;font-weight:400;transition:color .25s ease}.status-text.status-talking{color:#0ea5a4;font-weight:500}.status-text.status-listening{color:#2a2a2c;font-weight:500}.status-text.status-processing{color:#94a3b8}.status-timer{font-size:16px;color:#0f172a;font-weight:500}.voice-visualizer{display:flex;align-items:center;gap:3px;height:18px}.vbar{width:3px;height:6px;background:#0ea5a4;border-radius:2px;animation:vbarBounce 1s ease-in-out infinite}.vbar:nth-child(1){animation-delay:0s}.vbar:nth-child(2){animation-delay:.15s}.vbar:nth-child(3){animation-delay:.3s}.vbar:nth-child(4){animation-delay:.45s}@keyframes vbarBounce{0%,to{height:4px;opacity:.5}50%{height:16px;opacity:1}}.processing-dots{display:flex;align-items:center;gap:4px}.processing-dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:#94a3b8;animation:dotFade 1.2s ease-in-out infinite}.processing-dots span:nth-child(1){animation-delay:0s}.processing-dots span:nth-child(2){animation-delay:.2s}.processing-dots span:nth-child(3){animation-delay:.4s}@keyframes dotFade{0%,80%,to{transform:scale(.8);opacity:.4}40%{transform:scale(1.2);opacity:1}}.status-connected{display:flex;flex-direction:column;align-items:center;gap:4px}.status-inline .status-inline-row{flex-direction:row;align-items:center;gap:8px}.call-ended-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.call-ended-status{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;font-size:16px;color:#0f172a}.call-ended-status .status-text{font-weight:400}.call-ended-status .status-timer{font-weight:500}.call-ended-controls{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}.action-btn{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:24px;font-size:14px;font-weight:500;color:#0f172a;background:white;border:1px solid #e2e8f0;cursor:pointer;transition:background .2s ease}.action-btn:hover{background:#f8fafc}.waveform-container{width:100%;display:flex;align-items:center;justify-content:center;height:56px;margin-bottom:10px;padding:0 8px}.waveform-bars{display:flex;align-items:center;justify-content:center;gap:2px;height:56px;width:100%}.waveform-bar{flex:0 0 2px;width:2px;min-height:2px;border-radius:99px;background:#cbd5e1;transition:height .1s ease-out}.waveform-bar.active{background:linear-gradient(180deg,#0ea5a4 0%,#0d9488 100%);box-shadow:0 0 4px #0ea5a480}.controls{display:flex;align-items:center;justify-content:center;gap:24px;width:100%}.control-btn{width:60px;height:60px;border-radius:50%;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:transform .2s ease}.control-btn:hover{transform:scale(1.05)}.control-btn:active{transform:scale(.95)}.control-label{font-size:12px;font-weight:500;color:#0f172a}.mic-btn{background:#e2e8f0;color:#475569}.mic-btn .control-label{color:#475569}.mic-btn.muted{background:#e2e8f0;color:#475569}.end-call-btn{background:#ef4444;color:#fff}.end-call-btn .control-label{color:#fff}.end-call-btn:hover{background:#dc2626}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
154
+ VoiceAgentModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: VoiceAgentModalComponent, selector: "hivegpt-voice-agent-modal", inputs: { apiUrl: "apiUrl", token: "token", botId: "botId", conversationId: "conversationId", apiKey: "apiKey", eventToken: "eventToken", eventId: "eventId", eventUrl: "eventUrl", domainAuthority: "domainAuthority", agentName: "agentName", agentRole: "agentRole", agentAvatar: "agentAvatar", usersApiUrl: "usersApiUrl" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"voice-agent-modal-overlay\" (click)=\"endCall()\">\n <div\n class=\"voice-container voice-agent-modal\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 1C8.13 1 5 4.13 5 8V14C5 17.87 8.13 21 12 21C15.87 21 19 17.87 19 14V8C19 4.13 15.87 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23C10.34 23 9 21.66 9 20H15C15 21.66 13.66 23 12 23Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n <span class=\"header-title\">Voice</span>\n </div>\n <button\n class=\"close-button\"\n (click)=\"endCall()\"\n type=\"button\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Avatar Section with glow -->\n <div class=\"avatar-section\">\n <div class=\"avatar-glow\" [class.glow-talking]=\"isBotTalking\" [class.glow-listening]=\"callState === 'listening'\"></div>\n\n <!-- Particle ring \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"particles-container\">\n <span *ngFor=\"let i of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\"\n class=\"particle\"\n [style.--i]=\"i\"\n [style.animationDelay]=\"(i * 0.15) + 's'\">\n </span>\n </div>\n\n <div class=\"avatar-wrapper\" [class.speaking]=\"isBotTalking\" [class.listening]=\"callState === 'listening'\">\n <img class=\"avatar-image\" [src]=\"displayAvatarUrl\" alt=\"Nia\" />\n </div>\n </div>\n\n <!-- Agent Info: Nia + Collaboration Manager AI Agent Specialist -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">\n Nia\n <span class=\"ai-badge\">AI</span>\n </div>\n <p class=\"agent-role\">COP30 AI Agent </p>\n </div>\n\n <!-- Start Call (when idle only) -->\n <div *ngIf=\"callState === 'idle'\" class=\"start-call-section\">\n <p *ngIf=\"statusText === 'Connection failed'\" class=\"error-message\">\n {{ statusText }}\n </p>\n <button\n class=\"start-call-button\"\n type=\"button\"\n [disabled]=\"isConnecting\"\n (click)=\"startCall()\"\n >\n <span *ngIf=\"isConnecting\">Connecting...</span>\n <span *ngIf=\"!isConnecting && statusText === 'Connection failed'\"\n >Retry</span\n >\n <span *ngIf=\"!isConnecting && statusText !== 'Connection failed'\"\n >Start Call</span\n >\n </button>\n </div>\n\n <!-- Call Ended: status + Call Again / Back to Chat -->\n <div *ngIf=\"callState === 'ended'\" class=\"call-ended-section\">\n <p class=\"call-ended-status\">\n <span class=\"status-text\">Call Ended</span>\n <span class=\"status-timer\">{{ duration }}</span>\n </p>\n <div class=\"call-ended-controls\">\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"callAgain()\"\n title=\"Call Again\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n Call Again\n </button>\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"backToChat()\"\n title=\"Back to Chat\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n Back to Chat\n </button>\n </div>\n </div>\n\n <!-- Status (when connecting or in-call: Talking... / Listening / Connected + timer) -->\n <div\n class=\"status-indicator status-inline\"\n *ngIf=\"callState !== 'idle' && callState !== 'ended'\"\n >\n <div *ngIf=\"callState === 'connecting'\" class=\"status-connecting\">\n <svg\n class=\"spinner\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"31.416\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 31.416;15.708 15.708;0 31.416;0 31.416\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-15.708;-31.416;-31.416\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n <span class=\"status-text\">{{ statusText }}</span>\n </div>\n <div\n *ngIf=\"callState !== 'connecting'\"\n class=\"status-connected status-inline-row\"\n >\n <span class=\"status-text\" [class.status-talking]=\"isBotTalking\" [class.status-listening]=\"callState === 'listening'\" [class.status-processing]=\"isProcessing\">\n {{ statusLabel }}\n </span>\n\n <!-- Animated bars \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"voice-visualizer\">\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n </div>\n\n <!-- Bouncing dots \u2014 visible during processing pause -->\n <div *ngIf=\"isProcessing\" class=\"processing-dots\">\n <span></span><span></span><span></span>\n </div>\n\n <span class=\"status-timer\">{{ duration }}</span>\n </div>\n </div>\n\n <!-- Waveform: always visible during an active call, active (coloured) when user speaks -->\n <div\n *ngIf=\"callState === 'connected' || callState === 'listening' || callState === 'talking'\"\n class=\"waveform-container\"\n >\n <div class=\"waveform-bars\">\n <div\n *ngFor=\"let level of audioLevels; let i = index\"\n class=\"waveform-bar\"\n [class.active]=\"isUserActive\"\n [style.height.px]=\"getWaveformHeight(level, i)\"\n ></div>\n </div>\n </div>\n\n <!-- Call Controls (when connected) -->\n <div\n class=\"controls\"\n *ngIf=\"\n callState === 'connecting' ||\n callState === 'connected' ||\n callState === 'listening' ||\n callState === 'talking'\n \"\n >\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn mic-btn\"\n [class.muted]=\"isMicMuted\"\n (click)=\"toggleMic()\"\n type=\"button\"\n [title]=\"isMicMuted ? 'Unmute' : 'Mute'\"\n >\n <!-- Microphone icon (unmuted) -->\n <svg\n *ngIf=\"!isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n </svg>\n <!-- Microphone icon (muted) -->\n <svg\n *ngIf=\"isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n <path\n d=\"M2 2 L30 30\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Mute</span>\n </div>\n\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn end-call-btn\"\n (click)=\"hangUp()\"\n type=\"button\"\n title=\"End Call\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">End Call</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.voice-agent-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;justify-content:flex-end;align-items:flex-end;z-index:99999;backdrop-filter:blur(4px);padding:24px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.voice-container.voice-agent-modal{width:100%;max-width:440px;background:white;border-radius:30px;padding:30px;box-shadow:0 10px 40px #0000001a;text-align:center;position:relative;display:flex;flex-direction:column;align-items:center;min-height:600px;animation:modalEnter .3s ease-out}@keyframes modalEnter{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.header{width:100%;display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:28px;height:28px;background:#0f172a;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center}.header-title{font-size:18px;font-weight:500;color:#0f172a}.close-button{background:none;border:none;cursor:pointer;padding:8px;color:#0f172a;display:flex;align-items:center;justify-content:center;transition:color .2s}.close-button:hover{color:#475569}.avatar-section{position:relative;margin-bottom:24px}.avatar-wrapper{width:180px;height:180px;border-radius:50%;padding:6px;background:#0ea5a4;background:linear-gradient(135deg,#ccfbf1 0%,#0ea5a4 100%);display:flex;align-items:center;justify-content:center;position:relative}.avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover;border:4px solid white}.avatar-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:240px;height:240px;background:radial-gradient(circle,rgba(14,165,164,.2) 0%,transparent 70%);z-index:-1;pointer-events:none;transition:opacity .4s ease}.avatar-glow.glow-talking{width:280px;height:280px;background:radial-gradient(circle,rgba(14,165,164,.35) 0%,transparent 65%);animation:glowPulse 1.5s ease-in-out infinite}.avatar-glow.glow-listening{background:radial-gradient(circle,rgba(99,102,241,.25) 0%,transparent 65%)}@keyframes glowPulse{0%,to{opacity:.7;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}}.avatar-wrapper.speaking{animation:avatarPulse 1.4s ease-in-out infinite}.avatar-wrapper.listening{animation:avatarListenPulse 1.8s ease-in-out infinite}@keyframes avatarPulse{0%,to{box-shadow:0 0 #0ea5a480}50%{box-shadow:0 0 0 18px #0ea5a400}}@keyframes avatarListenPulse{0%,to{box-shadow:0 0 #6366f166}50%{box-shadow:0 0 0 14px #6366f100}}.particles-container{position:absolute;top:50%;left:50%;width:0;height:0;z-index:2;pointer-events:none}.particle{position:absolute;width:7px;height:7px;border-radius:50%;background:#0ea5a4;opacity:0;animation:particleOrbit 2.4s ease-in-out infinite;animation-delay:var(--delay, 0s);transform-origin:0 0}@keyframes particleOrbit{0%{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg)) translateY(-108px) scale(.4)}25%{opacity:.9}75%{opacity:.9}to{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg + 45deg)) translateY(-108px) scale(.4)}}.agent-info{margin-bottom:40px}.agent-name{font-size:24px;font-weight:700;color:#0f172a;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:8px}.ai-badge{background:#0ea5a4;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px}.agent-role{font-size:16px;color:#0f172a;font-weight:500;margin:0}.start-call-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.error-message{color:#dc2626;font-size:14px;margin:0}.start-call-button{padding:14px 32px;font-size:16px;font-weight:600;color:#fff;background:#0ea5a4;border:none;border-radius:12px;cursor:pointer;transition:background .2s}.start-call-button:hover:not(:disabled){background:#0d9488}.start-call-button:disabled{opacity:.7;cursor:not-allowed!important}.status-indicator{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:10px}.status-connecting{display:flex;align-items:center;gap:12px}.spinner{color:#0ea5a4;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-text{font-size:16px;color:#0f172a;font-weight:400;transition:color .25s ease}.status-text.status-talking{color:#0ea5a4;font-weight:500}.status-text.status-listening{color:#2a2a2c;font-weight:500}.status-text.status-processing{color:#94a3b8}.status-timer{font-size:16px;color:#0f172a;font-weight:500}.voice-visualizer{display:flex;align-items:center;gap:3px;height:18px}.vbar{width:3px;height:6px;background:#0ea5a4;border-radius:2px;animation:vbarBounce 1s ease-in-out infinite}.vbar:nth-child(1){animation-delay:0s}.vbar:nth-child(2){animation-delay:.15s}.vbar:nth-child(3){animation-delay:.3s}.vbar:nth-child(4){animation-delay:.45s}@keyframes vbarBounce{0%,to{height:4px;opacity:.5}50%{height:16px;opacity:1}}.processing-dots{display:flex;align-items:center;gap:4px}.processing-dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:#94a3b8;animation:dotFade 1.2s ease-in-out infinite}.processing-dots span:nth-child(1){animation-delay:0s}.processing-dots span:nth-child(2){animation-delay:.2s}.processing-dots span:nth-child(3){animation-delay:.4s}@keyframes dotFade{0%,80%,to{transform:scale(.8);opacity:.4}40%{transform:scale(1.2);opacity:1}}.status-connected{display:flex;flex-direction:column;align-items:center;gap:4px}.status-inline .status-inline-row{flex-direction:row;align-items:center;gap:8px}.call-ended-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.call-ended-status{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;font-size:16px;color:#0f172a}.call-ended-status .status-text{font-weight:400}.call-ended-status .status-timer{font-weight:500}.call-ended-controls{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}.action-btn{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:24px;font-size:14px;font-weight:500;color:#0f172a;background:white;border:1px solid #e2e8f0;cursor:pointer;transition:background .2s ease}.action-btn:hover{background:#f8fafc}.waveform-container{width:100%;display:flex;align-items:center;justify-content:center;height:56px;margin-bottom:10px;padding:0 8px}.waveform-bars{display:flex;align-items:center;justify-content:center;gap:2px;height:56px;width:100%}.waveform-bar{flex:0 0 2px;width:2px;min-height:2px;border-radius:99px;background:#cbd5e1;transition:height .1s ease-out}.waveform-bar.active{background:linear-gradient(180deg,#0ea5a4 0%,#0d9488 100%);box-shadow:0 0 4px #0ea5a480}.controls{display:flex;align-items:center;justify-content:center;gap:24px;width:100%}.control-btn{width:60px;height:60px;border-radius:50%;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:transform .2s ease}.control-btn:hover{transform:scale(1.05)}.control-btn:active{transform:scale(.95)}.control-label{font-size:12px;font-weight:500;color:#0f172a}.mic-btn{background:#e2e8f0;color:#475569}.mic-btn .control-label{color:#475569}.mic-btn.muted{background:#e2e8f0;color:#475569}.end-call-btn{background:#ef4444;color:#fff}.end-call-btn .control-label{color:#fff}.end-call-btn:hover{background:#dc2626}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
153
155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VoiceAgentModalComponent, decorators: [{
154
156
  type: Component,
155
- args: [{ selector: 'hivegpt-voice-agent-modal', template: "<div class=\"voice-agent-modal-overlay\" (click)=\"endCall()\">\n <div\n class=\"voice-container voice-agent-modal\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 1C8.13 1 5 4.13 5 8V14C5 17.87 8.13 21 12 21C15.87 21 19 17.87 19 14V8C19 4.13 15.87 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23C10.34 23 9 21.66 9 20H15C15 21.66 13.66 23 12 23Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n <span class=\"header-title\">Voice</span>\n </div>\n <button\n class=\"close-button\"\n (click)=\"endCall()\"\n type=\"button\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Avatar Section with glow -->\n <div class=\"avatar-section\">\n <div class=\"avatar-glow\" [class.glow-talking]=\"isBotTalking\" [class.glow-listening]=\"callState === 'listening'\"></div>\n\n <!-- Particle ring \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"particles-container\">\n <span *ngFor=\"let i of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\"\n class=\"particle\"\n [style.--i]=\"i\"\n [style.animationDelay]=\"(i * 0.15) + 's'\">\n </span>\n </div>\n\n <div class=\"avatar-wrapper\" [class.speaking]=\"isBotTalking\" [class.listening]=\"callState === 'listening'\">\n <img class=\"avatar-image\" [src]=\"displayAvatarUrl\" alt=\"Nia\" />\n </div>\n </div>\n\n <!-- Agent Info: Nia + Collaboration Manager AI Agent Specialist -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">\n Nia\n <span class=\"ai-badge\">AI</span>\n </div>\n <p class=\"agent-role\">COP30 AI Agent </p>\n </div>\n\n <!-- Start Call (when idle only) -->\n <div *ngIf=\"callState === 'idle'\" class=\"start-call-section\">\n <p *ngIf=\"statusText === 'Connection failed'\" class=\"error-message\">\n {{ statusText }}\n </p>\n <button\n class=\"start-call-button\"\n type=\"button\"\n [disabled]=\"isConnecting\"\n (click)=\"startCall()\"\n >\n <span *ngIf=\"isConnecting\">Connecting...</span>\n <span *ngIf=\"!isConnecting && statusText === 'Connection failed'\"\n >Retry</span\n >\n <span *ngIf=\"!isConnecting && statusText !== 'Connection failed'\"\n >Start Call</span\n >\n </button>\n </div>\n\n <!-- Call Ended: status + Call Again / Back to Chat -->\n <div *ngIf=\"callState === 'ended'\" class=\"call-ended-section\">\n <p class=\"call-ended-status\">\n <span class=\"status-text\">Call Ended</span>\n <span class=\"status-timer\">{{ duration }}</span>\n </p>\n <div class=\"call-ended-controls\">\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"callAgain()\"\n title=\"Call Again\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n Call Again\n </button>\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"backToChat()\"\n title=\"Back to Chat\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n Back to Chat\n </button>\n </div>\n </div>\n\n <!-- Status (when connecting or in-call: Talking... / Listening / Connected + timer) -->\n <div\n class=\"status-indicator status-inline\"\n *ngIf=\"callState !== 'idle' && callState !== 'ended'\"\n >\n <div *ngIf=\"callState === 'connecting'\" class=\"status-connecting\">\n <svg\n class=\"spinner\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"31.416\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 31.416;15.708 15.708;0 31.416;0 31.416\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-15.708;-31.416;-31.416\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n <span class=\"status-text\">{{ statusText }}</span>\n </div>\n <div\n *ngIf=\"callState !== 'connecting'\"\n class=\"status-connected status-inline-row\"\n >\n <span class=\"status-text\" [class.status-talking]=\"isBotTalking\" [class.status-listening]=\"callState === 'listening'\" [class.status-processing]=\"isProcessing\">\n {{ statusLabel }}\n </span>\n\n <!-- Animated bars \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"voice-visualizer\">\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n </div>\n\n <!-- Bouncing dots \u2014 visible during processing pause -->\n <div *ngIf=\"isProcessing\" class=\"processing-dots\">\n <span></span><span></span><span></span>\n </div>\n\n <span class=\"status-timer\">{{ duration }}</span>\n </div>\n </div>\n\n <!-- Waveform: always visible during an active call, active (coloured) when user speaks -->\n <div\n *ngIf=\"callState === 'connected' || callState === 'listening' || callState === 'talking'\"\n class=\"waveform-container\"\n >\n <div class=\"waveform-bars\">\n <div\n *ngFor=\"let level of audioLevels; let i = index\"\n class=\"waveform-bar\"\n [class.active]=\"isUserActive\"\n [style.height.px]=\"getWaveformHeight(level, i)\"\n ></div>\n </div>\n </div>\n\n <!-- Call Controls (when connected) -->\n <div\n class=\"controls\"\n *ngIf=\"\n callState === 'connected' ||\n callState === 'listening' ||\n callState === 'talking'\n \"\n >\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn mic-btn\"\n [class.muted]=\"isMicMuted\"\n (click)=\"toggleMic()\"\n type=\"button\"\n [title]=\"isMicMuted ? 'Unmute' : 'Mute'\"\n >\n <!-- Microphone icon (unmuted) -->\n <svg\n *ngIf=\"!isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n </svg>\n <!-- Microphone icon (muted) -->\n <svg\n *ngIf=\"isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n <path\n d=\"M2 2 L30 30\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Mute</span>\n </div>\n\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn end-call-btn\"\n (click)=\"hangUp()\"\n type=\"button\"\n title=\"End Call\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">End Call</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.voice-agent-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;justify-content:flex-end;align-items:flex-end;z-index:99999;backdrop-filter:blur(4px);padding:24px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.voice-container.voice-agent-modal{width:100%;max-width:440px;background:white;border-radius:30px;padding:30px;box-shadow:0 10px 40px #0000001a;text-align:center;position:relative;display:flex;flex-direction:column;align-items:center;min-height:600px;animation:modalEnter .3s ease-out}@keyframes modalEnter{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.header{width:100%;display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:28px;height:28px;background:#0f172a;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center}.header-title{font-size:18px;font-weight:500;color:#0f172a}.close-button{background:none;border:none;cursor:pointer;padding:8px;color:#0f172a;display:flex;align-items:center;justify-content:center;transition:color .2s}.close-button:hover{color:#475569}.avatar-section{position:relative;margin-bottom:24px}.avatar-wrapper{width:180px;height:180px;border-radius:50%;padding:6px;background:#0ea5a4;background:linear-gradient(135deg,#ccfbf1 0%,#0ea5a4 100%);display:flex;align-items:center;justify-content:center;position:relative}.avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover;border:4px solid white}.avatar-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:240px;height:240px;background:radial-gradient(circle,rgba(14,165,164,.2) 0%,transparent 70%);z-index:-1;pointer-events:none;transition:opacity .4s ease}.avatar-glow.glow-talking{width:280px;height:280px;background:radial-gradient(circle,rgba(14,165,164,.35) 0%,transparent 65%);animation:glowPulse 1.5s ease-in-out infinite}.avatar-glow.glow-listening{background:radial-gradient(circle,rgba(99,102,241,.25) 0%,transparent 65%)}@keyframes glowPulse{0%,to{opacity:.7;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}}.avatar-wrapper.speaking{animation:avatarPulse 1.4s ease-in-out infinite}.avatar-wrapper.listening{animation:avatarListenPulse 1.8s ease-in-out infinite}@keyframes avatarPulse{0%,to{box-shadow:0 0 #0ea5a480}50%{box-shadow:0 0 0 18px #0ea5a400}}@keyframes avatarListenPulse{0%,to{box-shadow:0 0 #6366f166}50%{box-shadow:0 0 0 14px #6366f100}}.particles-container{position:absolute;top:50%;left:50%;width:0;height:0;z-index:2;pointer-events:none}.particle{position:absolute;width:7px;height:7px;border-radius:50%;background:#0ea5a4;opacity:0;animation:particleOrbit 2.4s ease-in-out infinite;animation-delay:var(--delay, 0s);transform-origin:0 0}@keyframes particleOrbit{0%{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg)) translateY(-108px) scale(.4)}25%{opacity:.9}75%{opacity:.9}to{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg + 45deg)) translateY(-108px) scale(.4)}}.agent-info{margin-bottom:40px}.agent-name{font-size:24px;font-weight:700;color:#0f172a;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:8px}.ai-badge{background:#0ea5a4;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px}.agent-role{font-size:16px;color:#0f172a;font-weight:500;margin:0}.start-call-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.error-message{color:#dc2626;font-size:14px;margin:0}.start-call-button{padding:14px 32px;font-size:16px;font-weight:600;color:#fff;background:#0ea5a4;border:none;border-radius:12px;cursor:pointer;transition:background .2s}.start-call-button:hover:not(:disabled){background:#0d9488}.start-call-button:disabled{opacity:.7;cursor:not-allowed!important}.status-indicator{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:10px}.status-connecting{display:flex;align-items:center;gap:12px}.spinner{color:#0ea5a4;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-text{font-size:16px;color:#0f172a;font-weight:400;transition:color .25s ease}.status-text.status-talking{color:#0ea5a4;font-weight:500}.status-text.status-listening{color:#2a2a2c;font-weight:500}.status-text.status-processing{color:#94a3b8}.status-timer{font-size:16px;color:#0f172a;font-weight:500}.voice-visualizer{display:flex;align-items:center;gap:3px;height:18px}.vbar{width:3px;height:6px;background:#0ea5a4;border-radius:2px;animation:vbarBounce 1s ease-in-out infinite}.vbar:nth-child(1){animation-delay:0s}.vbar:nth-child(2){animation-delay:.15s}.vbar:nth-child(3){animation-delay:.3s}.vbar:nth-child(4){animation-delay:.45s}@keyframes vbarBounce{0%,to{height:4px;opacity:.5}50%{height:16px;opacity:1}}.processing-dots{display:flex;align-items:center;gap:4px}.processing-dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:#94a3b8;animation:dotFade 1.2s ease-in-out infinite}.processing-dots span:nth-child(1){animation-delay:0s}.processing-dots span:nth-child(2){animation-delay:.2s}.processing-dots span:nth-child(3){animation-delay:.4s}@keyframes dotFade{0%,80%,to{transform:scale(.8);opacity:.4}40%{transform:scale(1.2);opacity:1}}.status-connected{display:flex;flex-direction:column;align-items:center;gap:4px}.status-inline .status-inline-row{flex-direction:row;align-items:center;gap:8px}.call-ended-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.call-ended-status{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;font-size:16px;color:#0f172a}.call-ended-status .status-text{font-weight:400}.call-ended-status .status-timer{font-weight:500}.call-ended-controls{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}.action-btn{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:24px;font-size:14px;font-weight:500;color:#0f172a;background:white;border:1px solid #e2e8f0;cursor:pointer;transition:background .2s ease}.action-btn:hover{background:#f8fafc}.waveform-container{width:100%;display:flex;align-items:center;justify-content:center;height:56px;margin-bottom:10px;padding:0 8px}.waveform-bars{display:flex;align-items:center;justify-content:center;gap:2px;height:56px;width:100%}.waveform-bar{flex:0 0 2px;width:2px;min-height:2px;border-radius:99px;background:#cbd5e1;transition:height .1s ease-out}.waveform-bar.active{background:linear-gradient(180deg,#0ea5a4 0%,#0d9488 100%);box-shadow:0 0 4px #0ea5a480}.controls{display:flex;align-items:center;justify-content:center;gap:24px;width:100%}.control-btn{width:60px;height:60px;border-radius:50%;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:transform .2s ease}.control-btn:hover{transform:scale(1.05)}.control-btn:active{transform:scale(.95)}.control-label{font-size:12px;font-weight:500;color:#0f172a}.mic-btn{background:#e2e8f0;color:#475569}.mic-btn .control-label{color:#475569}.mic-btn.muted{background:#e2e8f0;color:#475569}.end-call-btn{background:#ef4444;color:#fff}.end-call-btn .control-label{color:#fff}.end-call-btn:hover{background:#dc2626}\n"] }]
157
+ args: [{ selector: 'hivegpt-voice-agent-modal', template: "<div class=\"voice-agent-modal-overlay\" (click)=\"endCall()\">\n <div\n class=\"voice-container voice-agent-modal\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 1C8.13 1 5 4.13 5 8V14C5 17.87 8.13 21 12 21C15.87 21 19 17.87 19 14V8C19 4.13 15.87 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23C10.34 23 9 21.66 9 20H15C15 21.66 13.66 23 12 23Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n <span class=\"header-title\">Voice</span>\n </div>\n <button\n class=\"close-button\"\n (click)=\"endCall()\"\n type=\"button\"\n aria-label=\"Close\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Avatar Section with glow -->\n <div class=\"avatar-section\">\n <div class=\"avatar-glow\" [class.glow-talking]=\"isBotTalking\" [class.glow-listening]=\"callState === 'listening'\"></div>\n\n <!-- Particle ring \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"particles-container\">\n <span *ngFor=\"let i of [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]\"\n class=\"particle\"\n [style.--i]=\"i\"\n [style.animationDelay]=\"(i * 0.15) + 's'\">\n </span>\n </div>\n\n <div class=\"avatar-wrapper\" [class.speaking]=\"isBotTalking\" [class.listening]=\"callState === 'listening'\">\n <img class=\"avatar-image\" [src]=\"displayAvatarUrl\" alt=\"Nia\" />\n </div>\n </div>\n\n <!-- Agent Info: Nia + Collaboration Manager AI Agent Specialist -->\n <div class=\"agent-info\">\n <div class=\"agent-name\">\n Nia\n <span class=\"ai-badge\">AI</span>\n </div>\n <p class=\"agent-role\">COP30 AI Agent </p>\n </div>\n\n <!-- Start Call (when idle only) -->\n <div *ngIf=\"callState === 'idle'\" class=\"start-call-section\">\n <p *ngIf=\"statusText === 'Connection failed'\" class=\"error-message\">\n {{ statusText }}\n </p>\n <button\n class=\"start-call-button\"\n type=\"button\"\n [disabled]=\"isConnecting\"\n (click)=\"startCall()\"\n >\n <span *ngIf=\"isConnecting\">Connecting...</span>\n <span *ngIf=\"!isConnecting && statusText === 'Connection failed'\"\n >Retry</span\n >\n <span *ngIf=\"!isConnecting && statusText !== 'Connection failed'\"\n >Start Call</span\n >\n </button>\n </div>\n\n <!-- Call Ended: status + Call Again / Back to Chat -->\n <div *ngIf=\"callState === 'ended'\" class=\"call-ended-section\">\n <p class=\"call-ended-status\">\n <span class=\"status-text\">Call Ended</span>\n <span class=\"status-timer\">{{ duration }}</span>\n </p>\n <div class=\"call-ended-controls\">\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"callAgain()\"\n title=\"Call Again\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n Call Again\n </button>\n <button\n class=\"action-btn\"\n type=\"button\"\n (click)=\"backToChat()\"\n title=\"Back to Chat\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n Back to Chat\n </button>\n </div>\n </div>\n\n <!-- Status (when connecting or in-call: Talking... / Listening / Connected + timer) -->\n <div\n class=\"status-indicator status-inline\"\n *ngIf=\"callState !== 'idle' && callState !== 'ended'\"\n >\n <div *ngIf=\"callState === 'connecting'\" class=\"status-connecting\">\n <svg\n class=\"spinner\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"31.416\"\n >\n <animate\n attributeName=\"stroke-dasharray\"\n dur=\"2s\"\n values=\"0 31.416;15.708 15.708;0 31.416;0 31.416\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"stroke-dashoffset\"\n dur=\"2s\"\n values=\"0;-15.708;-31.416;-31.416\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n <span class=\"status-text\">{{ statusText }}</span>\n </div>\n <div\n *ngIf=\"callState !== 'connecting'\"\n class=\"status-connected status-inline-row\"\n >\n <span class=\"status-text\" [class.status-talking]=\"isBotTalking\" [class.status-listening]=\"callState === 'listening'\" [class.status-processing]=\"isProcessing\">\n {{ statusLabel }}\n </span>\n\n <!-- Animated bars \u2014 visible while bot is talking -->\n <div *ngIf=\"isBotTalking\" class=\"voice-visualizer\">\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n <div class=\"vbar\"></div>\n </div>\n\n <!-- Bouncing dots \u2014 visible during processing pause -->\n <div *ngIf=\"isProcessing\" class=\"processing-dots\">\n <span></span><span></span><span></span>\n </div>\n\n <span class=\"status-timer\">{{ duration }}</span>\n </div>\n </div>\n\n <!-- Waveform: always visible during an active call, active (coloured) when user speaks -->\n <div\n *ngIf=\"callState === 'connected' || callState === 'listening' || callState === 'talking'\"\n class=\"waveform-container\"\n >\n <div class=\"waveform-bars\">\n <div\n *ngFor=\"let level of audioLevels; let i = index\"\n class=\"waveform-bar\"\n [class.active]=\"isUserActive\"\n [style.height.px]=\"getWaveformHeight(level, i)\"\n ></div>\n </div>\n </div>\n\n <!-- Call Controls (when connected) -->\n <div\n class=\"controls\"\n *ngIf=\"\n callState === 'connecting' ||\n callState === 'connected' ||\n callState === 'listening' ||\n callState === 'talking'\n \"\n >\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn mic-btn\"\n [class.muted]=\"isMicMuted\"\n (click)=\"toggleMic()\"\n type=\"button\"\n [title]=\"isMicMuted ? 'Unmute' : 'Mute'\"\n >\n <!-- Microphone icon (unmuted) -->\n <svg\n *ngIf=\"!isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n </svg>\n <!-- Microphone icon (muted) -->\n <svg\n *ngIf=\"isMicMuted\"\n width=\"24\"\n height=\"24\"\n viewBox=\"-5 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g transform=\"translate(-105, -307)\">\n <path\n d=\"M111,314 C111,311.238 113.239,309 116,309 C118.761,309 121,311.238 121,314 L121,324 C121,326.762 118.761,329 116,329 C113.239,329 111,326.762 111,324 L111,314 L111,314 Z M116,331 C119.866,331 123,327.866 123,324 L123,314 C123,310.134 119.866,307 116,307 C112.134,307 109,310.134 109,314 L109,324 C109,327.866 112.134,331 116,331 L116,331 Z M127,326 L125,326 C124.089,330.007 120.282,333 116,333 C111.718,333 107.911,330.007 107,326 L105,326 C105.883,330.799 110.063,334.51 115,334.955 L115,337 L114,337 C113.448,337 113,337.448 113,338 C113,338.553 113.448,339 114,339 L118,339 C118.552,339 119,338.553 119,338 C119,337.448 118.552,337 118,337 L117,337 L117,334.955 C121.937,334.51 126.117,330.799 127,326 L127,326 Z\"\n />\n </g>\n <path\n d=\"M2 2 L30 30\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Mute</span>\n </div>\n\n <div\n style=\"\n display: flex;\n align-items: center;\n gap: 2px;\n flex-direction: column;\n \"\n >\n <button\n class=\"control-btn end-call-btn\"\n (click)=\"hangUp()\"\n type=\"button\"\n title=\"End Call\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18M6 6L18 18\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n <span class=\"control-label\">End Call</span>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.voice-agent-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;justify-content:flex-end;align-items:flex-end;z-index:99999;backdrop-filter:blur(4px);padding:24px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif}.voice-container.voice-agent-modal{width:100%;max-width:440px;background:white;border-radius:30px;padding:30px;box-shadow:0 10px 40px #0000001a;text-align:center;position:relative;display:flex;flex-direction:column;align-items:center;min-height:600px;animation:modalEnter .3s ease-out}@keyframes modalEnter{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.header{width:100%;display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.header-left{display:flex;align-items:center;gap:8px}.header-icon{width:28px;height:28px;background:#0f172a;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center}.header-title{font-size:18px;font-weight:500;color:#0f172a}.close-button{background:none;border:none;cursor:pointer;padding:8px;color:#0f172a;display:flex;align-items:center;justify-content:center;transition:color .2s}.close-button:hover{color:#475569}.avatar-section{position:relative;margin-bottom:24px}.avatar-wrapper{width:180px;height:180px;border-radius:50%;padding:6px;background:#0ea5a4;background:linear-gradient(135deg,#ccfbf1 0%,#0ea5a4 100%);display:flex;align-items:center;justify-content:center;position:relative}.avatar-image{width:100%;height:100%;border-radius:50%;object-fit:cover;border:4px solid white}.avatar-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:240px;height:240px;background:radial-gradient(circle,rgba(14,165,164,.2) 0%,transparent 70%);z-index:-1;pointer-events:none;transition:opacity .4s ease}.avatar-glow.glow-talking{width:280px;height:280px;background:radial-gradient(circle,rgba(14,165,164,.35) 0%,transparent 65%);animation:glowPulse 1.5s ease-in-out infinite}.avatar-glow.glow-listening{background:radial-gradient(circle,rgba(99,102,241,.25) 0%,transparent 65%)}@keyframes glowPulse{0%,to{opacity:.7;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.08)}}.avatar-wrapper.speaking{animation:avatarPulse 1.4s ease-in-out infinite}.avatar-wrapper.listening{animation:avatarListenPulse 1.8s ease-in-out infinite}@keyframes avatarPulse{0%,to{box-shadow:0 0 #0ea5a480}50%{box-shadow:0 0 0 18px #0ea5a400}}@keyframes avatarListenPulse{0%,to{box-shadow:0 0 #6366f166}50%{box-shadow:0 0 0 14px #6366f100}}.particles-container{position:absolute;top:50%;left:50%;width:0;height:0;z-index:2;pointer-events:none}.particle{position:absolute;width:7px;height:7px;border-radius:50%;background:#0ea5a4;opacity:0;animation:particleOrbit 2.4s ease-in-out infinite;animation-delay:var(--delay, 0s);transform-origin:0 0}@keyframes particleOrbit{0%{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg)) translateY(-108px) scale(.4)}25%{opacity:.9}75%{opacity:.9}to{opacity:0;transform:rotate(calc(var(--i, 0) * 22.5deg + 45deg)) translateY(-108px) scale(.4)}}.agent-info{margin-bottom:40px}.agent-name{font-size:24px;font-weight:700;color:#0f172a;margin-bottom:8px;display:flex;align-items:center;justify-content:center;gap:8px}.ai-badge{background:#0ea5a4;color:#fff;font-size:10px;font-weight:700;padding:2px 6px;border-radius:6px}.agent-role{font-size:16px;color:#0f172a;font-weight:500;margin:0}.start-call-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.error-message{color:#dc2626;font-size:14px;margin:0}.start-call-button{padding:14px 32px;font-size:16px;font-weight:600;color:#fff;background:#0ea5a4;border:none;border-radius:12px;cursor:pointer;transition:background .2s}.start-call-button:hover:not(:disabled){background:#0d9488}.start-call-button:disabled{opacity:.7;cursor:not-allowed!important}.status-indicator{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:10px}.status-connecting{display:flex;align-items:center;gap:12px}.spinner{color:#0ea5a4;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-text{font-size:16px;color:#0f172a;font-weight:400;transition:color .25s ease}.status-text.status-talking{color:#0ea5a4;font-weight:500}.status-text.status-listening{color:#2a2a2c;font-weight:500}.status-text.status-processing{color:#94a3b8}.status-timer{font-size:16px;color:#0f172a;font-weight:500}.voice-visualizer{display:flex;align-items:center;gap:3px;height:18px}.vbar{width:3px;height:6px;background:#0ea5a4;border-radius:2px;animation:vbarBounce 1s ease-in-out infinite}.vbar:nth-child(1){animation-delay:0s}.vbar:nth-child(2){animation-delay:.15s}.vbar:nth-child(3){animation-delay:.3s}.vbar:nth-child(4){animation-delay:.45s}@keyframes vbarBounce{0%,to{height:4px;opacity:.5}50%{height:16px;opacity:1}}.processing-dots{display:flex;align-items:center;gap:4px}.processing-dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:#94a3b8;animation:dotFade 1.2s ease-in-out infinite}.processing-dots span:nth-child(1){animation-delay:0s}.processing-dots span:nth-child(2){animation-delay:.2s}.processing-dots span:nth-child(3){animation-delay:.4s}@keyframes dotFade{0%,80%,to{transform:scale(.8);opacity:.4}40%{transform:scale(1.2);opacity:1}}.status-connected{display:flex;flex-direction:column;align-items:center;gap:4px}.status-inline .status-inline-row{flex-direction:row;align-items:center;gap:8px}.call-ended-section{display:flex;flex-direction:column;align-items:center;gap:16px;margin-bottom:24px}.call-ended-status{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;font-size:16px;color:#0f172a}.call-ended-status .status-text{font-weight:400}.call-ended-status .status-timer{font-weight:500}.call-ended-controls{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}.action-btn{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:24px;font-size:14px;font-weight:500;color:#0f172a;background:white;border:1px solid #e2e8f0;cursor:pointer;transition:background .2s ease}.action-btn:hover{background:#f8fafc}.waveform-container{width:100%;display:flex;align-items:center;justify-content:center;height:56px;margin-bottom:10px;padding:0 8px}.waveform-bars{display:flex;align-items:center;justify-content:center;gap:2px;height:56px;width:100%}.waveform-bar{flex:0 0 2px;width:2px;min-height:2px;border-radius:99px;background:#cbd5e1;transition:height .1s ease-out}.waveform-bar.active{background:linear-gradient(180deg,#0ea5a4 0%,#0d9488 100%);box-shadow:0 0 4px #0ea5a480}.controls{display:flex;align-items:center;justify-content:center;gap:24px;width:100%}.control-btn{width:60px;height:60px;border-radius:50%;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:transform .2s ease}.control-btn:hover{transform:scale(1.05)}.control-btn:active{transform:scale(.95)}.control-label{font-size:12px;font-weight:500;color:#0f172a}.mic-btn{background:#e2e8f0;color:#475569}.mic-btn .control-label{color:#475569}.mic-btn.muted{background:#e2e8f0;color:#475569}.end-call-btn{background:#ef4444;color:#fff}.end-call-btn .control-label{color:#fff}.end-call-btn:hover{background:#dc2626}\n"] }]
156
158
  }], ctorParameters: function () { return [{ type: i1.VoiceAgentService }, { type: i2.AudioAnalyzerService }, { type: i0.Injector }]; }, propDecorators: { close: [{
157
159
  type: Output
158
160
  }], apiUrl: [{
@@ -182,4 +184,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
182
184
  }], usersApiUrl: [{
183
185
  type: Input
184
186
  }] } });
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9jb21wb25lbnRzL3ZvaWNlLWFnZW50LW1vZGFsL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBSXBHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFPNUcsTUFBTSxPQUFPLHdCQUF3QjtJQW1CbkMsWUFDUyxpQkFBb0MsRUFDcEMsYUFBbUMsRUFDbEMsUUFBa0I7UUFGbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXJCbEIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLbEMsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixvQkFBZSxHQUFXLFdBQVcsQ0FBQztRQUN0QyxjQUFTLEdBQVcsY0FBYyxDQUFDO1FBQ25D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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBWb2ljZUFnZW50U2VydmljZSwgQ2FsbFN0YXRlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdm9pY2UtYWdlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb0FuYWx5emVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVk9JQ0VfTU9EQUxfQ09ORklHLCBWT0lDRV9NT0RBTF9DTE9TRV9DQUxMQkFDSywgVm9pY2VNb2RhbENvbmZpZyB9IGZyb20gJy4uLy4uL3ZvaWNlLW1vZGFsLXRva2Vucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hpdmVncHQtdm9pY2UtYWdlbnQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBASW5wdXQoKSBhcGlVcmwhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBib3RJZCE6IHN0cmluZztcbiAgQElucHV0KCkgY29udmVyc2F0aW9uSWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaUtleTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGV2ZW50VG9rZW46IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBldmVudElkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXZlbnRVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkb21haW5BdXRob3JpdHk6IHN0cmluZyA9ICdwcm9kLWxpdGUnO1xuICBASW5wdXQoKSBhZ2VudE5hbWU6IHN0cmluZyA9ICdBSSBBc3Npc3RhbnQnO1xuICBASW5wdXQoKSBhZ2VudFJvbGU6IHN0cmluZyA9ICdBSSBBZ2VudCBTcGVjaWFsaXN0JztcbiAgQElucHV0KCkgYWdlbnRBdmF0YXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVzZXJzQXBpVXJsOiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIGluamVjdGVkQ29uZmlnOiBWb2ljZU1vZGFsQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb25DbG9zZUNhbGxiYWNrOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdm9pY2VBZ2VudFNlcnZpY2U6IFZvaWNlQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBhdWRpb0FuYWx5emVyOiBBdWRpb0FuYWx5emVyU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHt9XG5cbiAgLyoqIEhhcmRjb2RlZCB2b2ljZSBhZ2VudCBhdmF0YXIgKE5pYSkuICovXG4gIHJlYWRvbmx5IGRpc3BsYXlBdmF0YXJVcmwgPSAnaHR0cHM6Ly93d3cuam90Zm9ybS5jb20vdXBsb2Fkcy9tZWhtZXRrYXJha2FzbGkvZm9ybV9maWxlcy8xNTY0NTkzNjY3Njc2YThlODVmMjM3NTguODY5NDU1MzdfaWNvbi5wbmcnO1xuXG4gIGNhbGxTdGF0ZTogQ2FsbFN0YXRlID0gJ2lkbGUnO1xuICBzdGF0dXNUZXh0OiBzdHJpbmcgPSAnJztcbiAgZHVyYXRpb246IHN0cmluZyA9ICcwMDowMCc7XG4gIGlzTWljTXV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNVc2VyU3BlYWtpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYXVkaW9MZXZlbHM6IG51bWJlcltdID0gW107XG5cbiAgLyoqIFRydWUgd2hpbGUgdGhlIGJvdCBpcyBzcGVha2luZyDigJQgZHJpdmVzIGF2YXRhciBwdWxzZSBhbmltYXRpb24gYW5kIHZvaWNlIHZpc3VhbGl6ZXIuICovXG4gIGdldCBpc0JvdFRhbGtpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNhbGxTdGF0ZSA9PT0gJ3RhbGtpbmcnOyB9XG5cbiAgLyoqIFRydWUgd2hpbGUgdGhlIHVzZXIgaXMgYWN0aXZlbHkgc3BlYWtpbmcg4oCUIGRyaXZlcyB3YXZlZm9ybSBhY3RpdmUgY29sb3IuICovXG4gIGdldCBpc1VzZXJBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZycgJiYgdGhpcy5pc1VzZXJTcGVha2luZyAmJiAhdGhpcy5pc01pY011dGVkOyB9XG5cbiAgLyoqIFRydWUgZHVyaW5nIHRoZSBicmllZiBwcm9jZXNzaW5nIHBhdXNlIGJldHdlZW4gdXNlciBzcGVlY2ggYW5kIGJvdCByZXNwb25zZS4gKi9cbiAgZ2V0IGlzUHJvY2Vzc2luZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2FsbFN0YXRlID09PSAnY29ubmVjdGVkJyAmJiB0aGlzLnN0YXR1c1RleHQgPT09ICdQcm9jZXNzaW5nLi4uJzsgfVxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBXaGVuIG9wZW5lZCB2aWEgT3ZlcmxheSwgY29uZmlnIGlzIHByb3ZpZGVkIGJ5IGluamVjdGlvblxuICAgIHRoaXMuaW5qZWN0ZWRDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChWT0lDRV9NT0RBTF9DT05GSUcsIG51bGwpO1xuICAgIHRoaXMub25DbG9zZUNhbGxiYWNrID0gdGhpcy5pbmplY3Rvci5nZXQoVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIG51bGwpO1xuICAgIGlmICh0aGlzLmluamVjdGVkQ29uZmlnKSB7XG4gICAgICB0aGlzLmFwaVVybCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYXBpVXJsO1xuICAgICAgdGhpcy50b2tlbiA9IHRoaXMuaW5qZWN0ZWRDb25maWcudG9rZW47XG4gICAgICB0aGlzLmJvdElkID0gdGhpcy5pbmplY3RlZENvbmZpZy5ib3RJZDtcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSB0aGlzLmluamVjdGVkQ29uZmlnLmNvbnZlcnNhdGlvbklkO1xuICAgICAgdGhpcy5hcGlLZXkgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFwaUtleSA/PyAnJztcbiAgICAgIHRoaXMuZXZlbnRUb2tlbiA9IHRoaXMuaW5qZWN0ZWRDb25maWcuZXZlbnRUb2tlbiA/PyAnJztcbiAgICAgIHRoaXMuZXZlbnRJZCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuZXZlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMuZXZlbnRVcmwgPSB0aGlzLmluamVjdGVkQ29uZmlnLmV2ZW50VXJsID8/ICcnO1xuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHkgPSB0aGlzLmluamVjdGVkQ29uZmlnLmRvbWFpbkF1dGhvcml0eSA/PyAncHJvZC1saXRlJztcbiAgICAgIHRoaXMuYWdlbnROYW1lID0gdGhpcy5pbmplY3RlZENvbmZpZy5hZ2VudE5hbWUgPz8gdGhpcy5hZ2VudE5hbWU7XG4gICAgICB0aGlzLmFnZW50Um9sZSA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYWdlbnRSb2xlID8/IHRoaXMuYWdlbnRSb2xlO1xuICAgICAgdGhpcy5hZ2VudEF2YXRhciA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYWdlbnRBdmF0YXI7XG4gICAgICB0aGlzLnVzZXJzQXBpVXJsID0gdGhpcy5pbmplY3RlZENvbmZpZy51c2Vyc0FwaVVybCA/PyB0aGlzLnVzZXJzQXBpVXJsO1xuICAgIH1cblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5jYWxsU3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMuY2FsbFN0YXRlID0gc3RhdGU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2Uuc3RhdHVzVGV4dCQuc3Vic2NyaWJlKHRleHQgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSB0ZXh0O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmR1cmF0aW9uJC5zdWJzY3JpYmUoZHVyYXRpb24gPT4ge1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuaXNNaWNNdXRlZCQuc3Vic2NyaWJlKG11dGVkID0+IHtcbiAgICAgICAgdGhpcy5pc01pY011dGVkID0gbXV0ZWQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuaXNVc2VyU3BlYWtpbmckLnN1YnNjcmliZShzcGVha2luZyA9PiB7XG4gICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmcgPSBzcGVha2luZztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5hdWRpb0xldmVscyQuc3Vic2NyaWJlKGxldmVscyA9PiB7XG4gICAgICAgIHRoaXMuYXVkaW9MZXZlbHMgPSBsZXZlbHM7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBNb2RhbCBvcGVucyBpbiBpZGxlIHN0YXRlLCB0aGVuIGltbWVkaWF0ZWx5IHN0YXJ0cyBjb25uZWN0aW5nLlxuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UucmVzZXRUb0lkbGUoKTtcbiAgICB2b2lkIHRoaXMuc3RhcnRDYWxsKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgaXNDb25uZWN0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgYXN5bmMgc3RhcnRDYWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGluZyB8fCAodGhpcy5jYWxsU3RhdGUgIT09ICdpZGxlJyAmJiB0aGlzLmNhbGxTdGF0ZSAhPT0gJ2VuZGVkJykpIHJldHVybjtcbiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuY29ubmVjdChcbiAgICAgICAgdGhpcy5hcGlVcmwsXG4gICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgIHRoaXMuYm90SWQsXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHRoaXMuYXBpS2V5LFxuICAgICAgICB0aGlzLmV2ZW50VG9rZW4sXG4gICAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICAgICAgdGhpcy5ldmVudFVybCxcbiAgICAgICAgdGhpcy5kb21haW5BdXRob3JpdHksXG4gICAgICAgIHRoaXMudXNlcnNBcGlVcmwgfHwgdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvbm5lY3Qgdm9pY2UgYWdlbnQ6JywgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy52b2ljZUFnZW50U2VydmljZS5kaXNjb25uZWN0KCk7XG4gIH1cblxuICB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgdGhpcy52b2ljZUFnZW50U2VydmljZS50b2dnbGVNaWMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYXVkaW8gbGV2ZWwgKDDigJMxMDApIHRvIHdhdmVmb3JtIGJhciBoZWlnaHQgaW4gcHggd2l0aCBhIGdhdXNzaWFuXG4gICAqIGJlbGwtY3VydmUgZW52ZWxvcGUgc28gY2VudHJlIGJhcnMgYXJlIHRhbGxlc3QgYW5kIGVkZ2UgYmFycyBhcHBlYXJcbiAgICogYXMgdGlueSBkb3RzIOKAlCBtYXRjaGluZyB0aGUgYXVkaW8td2F2ZWZvcm0gcmVmZXJlbmNlIGRlc2lnbi5cbiAgICovXG4gIGdldFdhdmVmb3JtSGVpZ2h0KGxldmVsOiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIGxldmVsID8/IDApKTtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuYXVkaW9MZXZlbHMubGVuZ3RoIHx8IDYwO1xuICAgIGNvbnN0IGNlbnRlciA9ICh0b3RhbCAtIDEpIC8gMjtcbiAgICBjb25zdCBzaWdtYSA9IHRvdGFsIC8gNTtcbiAgICBjb25zdCBlbnZlbG9wZSA9IE1hdGguZXhwKC1NYXRoLnBvdyhpbmRleCAtIGNlbnRlciwgMikgLyAoMiAqIHNpZ21hICogc2lnbWEpKTtcbiAgICAvLyBNaW5pbXVtIGhlaWdodCBzY2FsZXMgd2l0aCBlbnZlbG9wZSBzbyBlZGdlcyBzaG93IGFzIGRvdHMgZXZlbiBpbiBzaWxlbmNlXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gMiArIGVudmVsb3BlICogMztcbiAgICBjb25zdCBtYXhIZWlnaHQgPSA0ICsgZW52ZWxvcGUgKiAzODtcbiAgICByZXR1cm4gbWluSGVpZ2h0ICsgKG4gLyAxMDApICogKG1heEhlaWdodCAtIG1pbkhlaWdodCk7XG4gIH1cblxuICAvKiogU3RhdHVzIGxhYmVsIGZvciBhY3RpdmUgY2FsbCDigJQgZHJpdmVuIGJ5IGNhbGxTdGF0ZSArIHNlcnZpY2Ugc3RhdHVzVGV4dC4gKi9cbiAgZ2V0IHN0YXR1c0xhYmVsKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmNhbGxTdGF0ZSkge1xuICAgICAgY2FzZSAnY29ubmVjdGluZyc6IHJldHVybiAnQ29ubmVjdGluZy4uLic7XG4gICAgICBjYXNlICd0YWxraW5nJzogICAgcmV0dXJuICdUYWxraW5nLi4uJztcbiAgICAgIGNhc2UgJ2xpc3RlbmluZyc6ICByZXR1cm4gJ0xpc3RlbmluZy4uLic7XG4gICAgICAvLyAnY29ubmVjdGVkJyBjb3ZlcnM6IGluaXRpYWwgY29ubmVjdCwgYmV0d2VlbiB0dXJucyAoTGlzdGVuaW5nIC8gUHJvY2Vzc2luZylcbiAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6ICByZXR1cm4gdGhpcy5zdGF0dXNUZXh0IHx8ICdDb25uZWN0ZWQnO1xuICAgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiB0aGlzLnN0YXR1c1RleHQgfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGwgQWdhaW46IHJlc2V0IHRvIGlkbGUgdGhlbiBzdGFydCBhIG5ldyBjYWxsLiAqL1xuICBjYWxsQWdhaW4oKTogdm9pZCB7XG4gICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5yZXNldFRvSWRsZSgpO1xuICAgIHRoaXMuc3RhcnRDYWxsKCk7XG4gIH1cblxuICAvKiogQmFjayB0byBDaGF0OiBjbG9zZSBtb2RhbCBhbmQgZGlzY29ubmVjdC4gKi9cbiAgYmFja1RvQ2hhdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZENhbGwoKTtcbiAgfVxuXG4gIC8qKiBFbmQgY2FsbCBidXQga2VlcCBtb2RhbCBvcGVuIHRvIHNob3cgQ2FsbCBFbmRlZCArIENhbGwgQWdhaW4gLyBCYWNrIHRvIENoYXQuICovXG4gIGhhbmdVcCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGVuZENhbGwoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5vbkNsb3NlQ2FsbGJhY2s/LigpO1xuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidm9pY2UtYWdlbnQtbW9kYWwtb3ZlcmxheVwiIChjbGljayk9XCJlbmRDYWxsKClcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidm9pY2UtY29udGFpbmVyIHZvaWNlLWFnZW50LW1vZGFsXCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICAgIDwhLS0gSGVhZGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWljb25cIj5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICB3aWR0aD1cIjE2XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMiAxQzguMTMgMSA1IDQuMTMgNSA4VjE0QzUgMTcuODcgOC4xMyAyMSAxMiAyMUMxNS44NyAyMSAxOSAxNy44NyAxOSAxNFY4QzE5IDQuMTMgMTUuODcgMSAxMiAxWlwiXG4gICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTIgMjNDMTAuMzQgMjMgOSAyMS42NiA5IDIwSDE1QzE1IDIxLjY2IDEzLjY2IDIzIDEyIDIzWlwiXG4gICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+Vm9pY2U8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJjbG9zZS1idXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiZW5kQ2FsbCgpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgICA+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICA+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBdmF0YXIgU2VjdGlvbiB3aXRoIGdsb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF2YXRhci1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWdsb3dcIiBbY2xhc3MuZ2xvdy10YWxraW5nXT1cImlzQm90VGFsa2luZ1wiIFtjbGFzcy5nbG93LWxpc3RlbmluZ109XCJjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnXCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gUGFydGljbGUgcmluZyDigJQgdmlzaWJsZSB3aGlsZSBib3QgaXMgdGFsa2luZyAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc0JvdFRhbGtpbmdcIiBjbGFzcz1cInBhcnRpY2xlcy1jb250YWluZXJcIj5cbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGkgb2YgWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTVdXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwYXJ0aWNsZVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLWldPVwiaVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5hbmltYXRpb25EZWxheV09XCIoaSAqIDAuMTUpICsgJ3MnXCI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLXdyYXBwZXJcIiBbY2xhc3Muc3BlYWtpbmddPVwiaXNCb3RUYWxraW5nXCIgW2NsYXNzLmxpc3RlbmluZ109XCJjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnXCI+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdmF0YXItaW1hZ2VcIiBbc3JjXT1cImRpc3BsYXlBdmF0YXJVcmxcIiBhbHQ9XCJOaWFcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFnZW50IEluZm86IE5pYSArIENvbGxhYm9yYXRpb24gTWFuYWdlciBBSSBBZ2VudCBTcGVjaWFsaXN0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1pbmZvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtbmFtZVwiPlxuICAgICAgICBOaWFcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1iYWRnZVwiPkFJPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBjbGFzcz1cImFnZW50LXJvbGVcIj5DT1AzMCBBSSBBZ2VudCA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0YXJ0IENhbGwgKHdoZW4gaWRsZSBvbmx5KSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY2FsbFN0YXRlID09PSAnaWRsZSdcIiBjbGFzcz1cInN0YXJ0LWNhbGwtc2VjdGlvblwiPlxuICAgICAgPHAgKm5nSWY9XCJzdGF0dXNUZXh0ID09PSAnQ29ubmVjdGlvbiBmYWlsZWQnXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgIHt7IHN0YXR1c1RleHQgfX1cbiAgICAgIDwvcD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJzdGFydC1jYWxsLWJ1dHRvblwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNDb25uZWN0aW5nXCJcbiAgICAgICAgKGNsaWNrKT1cInN0YXJ0Q2FsbCgpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0Nvbm5lY3RpbmdcIj5Db25uZWN0aW5nLi4uPC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0Nvbm5lY3RpbmcgJiYgc3RhdHVzVGV4dCA9PT0gJ0Nvbm5lY3Rpb24gZmFpbGVkJ1wiXG4gICAgICAgICAgPlJldHJ5PC9zcGFuXG4gICAgICAgID5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDb25uZWN0aW5nICYmIHN0YXR1c1RleHQgIT09ICdDb25uZWN0aW9uIGZhaWxlZCdcIlxuICAgICAgICAgID5TdGFydCBDYWxsPC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDYWxsIEVuZGVkOiBzdGF0dXMgKyBDYWxsIEFnYWluIC8gQmFjayB0byBDaGF0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdlbmRlZCdcIiBjbGFzcz1cImNhbGwtZW5kZWQtc2VjdGlvblwiPlxuICAgICAgPHAgY2xhc3M9XCJjYWxsLWVuZGVkLXN0YXR1c1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+Q2FsbCBFbmRlZDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGltZXJcIj57eyBkdXJhdGlvbiB9fTwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWVuZGVkLWNvbnRyb2xzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImFjdGlvbi1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJjYWxsQWdhaW4oKVwiXG4gICAgICAgICAgdGl0bGU9XCJDYWxsIEFnYWluXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4XCIgLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAzdjVoNVwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgQ2FsbCBBZ2FpblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImJhY2tUb0NoYXQoKVwiXG4gICAgICAgICAgdGl0bGU9XCJCYWNrIHRvIENoYXRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0yMSAxNWEyIDIgMCAwIDEtMiAySDdsLTQgNFY1YTIgMiAwIDAgMSAyLTJoMTRhMiAyIDAgMCAxIDIgMnpcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIEJhY2sgdG8gQ2hhdFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGF0dXMgKHdoZW4gY29ubmVjdGluZyBvciBpbi1jYWxsOiBUYWxraW5nLi4uIC8gTGlzdGVuaW5nIC8gQ29ubmVjdGVkICsgdGltZXIpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic3RhdHVzLWluZGljYXRvciBzdGF0dXMtaW5saW5lXCJcbiAgICAgICpuZ0lmPVwiY2FsbFN0YXRlICE9PSAnaWRsZScgJiYgY2FsbFN0YXRlICE9PSAnZW5kZWQnXCJcbiAgICA+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY2FsbFN0YXRlID09PSAnY29ubmVjdGluZydcIiBjbGFzcz1cInN0YXR1cy1jb25uZWN0aW5nXCI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICBjbGFzcz1cInNwaW5uZXJcIlxuICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgID5cbiAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICBjeD1cIjEyXCJcbiAgICAgICAgICAgIGN5PVwiMTJcIlxuICAgICAgICAgICAgcj1cIjEwXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjMxLjQxNlwiXG4gICAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldD1cIjMxLjQxNlwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGFuaW1hdGVcbiAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZT1cInN0cm9rZS1kYXNoYXJyYXlcIlxuICAgICAgICAgICAgICBkdXI9XCIyc1wiXG4gICAgICAgICAgICAgIHZhbHVlcz1cIjAgMzEuNDE2OzE1LjcwOCAxNS43MDg7MCAzMS40MTY7MCAzMS40MTZcIlxuICAgICAgICAgICAgICByZXBlYXRDb3VudD1cImluZGVmaW5pdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxhbmltYXRlXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU9XCJzdHJva2UtZGFzaG9mZnNldFwiXG4gICAgICAgICAgICAgIGR1cj1cIjJzXCJcbiAgICAgICAgICAgICAgdmFsdWVzPVwiMDstMTUuNzA4Oy0zMS40MTY7LTMxLjQxNlwiXG4gICAgICAgICAgICAgIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvY2lyY2xlPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGV4dFwiPnt7IHN0YXR1c1RleHQgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJjYWxsU3RhdGUgIT09ICdjb25uZWN0aW5nJ1wiXG4gICAgICAgIGNsYXNzPVwic3RhdHVzLWNvbm5lY3RlZCBzdGF0dXMtaW5saW5lLXJvd1wiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLXRleHRcIiBbY2xhc3Muc3RhdHVzLXRhbGtpbmddPVwiaXNCb3RUYWxraW5nXCIgW2NsYXNzLnN0YXR1cy1saXN0ZW5pbmddPVwiY2FsbFN0YXRlID09PSAnbGlzdGVuaW5nJ1wiIFtjbGFzcy5zdGF0dXMtcHJvY2Vzc2luZ109XCJpc1Byb2Nlc3NpbmdcIj5cbiAgICAgICAgICB7eyBzdGF0dXNMYWJlbCB9fVxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBBbmltYXRlZCBiYXJzIOKAlCB2aXNpYmxlIHdoaWxlIGJvdCBpcyB0YWxraW5nIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNCb3RUYWxraW5nXCIgY2xhc3M9XCJ2b2ljZS12aXN1YWxpemVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZiYXJcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmJhclwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YmFyXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZiYXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCb3VuY2luZyBkb3RzIOKAlCB2aXNpYmxlIGR1cmluZyBwcm9jZXNzaW5nIHBhdXNlIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNQcm9jZXNzaW5nXCIgY2xhc3M9XCJwcm9jZXNzaW5nLWRvdHNcIj5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGltZXJcIj57eyBkdXJhdGlvbiB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXYXZlZm9ybTogYWx3YXlzIHZpc2libGUgZHVyaW5nIGFuIGFjdGl2ZSBjYWxsLCBhY3RpdmUgKGNvbG91cmVkKSB3aGVuIHVzZXIgc3BlYWtzIC0tPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiY2FsbFN0YXRlID09PSAnY29ubmVjdGVkJyB8fCBjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnIHx8IGNhbGxTdGF0ZSA9PT0gJ3RhbGtpbmcnXCJcbiAgICAgIGNsYXNzPVwid2F2ZWZvcm0tY29udGFpbmVyXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwid2F2ZWZvcm0tYmFyc1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nRm9yPVwibGV0IGxldmVsIG9mIGF1ZGlvTGV2ZWxzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cIndhdmVmb3JtLWJhclwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1VzZXJBY3RpdmVcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZ2V0V2F2ZWZvcm1IZWlnaHQobGV2ZWwsIGkpXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhbGwgQ29udHJvbHMgKHdoZW4gY29ubmVjdGVkKSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNvbnRyb2xzXCJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGNhbGxTdGF0ZSA9PT0gJ2Nvbm5lY3RlZCcgfHxcbiAgICAgICAgY2FsbFN0YXRlID09PSAnbGlzdGVuaW5nJyB8fFxuICAgICAgICBjYWxsU3RhdGUgPT09ICd0YWxraW5nJ1xuICAgICAgXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIGdhcDogMnB4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtYnRuIG1pYy1idG5cIlxuICAgICAgICAgIFtjbGFzcy5tdXRlZF09XCJpc01pY011dGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWljKClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFt0aXRsZV09XCJpc01pY011dGVkID8gJ1VubXV0ZScgOiAnTXV0ZSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBNaWNyb3Bob25lIGljb24gKHVubXV0ZWQpIC0tPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzTWljTXV0ZWRcIlxuICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiLTUgMCAzMiAzMlwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMTA1LCAtMzA3KVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMTExLDMxNCBDMTExLDMxMS4yMzggMTEzLjIzOSwzMDkgMTE2LDMwOSBDMTE4Ljc2MSwzMDkgMTIxLDMxMS4yMzggMTIxLDMxNCBMMTIxLDMyNCBDMTIxLDMyNi43NjIgMTE4Ljc2MSwzMjkgMTE2LDMyOSBDMTEzLjIzOSwzMjkgMTExLDMyNi43NjIgMTExLDMyNCBMMTExLDMxNCBMMTExLDMxNCBaIE0xMTYsMzMxIEMxMTkuODY2LDMzMSAxMjMsMzI3Ljg2NiAxMjMsMzI0IEwxMjMsMzE0IEMxMjMsMzEwLjEzNCAxMTkuODY2LDMwNyAxMTYsMzA3IEMxMTIuMTM0LDMwNyAxMDksMzEwLjEzNCAxMDksMzE0IEwxMDksMzI0IEMxMDksMzI3Ljg2NiAxMTIuMTM0LDMzMSAxMTYsMzMxIEwxMTYsMzMxIFogTTEyNywzMjYgTDEyNSwzMjYgQzEyNC4wODksMzMwLjAwNyAxMjAuMjgyLDMzMyAxMTYsMzMzIEMxMTEuNzE4LDMzMyAxMDcuOTExLDMzMC4wMDcgMTA3LDMyNiBMMTA1LDMyNiBDMTA1Ljg4MywzMzAuNzk5IDExMC4wNjMsMzM0LjUxIDExNSwzMzQuOTU1IEwxMTUsMzM3IEwxMTQsMzM3IEMxMTMuNDQ4LDMzNyAxMTMsMzM3LjQ0OCAxMTMsMzM4IEMxMTMsMzM4LjU1MyAxMTMuNDQ4LDMzOSAxMTQsMzM5IEwxMTgsMzM5IEMxMTguNTUyLDMzOSAxMTksMzM4LjU1MyAxMTksMzM4IEMxMTksMzM3LjQ0OCAxMTguNTUyLDMzNyAxMTgsMzM3IEwxMTcsMzM3IEwxMTcsMzM0Ljk1NSBDMTIxLjkzNywzMzQuNTEgMTI2LjExNywzMzAuNzk5IDEyNywzMjYgTDEyNywzMjYgWlwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPCEtLSBNaWNyb3Bob25lIGljb24gKG11dGVkKSAtLT5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAqbmdJZj1cImlzTWljTXV0ZWRcIlxuICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiLTUgMCAzMiAzMlwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMTA1LCAtMzA3KVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMTExLDMxNCBDMTExLDMxMS4yMzggMTEzLjIzOSwzMDkgMTE2LDMwOSBDMTE4Ljc2MSwzMDkgMTIxLDMxMS4yMzggMTIxLDMxNCBMMTIxLDMyNCBDMTIxLDMyNi43NjIgMTE4Ljc2MSwzMjkgMTE2LDMyOSBDMTEzLjIzOSwzMjkgMTExLDMyNi43NjIgMTExLDMyNCBMMTExLDMxNCBMMTExLDMxNCBaIE0xMTYsMzMxIEMxMTkuODY2LDMzMSAxMjMsMzI3Ljg2NiAxMjMsMzI0IEwxMjMsMzE0IEMxMjMsMzEwLjEzNCAxMTkuODY2LDMwNyAxMTYsMzA3IEMxMTIuMTM0LDMwNyAxMDksMzEwLjEzNCAxMDksMzE0IEwxMDksMzI0IEMxMDksMzI3Ljg2NiAxMTIuMTM0LDMzMSAxMTYsMzMxIEwxMTYsMzMxIFogTTEyNywzMjYgTDEyNSwzMjYgQzEyNC4wODksMzMwLjAwNyAxMjAuMjgyLDMzMyAxMTYsMzMzIEMxMTEuNzE4LDMzMyAxMDcuOTExLDMzMC4wMDcgMTA3LDMyNiBMMTA1LDMyNiBDMTA1Ljg4MywzMzAuNzk5IDExMC4wNjMsMzM0LjUxIDExNSwzMzQuOTU1IEwxMTUsMzM3IEwxMTQsMzM3IEMxMTMuNDQ4LDMzNyAxMTMsMzM3LjQ0OCAxMTMsMzM4IEMxMTMsMzM4LjU1MyAxMTMuNDQ4LDMzOSAxMTQsMzM5IEwxMTgsMzM5IEMxMTguNTUyLDMzOSAxMTksMzM4LjU1MyAxMTksMzM4IEMxMTksMzM3LjQ0OCAxMTguNTUyLDMzNyAxMTgsMzM3IEwxMTcsMzM3IEwxMTcsMzM0Ljk1NSBDMTIxLjkzNywzMzQuNTEgMTI2LjExNywzMzAuNzk5IDEyNywzMjYgTDEyNywzMjYgWlwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTIgMiBMMzAgMzBcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+TXV0ZTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIGdhcDogMnB4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtYnRuIGVuZC1jYWxsLWJ0blwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmdVcCgpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICB0aXRsZT1cIkVuZCBDYWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIlxuICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+RW5kIENhbGw8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9jb21wb25lbnRzL3ZvaWNlLWFnZW50LW1vZGFsL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBSXBHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFPNUcsTUFBTSxPQUFPLHdCQUF3QjtJQW1CbkMsWUFDUyxpQkFBb0MsRUFDcEMsYUFBbUMsRUFDbEMsUUFBa0I7UUFGbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXJCbEIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLbEMsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixvQkFBZSxHQUFXLFdBQVcsQ0FBQztRQUN0QyxjQUFTLEdBQVcsY0FBYyxDQUFDO1FBQ25DLGNBQVMsR0FBVyxxQkFBcUIsQ0FBQztRQUUxQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUUxQixtQkFBYyxHQUE0QixJQUFJLENBQUM7UUFDL0Msb0JBQWUsR0FBd0IsSUFBSSxDQUFDO1FBUXBELDBDQUEwQztRQUNqQyxxQkFBZ0IsR0FBRyx1R0FBdUcsQ0FBQztRQUVwSSxjQUFTLEdBQWMsTUFBTSxDQUFDO1FBQzlCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsYUFBUSxHQUFXLE9BQU8sQ0FBQztRQUMzQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBV25CLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQW1FM0MsaUJBQVksR0FBWSxLQUFLLENBQUM7SUF4RjNCLENBQUM7SUFZSiwyRkFBMkY7SUFDM0YsSUFBSSxZQUFZLEtBQWMsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsK0VBQStFO0lBQy9FLElBQUksWUFBWSxLQUFjLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRWpILG1GQUFtRjtJQUNuRixJQUFJLFlBQVksS0FBYyxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztJQUk3RyxRQUFRO1FBQ04sMkRBQTJEO1FBQzNELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztZQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxJQUFJLFdBQVcsQ0FBQztZQUMxRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDakUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDbkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3hFO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYscUZBQXFGO1FBQ3JGLEtBQUssSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBSUQsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQztZQUFFLE9BQU87UUFDM0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDbEMsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FDOUIsQ0FBQztTQUNIO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hEO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQjtRQUNoQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDNUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUUsNEVBQTRFO1FBQzVFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsSUFBSSxXQUFXO1FBQ2IsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3RCLEtBQUssWUFBWSxDQUFDLENBQUMsT0FBTyxlQUFlLENBQUM7WUFDMUMsS0FBSyxTQUFTLENBQUMsQ0FBSSxPQUFPLFlBQVksQ0FBQztZQUN2QyxLQUFLLFdBQVcsQ0FBQyxDQUFFLE9BQU8sY0FBYyxDQUFDO1lBQ3pDLDhFQUE4RTtZQUM5RSxLQUFLLFdBQVcsQ0FBQyxDQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxXQUFXLENBQUM7WUFDekQsT0FBTyxDQUFDLENBQVcsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsVUFBVTtRQUNSLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQixDQUFDOztzSEFyTVUsd0JBQXdCOzBHQUF4Qix3QkFBd0IsZ2FDWHJDLCtqWEEyVUE7NEZEaFVhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSwyQkFBMkI7a0tBSzNCLEtBQUs7c0JBQWQsTUFBTTtnQkFDRSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UsIENhbGxTdGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby1hbmFseXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZPSUNFX01PREFMX0NPTkZJRywgVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIFZvaWNlTW9kYWxDb25maWcgfSBmcm9tICcuLi8uLi92b2ljZS1tb2RhbC10b2tlbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LXZvaWNlLWFnZW50LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQElucHV0KCkgYXBpVXJsITogc3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbklkITogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBldmVudFRva2VuOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXZlbnRJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGV2ZW50VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZG9tYWluQXV0aG9yaXR5OiBzdHJpbmcgPSAncHJvZC1saXRlJztcbiAgQElucHV0KCkgYWdlbnROYW1lOiBzdHJpbmcgPSAnQUkgQXNzaXN0YW50JztcbiAgQElucHV0KCkgYWdlbnRSb2xlOiBzdHJpbmcgPSAnQUkgQWdlbnQgU3BlY2lhbGlzdCc7XG4gIEBJbnB1dCgpIGFnZW50QXZhdGFyPzogc3RyaW5nO1xuICBASW5wdXQoKSB1c2Vyc0FwaVVybDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBpbmplY3RlZENvbmZpZzogVm9pY2VNb2RhbENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9uQ2xvc2VDYWxsYmFjazogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZvaWNlQWdlbnRTZXJ2aWNlOiBWb2ljZUFnZW50U2VydmljZSxcbiAgICBwdWJsaWMgYXVkaW9BbmFseXplcjogQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIC8qKiBIYXJkY29kZWQgdm9pY2UgYWdlbnQgYXZhdGFyIChOaWEpLiAqL1xuICByZWFkb25seSBkaXNwbGF5QXZhdGFyVXJsID0gJ2h0dHBzOi8vd3d3LmpvdGZvcm0uY29tL3VwbG9hZHMvbWVobWV0a2FyYWthc2xpL2Zvcm1fZmlsZXMvMTU2NDU5MzY2NzY3NmE4ZTg1ZjIzNzU4Ljg2OTQ1NTM3X2ljb24ucG5nJztcblxuICBjYWxsU3RhdGU6IENhbGxTdGF0ZSA9ICdpZGxlJztcbiAgc3RhdHVzVGV4dDogc3RyaW5nID0gJyc7XG4gIGR1cmF0aW9uOiBzdHJpbmcgPSAnMDA6MDAnO1xuICBpc01pY011dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzVXNlclNwZWFraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGF1ZGlvTGV2ZWxzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBib3QgaXMgc3BlYWtpbmcg4oCUIGRyaXZlcyBhdmF0YXIgcHVsc2UgYW5pbWF0aW9uIGFuZCB2b2ljZSB2aXN1YWxpemVyLiAqL1xuICBnZXQgaXNCb3RUYWxraW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5jYWxsU3RhdGUgPT09ICd0YWxraW5nJzsgfVxuXG4gIC8qKiBUcnVlIHdoaWxlIHRoZSB1c2VyIGlzIGFjdGl2ZWx5IHNwZWFraW5nIOKAlCBkcml2ZXMgd2F2ZWZvcm0gYWN0aXZlIGNvbG9yLiAqL1xuICBnZXQgaXNVc2VyQWN0aXZlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5jYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnICYmIHRoaXMuaXNVc2VyU3BlYWtpbmcgJiYgIXRoaXMuaXNNaWNNdXRlZDsgfVxuXG4gIC8qKiBUcnVlIGR1cmluZyB0aGUgYnJpZWYgcHJvY2Vzc2luZyBwYXVzZSBiZXR3ZWVuIHVzZXIgc3BlZWNoIGFuZCBib3QgcmVzcG9uc2UuICovXG4gIGdldCBpc1Byb2Nlc3NpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmNhbGxTdGF0ZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgdGhpcy5zdGF0dXNUZXh0ID09PSAnUHJvY2Vzc2luZy4uLic7IH1cblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiBvcGVuZWQgdmlhIE92ZXJsYXksIGNvbmZpZyBpcyBwcm92aWRlZCBieSBpbmplY3Rpb25cbiAgICB0aGlzLmluamVjdGVkQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoVk9JQ0VfTU9EQUxfQ09ORklHLCBudWxsKTtcbiAgICB0aGlzLm9uQ2xvc2VDYWxsYmFjayA9IHRoaXMuaW5qZWN0b3IuZ2V0KFZPSUNFX01PREFMX0NMT1NFX0NBTExCQUNLLCBudWxsKTtcbiAgICBpZiAodGhpcy5pbmplY3RlZENvbmZpZykge1xuICAgICAgdGhpcy5hcGlVcmwgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFwaVVybDtcbiAgICAgIHRoaXMudG9rZW4gPSB0aGlzLmluamVjdGVkQ29uZmlnLnRva2VuO1xuICAgICAgdGhpcy5ib3RJZCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYm90SWQ7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gdGhpcy5pbmplY3RlZENvbmZpZy5jb252ZXJzYXRpb25JZDtcbiAgICAgIHRoaXMuYXBpS2V5ID0gdGhpcy5pbmplY3RlZENvbmZpZy5hcGlLZXkgPz8gJyc7XG4gICAgICB0aGlzLmV2ZW50VG9rZW4gPSB0aGlzLmluamVjdGVkQ29uZmlnLmV2ZW50VG9rZW4gPz8gJyc7XG4gICAgICB0aGlzLmV2ZW50SWQgPSB0aGlzLmluamVjdGVkQ29uZmlnLmV2ZW50SWQgPz8gJyc7XG4gICAgICB0aGlzLmV2ZW50VXJsID0gdGhpcy5pbmplY3RlZENvbmZpZy5ldmVudFVybCA/PyAnJztcbiAgICAgIHRoaXMuZG9tYWluQXV0aG9yaXR5ID0gdGhpcy5pbmplY3RlZENvbmZpZy5kb21haW5BdXRob3JpdHkgPz8gJ3Byb2QtbGl0ZSc7XG4gICAgICB0aGlzLmFnZW50TmFtZSA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYWdlbnROYW1lID8/IHRoaXMuYWdlbnROYW1lO1xuICAgICAgdGhpcy5hZ2VudFJvbGUgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFnZW50Um9sZSA/PyB0aGlzLmFnZW50Um9sZTtcbiAgICAgIHRoaXMuYWdlbnRBdmF0YXIgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFnZW50QXZhdGFyO1xuICAgICAgdGhpcy51c2Vyc0FwaVVybCA9IHRoaXMuaW5qZWN0ZWRDb25maWcudXNlcnNBcGlVcmwgPz8gdGhpcy51c2Vyc0FwaVVybDtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuY2FsbFN0YXRlJC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICB0aGlzLmNhbGxTdGF0ZSA9IHN0YXRlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLnN0YXR1c1RleHQkLnN1YnNjcmliZSh0ZXh0ID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gdGV4dDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5kdXJhdGlvbiQuc3Vic2NyaWJlKGR1cmF0aW9uID0+IHtcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmlzTWljTXV0ZWQkLnN1YnNjcmliZShtdXRlZCA9PiB7XG4gICAgICAgIHRoaXMuaXNNaWNNdXRlZCA9IG11dGVkO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmlzVXNlclNwZWFraW5nJC5zdWJzY3JpYmUoc3BlYWtpbmcgPT4ge1xuICAgICAgICB0aGlzLmlzVXNlclNwZWFraW5nID0gc3BlYWtpbmc7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuYXVkaW9MZXZlbHMkLnN1YnNjcmliZShsZXZlbHMgPT4ge1xuICAgICAgICB0aGlzLmF1ZGlvTGV2ZWxzID0gbGV2ZWxzO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWx3YXlzIHN0YXJ0IGZyb20gYSBmcmVzaCB2b2ljZSBzZXNzaW9uIHRvIGF2b2lkIHN0YWxlL2Rpc2Nvbm5lY3RlZCBzdGF0ZSBmbGFzaGVzLlxuICAgIHZvaWQgdGhpcy5vcGVuRnJlc2hDYWxsU2Vzc2lvbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGlzQ29ubmVjdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGFzeW5jIHN0YXJ0Q2FsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RpbmcgfHwgKHRoaXMuY2FsbFN0YXRlICE9PSAnaWRsZScgJiYgdGhpcy5jYWxsU3RhdGUgIT09ICdlbmRlZCcpKSByZXR1cm47XG4gICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmNvbm5lY3QoXG4gICAgICAgIHRoaXMuYXBpVXJsLFxuICAgICAgICB0aGlzLnRva2VuLFxuICAgICAgICB0aGlzLmJvdElkLFxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkLFxuICAgICAgICB0aGlzLmFwaUtleSxcbiAgICAgICAgdGhpcy5ldmVudFRva2VuLFxuICAgICAgICB0aGlzLmV2ZW50SWQsXG4gICAgICAgIHRoaXMuZXZlbnRVcmwsXG4gICAgICAgIHRoaXMuZG9tYWluQXV0aG9yaXR5LFxuICAgICAgICB0aGlzLnVzZXJzQXBpVXJsIHx8IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IHZvaWNlIGFnZW50OicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuRnJlc2hDYWxsU2Vzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLnByZXBhcmVGcmVzaFNlc3Npb24oKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0Q2FsbCgpO1xuICB9XG5cbiAgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UudG9nZ2xlTWljKCk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGF1ZGlvIGxldmVsICgw4oCTMTAwKSB0byB3YXZlZm9ybSBiYXIgaGVpZ2h0IGluIHB4IHdpdGggYSBnYXVzc2lhblxuICAgKiBiZWxsLWN1cnZlIGVudmVsb3BlIHNvIGNlbnRyZSBiYXJzIGFyZSB0YWxsZXN0IGFuZCBlZGdlIGJhcnMgYXBwZWFyXG4gICAqIGFzIHRpbnkgZG90cyDigJQgbWF0Y2hpbmcgdGhlIGF1ZGlvLXdhdmVmb3JtIHJlZmVyZW5jZSBkZXNpZ24uXG4gICAqL1xuICBnZXRXYXZlZm9ybUhlaWdodChsZXZlbDogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBuID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBsZXZlbCA/PyAwKSk7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmF1ZGlvTGV2ZWxzLmxlbmd0aCB8fCA2MDtcbiAgICBjb25zdCBjZW50ZXIgPSAodG90YWwgLSAxKSAvIDI7XG4gICAgY29uc3Qgc2lnbWEgPSB0b3RhbCAvIDU7XG4gICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLmV4cCgtTWF0aC5wb3coaW5kZXggLSBjZW50ZXIsIDIpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7XG4gICAgLy8gTWluaW11bSBoZWlnaHQgc2NhbGVzIHdpdGggZW52ZWxvcGUgc28gZWRnZXMgc2hvdyBhcyBkb3RzIGV2ZW4gaW4gc2lsZW5jZVxuICAgIGNvbnN0IG1pbkhlaWdodCA9IDIgKyBlbnZlbG9wZSAqIDM7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gNCArIGVudmVsb3BlICogMzg7XG4gICAgcmV0dXJuIG1pbkhlaWdodCArIChuIC8gMTAwKSAqIChtYXhIZWlnaHQgLSBtaW5IZWlnaHQpO1xuICB9XG5cbiAgLyoqIFN0YXR1cyBsYWJlbCBmb3IgYWN0aXZlIGNhbGwg4oCUIGRyaXZlbiBieSBjYWxsU3RhdGUgKyBzZXJ2aWNlIHN0YXR1c1RleHQuICovXG4gIGdldCBzdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5jYWxsU3RhdGUpIHtcbiAgICAgIGNhc2UgJ2Nvbm5lY3RpbmcnOiByZXR1cm4gJ0Nvbm5lY3RpbmcuLi4nO1xuICAgICAgY2FzZSAndGFsa2luZyc6ICAgIHJldHVybiAnVGFsa2luZy4uLic7XG4gICAgICBjYXNlICdsaXN0ZW5pbmcnOiAgcmV0dXJuICdMaXN0ZW5pbmcuLi4nO1xuICAgICAgLy8gJ2Nvbm5lY3RlZCcgY292ZXJzOiBpbml0aWFsIGNvbm5lY3QsIGJldHdlZW4gdHVybnMgKExpc3RlbmluZyAvIFByb2Nlc3NpbmcpXG4gICAgICBjYXNlICdjb25uZWN0ZWQnOiAgcmV0dXJuIHRoaXMuc3RhdHVzVGV4dCB8fCAnQ29ubmVjdGVkJztcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNUZXh0IHx8ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsIEFnYWluOiByZXNldCB0byBpZGxlIHRoZW4gc3RhcnQgYSBuZXcgY2FsbC4gKi9cbiAgYXN5bmMgY2FsbEFnYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMub3BlbkZyZXNoQ2FsbFNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKiBCYWNrIHRvIENoYXQ6IGNsb3NlIG1vZGFsIGFuZCBkaXNjb25uZWN0LiAqL1xuICBiYWNrVG9DaGF0KCk6IHZvaWQge1xuICAgIHRoaXMuZW5kQ2FsbCgpO1xuICB9XG5cbiAgLyoqIEVuZCBjYWxsIGJ1dCBrZWVwIG1vZGFsIG9wZW4gdG8gc2hvdyBDYWxsIEVuZGVkICsgQ2FsbCBBZ2FpbiAvIEJhY2sgdG8gQ2hhdC4gKi9cbiAgaGFuZ1VwKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgYXN5bmMgZW5kQ2FsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLm9uQ2xvc2VDYWxsYmFjaz8uKCk7XG4gICAgdGhpcy5jbG9zZS5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2b2ljZS1hZ2VudC1tb2RhbC1vdmVybGF5XCIgKGNsaWNrKT1cImVuZENhbGwoKVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ2b2ljZS1jb250YWluZXIgdm9pY2UtYWdlbnQtbW9kYWxcIlxuICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICA+XG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaWNvblwiPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBkPVwiTTEyIDFDOC4xMyAxIDUgNC4xMyA1IDhWMTRDNSAxNy44NyA4LjEzIDIxIDEyIDIxQzE1Ljg3IDIxIDE5IDE3Ljg3IDE5IDE0VjhDMTkgNC4xMyAxNS44NyAxIDEyIDFaXCJcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk0xMiAyM0MxMC4zNCAyMyA5IDIxLjY2IDkgMjBIMTVDMTUgMjEuNjYgMTMuNjYgMjMgMTIgMjNaXCJcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5Wb2ljZTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImNsb3NlLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJlbmRDYWxsKClcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgID5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEF2YXRhciBTZWN0aW9uIHdpdGggZ2xvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItZ2xvd1wiIFtjbGFzcy5nbG93LXRhbGtpbmddPVwiaXNCb3RUYWxraW5nXCIgW2NsYXNzLmdsb3ctbGlzdGVuaW5nXT1cImNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZydcIj48L2Rpdj5cblxuICAgICAgPCEtLSBQYXJ0aWNsZSByaW5nIOKAlCB2aXNpYmxlIHdoaWxlIGJvdCBpcyB0YWxraW5nIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImlzQm90VGFsa2luZ1wiIGNsYXNzPVwicGFydGljbGVzLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaSBvZiBbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNV1cIlxuICAgICAgICAgICAgICBjbGFzcz1cInBhcnRpY2xlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0taV09XCJpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmFuaW1hdGlvbkRlbGF5XT1cIihpICogMC4xNSkgKyAncydcIj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItd3JhcHBlclwiIFtjbGFzcy5zcGVha2luZ109XCJpc0JvdFRhbGtpbmdcIiBbY2xhc3MubGlzdGVuaW5nXT1cImNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZydcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWFnZVwiIFtzcmNdPVwiZGlzcGxheUF2YXRhclVybFwiIGFsdD1cIk5pYVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWdlbnQgSW5mbzogTmlhICsgQ29sbGFib3JhdGlvbiBNYW5hZ2VyIEFJIEFnZW50IFNwZWNpYWxpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFnZW50LWluZm9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1uYW1lXCI+XG4gICAgICAgIE5pYVxuICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWJhZGdlXCI+QUk8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwiYWdlbnQtcm9sZVwiPkNPUDMwIEFJIEFnZW50IDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RhcnQgQ2FsbCAod2hlbiBpZGxlIG9ubHkpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdpZGxlJ1wiIGNsYXNzPVwic3RhcnQtY2FsbC1zZWN0aW9uXCI+XG4gICAgICA8cCAqbmdJZj1cInN0YXR1c1RleHQgPT09ICdDb25uZWN0aW9uIGZhaWxlZCdcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgc3RhdHVzVGV4dCB9fVxuICAgICAgPC9wPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInN0YXJ0LWNhbGwtYnV0dG9uXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0Nvbm5lY3RpbmdcIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRDYWxsKClcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImlzQ29ubmVjdGluZ1wiPkNvbm5lY3RpbmcuLi48L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ29ubmVjdGluZyAmJiBzdGF0dXNUZXh0ID09PSAnQ29ubmVjdGlvbiBmYWlsZWQnXCJcbiAgICAgICAgICA+UmV0cnk8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0Nvbm5lY3RpbmcgJiYgc3RhdHVzVGV4dCAhPT0gJ0Nvbm5lY3Rpb24gZmFpbGVkJ1wiXG4gICAgICAgICAgPlN0YXJ0IENhbGw8L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhbGwgRW5kZWQ6IHN0YXR1cyArIENhbGwgQWdhaW4gLyBCYWNrIHRvIENoYXQgLS0+XG4gICAgPGRpdiAqbmdJZj1cImNhbGxTdGF0ZSA9PT0gJ2VuZGVkJ1wiIGNsYXNzPVwiY2FsbC1lbmRlZC1zZWN0aW9uXCI+XG4gICAgICA8cCBjbGFzcz1cImNhbGwtZW5kZWQtc3RhdHVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLXRleHRcIj5DYWxsIEVuZGVkPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10aW1lclwiPnt7IGR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGwtZW5kZWQtY29udHJvbHNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ0blwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNhbGxBZ2FpbigpXCJcbiAgICAgICAgICB0aXRsZT1cIkNhbGwgQWdhaW5cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDEyYTkgOSAwIDEgMCA5LTkgOS43NSA5Ljc1IDAgMCAwLTYuNzQgMi43NEwzIDhcIiAvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDN2NWg1XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICBDYWxsIEFnYWluXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiYmFja1RvQ2hhdCgpXCJcbiAgICAgICAgICB0aXRsZT1cIkJhY2sgdG8gQ2hhdFwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTIxIDE1YTIgMiAwIDAgMS0yIDJIN2wtNCA0VjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAyelwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgQmFjayB0byBDaGF0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0YXR1cyAod2hlbiBjb25uZWN0aW5nIG9yIGluLWNhbGw6IFRhbGtpbmcuLi4gLyBMaXN0ZW5pbmcgLyBDb25uZWN0ZWQgKyB0aW1lcikgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIHN0YXR1cy1pbmxpbmVcIlxuICAgICAgKm5nSWY9XCJjYWxsU3RhdGUgIT09ICdpZGxlJyAmJiBjYWxsU3RhdGUgIT09ICdlbmRlZCdcIlxuICAgID5cbiAgICAgIDxkaXYgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdjb25uZWN0aW5nJ1wiIGNsYXNzPVwic3RhdHVzLWNvbm5lY3RpbmdcIj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIGNsYXNzPVwic3Bpbm5lclwiXG4gICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgIGN4PVwiMTJcIlxuICAgICAgICAgICAgY3k9XCIxMlwiXG4gICAgICAgICAgICByPVwiMTBcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiMzEuNDE2XCJcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PVwiMzEuNDE2XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YW5pbWF0ZVxuICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lPVwic3Ryb2tlLWRhc2hhcnJheVwiXG4gICAgICAgICAgICAgIGR1cj1cIjJzXCJcbiAgICAgICAgICAgICAgdmFsdWVzPVwiMCAzMS40MTY7MTUuNzA4IDE1LjcwODswIDMxLjQxNjswIDMxLjQxNlwiXG4gICAgICAgICAgICAgIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGFuaW1hdGVcbiAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZT1cInN0cm9rZS1kYXNob2Zmc2V0XCJcbiAgICAgICAgICAgICAgZHVyPVwiMnNcIlxuICAgICAgICAgICAgICB2YWx1ZXM9XCIwOy0xNS43MDg7LTMxLjQxNjstMzEuNDE2XCJcbiAgICAgICAgICAgICAgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jaXJjbGU+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10ZXh0XCI+e3sgc3RhdHVzVGV4dCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImNhbGxTdGF0ZSAhPT0gJ2Nvbm5lY3RpbmcnXCJcbiAgICAgICAgY2xhc3M9XCJzdGF0dXMtY29ubmVjdGVkIHN0YXR1cy1pbmxpbmUtcm93XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtdGV4dFwiIFtjbGFzcy5zdGF0dXMtdGFsa2luZ109XCJpc0JvdFRhbGtpbmdcIiBbY2xhc3Muc3RhdHVzLWxpc3RlbmluZ109XCJjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnXCIgW2NsYXNzLnN0YXR1cy1wcm9jZXNzaW5nXT1cImlzUHJvY2Vzc2luZ1wiPlxuICAgICAgICAgIHt7IHN0YXR1c0xhYmVsIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8IS0tIEFuaW1hdGVkIGJhcnMg4oCUIHZpc2libGUgd2hpbGUgYm90IGlzIHRhbGtpbmcgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0JvdFRhbGtpbmdcIiBjbGFzcz1cInZvaWNlLXZpc3VhbGl6ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmJhclwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YmFyXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZiYXJcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmJhclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvdW5jaW5nIGRvdHMg4oCUIHZpc2libGUgZHVyaW5nIHByb2Nlc3NpbmcgcGF1c2UgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc1Byb2Nlc3NpbmdcIiBjbGFzcz1cInByb2Nlc3NpbmctZG90c1wiPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy10aW1lclwiPnt7IGR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFdhdmVmb3JtOiBhbHdheXMgdmlzaWJsZSBkdXJpbmcgYW4gYWN0aXZlIGNhbGwsIGFjdGl2ZSAoY29sb3VyZWQpIHdoZW4gdXNlciBzcGVha3MgLS0+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJjYWxsU3RhdGUgPT09ICdjb25uZWN0ZWQnIHx8IGNhbGxTdGF0ZSA9PT0gJ2xpc3RlbmluZycgfHwgY2FsbFN0YXRlID09PSAndGFsa2luZydcIlxuICAgICAgY2xhc3M9XCJ3YXZlZm9ybS1jb250YWluZXJcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YXZlZm9ybS1iYXJzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGV2ZWwgb2YgYXVkaW9MZXZlbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwid2F2ZWZvcm0tYmFyXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzVXNlckFjdGl2ZVwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJnZXRXYXZlZm9ybUhlaWdodChsZXZlbCwgaSlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FsbCBDb250cm9scyAod2hlbiBjb25uZWN0ZWQpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY29udHJvbHNcIlxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgY2FsbFN0YXRlID09PSAnY29ubmVjdGluZycgfHxcbiAgICAgICAgY2FsbFN0YXRlID09PSAnY29ubmVjdGVkJyB8fFxuICAgICAgICBjYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnIHx8XG4gICAgICAgIGNhbGxTdGF0ZSA9PT0gJ3RhbGtpbmcnXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1idG4gbWljLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLm11dGVkXT1cImlzTWljTXV0ZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNaWMoKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3RpdGxlXT1cImlzTWljTXV0ZWQgPyAnVW5tdXRlJyA6ICdNdXRlJ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIE1pY3JvcGhvbmUgaWNvbiAodW5tdXRlZCkgLS0+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgKm5nSWY9XCIhaXNNaWNNdXRlZFwiXG4gICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCItNSAwIDMyIDMyXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xMDUsIC0zMDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0xMTEsMzE0IEMxMTEsMzExLjIzOCAxMTMuMjM5LDMwOSAxMTYsMzA5IEMxMTguNzYxLDMwOSAxMjEsMzExLjIzOCAxMjEsMzE0IEwxMjEsMzI0IEMxMjEsMzI2Ljc2MiAxMTguNzYxLDMyOSAxMTYsMzI5IEMxMTMuMjM5LDMyOSAxMTEsMzI2Ljc2MiAxMTEsMzI0IEwxMTEsMzE0IEwxMTEsMzE0IFogTTExNiwzMzEgQzExOS44NjYsMzMxIDEyMywzMjcuODY2IDEyMywzMjQgTDEyMywzMTQgQzEyMywzMTAuMTM0IDExOS44NjYsMzA3IDExNiwzMDcgQzExMi4xMzQsMzA3IDEwOSwzMTAuMTM0IDEwOSwzMTQgTDEwOSwzMjQgQzEwOSwzMjcuODY2IDExMi4xMzQsMzMxIDExNiwzMzEgTDExNiwzMzEgWiBNMTI3LDMyNiBMMTI1LDMyNiBDMTI0LjA4OSwzMzAuMDA3IDEyMC4yODIsMzMzIDExNiwzMzMgQzExMS43MTgsMzMzIDEwNy45MTEsMzMwLjAwNyAxMDcsMzI2IEwxMDUsMzI2IEMxMDUuODgzLDMzMC43OTkgMTEwLjA2MywzMzQuNTEgMTE1LDMzNC45NTUgTDExNSwzMzcgTDExNCwzMzcgQzExMy40NDgsMzM3IDExMywzMzcuNDQ4IDExMywzMzggQzExMywzMzguNTUzIDExMy40NDgsMzM5IDExNCwzMzkgTDExOCwzMzkgQzExOC41NTIsMzM5IDExOSwzMzguNTUzIDExOSwzMzggQzExOSwzMzcuNDQ4IDExOC41NTIsMzM3IDExOCwzMzcgTDExNywzMzcgTDExNywzMzQuOTU1IEMxMjEuOTM3LDMzNC41MSAxMjYuMTE3LDMzMC43OTkgMTI3LDMyNiBMMTI3LDMyNiBaXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8IS0tIE1pY3JvcGhvbmUgaWNvbiAobXV0ZWQpIC0tPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNaWNNdXRlZFwiXG4gICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCItNSAwIDMyIDMyXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xMDUsIC0zMDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0xMTEsMzE0IEMxMTEsMzExLjIzOCAxMTMuMjM5LDMwOSAxMTYsMzA5IEMxMTguNzYxLDMwOSAxMjEsMzExLjIzOCAxMjEsMzE0IEwxMjEsMzI0IEMxMjEsMzI2Ljc2MiAxMTguNzYxLDMyOSAxMTYsMzI5IEMxMTMuMjM5LDMyOSAxMTEsMzI2Ljc2MiAxMTEsMzI0IEwxMTEsMzE0IEwxMTEsMzE0IFogTTExNiwzMzEgQzExOS44NjYsMzMxIDEyMywzMjcuODY2IDEyMywzMjQgTDEyMywzMTQgQzEyMywzMTAuMTM0IDExOS44NjYsMzA3IDExNiwzMDcgQzExMi4xMzQsMzA3IDEwOSwzMTAuMTM0IDEwOSwzMTQgTDEwOSwzMjQgQzEwOSwzMjcuODY2IDExMi4xMzQsMzMxIDExNiwzMzEgTDExNiwzMzEgWiBNMTI3LDMyNiBMMTI1LDMyNiBDMTI0LjA4OSwzMzAuMDA3IDEyMC4yODIsMzMzIDExNiwzMzMgQzExMS43MTgsMzMzIDEwNy45MTEsMzMwLjAwNyAxMDcsMzI2IEwxMDUsMzI2IEMxMDUuODgzLDMzMC43OTkgMTEwLjA2MywzMzQuNTEgMTE1LDMzNC45NTUgTDExNSwzMzcgTDExNCwzMzcgQzExMy40NDgsMzM3IDExMywzMzcuNDQ4IDExMywzMzggQzExMywzMzguNTUzIDExMy40NDgsMzM5IDExNCwzMzkgTDExOCwzMzkgQzExOC41NTIsMzM5IDExOSwzMzguNTUzIDExOSwzMzggQzExOSwzMzcuNDQ4IDExOC41NTIsMzM3IDExOCwzMzcgTDExNywzMzcgTDExNywzMzQuOTU1IEMxMjEuOTM3LDMzNC41MSAxMjYuMTE3LDMzMC43OTkgMTI3LDMyNiBMMTI3LDMyNiBaXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMiAyIEwzMCAzMFwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5NdXRlPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1idG4gZW5kLWNhbGwtYnRuXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZ1VwKClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHRpdGxlPVwiRW5kIENhbGxcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5FbmQgQ2FsbDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19