emanate-ai-chat-lib 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/emanate-ai-chat-lib.umd.js +54 -9
- package/bundles/emanate-ai-chat-lib.umd.js.map +1 -1
- package/esm2015/lib/components/ai-chat.component.js +52 -9
- package/esm2015/lib/services/ai-agent.service.js +4 -2
- package/fesm2015/emanate-ai-chat-lib.js +54 -9
- package/fesm2015/emanate-ai-chat-lib.js.map +1 -1
- package/lib/components/ai-chat.component.d.ts +17 -1
- package/lib/services/ai-agent.service.d.ts +2 -1
- package/package.json +1 -1
|
@@ -17,6 +17,9 @@ export class AiChatComponent {
|
|
|
17
17
|
this.enableImageUpload = false; // Enable/disable image upload button
|
|
18
18
|
this.enableFileUpload = false; // Enable/disable file upload button
|
|
19
19
|
this.iconSet = 'feather'; // Icon set selection
|
|
20
|
+
this.enableAnimations = true; // Enable/disable all animations
|
|
21
|
+
this.animationSpeed = 'normal'; // Animation speed control
|
|
22
|
+
this.enableStatusTransitions = true; // Enable/disable status indicator transitions
|
|
20
23
|
this.messageReceived = new EventEmitter();
|
|
21
24
|
this.messageSent = new EventEmitter();
|
|
22
25
|
this.fileUploaded = new EventEmitter();
|
|
@@ -27,6 +30,7 @@ export class AiChatComponent {
|
|
|
27
30
|
this.intent = '';
|
|
28
31
|
this.isLoading = false;
|
|
29
32
|
this.configurationStatus = '';
|
|
33
|
+
this.previousStatus = ''; // Track previous status for transitions
|
|
30
34
|
// Resizing properties
|
|
31
35
|
this.currentSize = 'default';
|
|
32
36
|
this.isFullscreen = false;
|
|
@@ -54,7 +58,7 @@ export class AiChatComponent {
|
|
|
54
58
|
this.destroy$ = new Subject();
|
|
55
59
|
}
|
|
56
60
|
ngOnInit() {
|
|
57
|
-
this.
|
|
61
|
+
this.updateStatus('Initializing...');
|
|
58
62
|
console.log('AI Chat Component initialized');
|
|
59
63
|
// Load icon set
|
|
60
64
|
this.icons = getIconSet(this.iconSet, this.customIcons);
|
|
@@ -80,7 +84,7 @@ export class AiChatComponent {
|
|
|
80
84
|
}
|
|
81
85
|
catch (error) {
|
|
82
86
|
console.error('Error during component initialization:', error);
|
|
83
|
-
this.
|
|
87
|
+
this.updateStatus('Initialization error');
|
|
84
88
|
}
|
|
85
89
|
}
|
|
86
90
|
ngOnChanges(changes) {
|
|
@@ -117,6 +121,35 @@ export class AiChatComponent {
|
|
|
117
121
|
this.destroy$.next();
|
|
118
122
|
this.destroy$.complete();
|
|
119
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Get animation duration in milliseconds based on speed setting
|
|
126
|
+
*/
|
|
127
|
+
getAnimationDuration() {
|
|
128
|
+
if (!this.enableAnimations)
|
|
129
|
+
return 0;
|
|
130
|
+
switch (this.animationSpeed) {
|
|
131
|
+
case 'slow': return 500;
|
|
132
|
+
case 'fast': return 150;
|
|
133
|
+
default: return 250; // normal
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get animation CSS class based on settings
|
|
138
|
+
*/
|
|
139
|
+
getAnimationClass() {
|
|
140
|
+
if (!this.enableAnimations)
|
|
141
|
+
return 'no-animations';
|
|
142
|
+
return `animation-speed-${this.animationSpeed}`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Update status with transition tracking
|
|
146
|
+
*/
|
|
147
|
+
updateStatus(newStatus) {
|
|
148
|
+
if (this.enableStatusTransitions && this.configurationStatus !== newStatus) {
|
|
149
|
+
this.previousStatus = this.configurationStatus;
|
|
150
|
+
}
|
|
151
|
+
this.configurationStatus = newStatus;
|
|
152
|
+
}
|
|
120
153
|
/**
|
|
121
154
|
* Sanitize icon SVG strings for safe rendering in innerHTML bindings
|
|
122
155
|
*/
|
|
@@ -130,20 +163,20 @@ export class AiChatComponent {
|
|
|
130
163
|
});
|
|
131
164
|
}
|
|
132
165
|
testConfiguration() {
|
|
133
|
-
this.
|
|
166
|
+
this.updateStatus('Testing connection...');
|
|
134
167
|
this.aiAgentService.testConfiguration()
|
|
135
168
|
.pipe(takeUntil(this.destroy$))
|
|
136
169
|
.subscribe({
|
|
137
170
|
next: (response) => {
|
|
138
171
|
if (response.success) {
|
|
139
|
-
this.
|
|
172
|
+
this.updateStatus('AI Agent is ready');
|
|
140
173
|
}
|
|
141
174
|
else {
|
|
142
|
-
this.
|
|
175
|
+
this.updateStatus(`Configuration error: ${response.error}`);
|
|
143
176
|
}
|
|
144
177
|
},
|
|
145
178
|
error: (errorResponse) => {
|
|
146
|
-
this.
|
|
179
|
+
this.updateStatus(`Connection error: Cannot connect to backend service`);
|
|
147
180
|
console.error('API connection test failed:', errorResponse);
|
|
148
181
|
}
|
|
149
182
|
});
|
|
@@ -258,7 +291,7 @@ export class AiChatComponent {
|
|
|
258
291
|
this.isLoading = true;
|
|
259
292
|
const request = {
|
|
260
293
|
query: inquiry,
|
|
261
|
-
|
|
294
|
+
conversationId: this.conversationId,
|
|
262
295
|
userId: this.userId,
|
|
263
296
|
userName: this.userName,
|
|
264
297
|
appSource: this.appSource
|
|
@@ -268,6 +301,10 @@ export class AiChatComponent {
|
|
|
268
301
|
.subscribe({
|
|
269
302
|
next: (response) => {
|
|
270
303
|
this.isLoading = false;
|
|
304
|
+
// Update conversationId if provided in response
|
|
305
|
+
if (response.conversationId && !this.conversationId) {
|
|
306
|
+
this.conversationId = response.conversationId;
|
|
307
|
+
}
|
|
271
308
|
// Remove loading message
|
|
272
309
|
this.messages = this.messages.filter(msg => !msg.isLoading);
|
|
273
310
|
if (response.answer || (response.contents && response.contents.length > 0)) {
|
|
@@ -652,7 +689,7 @@ export class AiChatComponent {
|
|
|
652
689
|
}
|
|
653
690
|
}
|
|
654
691
|
AiChatComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AiChatComponent, deps: [{ token: i1.AiAgentService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
655
|
-
AiChatComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AiChatComponent, selector: "emanate-ai-chat", inputs: { title: "title", placeholder: "placeholder", showDebugInfo: "showDebugInfo", apiUrl: "apiUrl", appKey: "appKey", appSource: "appSource", userId: "userId", firstName: "firstName", userName: "userName", templateDesign: "templateDesign", welcomeMessage: "welcomeMessage", historicalMessages: "historicalMessages", conversationId: "conversationId", enableImageUpload: "enableImageUpload", enableFileUpload: "enableFileUpload", iconSet: "iconSet", customIcons: "customIcons" }, outputs: { messageReceived: "messageReceived", messageSent: "messageSent", fileUploaded: "fileUploaded", sizeChanged: "sizeChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"ai-chat-container\" \r\n [ngClass]=\"getThemeClass()\" \r\n [ngStyle]=\"getContainerStyle()\"\r\n [class.fullscreen]=\"isFullscreen\"\r\n [class.resizing]=\"isResizing\">\r\n \r\n <!-- Resize Handles -->\r\n <div class=\"resize-handle resize-handle-right\" \r\n (mousedown)=\"startResize($event, 'width')\"\r\n *ngIf=\"!isFullscreen\"\r\n title=\"Drag to resize width\">\r\n </div>\r\n \r\n <div class=\"resize-handle resize-handle-corner\" \r\n (mousedown)=\"startResize($event, 'both')\"\r\n *ngIf=\"!isFullscreen\"\r\n title=\"Drag to resize\">\r\n </div>\r\n \r\n <!-- Debug Information (only shown when showDebugInfo is true) -->\r\n <div *ngIf=\"showDebugInfo\" class=\"debug-info\">\r\n <h3>DEBUG: AI Chat Component Loaded</h3>\r\n <p>Status: {{ configurationStatus || 'Loading...' }}</p>\r\n <p>Messages count: {{ messages.length || 0 }}</p>\r\n <p>Theme: {{ templateDesign || 'default' }}</p>\r\n <p>Size: {{ currentSize }} ({{ containerWidth }}x{{ containerHeight }})</p>\r\n </div>\r\n\r\n <div class=\"chat-header\">\r\n <div class=\"header-left\">\r\n <h2>{{ title }}</h2>\r\n <!-- Icon-only status indicator -->\r\n <div class=\"status-indicator-icon\" \r\n [ngClass]=\"{'status-ready': configurationStatus === 'AI Agent is ready', \r\n 'status-error': configurationStatus !== 'AI Agent is ready',\r\n 'status-loading': configurationStatus === 'Initializing...' || configurationStatus === 'Testing connection...'}\"\r\n [title]=\"configurationStatus\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"header-controls\">\r\n <!-- Size Preset Buttons -->\r\n <div class=\"size-controls\" *ngIf=\"!isFullscreen\">\r\n <button class=\"control-button size-button\" \r\n (click)=\"applySizePreset('compact')\"\r\n [class.active]=\"currentSize === 'compact'\"\r\n title=\"Compact View\"\r\n attr.aria-label=\"Compact View\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.compactView\"></span>\r\n </button>\r\n <button class=\"control-button size-button\" \r\n (click)=\"applySizePreset('default')\"\r\n [class.active]=\"currentSize === 'default'\"\r\n title=\"Default View\"\r\n attr.aria-label=\"Default View\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.defaultView\"></span>\r\n </button>\r\n <button class=\"control-button size-button\" \r\n (click)=\"applySizePreset('expanded')\"\r\n [class.active]=\"currentSize === 'expanded'\"\r\n title=\"Expanded View\"\r\n attr.aria-label=\"Expanded View\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.expandedView\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-messages\" #messagesContainer>\r\n <div *ngFor=\"let message of messages; let i = index; trackBy: trackByIndex\" class=\"message-wrapper\">\r\n <!-- Message -->\r\n <div class=\"message\" \r\n [ngClass]=\"{'user-message': message.isUser, 'ai-message': !message.isUser, 'loading-message': message.isLoading}\">\r\n \r\n <div class=\"message-content\">\r\n <div [innerHTML]=\"message.content\"></div>\r\n <div class=\"message-timestamp\">{{ getFormattedTime(message.timestamp) }}</div>\r\n </div>\r\n \r\n <div class=\"message-avatar\">\r\n <span *ngIf=\"message.isUser\" class=\"avatar-icon\" [innerHTML]=\"sanitizedIcons.userAvatar\"></span>\r\n <span *ngIf=\"!message.isUser && !message.isLoading\" class=\"avatar-icon\" [innerHTML]=\"sanitizedIcons.aiAvatar\"></span>\r\n <span *ngIf=\"message.isLoading\" class=\"avatar-icon loading-spinner\" [innerHTML]=\"sanitizedIcons.loadingAvatar\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-input\">\r\n <!-- Attachments Preview -->\r\n <div class=\"attachments-preview\" *ngIf=\"selectedFiles.length > 0\">\r\n <div class=\"attachment-item\" *ngFor=\"let file of selectedFiles\">\r\n <svg class=\"attachment-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"></path>\r\n </svg>\r\n <span class=\"attachment-name\">{{ file.name }}</span>\r\n <span class=\"attachment-size\">{{ getFileSizeFormatted(file.size) }}</span>\r\n <button class=\"remove-attachment\" (click)=\"removeAttachment(file.id)\" title=\"Remove\" attr.aria-label=\"Remove attachment\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <div class=\"input-container\">\r\n <!-- File Upload Inputs (Hidden) -->\r\n <input type=\"file\" \r\n id=\"image-upload-input\" \r\n accept=\"image/*\" \r\n multiple \r\n (change)=\"onImageUpload($event)\"\r\n style=\"display: none;\"\r\n [disabled]=\"!enableImageUpload\">\r\n \r\n <input type=\"file\" \r\n id=\"file-upload-input\" \r\n accept=\".pdf,.doc,.docx,.txt,.csv\" \r\n multiple \r\n (change)=\"onFileUpload($event)\"\r\n style=\"display: none;\"\r\n [disabled]=\"!enableFileUpload\">\r\n \r\n <!-- Upload Buttons (Conditionally rendered) -->\r\n <div class=\"upload-buttons\" *ngIf=\"enableImageUpload || enableFileUpload\">\r\n <button *ngIf=\"enableImageUpload\" \r\n class=\"upload-button image-upload\" \r\n (click)=\"triggerImageUpload()\"\r\n [disabled]=\"isLoading\"\r\n title=\"Upload Image\"\r\n attr.aria-label=\"Upload Image\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.imageUpload\"></span>\r\n </button>\r\n \r\n <button *ngIf=\"enableFileUpload\" \r\n class=\"upload-button file-upload\" \r\n (click)=\"triggerFileUpload()\"\r\n [disabled]=\"isLoading\"\r\n title=\"Attach File\"\r\n attr.aria-label=\"Attach File\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.fileUpload\"></span>\r\n </button>\r\n </div>\r\n \r\n <textarea \r\n [(ngModel)]=\"currentInquiry\" \r\n (keypress)=\"onKeyPress($event)\"\r\n [placeholder]=\"placeholder\"\r\n rows=\"2\"\r\n [disabled]=\"isLoading\"\r\n class=\"inquiry-textarea\"\r\n attr.aria-label=\"Type your message\"></textarea>\r\n \r\n <button \r\n (click)=\"sendInquiry()\" \r\n [disabled]=\"!currentInquiry.trim() || isLoading\"\r\n class=\"send-button\"\r\n title=\"Send Message\"\r\n attr.aria-label=\"Send Message\">\r\n <span *ngIf=\"!isLoading\" class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.send\"></span>\r\n <span *ngIf=\"isLoading\" class=\"icon-svg loading-icon\" [innerHTML]=\"sanitizedIcons.sendLoading\"></span>\r\n <span class=\"text\">{{ isLoading ? 'Sending...' : 'Send' }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.ai-chat-container{display:flex;flex-direction:column;height:100vh;max-width:800px;margin:0 auto;background:#ffffff;border-radius:12px;overflow:hidden;position:relative;transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 8px #00000014,0 4px 16px #0000000a;--icon-primary: #667eea;--icon-secondary: #6b7280;--icon-avatar-user: #667eea;--icon-avatar-ai: #764ba2;--icon-header: #ffffff;--icon-upload: #667eea;--icon-send: #ffffff;--icon-active: #667eea;--icon-disabled: #d1d5db;--icon-hover: #5568d3}.ai-chat-container.fullscreen{position:fixed!important;top:0!important;left:0!important;right:0!important;bottom:0!important;width:100vw!important;height:100vh!important;max-width:100vw!important;max-height:100vh!important;border-radius:0;z-index:99999;margin:0}.ai-chat-container.resizing{-webkit-user-select:none;user-select:none;cursor:nwse-resize;transition:none}.resize-handle{position:absolute;background:rgba(102,126,234,.3);transition:background .2s ease;z-index:10}.resize-handle:hover{background:rgba(102,126,234,.6)}.resize-handle.resize-handle-right{top:0;right:-4px;width:8px;height:100%;cursor:ew-resize}.resize-handle.resize-handle-corner{bottom:-4px;right:-4px;width:20px;height:20px;cursor:nwse-resize;border-radius:0 0 8px}.resize-handle.resize-handle-corner:after{content:\"\\22f0\";position:absolute;bottom:2px;right:2px;font-size:12px;color:#fffc}.debug-info{background:yellow;padding:10px;border:1px solid orange}.debug-info h3{margin:0;font-size:1.2rem}.debug-info p{margin:5px 0}.icon-svg{display:inline-block;width:20px;height:20px;color:var(--icon-secondary)}.icon-svg svg{width:100%;height:100%;stroke-width:2;transition:all .2s ease}.avatar-icon{display:inline-block;width:28px;height:28px}.avatar-icon svg{width:100%;height:100%}.chat-header{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;padding:1rem 1.25rem;display:flex;justify-content:space-between;align-items:center;grid-gap:1rem;gap:1rem;flex-wrap:wrap;box-shadow:0 2px 4px #0000001a}.chat-header .header-left{display:flex;align-items:center;grid-gap:.75rem;gap:.75rem;flex:1;min-width:200px}.chat-header .header-left h2{margin:0;font-size:1.25rem;font-weight:600;letter-spacing:-.01em}.chat-header .header-controls{display:flex;align-items:center;grid-gap:.5rem;gap:.5rem}.chat-header .header-controls .icon-svg{color:var(--icon-header)}.chat-header .status-indicator-icon{width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.4);transition:all .3s ease;box-shadow:0 0 0 2px #fff3;cursor:help}.chat-header .status-indicator-icon.status-ready{background:#2ecc71;box-shadow:0 0 0 2px #2ecc714d,0 0 8px #2ecc7166}.chat-header .status-indicator-icon.status-error{background:#e74c3c;box-shadow:0 0 0 2px #e74c3c4d,0 0 8px #e74c3c66}.chat-header .status-indicator-icon.status-loading{background:#f39c12;box-shadow:0 0 0 2px #f39c124d;animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.1)}}.size-controls{display:flex;grid-gap:.5rem;gap:.5rem;background:transparent;padding:0;border-radius:0;backdrop-filter:none}.control-button{background:transparent;border:none;border-radius:0;width:28px;height:28px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1);color:#fff;padding:0}.control-button .icon-svg{width:18px;height:18px;color:var(--icon-header)}.control-button:hover:not(:disabled){opacity:.8;transform:scale(1.1)}.control-button:active:not(:disabled){transform:scale(.95)}.control-button.active{opacity:1;transform:scale(1.15)}.control-button:disabled{opacity:.4;cursor:not-allowed}.fullscreen-button{background:transparent}.fullscreen-button:hover:not(:disabled){opacity:.8;transform:scale(1.1)}.clear-button{background:transparent}.clear-button:hover:not(:disabled){opacity:.8;transform:scale(1.1);color:#fcc}.chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;padding:1.25rem;display:flex;flex-direction:column;grid-gap:.875rem;gap:.875rem;scroll-behavior:smooth;background:#f8f9fa}.chat-messages::-webkit-scrollbar{width:6px}.chat-messages::-webkit-scrollbar-track{background:transparent}.chat-messages::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:3px}.chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25)}.message-wrapper{display:flex;flex-direction:column}.message{display:flex;max-width:75%;animation:fadeInSlide .25s cubic-bezier(.4,0,.2,1)}.message.user-message{align-self:flex-end;flex-direction:row-reverse}.message.user-message .message-content{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border-radius:18px 18px 4px;box-shadow:0 1px 2px #0000001a}.message.user-message .avatar-icon{color:var(--icon-avatar-user)}.message.ai-message{align-self:flex-start}.message.ai-message .message-content{background:white;color:#1a1a1a;border-radius:18px 18px 18px 4px;border:1px solid #e8e8e8;box-shadow:0 1px 2px #0000000d}.message.ai-message .avatar-icon{color:var(--icon-avatar-ai)}.message.loading-message{opacity:.7}.message.loading-message .message-content{font-style:italic}@keyframes fadeInSlide{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.message-content{padding:.75rem 1rem;margin:0 .5rem;word-wrap:break-word;max-width:100%;line-height:1.5;font-size:.9375rem}.message-timestamp{font-size:.6875rem;opacity:.65;margin-top:.375rem;text-align:right;font-weight:500}.message-avatar{width:36px;height:36px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.message-avatar .avatar-icon{opacity:.9}.loading-spinner{animation:spin 1.2s linear infinite;opacity:.7}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.chat-input{background:white;padding:1rem 1.25rem;border-top:1px solid #e8e8e8;display:flex;flex-direction:column;grid-gap:.75rem;gap:.75rem;box-shadow:0 -2px 8px #0000000a}.input-container{display:flex;grid-gap:.5rem;gap:.5rem;align-items:flex-end}.upload-buttons{display:flex;grid-gap:.5rem;gap:.5rem;flex-direction:column}.upload-button{background:#f5f5f5;border:1px solid #e0e0e0;border-radius:10px;width:42px;height:42px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1)}.upload-button .icon-svg{width:20px;height:20px;color:var(--icon-upload)}.upload-button:hover:not(:disabled){background:var(--icon-upload);border-color:var(--icon-upload);transform:translateY(-1px);box-shadow:0 2px 8px #667eea40}.upload-button:hover:not(:disabled) .icon-svg{color:#fff}.upload-button:active:not(:disabled){transform:translateY(0)}.upload-button:disabled{opacity:.4;cursor:not-allowed;background:#fafafa}.attachments-preview{display:flex;flex-wrap:wrap;grid-gap:.5rem;gap:.5rem;padding:.75rem;background:#f8f9fa;border-radius:10px;border:1px solid #e8e8e8}.attachment-item{display:flex;align-items:center;grid-gap:.625rem;gap:.625rem;background:white;border:1px solid #e0e0e0;border-radius:8px;padding:.625rem .875rem;font-size:.875rem;transition:all .2s ease}.attachment-item:hover{border-color:#667eea;box-shadow:0 2px 4px #667eea1a}.attachment-item .attachment-icon{width:20px;height:20px;color:#667eea;flex-shrink:0}.attachment-item .attachment-name{font-weight:500;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1a1a1a}.attachment-item .attachment-size{color:#666;font-size:.75rem;font-weight:500}.attachment-item .remove-attachment{background:transparent;border:none;color:#999;cursor:pointer;padding:.25rem;margin-left:.25rem;transition:all .2s ease;display:flex;align-items:center;justify-content:center;border-radius:4px}.attachment-item .remove-attachment svg{width:16px;height:16px}.attachment-item .remove-attachment:hover{color:#e74c3c;background:rgba(231,76,60,.1)}.inquiry-textarea{flex:1;border:1.5px solid #e0e0e0;border-radius:22px;padding:.875rem 1.125rem;font-family:inherit;font-size:.9375rem;line-height:1.5;resize:none;outline:none;transition:all .2s cubic-bezier(.4,0,.2,1);background:#fafafa}.inquiry-textarea:focus{border-color:#667eea;background:white;box-shadow:0 0 0 3px #667eea14}.inquiry-textarea:disabled{background:#f5f5f5;cursor:not-allowed;opacity:.6}.inquiry-textarea::placeholder{color:#999}.send-button{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:50px;padding:.875rem 1.75rem;font-size:.9375rem;font-weight:600;cursor:pointer;display:flex;align-items:center;grid-gap:.5rem;gap:.5rem;transition:all .2s cubic-bezier(.4,0,.2,1);min-width:110px;justify-content:center;box-shadow:0 2px 8px #667eea40}.send-button .icon-svg{width:18px;height:18px;color:var(--icon-send)}.send-button .loading-icon{animation:spin 1.2s linear infinite}.send-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 16px #667eea66}.send-button:active:not(:disabled){transform:translateY(0)}.send-button:disabled{background:#d0d0d0;cursor:not-allowed;box-shadow:none;opacity:.6}@media (max-width: 768px){.ai-chat-container{max-width:100%;border-radius:0;height:100vh}.ai-chat-container:not(.fullscreen){width:100%!important}.resize-handle{display:none}.size-controls{display:none}.chat-header{padding:.875rem 1rem}.chat-header .header-left h2{font-size:1.125rem}.chat-header .status-indicator-icon{width:8px;height:8px}.control-button{width:36px;height:36px}.control-button .icon-svg{width:18px;height:18px}.message{max-width:85%}.message-content{font-size:.875rem}.upload-buttons{flex-direction:row}.input-container{flex-wrap:wrap}.send-button{min-width:90px;padding:.75rem 1.25rem}.send-button .text{display:none}.chat-input{padding:.875rem 1rem}}@media (max-width: 480px){.chat-header{flex-direction:column;align-items:flex-start;grid-gap:.625rem;gap:.625rem}.chat-header .header-controls{width:100%;justify-content:space-between}.control-button{width:34px;height:34px}.control-button .icon-svg{width:16px;height:16px}.message-content{padding:.625rem .875rem;font-size:.875rem}.attachments-preview{flex-direction:column}.attachment-item{width:100%}.attachment-item .attachment-name{max-width:120px}.send-button{padding:.75rem 1rem;min-width:80px}}.control-button:focus,.upload-button:focus,.send-button:focus,.clear-button:focus{outline:3px solid #667eea;outline-offset:2px}@media (prefers-contrast: high){.control-button,.upload-button,.send-button{border:2px solid currentColor}.message-content{border:2px solid currentColor}}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.theme-dark{background:#2c2c2c;--icon-primary: #818cf8;--icon-secondary: #9ca3af;--icon-avatar-user: #818cf8;--icon-avatar-ai: #a78bfa;--icon-header: #e5e7eb;--icon-upload: #818cf8;--icon-send: #ffffff;--icon-active: #818cf8;--icon-disabled: #4b5563;--icon-hover: #6366f1}.theme-dark .chat-header{background:linear-gradient(135deg,#1a1a1a,#333)}.theme-dark .chat-messages{background:#2c2c2c}.theme-dark .ai-message .message-content{background:#3a3a3a;color:#fff;border-color:#555}.theme-dark .chat-input{background:#3a3a3a;border-color:#555}.theme-dark .inquiry-textarea{background:#2c2c2c;color:#fff;border-color:#555}.theme-dark .inquiry-textarea:focus{border-color:#667eea}.theme-dark .attachments-preview{background:#3a3a3a;border-color:#555}.theme-dark .attachment-item{background:#2c2c2c;border-color:#555;color:#fff}.theme-dark .upload-button{background:rgba(255,255,255,.1);border-color:#fff3}.theme-dark .upload-button:hover:not(:disabled){background:rgba(255,255,255,.2)}.theme-blue{background:#e3f2fd;--icon-primary: #1976d2;--icon-secondary: #546e7a;--icon-avatar-user: #1976d2;--icon-avatar-ai: #0288d1;--icon-header: #ffffff;--icon-upload: #1976d2;--icon-send: #ffffff;--icon-active: #1976d2;--icon-disabled: #b0bec5;--icon-hover: #1565c0}.theme-blue .chat-header{background:linear-gradient(135deg,#1976d2,#42a5f5)}.theme-blue .user-message .message-content{background:linear-gradient(135deg,#1976d2,#42a5f5)}.theme-blue .ai-message .message-content{border-color:#bbdefb}.theme-blue .inquiry-textarea:focus{border-color:#1976d2}.theme-blue .send-button{background:linear-gradient(135deg,#1976d2,#42a5f5)}.theme-blue .upload-button{background:rgba(25,118,210,.1);border-color:#1976d24d}.theme-blue .upload-button:hover:not(:disabled){background:rgba(25,118,210,.2)}.theme-green{background:#e8f5e8;--icon-primary: #388e3c;--icon-secondary: #546e7a;--icon-avatar-user: #388e3c;--icon-avatar-ai: #2e7d32;--icon-header: #ffffff;--icon-upload: #388e3c;--icon-send: #ffffff;--icon-active: #388e3c;--icon-disabled: #b0bec5;--icon-hover: #2e7d32}.theme-green .chat-header{background:linear-gradient(135deg,#388e3c,#66bb6a)}.theme-green .user-message .message-content{background:linear-gradient(135deg,#388e3c,#66bb6a)}.theme-green .ai-message .message-content{border-color:#c8e6c9}.theme-green .inquiry-textarea:focus{border-color:#388e3c}.theme-green .send-button{background:linear-gradient(135deg,#388e3c,#66bb6a)}.theme-green .upload-button{background:rgba(56,142,60,.1);border-color:#388e3c4d}.theme-green .upload-button:hover:not(:disabled){background:rgba(56,142,60,.2)}.theme-purple{background:#f3e5f5;--icon-primary: #7b1fa2;--icon-secondary: #6a1b9a;--icon-avatar-user: #7b1fa2;--icon-avatar-ai: #8e24aa;--icon-header: #ffffff;--icon-upload: #7b1fa2;--icon-send: #ffffff;--icon-active: #7b1fa2;--icon-disabled: #ce93d8;--icon-hover: #6a1b9a}.theme-purple .chat-header{background:linear-gradient(135deg,#7b1fa2,#ab47bc)}.theme-purple .user-message .message-content{background:linear-gradient(135deg,#7b1fa2,#ab47bc)}.theme-purple .ai-message .message-content{border-color:#e1bee7}.theme-purple .inquiry-textarea:focus{border-color:#7b1fa2}.theme-purple .send-button{background:linear-gradient(135deg,#7b1fa2,#ab47bc)}.theme-purple .upload-button{background:rgba(123,31,162,.1);border-color:#7b1fa24d}.theme-purple .upload-button:hover:not(:disabled){background:rgba(123,31,162,.2)}.theme-minimal{background:#fafafa;--icon-primary: #333333;--icon-secondary: #757575;--icon-avatar-user: #424242;--icon-avatar-ai: #616161;--icon-header: #333333;--icon-upload: #424242;--icon-send: #ffffff;--icon-active: #333333;--icon-disabled: #bdbdbd;--icon-hover: #212121}.theme-minimal .chat-header{background:#fff;color:#333;border-bottom:1px solid #e0e0e0}.theme-minimal .user-message .message-content{background:#007bff;color:#fff;border-radius:18px}.theme-minimal .ai-message .message-content{background:#f8f9fa;color:#333;border:1px solid #dee2e6}.theme-minimal .send-button{background:#007bff;border-radius:4px}.theme-minimal .upload-button{background:rgba(0,123,255,.1);border-color:#007bff4d}.theme-minimal .upload-button:hover:not(:disabled){background:rgba(0,123,255,.2)}.theme-corporate{background:#f8f9fa}.theme-corporate .chat-header{background:linear-gradient(135deg,#495057,#6c757d)}.theme-corporate .user-message .message-content{background:#495057}.theme-corporate .ai-message .message-content{background:#fff;border-color:#dee2e6}.theme-corporate .inquiry-textarea:focus{border-color:#495057}.theme-corporate .send-button{background:#495057}.theme-corporate .upload-button{background:rgba(73,80,87,.1);border-color:#4950574d}.theme-corporate .upload-button:hover:not(:disabled){background:rgba(73,80,87,.2)}.theme-red{background:#ffebee}.theme-red .chat-header{background:linear-gradient(135deg,#d32f2f,#f44336)}.theme-red .user-message .message-content{background:linear-gradient(135deg,#d32f2f,#f44336)}.theme-red .ai-message .message-content{border-color:#ffcdd2}.theme-red .inquiry-textarea:focus{border-color:#d32f2f}.theme-red .send-button{background:linear-gradient(135deg,#d32f2f,#f44336)}.theme-red .upload-button{background:rgba(211,47,47,.1);border-color:#d32f2f4d}.theme-red .upload-button:hover:not(:disabled){background:rgba(211,47,47,.2)}.theme-yellow{background:#fffde7}.theme-yellow .chat-header{background:linear-gradient(135deg,#f57f17,#ffb300)}.theme-yellow .user-message .message-content{background:linear-gradient(135deg,#f57f17,#ffb300)}.theme-yellow .ai-message .message-content{border-color:#fff9c4}.theme-yellow .inquiry-textarea:focus{border-color:#f57f17}.theme-yellow .send-button{background:linear-gradient(135deg,#f57f17,#ffb300)}.theme-yellow .upload-button{background:rgba(245,127,23,.1);border-color:#f57f174d}.theme-yellow .upload-button:hover:not(:disabled){background:rgba(245,127,23,.2)}.theme-orange{background:#fff3e0}.theme-orange .chat-header{background:linear-gradient(135deg,#e65100,#ff9800)}.theme-orange .user-message .message-content{background:linear-gradient(135deg,#e65100,#ff9800)}.theme-orange .ai-message .message-content{border-color:#ffe0b2}.theme-orange .inquiry-textarea:focus{border-color:#e65100}.theme-orange .send-button{background:linear-gradient(135deg,#e65100,#ff9800)}.theme-orange .upload-button{background:rgba(230,81,0,.1);border-color:#e651004d}.theme-orange .upload-button:hover:not(:disabled){background:rgba(230,81,0,.2)}\n"], directives: [{ type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
692
|
+
AiChatComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AiChatComponent, selector: "emanate-ai-chat", inputs: { title: "title", placeholder: "placeholder", showDebugInfo: "showDebugInfo", apiUrl: "apiUrl", appKey: "appKey", appSource: "appSource", userId: "userId", firstName: "firstName", userName: "userName", templateDesign: "templateDesign", welcomeMessage: "welcomeMessage", historicalMessages: "historicalMessages", conversationId: "conversationId", enableImageUpload: "enableImageUpload", enableFileUpload: "enableFileUpload", iconSet: "iconSet", customIcons: "customIcons", enableAnimations: "enableAnimations", animationSpeed: "animationSpeed", enableStatusTransitions: "enableStatusTransitions" }, outputs: { messageReceived: "messageReceived", messageSent: "messageSent", fileUploaded: "fileUploaded", sizeChanged: "sizeChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"ai-chat-container\" \r\n [ngClass]=\"getThemeClass()\" \r\n [ngStyle]=\"getContainerStyle()\"\r\n [class.fullscreen]=\"isFullscreen\"\r\n [class.resizing]=\"isResizing\"\r\n [class]=\"getAnimationClass()\">\r\n \r\n <!-- Resize Handles -->\r\n <div class=\"resize-handle resize-handle-right\" \r\n (mousedown)=\"startResize($event, 'width')\"\r\n *ngIf=\"!isFullscreen\"\r\n title=\"Drag to resize width\">\r\n </div>\r\n \r\n <div class=\"resize-handle resize-handle-corner\" \r\n (mousedown)=\"startResize($event, 'both')\"\r\n *ngIf=\"!isFullscreen\"\r\n title=\"Drag to resize\">\r\n </div>\r\n \r\n <!-- Debug Information (only shown when showDebugInfo is true) -->\r\n <div *ngIf=\"showDebugInfo\" class=\"debug-info\">\r\n <h3>DEBUG: AI Chat Component Loaded</h3>\r\n <p>Status: {{ configurationStatus || 'Loading...' }}</p>\r\n <p>Messages count: {{ messages.length || 0 }}</p>\r\n <p>Theme: {{ templateDesign || 'default' }}</p>\r\n <p>Size: {{ currentSize }} ({{ containerWidth }}x{{ containerHeight }})</p>\r\n </div>\r\n\r\n <div class=\"chat-header\">\r\n <div class=\"header-left\">\r\n <h2>{{ title }}</h2>\r\n <!-- Icon-only status indicator -->\r\n <div class=\"status-indicator-icon\" \r\n [ngClass]=\"{'status-ready': configurationStatus === 'AI Agent is ready', \r\n 'status-error': configurationStatus !== 'AI Agent is ready' && configurationStatus !== 'Initializing...' && configurationStatus !== 'Testing connection...',\r\n 'status-loading': configurationStatus === 'Initializing...' || configurationStatus === 'Testing connection...',\r\n 'transition-enabled': enableStatusTransitions}\"\r\n [title]=\"configurationStatus\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"header-controls\">\r\n <!-- Size Preset Buttons -->\r\n <div class=\"size-controls\" *ngIf=\"!isFullscreen\">\r\n <button class=\"control-button size-button\" \r\n (click)=\"applySizePreset('compact')\"\r\n [class.active]=\"currentSize === 'compact'\"\r\n title=\"Compact View\"\r\n attr.aria-label=\"Compact View\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.compactView\"></span>\r\n </button>\r\n <button class=\"control-button size-button\" \r\n (click)=\"applySizePreset('default')\"\r\n [class.active]=\"currentSize === 'default'\"\r\n title=\"Default View\"\r\n attr.aria-label=\"Default View\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.defaultView\"></span>\r\n </button>\r\n <button class=\"control-button size-button\" \r\n (click)=\"applySizePreset('expanded')\"\r\n [class.active]=\"currentSize === 'expanded'\"\r\n title=\"Expanded View\"\r\n attr.aria-label=\"Expanded View\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.expandedView\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-messages\" #messagesContainer>\r\n <div *ngFor=\"let message of messages; let i = index; trackBy: trackByIndex\" class=\"message-wrapper\">\r\n <!-- Message -->\r\n <div class=\"message\" \r\n [ngClass]=\"{'user-message': message.isUser, 'ai-message': !message.isUser, 'loading-message': message.isLoading}\">\r\n \r\n <div class=\"message-content\">\r\n <div [innerHTML]=\"message.content\"></div>\r\n <div class=\"message-timestamp\">{{ getFormattedTime(message.timestamp) }}</div>\r\n </div>\r\n \r\n <div class=\"message-avatar\">\r\n <span *ngIf=\"message.isUser\" class=\"avatar-icon\" [innerHTML]=\"sanitizedIcons.userAvatar\"></span>\r\n <span *ngIf=\"!message.isUser && !message.isLoading\" class=\"avatar-icon\" [innerHTML]=\"sanitizedIcons.aiAvatar\"></span>\r\n <span *ngIf=\"message.isLoading\" class=\"avatar-icon loading-spinner\" [innerHTML]=\"sanitizedIcons.loadingAvatar\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-input\">\r\n <!-- Attachments Preview -->\r\n <div class=\"attachments-preview\" *ngIf=\"selectedFiles.length > 0\">\r\n <div class=\"attachment-item\" *ngFor=\"let file of selectedFiles\">\r\n <svg class=\"attachment-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"></path>\r\n </svg>\r\n <span class=\"attachment-name\">{{ file.name }}</span>\r\n <span class=\"attachment-size\">{{ getFileSizeFormatted(file.size) }}</span>\r\n <button class=\"remove-attachment\" (click)=\"removeAttachment(file.id)\" title=\"Remove\" attr.aria-label=\"Remove attachment\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <div class=\"input-container\">\r\n <!-- File Upload Inputs (Hidden) -->\r\n <input type=\"file\" \r\n id=\"image-upload-input\" \r\n accept=\"image/*\" \r\n multiple \r\n (change)=\"onImageUpload($event)\"\r\n style=\"display: none;\"\r\n [disabled]=\"!enableImageUpload\">\r\n \r\n <input type=\"file\" \r\n id=\"file-upload-input\" \r\n accept=\".pdf,.doc,.docx,.txt,.csv\" \r\n multiple \r\n (change)=\"onFileUpload($event)\"\r\n style=\"display: none;\"\r\n [disabled]=\"!enableFileUpload\">\r\n \r\n <!-- Upload Buttons (Conditionally rendered) -->\r\n <div class=\"upload-buttons\" *ngIf=\"enableImageUpload || enableFileUpload\">\r\n <button *ngIf=\"enableImageUpload\" \r\n class=\"upload-button image-upload\" \r\n (click)=\"triggerImageUpload()\"\r\n [disabled]=\"isLoading\"\r\n title=\"Upload Image\"\r\n attr.aria-label=\"Upload Image\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.imageUpload\"></span>\r\n </button>\r\n \r\n <button *ngIf=\"enableFileUpload\" \r\n class=\"upload-button file-upload\" \r\n (click)=\"triggerFileUpload()\"\r\n [disabled]=\"isLoading\"\r\n title=\"Attach File\"\r\n attr.aria-label=\"Attach File\">\r\n <span class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.fileUpload\"></span>\r\n </button>\r\n </div>\r\n \r\n <textarea \r\n [(ngModel)]=\"currentInquiry\" \r\n (keypress)=\"onKeyPress($event)\"\r\n [placeholder]=\"placeholder\"\r\n rows=\"2\"\r\n [disabled]=\"isLoading\"\r\n class=\"inquiry-textarea\"\r\n attr.aria-label=\"Type your message\"></textarea>\r\n \r\n <button \r\n (click)=\"sendInquiry()\" \r\n [disabled]=\"!currentInquiry.trim() || isLoading\"\r\n class=\"send-button\"\r\n title=\"Send Message\"\r\n attr.aria-label=\"Send Message\">\r\n <span *ngIf=\"!isLoading\" class=\"icon-svg\" [innerHTML]=\"sanitizedIcons.send\"></span>\r\n <span *ngIf=\"isLoading\" class=\"icon-svg loading-icon\" [innerHTML]=\"sanitizedIcons.sendLoading\"></span>\r\n <span class=\"text\">{{ isLoading ? 'Sending...' : 'Send' }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.ai-chat-container{display:flex;flex-direction:column;height:100vh;max-width:800px;margin:0 auto;background:#ffffff;border-radius:12px;overflow:hidden;position:relative;transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 2px 8px #00000014,0 4px 16px #0000000a;--icon-primary: #667eea;--icon-secondary: #6b7280;--icon-avatar-user: #667eea;--icon-avatar-ai: #764ba2;--icon-header: #ffffff;--icon-upload: #667eea;--icon-send: #ffffff;--icon-active: #667eea;--icon-disabled: #d1d5db;--icon-hover: #5568d3}.ai-chat-container.fullscreen{position:fixed!important;top:0!important;left:0!important;right:0!important;bottom:0!important;width:100vw!important;height:100vh!important;max-width:100vw!important;max-height:100vh!important;border-radius:0;z-index:99999;margin:0}.ai-chat-container.resizing{-webkit-user-select:none;user-select:none;cursor:nwse-resize;transition:none}.resize-handle{position:absolute;background:rgba(102,126,234,.3);transition:background .2s ease;z-index:10}.resize-handle:hover{background:rgba(102,126,234,.6)}.resize-handle.resize-handle-right{top:0;right:-4px;width:8px;height:100%;cursor:ew-resize}.resize-handle.resize-handle-corner{bottom:-4px;right:-4px;width:20px;height:20px;cursor:nwse-resize;border-radius:0 0 8px}.resize-handle.resize-handle-corner:after{content:\"\\22f0\";position:absolute;bottom:2px;right:2px;font-size:12px;color:#fffc}.debug-info{background:yellow;padding:10px;border:1px solid orange}.debug-info h3{margin:0;font-size:1.2rem}.debug-info p{margin:5px 0}.icon-svg{display:inline-block;width:20px;height:20px;color:var(--icon-secondary)}.icon-svg svg{width:100%;height:100%;stroke-width:2;transition:all .2s ease}.avatar-icon{display:inline-block;width:28px;height:28px}.avatar-icon svg{width:100%;height:100%}.chat-header{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;padding:1rem 1.25rem;display:flex;justify-content:space-between;align-items:center;grid-gap:1rem;gap:1rem;flex-wrap:wrap;box-shadow:0 2px 4px #0000001a}.chat-header .header-left{display:flex;align-items:center;grid-gap:.75rem;gap:.75rem;flex:1;min-width:200px}.chat-header .header-left h2{margin:0;font-size:1.25rem;font-weight:600;letter-spacing:-.01em}.chat-header .header-controls{display:flex;align-items:center;grid-gap:.5rem;gap:.5rem}.chat-header .header-controls .icon-svg{color:var(--icon-header)}.chat-header .status-indicator-icon{width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.4);transition:all .3s ease;box-shadow:0 0 0 2px #fff3;cursor:help}.chat-header .status-indicator-icon.transition-enabled{transition:background-color .4s cubic-bezier(.4,0,.2,1),box-shadow .4s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1)}.chat-header .status-indicator-icon.status-ready{background:#2ecc71;box-shadow:0 0 0 2px #2ecc714d,0 0 8px #2ecc7166}.chat-header .status-indicator-icon.status-ready.transition-enabled{animation:statusReady .5s cubic-bezier(.4,0,.2,1)}.chat-header .status-indicator-icon.status-error{background:#e74c3c;box-shadow:0 0 0 2px #e74c3c4d,0 0 8px #e74c3c66}.chat-header .status-indicator-icon.status-error.transition-enabled{animation:statusError .5s cubic-bezier(.4,0,.2,1)}.chat-header .status-indicator-icon.status-loading{background:#f39c12;box-shadow:0 0 0 2px #f39c124d;animation:pulse 1.5s ease-in-out infinite}.chat-header .status-indicator-icon.status-loading.transition-enabled{animation:pulse 1.5s ease-in-out infinite,statusLoading .5s cubic-bezier(.4,0,.2,1)}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.1)}}@keyframes statusReady{0%{transform:scale(.8);opacity:0}50%{transform:scale(1.2)}to{transform:scale(1);opacity:1}}@keyframes statusError{0%{transform:scale(.8);opacity:0}50%{transform:scale(1.15)}to{transform:scale(1);opacity:1}}@keyframes statusLoading{0%{transform:scale(.8) rotate(0);opacity:0}to{transform:scale(1) rotate(360deg);opacity:1}}.ai-chat-container{--animation-duration: .25s;--animation-easing: cubic-bezier(.4, 0, .2, 1)}.ai-chat-container.animation-speed-slow{--animation-duration: .5s}.ai-chat-container.animation-speed-slow *{transition-duration:.5s!important}.ai-chat-container.animation-speed-slow .status-indicator-icon.transition-enabled{transition-duration:.6s!important}.ai-chat-container.animation-speed-slow .message{animation-duration:.6s!important}.ai-chat-container.animation-speed-fast{--animation-duration: .15s}.ai-chat-container.animation-speed-fast *{transition-duration:.15s!important}.ai-chat-container.animation-speed-fast .status-indicator-icon.transition-enabled{transition-duration:.2s!important}.ai-chat-container.animation-speed-fast .message{animation-duration:.2s!important}.ai-chat-container.no-animations{--animation-duration: 0ms}.ai-chat-container.no-animations *,.ai-chat-container.no-animations *:before,.ai-chat-container.no-animations *:after{animation-duration:0ms!important;animation-delay:0ms!important;transition-duration:0ms!important;transition-delay:0ms!important}.ai-chat-container.no-animations .status-indicator-icon{animation:none!important;transition:none!important}.size-controls{display:flex;grid-gap:.5rem;gap:.5rem;background:transparent;padding:0;border-radius:0;backdrop-filter:none}.control-button{background:transparent;border:none;border-radius:0;width:28px;height:28px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1);color:#fff;padding:0}.control-button .icon-svg{width:18px;height:18px;color:var(--icon-header)}.control-button:hover:not(:disabled){opacity:.8;transform:scale(1.1)}.control-button:active:not(:disabled){transform:scale(.95)}.control-button.active{opacity:1;transform:scale(1.15)}.control-button:disabled{opacity:.4;cursor:not-allowed}.fullscreen-button{background:transparent}.fullscreen-button:hover:not(:disabled){opacity:.8;transform:scale(1.1)}.clear-button{background:transparent}.clear-button:hover:not(:disabled){opacity:.8;transform:scale(1.1);color:#fcc}.chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;padding:1.25rem;display:flex;flex-direction:column;grid-gap:.875rem;gap:.875rem;scroll-behavior:smooth;background:#f8f9fa}.chat-messages::-webkit-scrollbar{width:6px}.chat-messages::-webkit-scrollbar-track{background:transparent}.chat-messages::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:3px}.chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25)}.message-wrapper{display:flex;flex-direction:column}.message{display:flex;max-width:75%;animation:fadeInSlide .25s cubic-bezier(.4,0,.2,1)}.message.user-message{align-self:flex-end;flex-direction:row-reverse}.message.user-message .message-content{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border-radius:18px 18px 4px;box-shadow:0 1px 2px #0000001a}.message.user-message .avatar-icon{color:var(--icon-avatar-user)}.message.ai-message{align-self:flex-start}.message.ai-message .message-content{background:white;color:#1a1a1a;border-radius:18px 18px 18px 4px;border:1px solid #e8e8e8;box-shadow:0 1px 2px #0000000d}.message.ai-message .avatar-icon{color:var(--icon-avatar-ai)}.message.loading-message{opacity:.7}.message.loading-message .message-content{font-style:italic}@keyframes fadeInSlide{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.message-content{padding:.75rem 1rem;margin:0 .5rem;word-wrap:break-word;max-width:100%;line-height:1.5;font-size:.9375rem}.message-timestamp{font-size:.6875rem;opacity:.65;margin-top:.375rem;text-align:right;font-weight:500}.message-avatar{width:36px;height:36px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.message-avatar .avatar-icon{opacity:.9}.loading-spinner{animation:spin 1.2s linear infinite;opacity:.7}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.chat-input{background:white;padding:1rem 1.25rem;border-top:1px solid #e8e8e8;display:flex;flex-direction:column;grid-gap:.75rem;gap:.75rem;box-shadow:0 -2px 8px #0000000a}.input-container{display:flex;grid-gap:.5rem;gap:.5rem;align-items:flex-end}.upload-buttons{display:flex;grid-gap:.5rem;gap:.5rem;flex-direction:column}.upload-button{background:#f5f5f5;border:1px solid #e0e0e0;border-radius:10px;width:42px;height:42px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s cubic-bezier(.4,0,.2,1)}.upload-button .icon-svg{width:20px;height:20px;color:var(--icon-upload)}.upload-button:hover:not(:disabled){background:var(--icon-upload);border-color:var(--icon-upload);transform:translateY(-1px);box-shadow:0 2px 8px #667eea40}.upload-button:hover:not(:disabled) .icon-svg{color:#fff}.upload-button:active:not(:disabled){transform:translateY(0)}.upload-button:disabled{opacity:.4;cursor:not-allowed;background:#fafafa}.attachments-preview{display:flex;flex-wrap:wrap;grid-gap:.5rem;gap:.5rem;padding:.75rem;background:#f8f9fa;border-radius:10px;border:1px solid #e8e8e8}.attachment-item{display:flex;align-items:center;grid-gap:.625rem;gap:.625rem;background:white;border:1px solid #e0e0e0;border-radius:8px;padding:.625rem .875rem;font-size:.875rem;transition:all .2s ease}.attachment-item:hover{border-color:#667eea;box-shadow:0 2px 4px #667eea1a}.attachment-item .attachment-icon{width:20px;height:20px;color:#667eea;flex-shrink:0}.attachment-item .attachment-name{font-weight:500;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1a1a1a}.attachment-item .attachment-size{color:#666;font-size:.75rem;font-weight:500}.attachment-item .remove-attachment{background:transparent;border:none;color:#999;cursor:pointer;padding:.25rem;margin-left:.25rem;transition:all .2s ease;display:flex;align-items:center;justify-content:center;border-radius:4px}.attachment-item .remove-attachment svg{width:16px;height:16px}.attachment-item .remove-attachment:hover{color:#e74c3c;background:rgba(231,76,60,.1)}.inquiry-textarea{flex:1;border:1.5px solid #e0e0e0;border-radius:22px;padding:.875rem 1.125rem;font-family:inherit;font-size:.9375rem;line-height:1.5;resize:none;outline:none;transition:all .2s cubic-bezier(.4,0,.2,1);background:#fafafa}.inquiry-textarea:focus{border-color:#667eea;background:white;box-shadow:0 0 0 3px #667eea14}.inquiry-textarea:disabled{background:#f5f5f5;cursor:not-allowed;opacity:.6}.inquiry-textarea::placeholder{color:#999}.send-button{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:50px;padding:.875rem 1.75rem;font-size:.9375rem;font-weight:600;cursor:pointer;display:flex;align-items:center;grid-gap:.5rem;gap:.5rem;transition:all .2s cubic-bezier(.4,0,.2,1);min-width:110px;justify-content:center;box-shadow:0 2px 8px #667eea40}.send-button .icon-svg{width:18px;height:18px;color:var(--icon-send)}.send-button .loading-icon{animation:spin 1.2s linear infinite}.send-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 16px #667eea66}.send-button:active:not(:disabled){transform:translateY(0)}.send-button:disabled{background:#d0d0d0;cursor:not-allowed;box-shadow:none;opacity:.6}@media (max-width: 768px){.ai-chat-container{max-width:100%;border-radius:0;height:100vh}.ai-chat-container:not(.fullscreen){width:100%!important}.resize-handle{display:none}.size-controls{display:none}.chat-header{padding:.875rem 1rem}.chat-header .header-left h2{font-size:1.125rem}.chat-header .status-indicator-icon{width:8px;height:8px}.control-button{width:36px;height:36px}.control-button .icon-svg{width:18px;height:18px}.message{max-width:85%}.message-content{font-size:.875rem}.upload-buttons{flex-direction:row}.input-container{flex-wrap:wrap}.send-button{min-width:90px;padding:.75rem 1.25rem}.send-button .text{display:none}.chat-input{padding:.875rem 1rem}}@media (max-width: 480px){.chat-header{flex-direction:column;align-items:flex-start;grid-gap:.625rem;gap:.625rem}.chat-header .header-controls{width:100%;justify-content:space-between}.control-button{width:34px;height:34px}.control-button .icon-svg{width:16px;height:16px}.message-content{padding:.625rem .875rem;font-size:.875rem}.attachments-preview{flex-direction:column}.attachment-item{width:100%}.attachment-item .attachment-name{max-width:120px}.send-button{padding:.75rem 1rem;min-width:80px}}.control-button:focus,.upload-button:focus,.send-button:focus,.clear-button:focus{outline:3px solid #667eea;outline-offset:2px}@media (prefers-contrast: high){.control-button,.upload-button,.send-button{border:2px solid currentColor}.message-content{border:2px solid currentColor}}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.theme-dark{background:#2c2c2c;--icon-primary: #818cf8;--icon-secondary: #9ca3af;--icon-avatar-user: #818cf8;--icon-avatar-ai: #a78bfa;--icon-header: #e5e7eb;--icon-upload: #818cf8;--icon-send: #ffffff;--icon-active: #818cf8;--icon-disabled: #4b5563;--icon-hover: #6366f1}.theme-dark .chat-header{background:linear-gradient(135deg,#1a1a1a,#333)}.theme-dark .chat-messages{background:#2c2c2c}.theme-dark .ai-message .message-content{background:#3a3a3a;color:#fff;border-color:#555}.theme-dark .chat-input{background:#3a3a3a;border-color:#555}.theme-dark .inquiry-textarea{background:#2c2c2c;color:#fff;border-color:#555}.theme-dark .inquiry-textarea:focus{border-color:#667eea}.theme-dark .attachments-preview{background:#3a3a3a;border-color:#555}.theme-dark .attachment-item{background:#2c2c2c;border-color:#555;color:#fff}.theme-dark .upload-button{background:rgba(255,255,255,.1);border-color:#fff3}.theme-dark .upload-button:hover:not(:disabled){background:rgba(255,255,255,.2)}.theme-blue{background:#e3f2fd;--icon-primary: #1976d2;--icon-secondary: #546e7a;--icon-avatar-user: #1976d2;--icon-avatar-ai: #0288d1;--icon-header: #ffffff;--icon-upload: #1976d2;--icon-send: #ffffff;--icon-active: #1976d2;--icon-disabled: #b0bec5;--icon-hover: #1565c0}.theme-blue .chat-header{background:linear-gradient(135deg,#1976d2,#42a5f5)}.theme-blue .user-message .message-content{background:linear-gradient(135deg,#1976d2,#42a5f5)}.theme-blue .ai-message .message-content{border-color:#bbdefb}.theme-blue .inquiry-textarea:focus{border-color:#1976d2}.theme-blue .send-button{background:linear-gradient(135deg,#1976d2,#42a5f5)}.theme-blue .upload-button{background:rgba(25,118,210,.1);border-color:#1976d24d}.theme-blue .upload-button:hover:not(:disabled){background:rgba(25,118,210,.2)}.theme-green{background:#e8f5e8;--icon-primary: #388e3c;--icon-secondary: #546e7a;--icon-avatar-user: #388e3c;--icon-avatar-ai: #2e7d32;--icon-header: #ffffff;--icon-upload: #388e3c;--icon-send: #ffffff;--icon-active: #388e3c;--icon-disabled: #b0bec5;--icon-hover: #2e7d32}.theme-green .chat-header{background:linear-gradient(135deg,#388e3c,#66bb6a)}.theme-green .user-message .message-content{background:linear-gradient(135deg,#388e3c,#66bb6a)}.theme-green .ai-message .message-content{border-color:#c8e6c9}.theme-green .inquiry-textarea:focus{border-color:#388e3c}.theme-green .send-button{background:linear-gradient(135deg,#388e3c,#66bb6a)}.theme-green .upload-button{background:rgba(56,142,60,.1);border-color:#388e3c4d}.theme-green .upload-button:hover:not(:disabled){background:rgba(56,142,60,.2)}.theme-purple{background:#f3e5f5;--icon-primary: #7b1fa2;--icon-secondary: #6a1b9a;--icon-avatar-user: #7b1fa2;--icon-avatar-ai: #8e24aa;--icon-header: #ffffff;--icon-upload: #7b1fa2;--icon-send: #ffffff;--icon-active: #7b1fa2;--icon-disabled: #ce93d8;--icon-hover: #6a1b9a}.theme-purple .chat-header{background:linear-gradient(135deg,#7b1fa2,#ab47bc)}.theme-purple .user-message .message-content{background:linear-gradient(135deg,#7b1fa2,#ab47bc)}.theme-purple .ai-message .message-content{border-color:#e1bee7}.theme-purple .inquiry-textarea:focus{border-color:#7b1fa2}.theme-purple .send-button{background:linear-gradient(135deg,#7b1fa2,#ab47bc)}.theme-purple .upload-button{background:rgba(123,31,162,.1);border-color:#7b1fa24d}.theme-purple .upload-button:hover:not(:disabled){background:rgba(123,31,162,.2)}.theme-minimal{background:#fafafa;--icon-primary: #333333;--icon-secondary: #757575;--icon-avatar-user: #424242;--icon-avatar-ai: #616161;--icon-header: #333333;--icon-upload: #424242;--icon-send: #ffffff;--icon-active: #333333;--icon-disabled: #bdbdbd;--icon-hover: #212121}.theme-minimal .chat-header{background:#fff;color:#333;border-bottom:1px solid #e0e0e0}.theme-minimal .user-message .message-content{background:#007bff;color:#fff;border-radius:18px}.theme-minimal .ai-message .message-content{background:#f8f9fa;color:#333;border:1px solid #dee2e6}.theme-minimal .send-button{background:#007bff;border-radius:4px}.theme-minimal .upload-button{background:rgba(0,123,255,.1);border-color:#007bff4d}.theme-minimal .upload-button:hover:not(:disabled){background:rgba(0,123,255,.2)}.theme-corporate{background:#f8f9fa}.theme-corporate .chat-header{background:linear-gradient(135deg,#495057,#6c757d)}.theme-corporate .user-message .message-content{background:#495057}.theme-corporate .ai-message .message-content{background:#fff;border-color:#dee2e6}.theme-corporate .inquiry-textarea:focus{border-color:#495057}.theme-corporate .send-button{background:#495057}.theme-corporate .upload-button{background:rgba(73,80,87,.1);border-color:#4950574d}.theme-corporate .upload-button:hover:not(:disabled){background:rgba(73,80,87,.2)}.theme-red{background:#ffebee}.theme-red .chat-header{background:linear-gradient(135deg,#d32f2f,#f44336)}.theme-red .user-message .message-content{background:linear-gradient(135deg,#d32f2f,#f44336)}.theme-red .ai-message .message-content{border-color:#ffcdd2}.theme-red .inquiry-textarea:focus{border-color:#d32f2f}.theme-red .send-button{background:linear-gradient(135deg,#d32f2f,#f44336)}.theme-red .upload-button{background:rgba(211,47,47,.1);border-color:#d32f2f4d}.theme-red .upload-button:hover:not(:disabled){background:rgba(211,47,47,.2)}.theme-yellow{background:#fffde7}.theme-yellow .chat-header{background:linear-gradient(135deg,#f57f17,#ffb300)}.theme-yellow .user-message .message-content{background:linear-gradient(135deg,#f57f17,#ffb300)}.theme-yellow .ai-message .message-content{border-color:#fff9c4}.theme-yellow .inquiry-textarea:focus{border-color:#f57f17}.theme-yellow .send-button{background:linear-gradient(135deg,#f57f17,#ffb300)}.theme-yellow .upload-button{background:rgba(245,127,23,.1);border-color:#f57f174d}.theme-yellow .upload-button:hover:not(:disabled){background:rgba(245,127,23,.2)}.theme-orange{background:#fff3e0}.theme-orange .chat-header{background:linear-gradient(135deg,#e65100,#ff9800)}.theme-orange .user-message .message-content{background:linear-gradient(135deg,#e65100,#ff9800)}.theme-orange .ai-message .message-content{border-color:#ffe0b2}.theme-orange .inquiry-textarea:focus{border-color:#e65100}.theme-orange .send-button{background:linear-gradient(135deg,#e65100,#ff9800)}.theme-orange .upload-button{background:rgba(230,81,0,.1);border-color:#e651004d}.theme-orange .upload-button:hover:not(:disabled){background:rgba(230,81,0,.2)}\n"], directives: [{ type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
656
693
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AiChatComponent, decorators: [{
|
|
657
694
|
type: Component,
|
|
658
695
|
args: [{
|
|
@@ -694,6 +731,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
694
731
|
type: Input
|
|
695
732
|
}], customIcons: [{
|
|
696
733
|
type: Input
|
|
734
|
+
}], enableAnimations: [{
|
|
735
|
+
type: Input
|
|
736
|
+
}], animationSpeed: [{
|
|
737
|
+
type: Input
|
|
738
|
+
}], enableStatusTransitions: [{
|
|
739
|
+
type: Input
|
|
697
740
|
}], messageReceived: [{
|
|
698
741
|
type: Output
|
|
699
742
|
}], messageSent: [{
|
|
@@ -703,4 +746,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
703
746
|
}], sizeChanged: [{
|
|
704
747
|
type: Output
|
|
705
748
|
}] } });
|
|
706
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbWFuYXRlLWFpLWNoYXQtbGliL3NyYy9saWIvY29tcG9uZW50cy9haS1jaGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VtYW5hdGUtYWktY2hhdC1saWIvc3JjL2xpYi9jb21wb25lbnRzL2FpLWNoYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFFcEgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUErQixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBZ0MxRixNQUFNLE9BQU8sZUFBZTtJQTJEMUIsWUFDVSxjQUE4QixFQUM5QixTQUF1QjtRQUR2QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTVEeEIsVUFBSyxHQUFXLG1CQUFtQixDQUFDO1FBQ3BDLGdCQUFXLEdBQVcsMkVBQTJFLENBQUM7UUFDbEcsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFXL0Isc0JBQWlCLEdBQVksS0FBSyxDQUFDLENBQUMscUNBQXFDO1FBQ3pFLHFCQUFnQixHQUFZLEtBQUssQ0FBQyxDQUFFLG9DQUFvQztRQUN4RSxZQUFPLEdBQWdCLFNBQVMsQ0FBQyxDQUFHLHFCQUFxQjtRQUV4RCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFDbEQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQzlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDbEQs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akIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBaUFnZW50U2VydmljZSwgQWdlbnRSZXNwb25zZSwgU3VwcG9ydEJvdFJlcXVlc3QsIFN1cHBvcnRCb3RSZXNwb25zZSwgQ2hhdENvbnRlbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9haS1hZ2VudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSWNvblNldFR5cGUsIENoYXRJY29uQ29uZmlnLCBnZXRJY29uU2V0IH0gZnJvbSAnLi4vbW9kZWxzL2ljb24tY29uZmlnLmludGVyZmFjZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXRNZXNzYWdlIHtcclxuICBtZXNzYWdlSWQ/OiBzdHJpbmc7ICAgICAgICAgICAvLyBVbmlxdWUgbWVzc2FnZSBpZGVudGlmaWVyXHJcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7ICAgICAgIC8vIENvbnZlcnNhdGlvbi9zZXNzaW9uIGlkZW50aWZpZXJcclxuICBpc1VzZXI6IGJvb2xlYW47XHJcbiAgY29udGVudDogc3RyaW5nO1xyXG4gIHNlbmRlcj86IHN0cmluZzsgICAgICAgICAgICAgICAvLyBTZW5kZXIgbmFtZSAobWFwcyB0byB5b3VyICdzZW5kZXInIGZpZWxkKVxyXG4gIGludGVudD86IHN0cmluZztcclxuICBhdXRob3JOYW1lPzogc3RyaW5nO1xyXG4gIGNvbmZpZGVuY2VTY29yZT86IG51bWJlcjsgICAgICAvLyBBSSBjb25maWRlbmNlIHNjb3JlXHJcbiAgdGltZXN0YW1wOiBEYXRlO1xyXG4gIGlzTG9hZGluZz86IGJvb2xlYW47XHJcbiAgYXR0YWNobWVudHM/OiBGaWxlQXR0YWNobWVudFtdOyAvLyBGaWxlL0ltYWdlIGF0dGFjaG1lbnRzXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUF0dGFjaG1lbnQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICBzaXplOiBudW1iZXI7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG4gIGRhdGE/OiBzdHJpbmcgfCBBcnJheUJ1ZmZlcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQ2hhdFNpemUgPSAnY29tcGFjdCcgfCAnZGVmYXVsdCcgfCAnZXhwYW5kZWQnIHwgJ2Z1bGxzY3JlZW4nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlbWFuYXRlLWFpLWNoYXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9haS1jaGF0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9haS1jaGF0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEFpQ2hhdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSAnQ2hhdCB3aXRoIE1hZXN0cm8nO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnVHlwZSB5b3VyIGlucXVpcnkgaGVyZS4uLiAoUHJlc3MgRW50ZXIgdG8gc2VuZCwgU2hpZnQrRW50ZXIgZm9yIG5ldyBsaW5lKSc7XHJcbiAgQElucHV0KCkgc2hvd0RlYnVnSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFwaVVybD86IHN0cmluZztcclxuICBASW5wdXQoKSBhcHBLZXk/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYXBwU291cmNlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHVzZXJJZD86IHN0cmluZztcclxuICBASW5wdXQoKSBmaXJzdE5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXNlck5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdGVtcGxhdGVEZXNpZ24/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgd2VsY29tZU1lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaGlzdG9yaWNhbE1lc3NhZ2VzPzogYW55W107IC8vIEhpc3RvcmljYWwgbWVzc2FnZXMgZnJvbSBwYXJlbnRcclxuICBASW5wdXQoKSBjb252ZXJzYXRpb25JZD86IHN0cmluZzsgICAgLy8gQ3VycmVudCBjb252ZXJzYXRpb24gSURcclxuICBASW5wdXQoKSBlbmFibGVJbWFnZVVwbG9hZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBFbmFibGUvZGlzYWJsZSBpbWFnZSB1cGxvYWQgYnV0dG9uXHJcbiAgQElucHV0KCkgZW5hYmxlRmlsZVVwbG9hZDogYm9vbGVhbiA9IGZhbHNlOyAgLy8gRW5hYmxlL2Rpc2FibGUgZmlsZSB1cGxvYWQgYnV0dG9uXHJcbiAgQElucHV0KCkgaWNvblNldDogSWNvblNldFR5cGUgPSAnZmVhdGhlcic7ICAgLy8gSWNvbiBzZXQgc2VsZWN0aW9uXHJcbiAgQElucHV0KCkgY3VzdG9tSWNvbnM/OiBQYXJ0aWFsPENoYXRJY29uQ29uZmlnPjsgLy8gQ3VzdG9tIGljb24gb3ZlcnJpZGVzXHJcbiAgQE91dHB1dCgpIG1lc3NhZ2VSZWNlaXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgQE91dHB1dCgpIG1lc3NhZ2VTZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcclxuICBAT3V0cHV0KCkgZmlsZVVwbG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlQXR0YWNobWVudD4oKTtcclxuICBAT3V0cHV0KCkgc2l6ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2l6ZTogQ2hhdFNpemUsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0+KCk7XHJcblxyXG4gIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcbiAgY3VycmVudElucXVpcnkgPSAnJztcclxuICBhdXRob3JOYW1lID0gJyc7XHJcbiAgaW50ZW50ID0gJyc7XHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgY29uZmlndXJhdGlvblN0YXR1cyA9ICcnO1xyXG4gIFxyXG4gIC8vIFJlc2l6aW5nIHByb3BlcnRpZXNcclxuICBjdXJyZW50U2l6ZTogQ2hhdFNpemUgPSAnZGVmYXVsdCc7XHJcbiAgaXNGdWxsc2NyZWVuID0gZmFsc2U7XHJcbiAgaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gIGNvbnRhaW5lcldpZHRoID0gODAwO1xyXG4gIGNvbnRhaW5lckhlaWdodCA9IDYwMDtcclxuICBtaW5XaWR0aCA9IDQwMDtcclxuICBtYXhXaWR0aCA9IDE0MDA7XHJcbiAgbWluSGVpZ2h0ID0gNDAwO1xyXG4gIG1heEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIDEwMDtcclxuICBzdGFydFggPSAwO1xyXG4gIHN0YXJ0WSA9IDA7XHJcbiAgc3RhcnRXaWR0aCA9IDA7XHJcbiAgc3RhcnRIZWlnaHQgPSAwO1xyXG4gIFxyXG4gIC8vIEZpbGUgdXBsb2FkIHByb3BlcnRpZXNcclxuICBtYXhGaWxlU2l6ZSA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUJcclxuICBhbGxvd2VkSW1hZ2VUeXBlcyA9IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvanBnJywgJ2ltYWdlL2dpZicsICdpbWFnZS93ZWJwJ107XHJcbiAgYWxsb3dlZEZpbGVUeXBlcyA9IFsnYXBwbGljYXRpb24vcGRmJywgJ2FwcGxpY2F0aW9uL21zd29yZCcsIFxyXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JyxcclxuICAgICd0ZXh0L3BsYWluJywgJ3RleHQvY3N2J107XHJcbiAgc2VsZWN0ZWRGaWxlczogRmlsZUF0dGFjaG1lbnRbXSA9IFtdO1xyXG4gIFxyXG4gIC8vIEljb24gY29uZmlndXJhdGlvblxyXG4gIGljb25zOiBDaGF0SWNvbkNvbmZpZyA9IGdldEljb25TZXQoJ2ZlYXRoZXInKTtcclxuICBzYW5pdGl6ZWRJY29uczogeyBba2V5OiBzdHJpbmddOiBTYWZlSHRtbCB9ID0ge307XHJcbiAgXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhaUFnZW50U2VydmljZTogQWlBZ2VudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlndXJhdGlvblN0YXR1cyA9ICdJbml0aWFsaXppbmcuLi4nO1xyXG4gICAgY29uc29sZS5sb2coJ0FJIENoYXQgQ29tcG9uZW50IGluaXRpYWxpemVkJyk7XHJcbiAgICBcclxuICAgIC8vIExvYWQgaWNvbiBzZXRcclxuICAgIHRoaXMuaWNvbnMgPSBnZXRJY29uU2V0KHRoaXMuaWNvblNldCwgdGhpcy5jdXN0b21JY29ucyk7XHJcbiAgICB0aGlzLnNhbml0aXplSWNvbnMoKTtcclxuICAgIFxyXG4gICAgLy8gQ29uZmlndXJlIEFQSSBVUkwgYW5kIEFwcCBLZXkgaWYgcHJvdmlkZWRcclxuICAgIGlmICh0aGlzLmFwaVVybCB8fCB0aGlzLmFwcEtleSkge1xyXG4gICAgICB0aGlzLmFpQWdlbnRTZXJ2aWNlLmNvbmZpZ3VyZSh7IFxyXG4gICAgICAgIGFwaVVybDogdGhpcy5hcGlVcmwsXHJcbiAgICAgICAgYXBwS2V5OiB0aGlzLmFwcEtleSBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIExvYWQgaGlzdG9yaWNhbCBtZXNzYWdlcyBpZiBwcm92aWRlZFxyXG4gICAgICBpZiAodGhpcy5oaXN0b3JpY2FsTWVzc2FnZXMgJiYgdGhpcy5oaXN0b3JpY2FsTWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubG9hZEhpc3RvcmljYWxNZXNzYWdlcyh0aGlzLmhpc3RvcmljYWxNZXNzYWdlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRXZWxjb21lTWVzc2FnZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnRlc3RDb25maWd1cmF0aW9uKCk7XHJcbiAgICAgIHRoaXMubG9hZFNhdmVkU2l6ZSgpO1xyXG4gICAgICB0aGlzLmFwcGx5U2l6ZVByZXNldCh0aGlzLmN1cnJlbnRTaXplKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBjb21wb25lbnQgaW5pdGlhbGl6YXRpb246JywgZXJyb3IpO1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb25TdGF0dXMgPSAnSW5pdGlhbGl6YXRpb24gZXJyb3InO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgLy8gRGV0ZWN0IHdoZW4gaGlzdG9yaWNhbE1lc3NhZ2VzIGlucHV0IGNoYW5nZXNcclxuICAgIGlmIChjaGFuZ2VzWydoaXN0b3JpY2FsTWVzc2FnZXMnXSAmJiAhY2hhbmdlc1snaGlzdG9yaWNhbE1lc3NhZ2VzJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBjaGFuZ2VzWydoaXN0b3JpY2FsTWVzc2FnZXMnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdIaXN0b3JpY2FsIG1lc3NhZ2VzIGNoYW5nZWQ6JywgbmV3TWVzc2FnZXMpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ2xlYXIgZXhpc3RpbmcgbWVzc2FnZXMgYW5kIHJlbG9hZFxyXG4gICAgICB0aGlzLm1lc3NhZ2VzID0gW107XHJcbiAgICAgIFxyXG4gICAgICBpZiAobmV3TWVzc2FnZXMgJiYgbmV3TWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubG9hZEhpc3RvcmljYWxNZXNzYWdlcyhuZXdNZXNzYWdlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRXZWxjb21lTWVzc2FnZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIERldGVjdCB3aGVuIGNvbnZlcnNhdGlvbklkIGNoYW5nZXNcclxuICAgIGlmIChjaGFuZ2VzWydjb252ZXJzYXRpb25JZCddICYmICFjaGFuZ2VzWydjb252ZXJzYXRpb25JZCddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDb252ZXJzYXRpb24gSUQgY2hhbmdlZDonLCBjaGFuZ2VzWydjb252ZXJzYXRpb25JZCddLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3RpbmcgbWVzc2FnZXMgd2l0aCBuZXcgY29udmVyc2F0aW9uSWQgaWYgbmVlZGVkXHJcbiAgICAgIHRoaXMubWVzc2FnZXMuZm9yRWFjaChtc2cgPT4ge1xyXG4gICAgICAgIGlmIChtc2cuY29udmVyc2F0aW9uSWQgIT09IHRoaXMuY29udmVyc2F0aW9uSWQpIHtcclxuICAgICAgICAgIG1zZy5jb252ZXJzYXRpb25JZCA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gRGV0ZWN0IHdoZW4gaWNvbiBzZXQgY2hhbmdlc1xyXG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZXQnXSB8fCBjaGFuZ2VzWydjdXN0b21JY29ucyddKSB7XHJcbiAgICAgIHRoaXMuaWNvbnMgPSBnZXRJY29uU2V0KHRoaXMuaWNvblNldCwgdGhpcy5jdXN0b21JY29ucyk7XHJcbiAgICAgIHRoaXMuc2FuaXRpemVJY29ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogU2FuaXRpemUgaWNvbiBTVkcgc3RyaW5ncyBmb3Igc2FmZSByZW5kZXJpbmcgaW4gaW5uZXJIVE1MIGJpbmRpbmdzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzYW5pdGl6ZUljb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zYW5pdGl6ZWRJY29ucyA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5pY29ucykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBjb25zdCBzdmdTdHJpbmcgPSB0aGlzLmljb25zW2tleSBhcyBrZXlvZiBDaGF0SWNvbkNvbmZpZ107XHJcbiAgICAgIGlmIChzdmdTdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNhbml0aXplZEljb25zW2tleV0gPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChzdmdTdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRlc3RDb25maWd1cmF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWd1cmF0aW9uU3RhdHVzID0gJ1Rlc3RpbmcgY29ubmVjdGlvbi4uLic7XHJcbiAgICBcclxuICAgIHRoaXMuYWlBZ2VudFNlcnZpY2UudGVzdENvbmZpZ3VyYXRpb24oKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogQWdlbnRSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uU3RhdHVzID0gJ0FJIEFnZW50IGlzIHJlYWR5JztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0YXR1cyA9IGBDb25maWd1cmF0aW9uIGVycm9yOiAke3Jlc3BvbnNlLmVycm9yfWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yUmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uU3RhdHVzID0gYENvbm5lY3Rpb24gZXJyb3I6IENhbm5vdCBjb25uZWN0IHRvIGJhY2tlbmQgc2VydmljZWA7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBUEkgY29ubmVjdGlvbiB0ZXN0IGZhaWxlZDonLCBlcnJvclJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkV2VsY29tZU1lc3NhZ2UoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3ZWxjb21lVGV4dCA9IHRoaXMud2VsY29tZU1lc3NhZ2UgfHwgXHJcbiAgICAgIGA8aDM+SGVsbG8gJHt0aGlzLmZpcnN0TmFtZX0hPC9oMz5IaSwgSSdtIE1hZXN0cm/igJR5b3VyIEFJIGFzc2lzdGFudC4gSSdtIGhlcmUgdG8gaGVscCB3aXRoIHlvdXIgcG9saWN5LXJlbGF0ZWQgaW5xdWlyaWVzLjxicj48YnI+SG93IGNhbiBJIGFzc2lzdCB5b3UgdG9kYXk/YDtcclxuICAgIFxyXG4gICAgdGhpcy5tZXNzYWdlcy5wdXNoKHtcclxuICAgICAgaXNVc2VyOiBmYWxzZSxcclxuICAgICAgY29udGVudDogd2VsY29tZVRleHQsIC8vIERvbid0IGZvcm1hdCBIVE1MIGNvbnRlbnQsIHVzZSBpdCBkaXJlY3RseVxyXG4gICAgICBpbnRlbnQ6ICd3ZWxjb21lJyxcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgYW5kIHRyYW5zZm9ybSBoaXN0b3JpY2FsIG1lc3NhZ2VzIGZyb20gcGFyZW50IGNvbXBvbmVudFxyXG4gICAqIEFjY2VwdHMgbWVzc2FnZXMgaW4gdGhlIGZvcm1hdCBmcm9tIHlvdXIgYmFja2VuZC9zdGF0ZSBtYW5hZ2VtZW50XHJcbiAgICovXHJcbiAgbG9hZEhpc3RvcmljYWxNZXNzYWdlcyhoaXN0b3JpY2FsTWVzc2FnZXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnTG9hZGluZyBoaXN0b3JpY2FsIG1lc3NhZ2VzOicsIGhpc3RvcmljYWxNZXNzYWdlcyk7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGxvYWQ6JywgaGlzdG9yaWNhbE1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICBcclxuICAgIC8vIFRyYW5zZm9ybSB5b3VyIGJhY2tlbmQgZm9ybWF0IHRvIENoYXRNZXNzYWdlIGZvcm1hdFxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IGhpc3RvcmljYWxNZXNzYWdlcy5tYXAoKG1zZzogYW55KSA9PiB7XHJcbiAgICAgIC8vIERldGVybWluZSBpZiBtZXNzYWdlIGlzIGZyb20gdXNlciBiYXNlZCBvbiBzZW5kZXIgb3Igcm9sZVxyXG4gICAgICBjb25zdCBpc1VzZXJNZXNzYWdlID0gdGhpcy5pc1VzZXJNZXNzYWdlKG1zZyk7XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHtcclxuICAgICAgICBtZXNzYWdlSWQ6IG1zZy5tZXNzYWdlSWQgfHwgbXNnLmlkLFxyXG4gICAgICAgIGNvbnZlcnNhdGlvbklkOiBtc2cuY29udmVyc2F0aW9uSWQgfHwgdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgICBpc1VzZXI6IGlzVXNlck1lc3NhZ2UsXHJcbiAgICAgICAgY29udGVudDogbXNnLm1lc3NhZ2VUZXh0IHx8IG1zZy5tZXNzYWdlIHx8IG1zZy50ZXh0IHx8IG1zZy5jb250ZW50IHx8ICcnLFxyXG4gICAgICAgIHNlbmRlcjogbXNnLnNlbmRlciB8fCAoaXNVc2VyTWVzc2FnZSA/IHRoaXMudXNlck5hbWUgfHwgJ1VzZXInIDogJ01hZXN0cm8nKSxcclxuICAgICAgICBpbnRlbnQ6IG1zZy5pbnRlbnQgfHwgJycsXHJcbiAgICAgICAgYXV0aG9yTmFtZTogbXNnLmF1dGhvck5hbWUgfHwgbXNnLnNlbmRlcixcclxuICAgICAgICBjb25maWRlbmNlU2NvcmU6IG1zZy5jb25maWRlbmNlU2NvcmUgfHwgbXNnLmNvbmZpZGVuY2UgfHwgMCxcclxuICAgICAgICB0aW1lc3RhbXA6IG1zZy50aW1lc3RhbXAgfHwgbXNnLmNyZWF0ZWRBdCBcclxuICAgICAgICAgID8gbmV3IERhdGUobXNnLnRpbWVzdGFtcCB8fCBtc2cuY3JlYXRlZEF0KSBcclxuICAgICAgICAgIDogbmV3IERhdGUoKSxcclxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXHJcbiAgICAgIH0gYXMgQ2hhdE1lc3NhZ2U7XHJcbiAgICAgIFxyXG4gICAgICAvLyBjb25zb2xlLmxvZygnVHJhbnNmb3JtZWQgbWVzc2FnZTonLCB0cmFuc2Zvcm1lZCk7XHJcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBTb3J0IG1lc3NhZ2VzIGJ5IHRpbWVzdGFtcCB0byBtYWludGFpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXHJcbiAgICB0cmFuc2Zvcm1lZE1lc3NhZ2VzLnNvcnQoKGEsIGIpID0+IFxyXG4gICAgICBhLnRpbWVzdGFtcC5nZXRUaW1lKCkgLSBiLnRpbWVzdGFtcC5nZXRUaW1lKClcclxuICAgICk7XHJcbiAgICBcclxuICAgIC8vIGNvbnNvbGUubG9nKCdTb3J0ZWQgbWVzc2FnZXMgY291bnQ6JywgdHJhbnNmb3JtZWRNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgXHJcbiAgICAvLyBBZGQgd2VsY29tZSBtZXNzYWdlIGZpcnN0IGlmIG5vIG1lc3NhZ2VzIG9yIGxvYWQgaGlzdG9yaWNhbCBtZXNzYWdlc1xyXG4gICAgaWYgKHRyYW5zZm9ybWVkTWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdObyBtZXNzYWdlcyB0byBsb2FkLCBhZGRpbmcgd2VsY29tZSBtZXNzYWdlJyk7XHJcbiAgICAgIHRoaXMuYWRkV2VsY29tZU1lc3NhZ2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENoZWNrIGlmIGZpcnN0IG1lc3NhZ2UgaXMgYSB3ZWxjb21lIG1lc3NhZ2UsIGlmIG5vdCBhZGQgb25lXHJcbiAgICAgIGNvbnN0IGhhc1dlbGNvbWUgPSB0cmFuc2Zvcm1lZE1lc3NhZ2VzLnNvbWUobXNnID0+IFxyXG4gICAgICAgIG1zZy5pbnRlbnQgPT09ICd3ZWxjb21lJyB8fCBtc2cuY29udGVudC5pbmNsdWRlcygnSGVsbG8nKVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKCFoYXNXZWxjb21lKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ05vIHdlbGNvbWUgbWVzc2FnZSBmb3VuZCwgYWRkaW5nIG9uZScpO1xyXG4gICAgICAgIHRoaXMuYWRkV2VsY29tZU1lc3NhZ2UoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coJ1B1c2hpbmcgdHJhbnNmb3JtZWQgbWVzc2FnZXMgdG8gbWVzc2FnZXMgYXJyYXknKTtcclxuICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKC4uLnRyYW5zZm9ybWVkTWVzc2FnZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKCdUb3RhbCBsb2FkZWQgbWVzc2FnZXMgaW4gY29tcG9uZW50OicsIHRoaXMubWVzc2FnZXMubGVuZ3RoKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdNZXNzYWdlcyBhcnJheTonLCB0aGlzLm1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGEgbWVzc2FnZSBpcyBmcm9tIHRoZSB1c2VyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1VzZXJNZXNzYWdlKG1zZzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAvLyBDaGVjayB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBtaWdodCBpbmRpY2F0ZSB1c2VyIG1lc3NhZ2VcclxuICAgIGlmIChtc2cuaXNVc2VyICE9PSB1bmRlZmluZWQpIHJldHVybiBtc2cuaXNVc2VyO1xyXG4gICAgaWYgKG1zZy5yb2xlKSByZXR1cm4gbXNnLnJvbGUudG9Mb3dlckNhc2UoKSA9PT0gJ3VzZXInO1xyXG4gICAgaWYgKG1zZy5zZW5kZXIpIHtcclxuICAgICAgY29uc3Qgc2VuZGVyID0gbXNnLnNlbmRlci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gc2VuZGVyID09PSAndXNlcicgfHwgXHJcbiAgICAgICAgICAgICBzZW5kZXIgPT09IHRoaXMudXNlck5hbWU/LnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgICAgICAgIHNlbmRlciA9PT0gdGhpcy51c2VySWQ/LnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgICAgICAgIHNlbmRlci5pbmNsdWRlcygndXNlcicpO1xyXG4gICAgfVxyXG4gICAgLy8gRGVmYXVsdCB0byBmYWxzZSAoYm90IG1lc3NhZ2UpIGlmIGNhbid0IGRldGVybWluZVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2VuZElucXVpcnkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudElucXVpcnkudHJpbSgpIHx8IHRoaXMuaXNMb2FkaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1c2VyTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5nZW5lcmF0ZU1lc3NhZ2VJZCgpLFxyXG4gICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgaXNVc2VyOiB0cnVlLFxyXG4gICAgICBzZW5kZXI6IHRoaXMudXNlck5hbWUgfHwgJ1VzZXInLFxyXG4gICAgICBpbnRlbnQ6IHRoaXMuaW50ZW50LFxyXG4gICAgICBjb250ZW50OiB0aGlzLmN1cnJlbnRJbnF1aXJ5LFxyXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcclxuICAgIH07XHJcbiAgICBcclxuICAgIHRoaXMubWVzc2FnZXMucHVzaCh1c2VyTWVzc2FnZSk7XHJcbiAgICB0aGlzLm1lc3NhZ2VTZW50LmVtaXQodXNlck1lc3NhZ2UpO1xyXG5cclxuICAgIC8vIEFkZCBsb2FkaW5nIG1lc3NhZ2VcclxuICAgIGNvbnN0IGxvYWRpbmdNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcclxuICAgICAgaXNVc2VyOiBmYWxzZSxcclxuICAgICAgaW50ZW50OiAnJyxcclxuICAgICAgY29udGVudDogJ1Byb2Nlc3NpbmcgeW91ciBpbnF1aXJ5Li4uJyxcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWVcclxuICAgIH07XHJcbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2gobG9hZGluZ01lc3NhZ2UpO1xyXG5cclxuICAgIGNvbnN0IGlucXVpcnkgPSB0aGlzLmN1cnJlbnRJbnF1aXJ5LnRyaW0oKTtcclxuICAgIHRoaXMuY3VycmVudElucXVpcnkgPSAnJztcclxuICAgIHRoaXMuYXV0aG9yTmFtZSA9ICcnO1xyXG4gICAgdGhpcy5pbnRlbnQgPSAnJztcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0OiBTdXBwb3J0Qm90UmVxdWVzdCA9IHtcclxuICAgICAgcXVlcnk6IGlucXVpcnksXHJcbiAgICAgIGNoYXRIaXN0b3J5OiBbXSxcclxuICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcclxuICAgICAgdXNlck5hbWU6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgIGFwcFNvdXJjZTogdGhpcy5hcHBTb3VyY2VcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5haUFnZW50U2VydmljZS5wcm9jZXNzSW5xdWlyeShyZXF1ZXN0KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogU3VwcG9ydEJvdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyBSZW1vdmUgbG9hZGluZyBtZXNzYWdlXHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcy5maWx0ZXIobXNnID0+ICFtc2cuaXNMb2FkaW5nKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmFuc3dlciB8fCAocmVzcG9uc2UuY29udGVudHMgJiYgcmVzcG9uc2UuY29udGVudHMubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmFuc3dlcikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJvdE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB0aGlzLmdlbmVyYXRlTWVzc2FnZUlkKCksXHJcbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgIGlzVXNlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzZW5kZXI6ICdNYWVzdHJvJyxcclxuICAgICAgICAgICAgICAgIGludGVudDogcmVzcG9uc2Uuc2VhcmNoSW50ZW50IHx8IGlucXVpcnksXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLmZvcm1hdE1lc3NhZ2VDb250ZW50KHJlc3BvbnNlLmFuc3dlciksXHJcbiAgICAgICAgICAgICAgICBhdXRob3JOYW1lOiByZXNwb25zZS5jb250ZW50cyAmJiByZXNwb25zZS5jb250ZW50cy5sZW5ndGggPiAwID8gcmVzcG9uc2UuY29udGVudHNbMF0uYXV0aG9yTmFtZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKGJvdE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkLmVtaXQoYm90TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuY29udGVudHMgJiYgcmVzcG9uc2UuY29udGVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIC8vIFB1c2ggZWFjaCBjb250ZW50IGFzIGEgc2VwYXJhdGUgbWVzc2FnZVxyXG4gICAgICAgICAgICAgIHJlc3BvbnNlLmNvbnRlbnRzLmZvckVhY2goY29udGVudEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgYm90TWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB0aGlzLmdlbmVyYXRlTWVzc2FnZUlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNVc2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzZW5kZXI6IGNvbnRlbnRJdGVtLmF1dGhvck5hbWUgfHwgJ01hZXN0cm8nLFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudDogcmVzcG9uc2Uuc2VhcmNoSW50ZW50IHx8IGlucXVpcnksXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5mb3JtYXRNZXNzYWdlQ29udGVudChjb250ZW50SXRlbS5jb250ZW50IHx8ICdObyBjb250ZW50IGF2YWlsYWJsZScpLFxyXG4gICAgICAgICAgICAgICAgICAgIGF1dGhvck5hbWU6IGNvbnRlbnRJdGVtLmF1dGhvck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaChib3RNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUmVjZWl2ZWQuZW1pdChib3RNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVNZXNzYWdlSWQoKSxcclxuICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICBpc1VzZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIHNlbmRlcjogJ01hZXN0cm8nLFxyXG4gICAgICAgICAgICAgIGludGVudDogaW5xdWlyeSxcclxuICAgICAgICAgICAgICBjb250ZW50OiBgU29ycnksIEkgZGlkbid0IHJlY2VpdmUgYSB2YWxpZCByZXNwb25zZS5gLFxyXG4gICAgICAgICAgICAgIGF1dGhvck5hbWU6IHRoaXMuYXV0aG9yTmFtZSxcclxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkLmVtaXQoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIFJlbW92ZSBsb2FkaW5nIG1lc3NhZ2VcclxuICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmZpbHRlcihtc2cgPT4gIW1zZy5pc0xvYWRpbmcpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVNZXNzYWdlSWQoKSxcclxuICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgICAgIGlzVXNlcjogZmFsc2UsXHJcbiAgICAgICAgICAgIHNlbmRlcjogJ01hZXN0cm8nLFxyXG4gICAgICAgICAgICBpbnRlbnQ6IGlucXVpcnksXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdTb3JyeSwgSSBlbmNvdW50ZXJlZCBhbiBlcnJvciBwcm9jZXNzaW5nIHlvdXIgcmVxdWVzdC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLFxyXG4gICAgICAgICAgICBhdXRob3JOYW1lOiB0aGlzLmF1dGhvck5hbWUsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaChlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlUmVjZWl2ZWQuZW1pdChlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGlucXVpcnk6JywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNoYXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1lc3NhZ2VzID0gW107XHJcbiAgICB0aGlzLmFkZFdlbGNvbWVNZXNzYWdlKCk7XHJcbiAgfVxyXG5cclxuICBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLnNlbmRJbnF1aXJ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBnZXRUaGVtZUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICAvLyBEZWZhdWx0IHRoZW1lIGlmIG5vIHRlbXBsYXRlIGRlc2lnbiBpcyBzcGVjaWZpZWRcclxuICAgIGlmICghdGhpcy50ZW1wbGF0ZURlc2lnbikge1xyXG4gICAgICByZXR1cm4gJ3RoZW1lLWRlZmF1bHQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYXRlIGFuZCByZXR1cm4gdGhlbWUgY2xhc3NcclxuICAgIGNvbnN0IHZhbGlkVGhlbWVzID0gWydkZWZhdWx0JywgJ2RhcmsnLCAnYmx1ZScsICdncmVlbicsICdwdXJwbGUnLCAnbWluaW1hbCcsICdjb3Jwb3JhdGUnLCAncmVkJywgJ3llbGxvdycsICdvcmFuZ2UnXTtcclxuICAgIGNvbnN0IHRoZW1lID0gdGhpcy50ZW1wbGF0ZURlc2lnbi50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICBpZiAodmFsaWRUaGVtZXMuaW5jbHVkZXModGhlbWUpKSB7XHJcbiAgICAgIHJldHVybiBgdGhlbWUtJHt0aGVtZX1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGlmIGludmFsaWQgdGhlbWVcclxuICAgIGNvbnNvbGUud2FybihgSW52YWxpZCB0aGVtZSAnJHt0aGlzLnRlbXBsYXRlRGVzaWdufScgcHJvdmlkZWQuIFVzaW5nIGRlZmF1bHQgdGhlbWUuYCk7XHJcbiAgICByZXR1cm4gJ3RoZW1lLWRlZmF1bHQnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XHJcbiAgICBcclxuICAgIC8vIElmIGNvbnRlbnQgYWxyZWFkeSBjb250YWlucyBIVE1MIHRhZ3MsIHJldHVybiBhcy1pc1xyXG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJzwnKSAmJiBjb250ZW50LmluY2x1ZGVzKCc+JykpIHtcclxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgbmV3bGluZXMgdG8gSFRNTCBicmVha3NcclxuICAgIGxldCBmb3JtYXR0ZWQgPSBjb250ZW50LnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xyXG4gICAgXHJcbiAgICAvLyBDb252ZXJ0IGVzY2FwZWQgbmV3bGluZXMgdG8gSFRNTCBicmVha3NcclxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXFxcbi9nLCAnPGJyPicpO1xyXG4gICAgXHJcbiAgICAvLyBDb252ZXJ0IG1hcmtkb3duLXN0eWxlIGJvbGQgdG8gSFRNTFxyXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xcKlxcKiguKj8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+Jyk7XHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgYnVsbGV0IHBvaW50cyB0byBIVE1MIGxpc3RzXHJcbiAgICBjb25zdCBsaW5lcyA9IGZvcm1hdHRlZC5zcGxpdCgnPGJyPicpO1xyXG4gICAgbGV0IGluTGlzdCA9IGZhbHNlO1xyXG4gICAgY29uc3QgcHJvY2Vzc2VkTGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBcclxuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ+KAoiAnKSkge1xyXG4gICAgICAgIGlmICghaW5MaXN0KSB7XHJcbiAgICAgICAgICBwcm9jZXNzZWRMaW5lcy5wdXNoKCc8dWw+Jyk7XHJcbiAgICAgICAgICBpbkxpc3QgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9jZXNzZWRMaW5lcy5wdXNoKCc8bGk+JyArIGxpbmUucmVwbGFjZSgvXuKAoiAvLCAnJykgKyAnPC9saT4nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoaW5MaXN0KSB7XHJcbiAgICAgICAgICBwcm9jZXNzZWRMaW5lcy5wdXNoKCc8L3VsPicpO1xyXG4gICAgICAgICAgaW5MaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb2Nlc3NlZExpbmVzLnB1c2gobGluZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKGluTGlzdCkge1xyXG4gICAgICBwcm9jZXNzZWRMaW5lcy5wdXNoKCc8L3VsPicpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcHJvY2Vzc2VkTGluZXMuam9pbignPGJyPicpLnJlcGxhY2UoLzxicj48dWw+L2csICc8dWw+JykucmVwbGFjZSgvPFxcL3VsPjxicj4vZywgJzwvdWw+Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlU2Vzc2lvbklkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3Nlc3Npb25fJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KSArICdfJyArIERhdGUubm93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlTWVzc2FnZUlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ21zZ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpICsgJ18nICsgRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1hdHRlZFRpbWUodGltZXN0YW1wOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aW1lc3RhbXAudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09IFJlc2l6ZSBNZXRob2RzID09PT09PT09PT09PT1cclxuICBcclxuICBzdGFydFJlc2l6ZShldmVudDogTW91c2VFdmVudCwgZGlyZWN0aW9uOiAnd2lkdGgnIHwgJ2JvdGgnKTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcclxuICAgIHRoaXMuc3RhcnRXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGg7XHJcbiAgICB0aGlzLnN0YXJ0SGVpZ2h0ID0gdGhpcy5jb250YWluZXJIZWlnaHQ7XHJcbiAgICBcclxuICAgIGNvbnN0IG1vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4gdGhpcy5vblJlc2l6ZShlLCBkaXJlY3Rpb24pO1xyXG4gICAgY29uc3QgbW91c2VVcEhhbmRsZXIgPSAoKSA9PiB0aGlzLnN0b3BSZXNpemUobW91c2VNb3ZlSGFuZGxlciwgbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVIYW5kbGVyKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwSGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uUmVzaXplKGV2ZW50OiBNb3VzZUV2ZW50LCBkaXJlY3Rpb246ICd3aWR0aCcgfCAnYm90aCcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcclxuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcclxuICAgIFxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3dpZHRoJyB8fCBkaXJlY3Rpb24gPT09ICdib3RoJykge1xyXG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWluKFxyXG4gICAgICAgIE1hdGgubWF4KHRoaXMuc3RhcnRXaWR0aCArIGRlbHRhWCwgdGhpcy5taW5XaWR0aCksXHJcbiAgICAgICAgdGhpcy5tYXhXaWR0aFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gbmV3V2lkdGg7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChkaXJlY3Rpb24gPT09ICdib3RoJykge1xyXG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1pbihcclxuICAgICAgICBNYXRoLm1heCh0aGlzLnN0YXJ0SGVpZ2h0ICsgZGVsdGFZLCB0aGlzLm1pbkhlaWdodCksXHJcbiAgICAgICAgdGhpcy5tYXhIZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBuZXdIZWlnaHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3BSZXNpemUobW91c2VNb3ZlSGFuZGxlcjogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQsIG1vdXNlVXBIYW5kbGVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlVXBIYW5kbGVyKTtcclxuICAgIFxyXG4gICAgdGhpcy5zYXZlU2l6ZVByZWZlcmVuY2UoKTtcclxuICAgIHRoaXMuZW1pdFNpemVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2l6ZVByZXNldChzaXplOiBDaGF0U2l6ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50U2l6ZSA9IHNpemU7XHJcbiAgICBcclxuICAgIHN3aXRjaCAoc2l6ZSkge1xyXG4gICAgICBjYXNlICdjb21wYWN0JzpcclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gNDAwO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gNTAwO1xyXG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2RlZmF1bHQnOlxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSA4MDA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSA2MDA7XHJcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZXhwYW5kZWQnOlxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSAxMjAwO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gODAwO1xyXG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Z1bGxzY3JlZW4nOlxyXG4gICAgICAgIHRoaXMudG9nZ2xlRnVsbHNjcmVlbigpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zYXZlU2l6ZVByZWZlcmVuY2UoKTtcclxuICAgIHRoaXMuZW1pdFNpemVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUZ1bGxzY3JlZW4oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNGdWxsc2NyZWVuKSB7XHJcbiAgICAgIC8vIEVudGVyaW5nIGZ1bGxzY3JlZW4gLSBzYXZlIGN1cnJlbnQgc3RhdGUgZmlyc3RcclxuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnY2hhdGJveC1wcmV2aW91cy1zaXplJywgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIHdpZHRoOiB0aGlzLmNvbnRhaW5lcldpZHRoLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5jb250YWluZXJIZWlnaHQsXHJcbiAgICAgICAgc2l6ZTogdGhpcy5jdXJyZW50U2l6ZSxcclxuICAgICAgICB3YXNGdWxsc2NyZWVuOiB0aGlzLmlzRnVsbHNjcmVlblxyXG4gICAgICB9KSk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuY3VycmVudFNpemUgPSAnZnVsbHNjcmVlbic7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBFeGl0aW5nIGZ1bGxzY3JlZW4gLSByZXN0b3JlIHByZXZpb3VzIHN0YXRlXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdjaGF0Ym94LXByZXZpb3VzLXNpemUnKTtcclxuICAgICAgICBpZiAocHJldmlvdXMpIHtcclxuICAgICAgICAgIGNvbnN0IHByZXZEYXRhID0gSlNPTi5wYXJzZShwcmV2aW91cyk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gcHJldkRhdGEud2lkdGggfHwgODAwO1xyXG4gICAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBwcmV2RGF0YS5oZWlnaHQgfHwgNjAwO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2l6ZSA9IHByZXZEYXRhLnNpemUgPT09ICdmdWxsc2NyZWVuJyA/ICdkZWZhdWx0JyA6IHByZXZEYXRhLnNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFNpemUgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gODAwO1xyXG4gICAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSA2MDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNpemUgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IDgwMDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDYwMDtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zYXZlU2l6ZVByZWZlcmVuY2UoKTtcclxuICAgIHRoaXMuZW1pdFNpemVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVNpemVQcmVmZXJlbmNlKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2l6ZURhdGEgPSB7XHJcbiAgICAgIHNpemU6IHRoaXMuY3VycmVudFNpemUsXHJcbiAgICAgIHdpZHRoOiB0aGlzLmNvbnRhaW5lcldpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuY29udGFpbmVySGVpZ2h0LFxyXG4gICAgICBpc0Z1bGxzY3JlZW46IHRoaXMuaXNGdWxsc2NyZWVuXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdjaGF0Ym94LXNpemUtcHJlZmVyZW5jZScsIEpTT04uc3RyaW5naWZ5KHNpemVEYXRhKSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIHNpemUgcHJlZmVyZW5jZTonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRTYXZlZFNpemUoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzYXZlZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2NoYXRib3gtc2l6ZS1wcmVmZXJlbmNlJyk7XHJcbiAgICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIGNvbnN0IHNpemVEYXRhID0gSlNPTi5wYXJzZShzYXZlZCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2l6ZSA9IHNpemVEYXRhLnNpemUgfHwgJ2RlZmF1bHQnO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBzaXplRGF0YS53aWR0aCB8fCA4MDA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBzaXplRGF0YS5oZWlnaHQgfHwgNjAwO1xyXG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gc2l6ZURhdGEuaXNGdWxsc2NyZWVuIHx8IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2FkIHNpemUgcHJlZmVyZW5jZTonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRTaXplQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaXplQ2hhbmdlZC5lbWl0KHtcclxuICAgICAgc2l6ZTogdGhpcy5jdXJyZW50U2l6ZSxcclxuICAgICAgd2lkdGg6IHRoaXMuY29udGFpbmVyV2lkdGgsXHJcbiAgICAgIGhlaWdodDogdGhpcy5jb250YWluZXJIZWlnaHRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udGFpbmVyU3R5bGUoKTogYW55IHtcclxuICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiAnMTAwdncgIWltcG9ydGFudCcsXHJcbiAgICAgICAgaGVpZ2h0OiAnMTAwdmggIWltcG9ydGFudCcsXHJcbiAgICAgICAgbWF4V2lkdGg6ICcxMDB2dyAhaW1wb3J0YW50JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICcxMDB2aCAhaW1wb3J0YW50JyxcclxuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcclxuICAgICAgICB0b3A6ICcwJyxcclxuICAgICAgICBsZWZ0OiAnMCcsXHJcbiAgICAgICAgcmlnaHQ6ICcwJyxcclxuICAgICAgICBib3R0b206ICcwJyxcclxuICAgICAgICBtYXJnaW46ICcwJyxcclxuICAgICAgICB6SW5kZXg6IDk5OTk5XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiBgJHt0aGlzLmNvbnRhaW5lcldpZHRofXB4YCxcclxuICAgICAgaGVpZ2h0OiBgJHt0aGlzLmNvbnRhaW5lckhlaWdodH1weGAsXHJcbiAgICAgIG1heFdpZHRoOiBgJHt0aGlzLm1heFdpZHRofXB4YFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT0gRmlsZSBVcGxvYWQgTWV0aG9kcyA9PT09PT09PT09PT09XHJcbiAgXHJcbiAgb25JbWFnZVVwbG9hZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbGVTZWxlY3Rpb24oQXJyYXkuZnJvbShpbnB1dC5maWxlcyksICdpbWFnZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlVXBsb2FkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmIChpbnB1dC5maWxlcyAmJiBpbnB1dC5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRmlsZVNlbGVjdGlvbihBcnJheS5mcm9tKGlucHV0LmZpbGVzKSwgJ2ZpbGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRmlsZVNlbGVjdGlvbihmaWxlczogRmlsZVtdLCB0eXBlOiAnaW1hZ2UnIHwgJ2ZpbGUnKTogdm9pZCB7XHJcbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAvLyBWYWxpZGF0ZSBmaWxlIHR5cGVcclxuICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdHlwZSA9PT0gJ2ltYWdlJyA/IHRoaXMuYWxsb3dlZEltYWdlVHlwZXMgOiB0aGlzLmFsbG93ZWRGaWxlVHlwZXM7XHJcbiAgICAgIGlmICghYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYEZpbGUgdHlwZSAke2ZpbGUudHlwZX0gbm90IGFsbG93ZWRgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZVxyXG4gICAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5tYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgRmlsZSAke2ZpbGUubmFtZX0gZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHt0aGlzLm1heEZpbGVTaXplIC8gMTAyNCAvIDEwMjR9TUJgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQ6IEZpbGVBdHRhY2htZW50ID0ge1xyXG4gICAgICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVNZXNzYWdlSWQoKSxcclxuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcclxuICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcclxuICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcclxuICAgICAgICAgIGRhdGE6IGUudGFyZ2V0Py5yZXN1bHQgfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlZC5lbWl0KGF0dGFjaG1lbnQpO1xyXG4gICAgICB9O1xyXG4gICAgICBcclxuICAgICAgaWYgKHR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQXR0YWNobWVudChhdHRhY2htZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gdGhpcy5zZWxlY3RlZEZpbGVzLmZpbHRlcihmID0+IGYuaWQgIT09IGF0dGFjaG1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VySW1hZ2VVcGxvYWQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS11cGxvYWQtaW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0KSB7XHJcbiAgICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyRmlsZVVwbG9hZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmIChpbnB1dCkge1xyXG4gICAgICBpbnB1dC5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZUljb24oZmlsZVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoZmlsZVR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHJldHVybiAn8J+WvO+4jyc7XHJcbiAgICBpZiAoZmlsZVR5cGUuaW5jbHVkZXMoJ3BkZicpKSByZXR1cm4gJ/Cfk4QnO1xyXG4gICAgaWYgKGZpbGVUeXBlLmluY2x1ZGVzKCd3b3JkJykgfHwgZmlsZVR5cGUuaW5jbHVkZXMoJ2RvY3VtZW50JykpIHJldHVybiAn8J+TnSc7XHJcbiAgICBpZiAoZmlsZVR5cGUuaW5jbHVkZXMoJ3RleHQnKSkgcmV0dXJuICfwn5ODJztcclxuICAgIHJldHVybiAn8J+Tjic7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlU2l6ZUZvcm1hdHRlZChieXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmIChieXRlcyA8IDEwMjQpIHJldHVybiBieXRlcyArICcgQic7XHJcbiAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIChieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSkgKyAnIEtCJztcclxuICAgIHJldHVybiAoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpICsgJyBNQic7XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImFpLWNoYXQtY29udGFpbmVyXCIgXHJcbiAgICAgW25nQ2xhc3NdPVwiZ2V0VGhlbWVDbGFzcygpXCIgXHJcbiAgICAgW25nU3R5bGVdPVwiZ2V0Q29udGFpbmVyU3R5bGUoKVwiXHJcbiAgICAgW2NsYXNzLmZ1bGxzY3JlZW5dPVwiaXNGdWxsc2NyZWVuXCJcclxuICAgICBbY2xhc3MucmVzaXppbmddPVwiaXNSZXNpemluZ1wiPlxyXG4gIFxyXG4gIDwhLS0gUmVzaXplIEhhbmRsZXMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGUgcmVzaXplLWhhbmRsZS1yaWdodFwiIFxyXG4gICAgICAgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsICd3aWR0aCcpXCJcclxuICAgICAgICpuZ0lmPVwiIWlzRnVsbHNjcmVlblwiXHJcbiAgICAgICB0aXRsZT1cIkRyYWcgdG8gcmVzaXplIHdpZHRoXCI+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGUgcmVzaXplLWhhbmRsZS1jb3JuZXJcIiBcclxuICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRSZXNpemUoJGV2ZW50LCAnYm90aCcpXCJcclxuICAgICAgICpuZ0lmPVwiIWlzRnVsbHNjcmVlblwiXHJcbiAgICAgICB0aXRsZT1cIkRyYWcgdG8gcmVzaXplXCI+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPCEtLSBEZWJ1ZyBJbmZvcm1hdGlvbiAob25seSBzaG93biB3aGVuIHNob3dEZWJ1Z0luZm8gaXMgdHJ1ZSkgLS0+XHJcbiAgPGRpdiAqbmdJZj1cInNob3dEZWJ1Z0luZm9cIiBjbGFzcz1cImRlYnVnLWluZm9cIj5cclxuICAgIDxoMz5ERUJVRzogQUkgQ2hhdCBDb21wb25lbnQgTG9hZGVkPC9oMz5cclxuICAgIDxwPlN0YXR1czoge3sgY29uZmlndXJhdGlvblN0YXR1cyB8fCAnTG9hZGluZy4uLicgfX08L3A+XHJcbiAgICA8cD5NZXNzYWdlcyBjb3VudDoge3sgbWVzc2FnZXMubGVuZ3RoIHx8IDAgfX08L3A+XHJcbiAgICA8cD5UaGVtZToge3sgdGVtcGxhdGVEZXNpZ24gfHwgJ2RlZmF1bHQnIH19PC9wPlxyXG4gICAgPHA+U2l6ZToge3sgY3VycmVudFNpemUgfX0gKHt7IGNvbnRhaW5lcldpZHRoIH19eHt7IGNvbnRhaW5lckhlaWdodCB9fSk8L3A+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XHJcbiAgICAgIDxoMj57eyB0aXRsZSB9fTwvaDI+XHJcbiAgICAgIDwhLS0gSWNvbi1vbmx5IHN0YXR1cyBpbmRpY2F0b3IgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yLWljb25cIiBcclxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J3N0YXR1cy1yZWFkeSc6IGNvbmZpZ3VyYXRpb25TdGF0dXMgPT09ICdBSSBBZ2VudCBpcyByZWFkeScsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cy1lcnJvcic6IGNvbmZpZ3VyYXRpb25TdGF0dXMgIT09ICdBSSBBZ2VudCBpcyByZWFkeScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzLWxvYWRpbmcnOiBjb25maWd1cmF0aW9uU3RhdHVzID09PSAnSW5pdGlhbGl6aW5nLi4uJyB8fCBjb25maWd1cmF0aW9uU3RhdHVzID09PSAnVGVzdGluZyBjb25uZWN0aW9uLi4uJ31cIlxyXG4gICAgICAgICAgIFt0aXRsZV09XCJjb25maWd1cmF0aW9uU3RhdHVzXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItY29udHJvbHNcIj5cclxuICAgICAgPCEtLSBTaXplIFByZXNldCBCdXR0b25zIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2l6ZS1jb250cm9sc1wiICpuZ0lmPVwiIWlzRnVsbHNjcmVlblwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ1dHRvbiBzaXplLWJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2l6ZVByZXNldCgnY29tcGFjdCcpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNpemUgPT09ICdjb21wYWN0J1wiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkNvbXBhY3QgVmlld1wiXHJcbiAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJDb21wYWN0IFZpZXdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zdmdcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmNvbXBhY3RWaWV3XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ1dHRvbiBzaXplLWJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2l6ZVByZXNldCgnZGVmYXVsdCcpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNpemUgPT09ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkRlZmF1bHQgVmlld1wiXHJcbiAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJEZWZhdWx0IFZpZXdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zdmdcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmRlZmF1bHRWaWV3XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ1dHRvbiBzaXplLWJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2l6ZVByZXNldCgnZXhwYW5kZWQnKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTaXplID09PSAnZXhwYW5kZWQnXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwYW5kZWQgVmlld1wiXHJcbiAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJFeHBhbmRlZCBWaWV3XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tc3ZnXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy5leHBhbmRlZFZpZXdcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LW1lc3NhZ2VzXCIgI21lc3NhZ2VzQ29udGFpbmVyPlxyXG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgY2xhc3M9XCJtZXNzYWdlLXdyYXBwZXJcIj5cclxuICAgICAgPCEtLSBNZXNzYWdlIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiIFxyXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cInsndXNlci1tZXNzYWdlJzogbWVzc2FnZS5pc1VzZXIsICdhaS1tZXNzYWdlJzogIW1lc3NhZ2UuaXNVc2VyLCAnbG9hZGluZy1tZXNzYWdlJzogbWVzc2FnZS5pc0xvYWRpbmd9XCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtdGltZXN0YW1wXCI+e3sgZ2V0Rm9ybWF0dGVkVGltZShtZXNzYWdlLnRpbWVzdGFtcCkgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1hdmF0YXJcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibWVzc2FnZS5pc1VzZXJcIiBjbGFzcz1cImF2YXRhci1pY29uXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy51c2VyQXZhdGFyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbWVzc2FnZS5pc1VzZXIgJiYgIW1lc3NhZ2UuaXNMb2FkaW5nXCIgY2xhc3M9XCJhdmF0YXItaWNvblwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkSWNvbnMuYWlBdmF0YXJcIj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1lc3NhZ2UuaXNMb2FkaW5nXCIgY2xhc3M9XCJhdmF0YXItaWNvbiBsb2FkaW5nLXNwaW5uZXJcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmxvYWRpbmdBdmF0YXJcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LWlucHV0XCI+XHJcbiAgICA8IS0tIEF0dGFjaG1lbnRzIFByZXZpZXcgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudHMtcHJldmlld1wiICpuZ0lmPVwic2VsZWN0ZWRGaWxlcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LWl0ZW1cIiAqbmdGb3I9XCJsZXQgZmlsZSBvZiBzZWxlY3RlZEZpbGVzXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cImF0dGFjaG1lbnQtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMjEuNDQgMTEuMDVsLTkuMTkgOS4xOWE2IDYgMCAwIDEtOC40OS04LjQ5bDkuMTktOS4xOWE0IDQgMCAwIDEgNS42NiA1LjY2bC05LjIgOS4xOWEyIDIgMCAwIDEtMi44My0yLjgzbDguNDktOC40OFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImF0dGFjaG1lbnQtbmFtZVwiPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImF0dGFjaG1lbnQtc2l6ZVwiPnt7IGdldEZpbGVTaXplRm9ybWF0dGVkKGZpbGUuc2l6ZSkgfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlbW92ZS1hdHRhY2htZW50XCIgKGNsaWNrKT1cInJlbW92ZUF0dGFjaG1lbnQoZmlsZS5pZClcIiB0aXRsZT1cIlJlbW92ZVwiIGF0dHIuYXJpYS1sYWJlbD1cIlJlbW92ZSBhdHRhY2htZW50XCI+XHJcbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgPCEtLSBGaWxlIFVwbG9hZCBJbnB1dHMgKEhpZGRlbikgLS0+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIFxyXG4gICAgICAgICAgICAgaWQ9XCJpbWFnZS11cGxvYWQtaW5wdXRcIiBcclxuICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIiBcclxuICAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXHJcbiAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVuYWJsZUltYWdlVXBsb2FkXCI+XHJcbiAgICAgIFxyXG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBcclxuICAgICAgICAgICAgIGlkPVwiZmlsZS11cGxvYWQtaW5wdXRcIiBcclxuICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwudHh0LC5jc3ZcIiBcclxuICAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVVcGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCJcclxuICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZW5hYmxlRmlsZVVwbG9hZFwiPlxyXG4gICAgICBcclxuICAgICAgPCEtLSBVcGxvYWQgQnV0dG9ucyAoQ29uZGl0aW9uYWxseSByZW5kZXJlZCkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uc1wiICpuZ0lmPVwiZW5hYmxlSW1hZ2VVcGxvYWQgfHwgZW5hYmxlRmlsZVVwbG9hZFwiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJlbmFibGVJbWFnZVVwbG9hZFwiIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uIGltYWdlLXVwbG9hZFwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJJbWFnZVVwbG9hZCgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJVcGxvYWQgSW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwiVXBsb2FkIEltYWdlXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tc3ZnXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy5pbWFnZVVwbG9hZFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICBcclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZW5hYmxlRmlsZVVwbG9hZFwiIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uIGZpbGUtdXBsb2FkXCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiQXR0YWNoIEZpbGVcIlxyXG4gICAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwiQXR0YWNoIEZpbGVcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zdmdcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmZpbGVVcGxvYWRcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBcclxuICAgICAgPHRleHRhcmVhIFxyXG4gICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudElucXVpcnlcIiBcclxuICAgICAgICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIHJvd3M9XCIyXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICBjbGFzcz1cImlucXVpcnktdGV4dGFyZWFcIlxyXG4gICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cIlR5cGUgeW91ciBtZXNzYWdlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgXHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cInNlbmRJbnF1aXJ5KClcIiBcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWN1cnJlbnRJbnF1aXJ5LnRyaW0oKSB8fCBpc0xvYWRpbmdcIlxyXG4gICAgICAgIGNsYXNzPVwic2VuZC1idXR0b25cIlxyXG4gICAgICAgIHRpdGxlPVwiU2VuZCBNZXNzYWdlXCJcclxuICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJTZW5kIE1lc3NhZ2VcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0xvYWRpbmdcIiBjbGFzcz1cImljb24tc3ZnXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy5zZW5kXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJpY29uLXN2ZyBsb2FkaW5nLWljb25cIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLnNlbmRMb2FkaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7IGlzTG9hZGluZyA/ICdTZW5kaW5nLi4uJyA6ICdTZW5kJyB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
749
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbWFuYXRlLWFpLWNoYXQtbGliL3NyYy9saWIvY29tcG9uZW50cy9haS1jaGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VtYW5hdGUtYWktY2hhdC1saWIvc3JjL2xpYi9jb21wb25lbnRzL2FpLWNoYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFFcEgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUErQixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBZ0MxRixNQUFNLE9BQU8sZUFBZTtJQStEMUIsWUFDVSxjQUE4QixFQUM5QixTQUF1QjtRQUR2QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQWhFeEIsVUFBSyxHQUFXLG1CQUFtQixDQUFDO1FBQ3BDLGdCQUFXLEdBQVcsMkVBQTJFLENBQUM7UUFDbEcsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFXL0Isc0JBQWlCLEdBQVksS0FBSyxDQUFDLENBQUMscUNBQXFDO1FBQ3pFLHFCQUFnQixHQUFZLEtBQUssQ0FBQyxDQUFFLG9DQUFvQztRQUN4RSxZQUFPLEdBQWdCLFNBQVMsQ0FBQyxDQUFHLHFCQUFxQjtRQUV6RCxxQkFBZ0IsR0FBWSxJQUFJLENBQUMsQ0FBRyxnQ0FBZ0M7UUFDcEUsbUJBQWMsR0FBK0IsUUFBUSxDQUFDLENBQUMsMEJBQTBCO1FBQ2pGLDRCQUF1QixHQUFZLElBQUksQ0FBQyxDQUFDLDhDQUE4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QkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQWlBZ2VudFNlcnZpY2UsIEFnZW50UmVzcG9uc2UsIFN1cHBvcnRCb3RSZXF1ZXN0LCBTdXBwb3J0Qm90UmVzcG9uc2UsIENoYXRDb250ZW50IH0gZnJvbSAnLi4vc2VydmljZXMvYWktYWdlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEljb25TZXRUeXBlLCBDaGF0SWNvbkNvbmZpZywgZ2V0SWNvblNldCB9IGZyb20gJy4uL21vZGVscy9pY29uLWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGF0TWVzc2FnZSB7XHJcbiAgbWVzc2FnZUlkPzogc3RyaW5nOyAgICAgICAgICAgLy8gVW5pcXVlIG1lc3NhZ2UgaWRlbnRpZmllclxyXG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nOyAgICAgICAvLyBDb252ZXJzYXRpb24vc2Vzc2lvbiBpZGVudGlmaWVyXHJcbiAgaXNVc2VyOiBib29sZWFuO1xyXG4gIGNvbnRlbnQ6IHN0cmluZztcclxuICBzZW5kZXI/OiBzdHJpbmc7ICAgICAgICAgICAgICAgLy8gU2VuZGVyIG5hbWUgKG1hcHMgdG8geW91ciAnc2VuZGVyJyBmaWVsZClcclxuICBpbnRlbnQ/OiBzdHJpbmc7XHJcbiAgYXV0aG9yTmFtZT86IHN0cmluZztcclxuICBjb25maWRlbmNlU2NvcmU/OiBudW1iZXI7ICAgICAgLy8gQUkgY29uZmlkZW5jZSBzY29yZVxyXG4gIHRpbWVzdGFtcDogRGF0ZTtcclxuICBpc0xvYWRpbmc/OiBib29sZWFuO1xyXG4gIGF0dGFjaG1lbnRzPzogRmlsZUF0dGFjaG1lbnRbXTsgLy8gRmlsZS9JbWFnZSBhdHRhY2htZW50c1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVBdHRhY2htZW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgc2l6ZTogbnVtYmVyO1xyXG4gIHVybD86IHN0cmluZztcclxuICBkYXRhPzogc3RyaW5nIHwgQXJyYXlCdWZmZXI7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENoYXRTaXplID0gJ2NvbXBhY3QnIHwgJ2RlZmF1bHQnIHwgJ2V4cGFuZGVkJyB8ICdmdWxsc2NyZWVuJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZW1hbmF0ZS1haS1jaGF0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWktY2hhdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWktY2hhdC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBaUNoYXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0NoYXQgd2l0aCBNYWVzdHJvJztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1R5cGUgeW91ciBpbnF1aXJ5IGhlcmUuLi4gKFByZXNzIEVudGVyIHRvIHNlbmQsIFNoaWZ0K0VudGVyIGZvciBuZXcgbGluZSknO1xyXG4gIEBJbnB1dCgpIHNob3dEZWJ1Z0luZm86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhcGlVcmw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYXBwS2V5Pzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFwcFNvdXJjZT86IHN0cmluZztcclxuICBASW5wdXQoKSB1c2VySWQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZmlyc3ROYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHVzZXJOYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRlbXBsYXRlRGVzaWduPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHdlbGNvbWVNZXNzYWdlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhpc3RvcmljYWxNZXNzYWdlcz86IGFueVtdOyAvLyBIaXN0b3JpY2FsIG1lc3NhZ2VzIGZyb20gcGFyZW50XHJcbiAgQElucHV0KCkgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7ICAgIC8vIEN1cnJlbnQgY29udmVyc2F0aW9uIElEXHJcbiAgQElucHV0KCkgZW5hYmxlSW1hZ2VVcGxvYWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRW5hYmxlL2Rpc2FibGUgaW1hZ2UgdXBsb2FkIGJ1dHRvblxyXG4gIEBJbnB1dCgpIGVuYWJsZUZpbGVVcGxvYWQ6IGJvb2xlYW4gPSBmYWxzZTsgIC8vIEVuYWJsZS9kaXNhYmxlIGZpbGUgdXBsb2FkIGJ1dHRvblxyXG4gIEBJbnB1dCgpIGljb25TZXQ6IEljb25TZXRUeXBlID0gJ2ZlYXRoZXInOyAgIC8vIEljb24gc2V0IHNlbGVjdGlvblxyXG4gIEBJbnB1dCgpIGN1c3RvbUljb25zPzogUGFydGlhbDxDaGF0SWNvbkNvbmZpZz47IC8vIEN1c3RvbSBpY29uIG92ZXJyaWRlc1xyXG4gIEBJbnB1dCgpIGVuYWJsZUFuaW1hdGlvbnM6IGJvb2xlYW4gPSB0cnVlOyAgIC8vIEVuYWJsZS9kaXNhYmxlIGFsbCBhbmltYXRpb25zXHJcbiAgQElucHV0KCkgYW5pbWF0aW9uU3BlZWQ6ICdzbG93JyB8ICdub3JtYWwnIHwgJ2Zhc3QnID0gJ25vcm1hbCc7IC8vIEFuaW1hdGlvbiBzcGVlZCBjb250cm9sXHJcbiAgQElucHV0KCkgZW5hYmxlU3RhdHVzVHJhbnNpdGlvbnM6IGJvb2xlYW4gPSB0cnVlOyAvLyBFbmFibGUvZGlzYWJsZSBzdGF0dXMgaW5kaWNhdG9yIHRyYW5zaXRpb25zXHJcbiAgQE91dHB1dCgpIG1lc3NhZ2VSZWNlaXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgQE91dHB1dCgpIG1lc3NhZ2VTZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcclxuICBAT3V0cHV0KCkgZmlsZVVwbG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlQXR0YWNobWVudD4oKTtcclxuICBAT3V0cHV0KCkgc2l6ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2l6ZTogQ2hhdFNpemUsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0+KCk7XHJcblxyXG4gIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcbiAgY3VycmVudElucXVpcnkgPSAnJztcclxuICBhdXRob3JOYW1lID0gJyc7XHJcbiAgaW50ZW50ID0gJyc7XHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgY29uZmlndXJhdGlvblN0YXR1cyA9ICcnO1xyXG4gIHByZXZpb3VzU3RhdHVzID0gJyc7IC8vIFRyYWNrIHByZXZpb3VzIHN0YXR1cyBmb3IgdHJhbnNpdGlvbnNcclxuICBcclxuICAvLyBSZXNpemluZyBwcm9wZXJ0aWVzXHJcbiAgY3VycmVudFNpemU6IENoYXRTaXplID0gJ2RlZmF1bHQnO1xyXG4gIGlzRnVsbHNjcmVlbiA9IGZhbHNlO1xyXG4gIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICBjb250YWluZXJXaWR0aCA9IDgwMDtcclxuICBjb250YWluZXJIZWlnaHQgPSA2MDA7XHJcbiAgbWluV2lkdGggPSA0MDA7XHJcbiAgbWF4V2lkdGggPSAxNDAwO1xyXG4gIG1pbkhlaWdodCA9IDQwMDtcclxuICBtYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxMDA7XHJcbiAgc3RhcnRYID0gMDtcclxuICBzdGFydFkgPSAwO1xyXG4gIHN0YXJ0V2lkdGggPSAwO1xyXG4gIHN0YXJ0SGVpZ2h0ID0gMDtcclxuICBcclxuICAvLyBGaWxlIHVwbG9hZCBwcm9wZXJ0aWVzXHJcbiAgbWF4RmlsZVNpemUgPSAxMCAqIDEwMjQgKiAxMDI0OyAvLyAxME1CXHJcbiAgYWxsb3dlZEltYWdlVHlwZXMgPSBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJywgJ2ltYWdlL2pwZycsICdpbWFnZS9naWYnLCAnaW1hZ2Uvd2VicCddO1xyXG4gIGFsbG93ZWRGaWxlVHlwZXMgPSBbJ2FwcGxpY2F0aW9uL3BkZicsICdhcHBsaWNhdGlvbi9tc3dvcmQnLCBcclxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXHJcbiAgICAndGV4dC9wbGFpbicsICd0ZXh0L2NzdiddO1xyXG4gIHNlbGVjdGVkRmlsZXM6IEZpbGVBdHRhY2htZW50W10gPSBbXTtcclxuICBcclxuICAvLyBJY29uIGNvbmZpZ3VyYXRpb25cclxuICBpY29uczogQ2hhdEljb25Db25maWcgPSBnZXRJY29uU2V0KCdmZWF0aGVyJyk7XHJcbiAgc2FuaXRpemVkSWNvbnM6IHsgW2tleTogc3RyaW5nXTogU2FmZUh0bWwgfSA9IHt9O1xyXG4gIFxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWlBZ2VudFNlcnZpY2U6IEFpQWdlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplclxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXR1cygnSW5pdGlhbGl6aW5nLi4uJyk7XHJcbiAgICBjb25zb2xlLmxvZygnQUkgQ2hhdCBDb21wb25lbnQgaW5pdGlhbGl6ZWQnKTtcclxuICAgIFxyXG4gICAgLy8gTG9hZCBpY29uIHNldFxyXG4gICAgdGhpcy5pY29ucyA9IGdldEljb25TZXQodGhpcy5pY29uU2V0LCB0aGlzLmN1c3RvbUljb25zKTtcclxuICAgIHRoaXMuc2FuaXRpemVJY29ucygpO1xyXG4gICAgXHJcbiAgICAvLyBDb25maWd1cmUgQVBJIFVSTCBhbmQgQXBwIEtleSBpZiBwcm92aWRlZFxyXG4gICAgaWYgKHRoaXMuYXBpVXJsIHx8IHRoaXMuYXBwS2V5KSB7XHJcbiAgICAgIHRoaXMuYWlBZ2VudFNlcnZpY2UuY29uZmlndXJlKHsgXHJcbiAgICAgICAgYXBpVXJsOiB0aGlzLmFwaVVybCxcclxuICAgICAgICBhcHBLZXk6IHRoaXMuYXBwS2V5IFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gTG9hZCBoaXN0b3JpY2FsIG1lc3NhZ2VzIGlmIHByb3ZpZGVkXHJcbiAgICAgIGlmICh0aGlzLmhpc3RvcmljYWxNZXNzYWdlcyAmJiB0aGlzLmhpc3RvcmljYWxNZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkSGlzdG9yaWNhbE1lc3NhZ2VzKHRoaXMuaGlzdG9yaWNhbE1lc3NhZ2VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFkZFdlbGNvbWVNZXNzYWdlKCk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMudGVzdENvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgdGhpcy5sb2FkU2F2ZWRTaXplKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlTaXplUHJlc2V0KHRoaXMuY3VycmVudFNpemUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbjonLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdJbml0aWFsaXphdGlvbiBlcnJvcicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgLy8gRGV0ZWN0IHdoZW4gaGlzdG9yaWNhbE1lc3NhZ2VzIGlucHV0IGNoYW5nZXNcclxuICAgIGlmIChjaGFuZ2VzWydoaXN0b3JpY2FsTWVzc2FnZXMnXSAmJiAhY2hhbmdlc1snaGlzdG9yaWNhbE1lc3NhZ2VzJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBjaGFuZ2VzWydoaXN0b3JpY2FsTWVzc2FnZXMnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdIaXN0b3JpY2FsIG1lc3NhZ2VzIGNoYW5nZWQ6JywgbmV3TWVzc2FnZXMpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ2xlYXIgZXhpc3RpbmcgbWVzc2FnZXMgYW5kIHJlbG9hZFxyXG4gICAgICB0aGlzLm1lc3NhZ2VzID0gW107XHJcbiAgICAgIFxyXG4gICAgICBpZiAobmV3TWVzc2FnZXMgJiYgbmV3TWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubG9hZEhpc3RvcmljYWxNZXNzYWdlcyhuZXdNZXNzYWdlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRXZWxjb21lTWVzc2FnZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIERldGVjdCB3aGVuIGNvbnZlcnNhdGlvbklkIGNoYW5nZXNcclxuICAgIGlmIChjaGFuZ2VzWydjb252ZXJzYXRpb25JZCddICYmICFjaGFuZ2VzWydjb252ZXJzYXRpb25JZCddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDb252ZXJzYXRpb24gSUQgY2hhbmdlZDonLCBjaGFuZ2VzWydjb252ZXJzYXRpb25JZCddLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3RpbmcgbWVzc2FnZXMgd2l0aCBuZXcgY29udmVyc2F0aW9uSWQgaWYgbmVlZGVkXHJcbiAgICAgIHRoaXMubWVzc2FnZXMuZm9yRWFjaChtc2cgPT4ge1xyXG4gICAgICAgIGlmIChtc2cuY29udmVyc2F0aW9uSWQgIT09IHRoaXMuY29udmVyc2F0aW9uSWQpIHtcclxuICAgICAgICAgIG1zZy5jb252ZXJzYXRpb25JZCA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gRGV0ZWN0IHdoZW4gaWNvbiBzZXQgY2hhbmdlc1xyXG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZXQnXSB8fCBjaGFuZ2VzWydjdXN0b21JY29ucyddKSB7XHJcbiAgICAgIHRoaXMuaWNvbnMgPSBnZXRJY29uU2V0KHRoaXMuaWNvblNldCwgdGhpcy5jdXN0b21JY29ucyk7XHJcbiAgICAgIHRoaXMuc2FuaXRpemVJY29ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbmltYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGJhc2VkIG9uIHNwZWVkIHNldHRpbmdcclxuICAgKi9cclxuICBnZXRBbmltYXRpb25EdXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgaWYgKCF0aGlzLmVuYWJsZUFuaW1hdGlvbnMpIHJldHVybiAwO1xyXG4gICAgc3dpdGNoICh0aGlzLmFuaW1hdGlvblNwZWVkKSB7XHJcbiAgICAgIGNhc2UgJ3Nsb3cnOiByZXR1cm4gNTAwO1xyXG4gICAgICBjYXNlICdmYXN0JzogcmV0dXJuIDE1MDtcclxuICAgICAgZGVmYXVsdDogcmV0dXJuIDI1MDsgLy8gbm9ybWFsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYW5pbWF0aW9uIENTUyBjbGFzcyBiYXNlZCBvbiBzZXR0aW5nc1xyXG4gICAqL1xyXG4gIGdldEFuaW1hdGlvbkNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuZW5hYmxlQW5pbWF0aW9ucykgcmV0dXJuICduby1hbmltYXRpb25zJztcclxuICAgIHJldHVybiBgYW5pbWF0aW9uLXNwZWVkLSR7dGhpcy5hbmltYXRpb25TcGVlZH1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHN0YXR1cyB3aXRoIHRyYW5zaXRpb24gdHJhY2tpbmdcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZVN0YXR1cyhuZXdTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlU3RhdHVzVHJhbnNpdGlvbnMgJiYgdGhpcy5jb25maWd1cmF0aW9uU3RhdHVzICE9PSBuZXdTdGF0dXMpIHtcclxuICAgICAgdGhpcy5wcmV2aW91c1N0YXR1cyA9IHRoaXMuY29uZmlndXJhdGlvblN0YXR1cztcclxuICAgIH1cclxuICAgIHRoaXMuY29uZmlndXJhdGlvblN0YXR1cyA9IG5ld1N0YXR1cztcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogU2FuaXRpemUgaWNvbiBTVkcgc3RyaW5ncyBmb3Igc2FmZSByZW5kZXJpbmcgaW4gaW5uZXJIVE1MIGJpbmRpbmdzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzYW5pdGl6ZUljb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zYW5pdGl6ZWRJY29ucyA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5pY29ucykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBjb25zdCBzdmdTdHJpbmcgPSB0aGlzLmljb25zW2tleSBhcyBrZXlvZiBDaGF0SWNvbkNvbmZpZ107XHJcbiAgICAgIGlmIChzdmdTdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNhbml0aXplZEljb25zW2tleV0gPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChzdmdTdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRlc3RDb25maWd1cmF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVTdGF0dXMoJ1Rlc3RpbmcgY29ubmVjdGlvbi4uLicpO1xyXG4gICAgXHJcbiAgICB0aGlzLmFpQWdlbnRTZXJ2aWNlLnRlc3RDb25maWd1cmF0aW9uKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IEFnZW50UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdBSSBBZ2VudCBpcyByZWFkeScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoYENvbmZpZ3VyYXRpb24gZXJyb3I6ICR7cmVzcG9uc2UuZXJyb3J9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yUmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoYENvbm5lY3Rpb24gZXJyb3I6IENhbm5vdCBjb25uZWN0IHRvIGJhY2tlbmQgc2VydmljZWApO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignQVBJIGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6JywgZXJyb3JSZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZFdlbGNvbWVNZXNzYWdlKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2VsY29tZVRleHQgPSB0aGlzLndlbGNvbWVNZXNzYWdlIHx8IFxyXG4gICAgICBgPGgzPkhlbGxvICR7dGhpcy5maXJzdE5hbWV9ITwvaDM+SGksIEknbSBNYWVzdHJv4oCUeW91ciBBSSBhc3Npc3RhbnQuIEknbSBoZXJlIHRvIGhlbHAgd2l0aCB5b3VyIHBvbGljeS1yZWxhdGVkIGlucXVpcmllcy48YnI+PGJyPkhvdyBjYW4gSSBhc3Npc3QgeW91IHRvZGF5P2A7XHJcbiAgICBcclxuICAgIHRoaXMubWVzc2FnZXMucHVzaCh7XHJcbiAgICAgIGlzVXNlcjogZmFsc2UsXHJcbiAgICAgIGNvbnRlbnQ6IHdlbGNvbWVUZXh0LCAvLyBEb24ndCBmb3JtYXQgSFRNTCBjb250ZW50LCB1c2UgaXQgZGlyZWN0bHlcclxuICAgICAgaW50ZW50OiAnd2VsY29tZScsXHJcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkIGFuZCB0cmFuc2Zvcm0gaGlzdG9yaWNhbCBtZXNzYWdlcyBmcm9tIHBhcmVudCBjb21wb25lbnRcclxuICAgKiBBY2NlcHRzIG1lc3NhZ2VzIGluIHRoZSBmb3JtYXQgZnJvbSB5b3VyIGJhY2tlbmQvc3RhdGUgbWFuYWdlbWVudFxyXG4gICAqL1xyXG4gIGxvYWRIaXN0b3JpY2FsTWVzc2FnZXMoaGlzdG9yaWNhbE1lc3NhZ2VzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coJ0xvYWRpbmcgaGlzdG9yaWNhbCBtZXNzYWdlczonLCBoaXN0b3JpY2FsTWVzc2FnZXMpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ051bWJlciBvZiBtZXNzYWdlcyB0byBsb2FkOicsIGhpc3RvcmljYWxNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgXHJcbiAgICAvLyBUcmFuc2Zvcm0geW91ciBiYWNrZW5kIGZvcm1hdCB0byBDaGF0TWVzc2FnZSBmb3JtYXRcclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkTWVzc2FnZXM6IENoYXRNZXNzYWdlW10gPSBoaXN0b3JpY2FsTWVzc2FnZXMubWFwKChtc2c6IGFueSkgPT4ge1xyXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgbWVzc2FnZSBpcyBmcm9tIHVzZXIgYmFzZWQgb24gc2VuZGVyIG9yIHJvbGVcclxuICAgICAgY29uc3QgaXNVc2VyTWVzc2FnZSA9IHRoaXMuaXNVc2VyTWVzc2FnZShtc2cpO1xyXG4gICAgICBcclxuICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSB7XHJcbiAgICAgICAgbWVzc2FnZUlkOiBtc2cubWVzc2FnZUlkIHx8IG1zZy5pZCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZDogbXNnLmNvbnZlcnNhdGlvbklkIHx8IHRoaXMuY29udmVyc2F0aW9uSWQsXHJcbiAgICAgICAgaXNVc2VyOiBpc1VzZXJNZXNzYWdlLFxyXG4gICAgICAgIGNvbnRlbnQ6IG1zZy5tZXNzYWdlVGV4dCB8fCBtc2cubWVzc2FnZSB8fCBtc2cudGV4dCB8fCBtc2cuY29udGVudCB8fCAnJyxcclxuICAgICAgICBzZW5kZXI6IG1zZy5zZW5kZXIgfHwgKGlzVXNlck1lc3NhZ2UgPyB0aGlzLnVzZXJOYW1lIHx8ICdVc2VyJyA6ICdNYWVzdHJvJyksXHJcbiAgICAgICAgaW50ZW50OiBtc2cuaW50ZW50IHx8ICcnLFxyXG4gICAgICAgIGF1dGhvck5hbWU6IG1zZy5hdXRob3JOYW1lIHx8IG1zZy5zZW5kZXIsXHJcbiAgICAgICAgY29uZmlkZW5jZVNjb3JlOiBtc2cuY29uZmlkZW5jZVNjb3JlIHx8IG1zZy5jb25maWRlbmNlIHx8IDAsXHJcbiAgICAgICAgdGltZXN0YW1wOiBtc2cudGltZXN0YW1wIHx8IG1zZy5jcmVhdGVkQXQgXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKG1zZy50aW1lc3RhbXAgfHwgbXNnLmNyZWF0ZWRBdCkgXHJcbiAgICAgICAgICA6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxyXG4gICAgICB9IGFzIENoYXRNZXNzYWdlO1xyXG4gICAgICBcclxuICAgICAgLy8gY29uc29sZS5sb2coJ1RyYW5zZm9ybWVkIG1lc3NhZ2U6JywgdHJhbnNmb3JtZWQpO1xyXG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gU29ydCBtZXNzYWdlcyBieSB0aW1lc3RhbXAgdG8gbWFpbnRhaW4gY2hyb25vbG9naWNhbCBvcmRlclxyXG4gICAgdHJhbnNmb3JtZWRNZXNzYWdlcy5zb3J0KChhLCBiKSA9PiBcclxuICAgICAgYS50aW1lc3RhbXAuZ2V0VGltZSgpIC0gYi50aW1lc3RhbXAuZ2V0VGltZSgpXHJcbiAgICApO1xyXG4gICAgXHJcbiAgICAvLyBjb25zb2xlLmxvZygnU29ydGVkIG1lc3NhZ2VzIGNvdW50OicsIHRyYW5zZm9ybWVkTWVzc2FnZXMubGVuZ3RoKTtcclxuICAgIFxyXG4gICAgLy8gQWRkIHdlbGNvbWUgbWVzc2FnZSBmaXJzdCBpZiBubyBtZXNzYWdlcyBvciBsb2FkIGhpc3RvcmljYWwgbWVzc2FnZXNcclxuICAgIGlmICh0cmFuc2Zvcm1lZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnTm8gbWVzc2FnZXMgdG8gbG9hZCwgYWRkaW5nIHdlbGNvbWUgbWVzc2FnZScpO1xyXG4gICAgICB0aGlzLmFkZFdlbGNvbWVNZXNzYWdlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBDaGVjayBpZiBmaXJzdCBtZXNzYWdlIGlzIGEgd2VsY29tZSBtZXNzYWdlLCBpZiBub3QgYWRkIG9uZVxyXG4gICAgICBjb25zdCBoYXNXZWxjb21lID0gdHJhbnNmb3JtZWRNZXNzYWdlcy5zb21lKG1zZyA9PiBcclxuICAgICAgICBtc2cuaW50ZW50ID09PSAnd2VsY29tZScgfHwgbXNnLmNvbnRlbnQuaW5jbHVkZXMoJ0hlbGxvJylcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmICghaGFzV2VsY29tZSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdObyB3ZWxjb21lIG1lc3NhZ2UgZm91bmQsIGFkZGluZyBvbmUnKTtcclxuICAgICAgICB0aGlzLmFkZFdlbGNvbWVNZXNzYWdlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdQdXNoaW5nIHRyYW5zZm9ybWVkIG1lc3NhZ2VzIHRvIG1lc3NhZ2VzIGFycmF5Jyk7XHJcbiAgICAgIHRoaXMubWVzc2FnZXMucHVzaCguLi50cmFuc2Zvcm1lZE1lc3NhZ2VzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnVG90YWwgbG9hZGVkIG1lc3NhZ2VzIGluIGNvbXBvbmVudDonLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnTWVzc2FnZXMgYXJyYXk6JywgdGhpcy5tZXNzYWdlcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSBpZiBhIG1lc3NhZ2UgaXMgZnJvbSB0aGUgdXNlclxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNVc2VyTWVzc2FnZShtc2c6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gQ2hlY2sgdmFyaW91cyBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgaW5kaWNhdGUgdXNlciBtZXNzYWdlXHJcbiAgICBpZiAobXNnLmlzVXNlciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbXNnLmlzVXNlcjtcclxuICAgIGlmIChtc2cucm9sZSkgcmV0dXJuIG1zZy5yb2xlLnRvTG93ZXJDYXNlKCkgPT09ICd1c2VyJztcclxuICAgIGlmIChtc2cuc2VuZGVyKSB7XHJcbiAgICAgIGNvbnN0IHNlbmRlciA9IG1zZy5zZW5kZXIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgcmV0dXJuIHNlbmRlciA9PT0gJ3VzZXInIHx8IFxyXG4gICAgICAgICAgICAgc2VuZGVyID09PSB0aGlzLnVzZXJOYW1lPy50b0xvd2VyQ2FzZSgpIHx8XHJcbiAgICAgICAgICAgICBzZW5kZXIgPT09IHRoaXMudXNlcklkPy50b0xvd2VyQ2FzZSgpIHx8XHJcbiAgICAgICAgICAgICBzZW5kZXIuaW5jbHVkZXMoJ3VzZXInKTtcclxuICAgIH1cclxuICAgIC8vIERlZmF1bHQgdG8gZmFsc2UgKGJvdCBtZXNzYWdlKSBpZiBjYW4ndCBkZXRlcm1pbmVcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbmRJbnF1aXJ5KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRJbnF1aXJ5LnRyaW0oKSB8fCB0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlck1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xyXG4gICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVNZXNzYWdlSWQoKSxcclxuICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuY29udmVyc2F0aW9uSWQsXHJcbiAgICAgIGlzVXNlcjogdHJ1ZSxcclxuICAgICAgc2VuZGVyOiB0aGlzLnVzZXJOYW1lIHx8ICdVc2VyJyxcclxuICAgICAgaW50ZW50OiB0aGlzLmludGVudCxcclxuICAgICAgY29udGVudDogdGhpcy5jdXJyZW50SW5xdWlyeSxcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2godXNlck1lc3NhZ2UpO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VudC5lbWl0KHVzZXJNZXNzYWdlKTtcclxuXHJcbiAgICAvLyBBZGQgbG9hZGluZyBtZXNzYWdlXHJcbiAgICBjb25zdCBsb2FkaW5nTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgIGlzVXNlcjogZmFsc2UsXHJcbiAgICAgIGludGVudDogJycsXHJcbiAgICAgIGNvbnRlbnQ6ICdQcm9jZXNzaW5nIHlvdXIgaW5xdWlyeS4uLicsXHJcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcclxuICAgICAgaXNMb2FkaW5nOiB0cnVlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5tZXNzYWdlcy5wdXNoKGxvYWRpbmdNZXNzYWdlKTtcclxuXHJcbiAgICBjb25zdCBpbnF1aXJ5ID0gdGhpcy5jdXJyZW50SW5xdWlyeS50cmltKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRJbnF1aXJ5ID0gJyc7XHJcbiAgICB0aGlzLmF1dGhvck5hbWUgPSAnJztcclxuICAgIHRoaXMuaW50ZW50ID0gJyc7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdDogU3VwcG9ydEJvdFJlcXVlc3QgPSB7XHJcbiAgICAgIHF1ZXJ5OiBpbnF1aXJ5LFxyXG4gICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcclxuICAgICAgdXNlck5hbWU6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgIGFwcFNvdXJjZTogdGhpcy5hcHBTb3VyY2VcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5haUFnZW50U2VydmljZS5wcm9jZXNzSW5xdWlyeShyZXF1ZXN0KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogU3VwcG9ydEJvdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyBVcGRhdGUgY29udmVyc2F0aW9uSWQgaWYgcHJvdmlkZWQgaW4gcmVzcG9uc2VcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5jb252ZXJzYXRpb25JZCAmJiAhdGhpcy5jb252ZXJzYXRpb25JZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gcmVzcG9uc2UuY29udmVyc2F0aW9uSWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIFJlbW92ZSBsb2FkaW5nIG1lc3NhZ2VcclxuICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmZpbHRlcihtc2cgPT4gIW1zZy5pc0xvYWRpbmcpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYW5zd2VyIHx8IChyZXNwb25zZS5jb250ZW50cyAmJiByZXNwb25zZS5jb250ZW50cy5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuYW5zd2VyKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYm90TWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVNZXNzYWdlSWQoKSxcclxuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmNvbnZlcnNhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgaXNVc2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNlbmRlcjogJ01hZXN0cm8nLFxyXG4gICAgICAgICAgICAgICAgaW50ZW50OiByZXNwb25zZS5zZWFyY2hJbnRlbnQgfHwgaW5xdWlyeSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuZm9ybWF0TWVzc2FnZUNvbnRlbnQocmVzcG9uc2UuYW5zd2VyKSxcclxuICAgICAgICAgICAgICAgIGF1dGhvck5hbWU6IHJlc3BvbnNlLmNvbnRlbnRzICYmIHJlc3BvbnNlLmNvbnRlbnRzLmxlbmd0aCA+IDAgPyByZXNwb25zZS5jb250ZW50c1swXS5hdXRob3JOYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goYm90TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUmVjZWl2ZWQuZW1pdChib3RNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5jb250ZW50cyAmJiByZXNwb25zZS5jb250ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgLy8gUHVzaCBlYWNoIGNvbnRlbnQgYXMgYSBzZXBhcmF0ZSBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2UuY29udGVudHMuZm9yRWFjaChjb250ZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0uY29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBib3RNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVNZXNzYWdlSWQoKSxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBpc1VzZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbmRlcjogY29udGVudEl0ZW0uYXV0aG9yTmFtZSB8fCAnTWFlc3RybycsXHJcbiAgICAgICAgICAgICAgICAgICAgaW50ZW50OiByZXNwb25zZS5zZWFyY2hJbnRlbnQgfHwgaW5xdWlyeSxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLmZvcm1hdE1lc3NhZ2VDb250ZW50KGNvbnRlbnRJdGVtLmNvbnRlbnQgfHwgJ05vIGNvbnRlbnQgYXZhaWxhYmxlJyksXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yTmFtZTogY29udGVudEl0ZW0uYXV0aG9yTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcclxuICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKGJvdE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlZC5lbWl0KGJvdE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZDogdGhpcy5nZW5lcmF0ZU1lc3NhZ2VJZCgpLFxyXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmNvbnZlcnNhdGlvbklkLFxyXG4gICAgICAgICAgICAgIGlzVXNlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgc2VuZGVyOiAnTWFlc3RybycsXHJcbiAgICAgICAgICAgICAgaW50ZW50OiBpbnF1aXJ5LFxyXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGBTb3JyeSwgSSBkaWRuJ3QgcmVjZWl2ZSBhIHZhbGlkIHJlc3BvbnNlLmAsXHJcbiAgICAgICAgICAgICAgYXV0aG9yTmFtZTogdGhpcy5hdXRob3JOYW1lLFxyXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlUmVjZWl2ZWQuZW1pdChlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gUmVtb3ZlIGxvYWRpbmcgbWVzc2FnZVxyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMuZmlsdGVyKG1zZyA9PiAhbXNnLmlzTG9hZGluZyk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogdGhpcy5nZW5lcmF0ZU1lc3NhZ2VJZCgpLFxyXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgaXNVc2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgc2VuZGVyOiAnTWFlc3RybycsXHJcbiAgICAgICAgICAgIGludGVudDogaW5xdWlyeSxcclxuICAgICAgICAgICAgY29udGVudDogJ1NvcnJ5LCBJIGVuY291bnRlcmVkIGFuIGVycm9yIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0LiBQbGVhc2UgdHJ5IGFnYWluLicsXHJcbiAgICAgICAgICAgIGF1dGhvck5hbWU6IHRoaXMuYXV0aG9yTmFtZSxcclxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlZC5lbWl0KGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgaW5xdWlyeTonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsZWFyQ2hhdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZXMgPSBbXTtcclxuICAgIHRoaXMuYWRkV2VsY29tZU1lc3NhZ2UoKTtcclxuICB9XHJcblxyXG4gIG9uS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMuc2VuZElucXVpcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIGdldFRoZW1lQ2xhc3MoKTogc3RyaW5nIHtcclxuICAgIC8vIERlZmF1bHQgdGhlbWUgaWYgbm8gdGVtcGxhdGUgZGVzaWduIGlzIHNwZWNpZmllZFxyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlRGVzaWduKSB7XHJcbiAgICAgIHJldHVybiAndGhlbWUtZGVmYXVsdCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgYW5kIHJldHVybiB0aGVtZSBjbGFzc1xyXG4gICAgY29uc3QgdmFsaWRUaGVtZXMgPSBbJ2RlZmF1bHQnLCAnZGFyaycsICdibHVlJywgJ2dyZWVuJywgJ3B1cnBsZScsICdtaW5pbWFsJywgJ2NvcnBvcmF0ZScsICdyZWQnLCAneWVsbG93JywgJ29yYW5nZSddO1xyXG4gICAgY29uc3QgdGhlbWUgPSB0aGlzLnRlbXBsYXRlRGVzaWduLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBcclxuICAgIGlmICh2YWxpZFRoZW1lcy5pbmNsdWRlcyh0aGVtZSkpIHtcclxuICAgICAgcmV0dXJuIGB0aGVtZS0ke3RoZW1lfWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgaWYgaW52YWxpZCB0aGVtZVxyXG4gICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHRoZW1lICcke3RoaXMudGVtcGxhdGVEZXNpZ259JyBwcm92aWRlZC4gVXNpbmcgZGVmYXVsdCB0aGVtZS5gKTtcclxuICAgIHJldHVybiAndGhlbWUtZGVmYXVsdCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdE1lc3NhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWNvbnRlbnQpIHJldHVybiAnJztcclxuICAgIFxyXG4gICAgLy8gSWYgY29udGVudCBhbHJlYWR5IGNvbnRhaW5zIEhUTUwgdGFncywgcmV0dXJuIGFzLWlzXHJcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnPCcpICYmIGNvbnRlbnQuaW5jbHVkZXMoJz4nKSkge1xyXG4gICAgICByZXR1cm4gY29udGVudDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQ29udmVydCBuZXdsaW5lcyB0byBIVE1MIGJyZWFrc1xyXG4gICAgbGV0IGZvcm1hdHRlZCA9IGNvbnRlbnQucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgZXNjYXBlZCBuZXdsaW5lcyB0byBIVE1MIGJyZWFrc1xyXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xcXFxuL2csICc8YnI+Jyk7XHJcbiAgICBcclxuICAgIC8vIENvbnZlcnQgbWFya2Rvd24tc3R5bGUgYm9sZCB0byBIVE1MXHJcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcclxuICAgIFxyXG4gICAgLy8gQ29udmVydCBidWxsZXQgcG9pbnRzIHRvIEhUTUwgbGlzdHNcclxuICAgIGNvbnN0IGxpbmVzID0gZm9ybWF0dGVkLnNwbGl0KCc8YnI+Jyk7XHJcbiAgICBsZXQgaW5MaXN0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBwcm9jZXNzZWRMaW5lczogc3RyaW5nW10gPSBbXTtcclxuICAgIFxyXG4gICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xyXG4gICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aCgn4oCiICcpKSB7XHJcbiAgICAgICAgaWYgKCFpbkxpc3QpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZExpbmVzLnB1c2goJzx1bD4nKTtcclxuICAgICAgICAgIGluTGlzdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb2Nlc3NlZExpbmVzLnB1c2goJzxsaT4nICsgbGluZS5yZXBsYWNlKC9e4oCiIC8sICcnKSArICc8L2xpPicpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChpbkxpc3QpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZExpbmVzLnB1c2goJzwvdWw+Jyk7XHJcbiAgICAgICAgICBpbkxpc3QgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvY2Vzc2VkTGluZXMucHVzaChsaW5lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoaW5MaXN0KSB7XHJcbiAgICAgIHByb2Nlc3NlZExpbmVzLnB1c2goJzwvdWw+Jyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBwcm9jZXNzZWRMaW5lcy5qb2luKCc8YnI+JykucmVwbGFjZSgvPGJyPjx1bD4vZywgJzx1bD4nKS5yZXBsYWNlKC88XFwvdWw+PGJyPi9nLCAnPC91bD4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVTZXNzaW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnc2Vzc2lvbl8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpICsgJ18nICsgRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVNZXNzYWdlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnbXNnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSkgKyAnXycgKyBEYXRlLm5vdygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybWF0dGVkVGltZSh0aW1lc3RhbXA6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT0gUmVzaXplIE1ldGhvZHMgPT09PT09PT09PT09PVxyXG4gIFxyXG4gIHN0YXJ0UmVzaXplKGV2ZW50OiBNb3VzZUV2ZW50LCBkaXJlY3Rpb246ICd3aWR0aCcgfCAnYm90aCcpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xyXG4gICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xyXG4gICAgdGhpcy5zdGFydFdpZHRoID0gdGhpcy5jb250YWluZXJXaWR0aDtcclxuICAgIHRoaXMuc3RhcnRIZWlnaHQgPSB0aGlzLmNvbnRhaW5lckhlaWdodDtcclxuICAgIFxyXG4gICAgY29uc3QgbW91c2VNb3ZlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLm9uUmVzaXplKGUsIGRpcmVjdGlvbik7XHJcbiAgICBjb25zdCBtb3VzZVVwSGFuZGxlciA9ICgpID0+IHRoaXMuc3RvcFJlc2l6ZShtb3VzZU1vdmVIYW5kbGVyLCBtb3VzZVVwSGFuZGxlcik7XHJcbiAgICBcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlVXBIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25SZXNpemUoZXZlbnQ6IE1vdXNlRXZlbnQsIGRpcmVjdGlvbjogJ3dpZHRoJyB8ICdib3RoJyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzUmVzaXppbmcpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xyXG4gICAgY29uc3QgZGVsdGFZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xyXG4gICAgXHJcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnd2lkdGgnIHx8IGRpcmVjdGlvbiA9PT0gJ2JvdGgnKSB7XHJcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5taW4oXHJcbiAgICAgICAgTWF0aC5tYXgodGhpcy5zdGFydFdpZHRoICsgZGVsdGFYLCB0aGlzLm1pbldpZHRoKSxcclxuICAgICAgICB0aGlzLm1heFdpZHRoXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBuZXdXaWR0aDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2JvdGgnKSB7XHJcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKFxyXG4gICAgICAgIE1hdGgubWF4KHRoaXMuc3RhcnRIZWlnaHQgKyBkZWx0YVksIHRoaXMubWluSGVpZ2h0KSxcclxuICAgICAgICB0aGlzLm1heEhlaWdodFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IG5ld0hlaWdodDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RvcFJlc2l6ZShtb3VzZU1vdmVIYW5kbGVyOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZCwgbW91c2VVcEhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgXHJcbiAgICB0aGlzLnNhdmVTaXplUHJlZmVyZW5jZSgpO1xyXG4gICAgdGhpcy5lbWl0U2l6ZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaXplUHJlc2V0KHNpemU6IENoYXRTaXplKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRTaXplID0gc2l6ZTtcclxuICAgIFxyXG4gICAgc3dpdGNoIChzaXplKSB7XHJcbiAgICAgIGNhc2UgJ2NvbXBhY3QnOlxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSA0MDA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSA1MDA7XHJcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGVmYXVsdCc6XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IDgwMDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDYwMDtcclxuICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdleHBhbmRlZCc6XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IDEyMDA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSA4MDA7XHJcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZnVsbHNjcmVlbic6XHJcbiAgICAgICAgdGhpcy50b2dnbGVGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnNhdmVTaXplUHJlZmVyZW5jZSgpO1xyXG4gICAgdGhpcy5lbWl0U2l6ZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRnVsbHNjcmVlbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0Z1bGxzY3JlZW4pIHtcclxuICAgICAgLy8gRW50ZXJpbmcgZnVsbHNjcmVlbiAtIHNhdmUgY3VycmVudCBzdGF0ZSBmaXJzdFxyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdjaGF0Ym94LXByZXZpb3VzLXNpemUnLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgd2lkdGg6IHRoaXMuY29udGFpbmVyV2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmNvbnRhaW5lckhlaWdodCxcclxuICAgICAgICBzaXplOiB0aGlzLmN1cnJlbnRTaXplLFxyXG4gICAgICAgIHdhc0Z1bGxzY3JlZW46IHRoaXMuaXNGdWxsc2NyZWVuXHJcbiAgICAgIH0pKTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jdXJyZW50U2l6ZSA9ICdmdWxsc2NyZWVuJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEV4aXRpbmcgZnVsbHNjcmVlbiAtIHJlc3RvcmUgcHJldmlvdXMgc3RhdGVcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2NoYXRib3gtcHJldmlvdXMtc2l6ZScpO1xyXG4gICAgICAgIGlmIChwcmV2aW91cykge1xyXG4gICAgICAgICAgY29uc3QgcHJldkRhdGEgPSBKU09OLnBhcnNlKHByZXZpb3VzKTtcclxuICAgICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBwcmV2RGF0YS53aWR0aCB8fCA4MDA7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHByZXZEYXRhLmhlaWdodCB8fCA2MDA7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTaXplID0gcHJldkRhdGEuc2l6ZSA9PT0gJ2Z1bGxzY3JlZW4nID8gJ2RlZmF1bHQnIDogcHJldkRhdGEuc2l6ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2l6ZSA9ICdkZWZhdWx0JztcclxuICAgICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSA4MDA7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IDYwMDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2l6ZSA9ICdkZWZhdWx0JztcclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gODAwO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gNjAwO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnNhdmVTaXplUHJlZmVyZW5jZSgpO1xyXG4gICAgdGhpcy5lbWl0U2l6ZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlU2l6ZVByZWZlcmVuY2UoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzaXplRGF0YSA9IHtcclxuICAgICAgc2l6ZTogdGhpcy5jdXJyZW50U2l6ZSxcclxuICAgICAgd2lkdGg6IHRoaXMuY29udGFpbmVyV2lkdGgsXHJcbiAgICAgIGhlaWdodDogdGhpcy5jb250YWluZXJIZWlnaHQsXHJcbiAgICAgIGlzRnVsbHNjcmVlbjogdGhpcy5pc0Z1bGxzY3JlZW5cclxuICAgIH07XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2NoYXRib3gtc2l6ZS1wcmVmZXJlbmNlJywgSlNPTi5zdHJpbmdpZnkoc2l6ZURhdGEpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgc2l6ZSBwcmVmZXJlbmNlOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZFNhdmVkU2l6ZSgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNhdmVkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY2hhdGJveC1zaXplLXByZWZlcmVuY2UnKTtcclxuICAgICAgaWYgKHNhdmVkKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZURhdGEgPSBKU09OLnBhcnNlKHNhdmVkKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTaXplID0gc2l6ZURhdGEuc2l6ZSB8fCAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IHNpemVEYXRhLndpZHRoIHx8IDgwMDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHNpemVEYXRhLmhlaWdodCB8fCA2MDA7XHJcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBzaXplRGF0YS5pc0Z1bGxzY3JlZW4gfHwgZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgc2l6ZSBwcmVmZXJlbmNlOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFNpemVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNpemVDaGFuZ2VkLmVtaXQoe1xyXG4gICAgICBzaXplOiB0aGlzLmN1cnJlbnRTaXplLFxyXG4gICAgICB3aWR0aDogdGhpcy5jb250YWluZXJXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmNvbnRhaW5lckhlaWdodFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb250YWluZXJTdHlsZSgpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgd2lkdGg6ICcxMDB2dyAhaW1wb3J0YW50JyxcclxuICAgICAgICBoZWlnaHQ6ICcxMDB2aCAhaW1wb3J0YW50JyxcclxuICAgICAgICBtYXhXaWR0aDogJzEwMHZ3ICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzEwMHZoICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxyXG4gICAgICAgIHRvcDogJzAnLFxyXG4gICAgICAgIGxlZnQ6ICcwJyxcclxuICAgICAgICByaWdodDogJzAnLFxyXG4gICAgICAgIGJvdHRvbTogJzAnLFxyXG4gICAgICAgIG1hcmdpbjogJzAnLFxyXG4gICAgICAgIHpJbmRleDogOTk5OTlcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGg6IGAke3RoaXMuY29udGFpbmVyV2lkdGh9cHhgLFxyXG4gICAgICBoZWlnaHQ6IGAke3RoaXMuY29udGFpbmVySGVpZ2h0fXB4YCxcclxuICAgICAgbWF4V2lkdGg6IGAke3RoaXMubWF4V2lkdGh9cHhgXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PSBGaWxlIFVwbG9hZCBNZXRob2RzID09PT09PT09PT09PT1cclxuICBcclxuICBvbkltYWdlVXBsb2FkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmIChpbnB1dC5maWxlcyAmJiBpbnB1dC5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRmlsZVNlbGVjdGlvbihBcnJheS5mcm9tKGlucHV0LmZpbGVzKSwgJ2ltYWdlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVVcGxvYWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0LmZpbGVzICYmIGlucHV0LmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5oYW5kbGVGaWxlU2VsZWN0aW9uKEFycmF5LmZyb20oaW5wdXQuZmlsZXMpLCAnZmlsZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVGaWxlU2VsZWN0aW9uKGZpbGVzOiBGaWxlW10sIHR5cGU6ICdpbWFnZScgfCAnZmlsZScpOiB2b2lkIHtcclxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgIC8vIFZhbGlkYXRlIGZpbGUgdHlwZVxyXG4gICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0eXBlID09PSAnaW1hZ2UnID8gdGhpcy5hbGxvd2VkSW1hZ2VUeXBlcyA6IHRoaXMuYWxsb3dlZEZpbGVUeXBlcztcclxuICAgICAgaWYgKCFhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgRmlsZSB0eXBlICR7ZmlsZS50eXBlfSBub3QgYWxsb3dlZGApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBzaXplXHJcbiAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLm1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZS5uYW1lfSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke3RoaXMubWF4RmlsZVNpemUgLyAxMDI0IC8gMTAyNH1NQmApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBQcm9ncmVzc0V2ZW50PEZpbGVSZWFkZXI+KSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudDogRmlsZUF0dGFjaG1lbnQgPSB7XHJcbiAgICAgICAgICBpZDogdGhpcy5nZW5lcmF0ZU1lc3NhZ2VJZCgpLFxyXG4gICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxyXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxyXG4gICAgICAgICAgZGF0YTogZS50YXJnZXQ/LnJlc3VsdCB8fCB1bmRlZmluZWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5wdXNoKGF0dGFjaG1lbnQpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVkLmVtaXQoYXR0YWNobWVudCk7XHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICBpZiAodHlwZSA9PT0gJ2ltYWdlJykge1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVBdHRhY2htZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gYXR0YWNobWVudElkKTtcclxuICB9XHJcblxyXG4gIHRyaWdnZXJJbWFnZVVwbG9hZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLXVwbG9hZC1pbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgaW5wdXQuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyaWdnZXJGaWxlVXBsb2FkKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS11cGxvYWQtaW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0KSB7XHJcbiAgICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlSWNvbihmaWxlVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChmaWxlVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkgcmV0dXJuICfwn5a877iPJztcclxuICAgIGlmIChmaWxlVHlwZS5pbmNsdWRlcygncGRmJykpIHJldHVybiAn8J+ThCc7XHJcbiAgICBpZiAoZmlsZVR5cGUuaW5jbHVkZXMoJ3dvcmQnKSB8fCBmaWxlVHlwZS5pbmNsdWRlcygnZG9jdW1lbnQnKSkgcmV0dXJuICfwn5OdJztcclxuICAgIGlmIChmaWxlVHlwZS5pbmNsdWRlcygndGV4dCcpKSByZXR1cm4gJ/Cfk4MnO1xyXG4gICAgcmV0dXJuICfwn5OOJztcclxuICB9XHJcblxyXG4gIGdldEZpbGVTaXplRm9ybWF0dGVkKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGJ5dGVzICsgJyBCJztcclxuICAgIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSByZXR1cm4gKGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKSArICcgS0InO1xyXG4gICAgcmV0dXJuIChieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSkgKyAnIE1CJztcclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiYWktY2hhdC1jb250YWluZXJcIiBcclxuICAgICBbbmdDbGFzc109XCJnZXRUaGVtZUNsYXNzKClcIiBcclxuICAgICBbbmdTdHlsZV09XCJnZXRDb250YWluZXJTdHlsZSgpXCJcclxuICAgICBbY2xhc3MuZnVsbHNjcmVlbl09XCJpc0Z1bGxzY3JlZW5cIlxyXG4gICAgIFtjbGFzcy5yZXNpemluZ109XCJpc1Jlc2l6aW5nXCJcclxuICAgICBbY2xhc3NdPVwiZ2V0QW5pbWF0aW9uQ2xhc3MoKVwiPlxyXG4gIFxyXG4gIDwhLS0gUmVzaXplIEhhbmRsZXMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGUgcmVzaXplLWhhbmRsZS1yaWdodFwiIFxyXG4gICAgICAgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsICd3aWR0aCcpXCJcclxuICAgICAgICpuZ0lmPVwiIWlzRnVsbHNjcmVlblwiXHJcbiAgICAgICB0aXRsZT1cIkRyYWcgdG8gcmVzaXplIHdpZHRoXCI+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGUgcmVzaXplLWhhbmRsZS1jb3JuZXJcIiBcclxuICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRSZXNpemUoJGV2ZW50LCAnYm90aCcpXCJcclxuICAgICAgICpuZ0lmPVwiIWlzRnVsbHNjcmVlblwiXHJcbiAgICAgICB0aXRsZT1cIkRyYWcgdG8gcmVzaXplXCI+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPCEtLSBEZWJ1ZyBJbmZvcm1hdGlvbiAob25seSBzaG93biB3aGVuIHNob3dEZWJ1Z0luZm8gaXMgdHJ1ZSkgLS0+XHJcbiAgPGRpdiAqbmdJZj1cInNob3dEZWJ1Z0luZm9cIiBjbGFzcz1cImRlYnVnLWluZm9cIj5cclxuICAgIDxoMz5ERUJVRzogQUkgQ2hhdCBDb21wb25lbnQgTG9hZGVkPC9oMz5cclxuICAgIDxwPlN0YXR1czoge3sgY29uZmlndXJhdGlvblN0YXR1cyB8fCAnTG9hZGluZy4uLicgfX08L3A+XHJcbiAgICA8cD5NZXNzYWdlcyBjb3VudDoge3sgbWVzc2FnZXMubGVuZ3RoIHx8IDAgfX08L3A+XHJcbiAgICA8cD5UaGVtZToge3sgdGVtcGxhdGVEZXNpZ24gfHwgJ2RlZmF1bHQnIH19PC9wPlxyXG4gICAgPHA+U2l6ZToge3sgY3VycmVudFNpemUgfX0gKHt7IGNvbnRhaW5lcldpZHRoIH19eHt7IGNvbnRhaW5lckhlaWdodCB9fSk8L3A+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XHJcbiAgICAgIDxoMj57eyB0aXRsZSB9fTwvaDI+XHJcbiAgICAgIDwhLS0gSWNvbi1vbmx5IHN0YXR1cyBpbmRpY2F0b3IgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yLWljb25cIiBcclxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J3N0YXR1cy1yZWFkeSc6IGNvbmZpZ3VyYXRpb25TdGF0dXMgPT09ICdBSSBBZ2VudCBpcyByZWFkeScsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cy1lcnJvcic6IGNvbmZpZ3VyYXRpb25TdGF0dXMgIT09ICdBSSBBZ2VudCBpcyByZWFkeScgJiYgY29uZmlndXJhdGlvblN0YXR1cyAhPT0gJ0luaXRpYWxpemluZy4uLicgJiYgY29uZmlndXJhdGlvblN0YXR1cyAhPT0gJ1Rlc3RpbmcgY29ubmVjdGlvbi4uLicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzLWxvYWRpbmcnOiBjb25maWd1cmF0aW9uU3RhdHVzID09PSAnSW5pdGlhbGl6aW5nLi4uJyB8fCBjb25maWd1cmF0aW9uU3RhdHVzID09PSAnVGVzdGluZyBjb25uZWN0aW9uLi4uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICd0cmFuc2l0aW9uLWVuYWJsZWQnOiBlbmFibGVTdGF0dXNUcmFuc2l0aW9uc31cIlxyXG4gICAgICAgICAgIFt0aXRsZV09XCJjb25maWd1cmF0aW9uU3RhdHVzXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItY29udHJvbHNcIj5cclxuICAgICAgPCEtLSBTaXplIFByZXNldCBCdXR0b25zIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2l6ZS1jb250cm9sc1wiICpuZ0lmPVwiIWlzRnVsbHNjcmVlblwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ1dHRvbiBzaXplLWJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2l6ZVByZXNldCgnY29tcGFjdCcpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNpemUgPT09ICdjb21wYWN0J1wiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkNvbXBhY3QgVmlld1wiXHJcbiAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJDb21wYWN0IFZpZXdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zdmdcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmNvbXBhY3RWaWV3XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ1dHRvbiBzaXplLWJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2l6ZVByZXNldCgnZGVmYXVsdCcpXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNpemUgPT09ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkRlZmF1bHQgVmlld1wiXHJcbiAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJEZWZhdWx0IFZpZXdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zdmdcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmRlZmF1bHRWaWV3XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ1dHRvbiBzaXplLWJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5U2l6ZVByZXNldCgnZXhwYW5kZWQnKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTaXplID09PSAnZXhwYW5kZWQnXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwYW5kZWQgVmlld1wiXHJcbiAgICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJFeHBhbmRlZCBWaWV3XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tc3ZnXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy5leHBhbmRlZFZpZXdcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LW1lc3NhZ2VzXCIgI21lc3NhZ2VzQ29udGFpbmVyPlxyXG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgY2xhc3M9XCJtZXNzYWdlLXdyYXBwZXJcIj5cclxuICAgICAgPCEtLSBNZXNzYWdlIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiIFxyXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cInsndXNlci1tZXNzYWdlJzogbWVzc2FnZS5pc1VzZXIsICdhaS1tZXNzYWdlJzogIW1lc3NhZ2UuaXNVc2VyLCAnbG9hZGluZy1tZXNzYWdlJzogbWVzc2FnZS5pc0xvYWRpbmd9XCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtdGltZXN0YW1wXCI+e3sgZ2V0Rm9ybWF0dGVkVGltZShtZXNzYWdlLnRpbWVzdGFtcCkgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1hdmF0YXJcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibWVzc2FnZS5pc1VzZXJcIiBjbGFzcz1cImF2YXRhci1pY29uXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy51c2VyQXZhdGFyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbWVzc2FnZS5pc1VzZXIgJiYgIW1lc3NhZ2UuaXNMb2FkaW5nXCIgY2xhc3M9XCJhdmF0YXItaWNvblwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkSWNvbnMuYWlBdmF0YXJcIj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1lc3NhZ2UuaXNMb2FkaW5nXCIgY2xhc3M9XCJhdmF0YXItaWNvbiBsb2FkaW5nLXNwaW5uZXJcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmxvYWRpbmdBdmF0YXJcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LWlucHV0XCI+XHJcbiAgICA8IS0tIEF0dGFjaG1lbnRzIFByZXZpZXcgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudHMtcHJldmlld1wiICpuZ0lmPVwic2VsZWN0ZWRGaWxlcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LWl0ZW1cIiAqbmdGb3I9XCJsZXQgZmlsZSBvZiBzZWxlY3RlZEZpbGVzXCI+XHJcbiAgICAgICAgPHN2ZyBjbGFzcz1cImF0dGFjaG1lbnQtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMjEuNDQgMTEuMDVsLTkuMTkgOS4xOWE2IDYgMCAwIDEtOC40OS04LjQ5bDkuMTktOS4xOWE0IDQgMCAwIDEgNS42NiA1LjY2bC05LjIgOS4xOWEyIDIgMCAwIDEtMi44My0yLjgzbDguNDktOC40OFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImF0dGFjaG1lbnQtbmFtZVwiPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImF0dGFjaG1lbnQtc2l6ZVwiPnt7IGdldEZpbGVTaXplRm9ybWF0dGVkKGZpbGUuc2l6ZSkgfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlbW92ZS1hdHRhY2htZW50XCIgKGNsaWNrKT1cInJlbW92ZUF0dGFjaG1lbnQoZmlsZS5pZClcIiB0aXRsZT1cIlJlbW92ZVwiIGF0dHIuYXJpYS1sYWJlbD1cIlJlbW92ZSBhdHRhY2htZW50XCI+XHJcbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgPCEtLSBGaWxlIFVwbG9hZCBJbnB1dHMgKEhpZGRlbikgLS0+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIFxyXG4gICAgICAgICAgICAgaWQ9XCJpbWFnZS11cGxvYWQtaW5wdXRcIiBcclxuICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIiBcclxuICAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXHJcbiAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVuYWJsZUltYWdlVXBsb2FkXCI+XHJcbiAgICAgIFxyXG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBcclxuICAgICAgICAgICAgIGlkPVwiZmlsZS11cGxvYWQtaW5wdXRcIiBcclxuICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwudHh0LC5jc3ZcIiBcclxuICAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVVcGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCJcclxuICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZW5hYmxlRmlsZVVwbG9hZFwiPlxyXG4gICAgICBcclxuICAgICAgPCEtLSBVcGxvYWQgQnV0dG9ucyAoQ29uZGl0aW9uYWxseSByZW5kZXJlZCkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uc1wiICpuZ0lmPVwiZW5hYmxlSW1hZ2VVcGxvYWQgfHwgZW5hYmxlRmlsZVVwbG9hZFwiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJlbmFibGVJbWFnZVVwbG9hZFwiIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uIGltYWdlLXVwbG9hZFwiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJJbWFnZVVwbG9hZCgpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJVcGxvYWQgSW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwiVXBsb2FkIEltYWdlXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tc3ZnXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy5pbWFnZVVwbG9hZFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICBcclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZW5hYmxlRmlsZVVwbG9hZFwiIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uIGZpbGUtdXBsb2FkXCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiQXR0YWNoIEZpbGVcIlxyXG4gICAgICAgICAgICAgICAgYXR0ci5hcmlhLWxhYmVsPVwiQXR0YWNoIEZpbGVcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1zdmdcIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLmZpbGVVcGxvYWRcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBcclxuICAgICAgPHRleHRhcmVhIFxyXG4gICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudElucXVpcnlcIiBcclxuICAgICAgICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIHJvd3M9XCIyXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICBjbGFzcz1cImlucXVpcnktdGV4dGFyZWFcIlxyXG4gICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cIlR5cGUgeW91ciBtZXNzYWdlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgXHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cInNlbmRJbnF1aXJ5KClcIiBcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWN1cnJlbnRJbnF1aXJ5LnRyaW0oKSB8fCBpc0xvYWRpbmdcIlxyXG4gICAgICAgIGNsYXNzPVwic2VuZC1idXR0b25cIlxyXG4gICAgICAgIHRpdGxlPVwiU2VuZCBNZXNzYWdlXCJcclxuICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJTZW5kIE1lc3NhZ2VcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0xvYWRpbmdcIiBjbGFzcz1cImljb24tc3ZnXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRJY29ucy5zZW5kXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJpY29uLXN2ZyBsb2FkaW5nLWljb25cIiBbaW5uZXJIVE1MXT1cInNhbml0aXplZEljb25zLnNlbmRMb2FkaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPnt7IGlzTG9hZGluZyA/ICdTZW5kaW5nLi4uJyA6ICdTZW5kJyB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|