aril 1.2.7 → 1.2.9
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/esm2022/ui/form/src/form.component.mjs +2 -2
- package/esm2022/ui-business/trace-drawer/index.mjs +3 -1
- package/esm2022/ui-business/trace-drawer/src/app-log.service.mjs +25 -0
- package/esm2022/ui-business/trace-drawer/src/interfaces.mjs +1 -1
- package/esm2022/ui-business/trace-drawer/src/trace-drawer.component.mjs +143 -15
- package/fesm2022/aril-ui-business-trace-drawer.mjs +162 -16
- package/fesm2022/aril-ui-business-trace-drawer.mjs.map +1 -1
- package/fesm2022/aril-ui-form.mjs +1 -1
- package/fesm2022/aril-ui-form.mjs.map +1 -1
- package/package.json +80 -80
- package/ui-business/trace-drawer/index.d.ts +2 -0
- package/ui-business/trace-drawer/src/app-log.service.d.ts +10 -0
- package/ui-business/trace-drawer/src/interfaces.d.ts +32 -0
- package/ui-business/trace-drawer/src/trace-drawer.component.d.ts +22 -1
|
@@ -1,45 +1,76 @@
|
|
|
1
1
|
import { JsonPipe } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Output, effect, inject, input, signal } from '@angular/core';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Output, computed, effect, inject, input, signal } from '@angular/core';
|
|
3
3
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { EMPTY, Subject, catchError, switchMap } from 'rxjs';
|
|
4
|
+
import { EMPTY, Subject, catchError, map, switchMap } from 'rxjs';
|
|
5
5
|
import { ProgressSpinnerModule } from 'primeng/progressspinner';
|
|
6
6
|
import { SidebarModule } from 'primeng/sidebar';
|
|
7
|
-
import {
|
|
7
|
+
import { TooltipModule } from 'primeng/tooltip';
|
|
8
|
+
import { TranslocoModule, TranslocoService } from '@ngneat/transloco';
|
|
9
|
+
import { KeycloakService } from 'keycloak-angular';
|
|
10
|
+
import { MessageService } from 'primeng/api';
|
|
8
11
|
import { BadgeComponent } from 'aril/ui/badge';
|
|
9
12
|
import { ButtonComponent } from 'aril/ui/button';
|
|
10
13
|
import 'aril/util/primitive-extensions';
|
|
14
|
+
import { AppLogService } from './app-log.service';
|
|
11
15
|
import { TraceLogService } from './trace-log.service';
|
|
12
16
|
import * as i0 from "@angular/core";
|
|
13
17
|
import * as i1 from "@ngneat/transloco";
|
|
14
18
|
import * as i2 from "primeng/sidebar";
|
|
15
19
|
import * as i3 from "primeng/api";
|
|
16
20
|
import * as i4 from "primeng/progressspinner";
|
|
21
|
+
import * as i5 from "primeng/tooltip";
|
|
17
22
|
export class TraceDrawerComponent {
|
|
18
23
|
constructor() {
|
|
19
24
|
this.traceLogService = inject(TraceLogService);
|
|
25
|
+
this.appLogService = inject(AppLogService);
|
|
26
|
+
this.messageService = inject(MessageService);
|
|
27
|
+
this.translocoService = inject(TranslocoService);
|
|
28
|
+
this.keycloakService = inject(KeycloakService);
|
|
20
29
|
this.visible = input(false);
|
|
21
30
|
this.traceId = input.required();
|
|
22
31
|
this.position = input('right');
|
|
23
32
|
this.width = input('min(680px, 90vw)');
|
|
24
33
|
this.modal = input(false);
|
|
25
|
-
this.pageSize = input(
|
|
34
|
+
this.pageSize = input(10);
|
|
26
35
|
this.startTime = input();
|
|
27
36
|
this.endTime = input();
|
|
28
37
|
this.visibleChange = new EventEmitter();
|
|
29
38
|
this.loading = signal(false);
|
|
39
|
+
this.loadingMore = signal(false);
|
|
30
40
|
this.errorMessage = signal(undefined);
|
|
31
41
|
this.apisixHits = signal([]);
|
|
42
|
+
this.totalItem = signal(0);
|
|
43
|
+
this.pageNumber = signal(1);
|
|
44
|
+
this.appLogs = signal([]);
|
|
45
|
+
this.appLogsLoadingMore = signal(false);
|
|
46
|
+
this.appLogsTotal = signal(0);
|
|
47
|
+
this.appLogsPage = signal(1);
|
|
48
|
+
this.hasMore = computed(() => this.apisixHits().length < this.totalItem());
|
|
49
|
+
this.appLogsHasMore = computed(() => this.appLogs().length < this.appLogsTotal());
|
|
32
50
|
this.request = new Subject();
|
|
33
|
-
this.
|
|
51
|
+
this.appLogsRequest = new Subject();
|
|
52
|
+
this.response = toSignal(this.request.pipe(switchMap((req) => this.traceLogService
|
|
34
53
|
.searchByTraceId({
|
|
35
|
-
traceId,
|
|
54
|
+
traceId: req.traceId,
|
|
36
55
|
startTime: this.startTime() ?? 20000101000000,
|
|
37
56
|
endTime: this.endTime() ?? (new Date().dateToLong('time') ?? 99991231235959),
|
|
38
|
-
pager: { pageSize: this.pageSize(), pageNumber:
|
|
57
|
+
pager: { pageSize: this.pageSize(), pageNumber: req.pageNumber }
|
|
39
58
|
})
|
|
40
|
-
.pipe(catchError((err) => {
|
|
59
|
+
.pipe(map((resp) => ({ resp, append: req.append })), catchError((err) => {
|
|
41
60
|
this.errorMessage.set(err?.error?.message ?? err?.message ?? 'İstek başarısız oldu');
|
|
42
61
|
this.loading.set(false);
|
|
62
|
+
this.loadingMore.set(false);
|
|
63
|
+
return EMPTY;
|
|
64
|
+
})))));
|
|
65
|
+
this.appLogsResponse = toSignal(this.appLogsRequest.pipe(switchMap((req) => this.appLogService
|
|
66
|
+
.searchByTraceId({
|
|
67
|
+
traceId: req.traceId,
|
|
68
|
+
startTime: this.startTime() ?? 20000101000000,
|
|
69
|
+
endTime: this.endTime() ?? (new Date().dateToLong('time') ?? 99991231235959),
|
|
70
|
+
pager: { pageSize: this.pageSize(), pageNumber: req.pageNumber }
|
|
71
|
+
})
|
|
72
|
+
.pipe(map((resp) => ({ resp, append: req.append })), catchError(() => {
|
|
73
|
+
this.appLogsLoadingMore.set(false);
|
|
43
74
|
return EMPTY;
|
|
44
75
|
})))));
|
|
45
76
|
effect(() => {
|
|
@@ -48,13 +79,45 @@ export class TraceDrawerComponent {
|
|
|
48
79
|
}
|
|
49
80
|
}, { allowSignalWrites: true });
|
|
50
81
|
effect(() => {
|
|
51
|
-
const
|
|
52
|
-
if (!
|
|
82
|
+
const wrapped = this.response();
|
|
83
|
+
if (!wrapped)
|
|
53
84
|
return;
|
|
54
|
-
|
|
85
|
+
const result = wrapped.resp.response?.result ?? [];
|
|
86
|
+
const total = wrapped.resp.response?.resultInfo?.totalItem ?? 0;
|
|
87
|
+
this.apisixHits.update((prev) => (wrapped.append ? [...prev, ...result] : result));
|
|
88
|
+
this.totalItem.set(total);
|
|
55
89
|
this.loading.set(false);
|
|
90
|
+
this.loadingMore.set(false);
|
|
56
91
|
this.errorMessage.set(undefined);
|
|
57
92
|
}, { allowSignalWrites: true });
|
|
93
|
+
effect(() => {
|
|
94
|
+
const wrapped = this.appLogsResponse();
|
|
95
|
+
if (!wrapped)
|
|
96
|
+
return;
|
|
97
|
+
const result = wrapped.resp.response?.result ?? [];
|
|
98
|
+
const total = wrapped.resp.response?.resultInfo?.totalItem ?? 0;
|
|
99
|
+
this.appLogs.update((prev) => (wrapped.append ? [...prev, ...result] : result));
|
|
100
|
+
this.appLogsTotal.set(total);
|
|
101
|
+
this.appLogsLoadingMore.set(false);
|
|
102
|
+
}, { allowSignalWrites: true });
|
|
103
|
+
}
|
|
104
|
+
loadMore() {
|
|
105
|
+
const id = this.traceId();
|
|
106
|
+
if (!id || this.loadingMore() || !this.hasMore())
|
|
107
|
+
return;
|
|
108
|
+
const next = this.pageNumber() + 1;
|
|
109
|
+
this.pageNumber.set(next);
|
|
110
|
+
this.loadingMore.set(true);
|
|
111
|
+
this.request.next({ traceId: id, pageNumber: next, append: true });
|
|
112
|
+
}
|
|
113
|
+
loadMoreAppLogs() {
|
|
114
|
+
const id = this.traceId();
|
|
115
|
+
if (!id || this.appLogsLoadingMore() || !this.appLogsHasMore())
|
|
116
|
+
return;
|
|
117
|
+
const next = this.appLogsPage() + 1;
|
|
118
|
+
this.appLogsPage.set(next);
|
|
119
|
+
this.appLogsLoadingMore.set(true);
|
|
120
|
+
this.appLogsRequest.next({ traceId: id, pageNumber: next, append: true });
|
|
58
121
|
}
|
|
59
122
|
onVisibleChange(value) {
|
|
60
123
|
this.visibleChange.emit(value);
|
|
@@ -64,11 +127,59 @@ export class TraceDrawerComponent {
|
|
|
64
127
|
if (id)
|
|
65
128
|
this.fetch(id);
|
|
66
129
|
}
|
|
130
|
+
shareLink() {
|
|
131
|
+
const id = this.traceId();
|
|
132
|
+
if (!id)
|
|
133
|
+
return;
|
|
134
|
+
const base = window.location.href.split('?')[0];
|
|
135
|
+
const url = `${base}?traceId=${encodeURIComponent(id)}`;
|
|
136
|
+
navigator.clipboard.writeText(url).then(() => {
|
|
137
|
+
this.messageService.add({
|
|
138
|
+
severity: 'success',
|
|
139
|
+
summary: this.translocoService.translate('traceDrawer.linkCopied'),
|
|
140
|
+
key: 'toast-root'
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async copyAsCurl(hit) {
|
|
145
|
+
const token = await this.keycloakService.getToken().catch(() => '');
|
|
146
|
+
const cmd = this.buildCurl(hit, token);
|
|
147
|
+
await navigator.clipboard.writeText(cmd);
|
|
148
|
+
this.messageService.add({
|
|
149
|
+
severity: 'success',
|
|
150
|
+
summary: this.translocoService.translate('traceDrawer.curlCopied'),
|
|
151
|
+
key: 'toast-root'
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
buildCurl(hit, token) {
|
|
155
|
+
const method = (hit.requestMethod ?? 'GET').toUpperCase();
|
|
156
|
+
const host = hit.upstreamHost ? hit.upstreamHost.replace(/\/+$/, '') : '';
|
|
157
|
+
const uri = hit.requestUri ?? '';
|
|
158
|
+
const url = host ? (host.startsWith('http') ? `${host}${uri}` : `https://${host}${uri}`) : uri;
|
|
159
|
+
const escape = (s) => s.replace(/'/g, `'\\''`);
|
|
160
|
+
const lines = [`curl -X ${method} '${escape(url)}'`];
|
|
161
|
+
if (token)
|
|
162
|
+
lines.push(`-H 'Authorization: Bearer ${escape(token)}'`);
|
|
163
|
+
const body = hit.requestBody?.trim();
|
|
164
|
+
if (body) {
|
|
165
|
+
const isJson = (body.startsWith('{') && body.endsWith('}')) || (body.startsWith('[') && body.endsWith(']'));
|
|
166
|
+
if (isJson)
|
|
167
|
+
lines.push(`-H 'Content-Type: application/json'`);
|
|
168
|
+
lines.push(`-d '${escape(body)}'`);
|
|
169
|
+
}
|
|
170
|
+
return lines.join(' \\\n ');
|
|
171
|
+
}
|
|
67
172
|
fetch(traceId) {
|
|
68
173
|
this.loading.set(true);
|
|
69
174
|
this.errorMessage.set(undefined);
|
|
70
175
|
this.apisixHits.set([]);
|
|
71
|
-
this.
|
|
176
|
+
this.totalItem.set(0);
|
|
177
|
+
this.pageNumber.set(1);
|
|
178
|
+
this.appLogs.set([]);
|
|
179
|
+
this.appLogsTotal.set(0);
|
|
180
|
+
this.appLogsPage.set(1);
|
|
181
|
+
this.request.next({ traceId, pageNumber: 1, append: false });
|
|
182
|
+
this.appLogsRequest.next({ traceId, pageNumber: 1, append: false });
|
|
72
183
|
}
|
|
73
184
|
statusSeverity(status) {
|
|
74
185
|
if (status >= 500)
|
|
@@ -81,6 +192,23 @@ export class TraceDrawerComponent {
|
|
|
81
192
|
return 'success';
|
|
82
193
|
return 'secondary';
|
|
83
194
|
}
|
|
195
|
+
levelSeverity(level) {
|
|
196
|
+
switch ((level ?? '').toUpperCase()) {
|
|
197
|
+
case 'ERROR':
|
|
198
|
+
case 'FATAL':
|
|
199
|
+
return 'danger';
|
|
200
|
+
case 'WARN':
|
|
201
|
+
case 'WARNING':
|
|
202
|
+
return 'warning';
|
|
203
|
+
case 'INFO':
|
|
204
|
+
return 'info';
|
|
205
|
+
case 'DEBUG':
|
|
206
|
+
case 'TRACE':
|
|
207
|
+
return 'secondary';
|
|
208
|
+
default:
|
|
209
|
+
return 'secondary';
|
|
210
|
+
}
|
|
211
|
+
}
|
|
84
212
|
durationSeverity(seconds) {
|
|
85
213
|
const ms = (seconds ?? 0) * 1000;
|
|
86
214
|
if (ms >= 1000)
|
|
@@ -137,12 +265,12 @@ export class TraceDrawerComponent {
|
|
|
137
265
|
}
|
|
138
266
|
}
|
|
139
267
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: TraceDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
140
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: TraceDrawerComponent, isStandalone: true, selector: "aril-trace-drawer", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, traceId: { classPropertyName: "traceId", publicName: "traceId", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, startTime: { classPropertyName: "startTime", publicName: "startTime", isSignal: true, isRequired: false, transformFunction: null }, endTime: { classPropertyName: "endTime", publicName: "endTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\r\n\t<p-sidebar\r\n\t\t[visible]=\"visible()\"\r\n\t\t(visibleChange)=\"onVisibleChange($event)\"\r\n\t\t[position]=\"position()\"\r\n\t\t[style]=\"{ width: width() }\"\r\n\t\t[modal]=\"modal()\"\r\n\t\t[dismissible]=\"true\"\r\n\t\t[showCloseIcon]=\"true\"\r\n\t\tstyleClass=\"aril-trace-drawer\">\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<div class=\"aril-trace-drawer__header\">\r\n\t\t\t\t<i class=\"pi pi-sitemap\"></i>\r\n\t\t\t\t<span class=\"aril-trace-drawer__title\">{{ t('traceDrawer.title') }}</span>\r\n\t\t\t\t<code class=\"aril-trace-drawer__chip\" [title]=\"traceId()\">{{ traceId() }}</code>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\r\n\t\t<div class=\"aril-trace-drawer__body\">\r\n\t\t\t@if (loading()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t<p-progressSpinner strokeWidth=\"3\" styleClass=\"w-3rem h-3rem\"></p-progressSpinner>\r\n\t\t\t\t\t<span>{{ t('traceDrawer.loading') }}</span>\r\n\t\t\t\t</div>\r\n\t\t\t} @else if (errorMessage()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state aril-trace-drawer__state--error\">\r\n\t\t\t\t\t<i class=\"pi pi-exclamation-triangle\"></i>\r\n\t\t\t\t\t<p>{{ errorMessage() }}</p>\r\n\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t[label]=\"t('traceDrawer.retry')\"\r\n\t\t\t\t\t\ticon=\"REFRESH\"\r\n\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t(clickEvent)=\"retry()\" />\r\n\t\t\t\t</div>\r\n\t\t\t} @else if (apisixHits().length) {\r\n\t\t\t\t<section class=\"aril-trace-drawer__section\">\r\n\t\t\t\t\t<h3 class=\"aril-trace-drawer__section-title\">\r\n\t\t\t\t\t\t<i class=\"pi pi-globe\"></i>\r\n\t\t\t\t\t\t{{ t('traceDrawer.apisixHeader') }}\r\n\t\t\t\t\t\t<aril-badge [value]=\"apisixHits().length.toString()\" severity=\"info\" [rounded]=\"true\" />\r\n\t\t\t\t\t</h3>\r\n\t\t\t\t\t@for (hit of apisixHits(); track hit.id) {\r\n\t\t\t\t\t\t<div class=\"apisix-card\">\r\n\t\t\t\t\t\t\t<div class=\"apisix-card__head\">\r\n\t\t\t\t\t\t\t\t<aril-badge [value]=\"hit.status.toString()\" [severity]=\"statusSeverity(hit.status)\" />\r\n\t\t\t\t\t\t\t\t<span class=\"apisix-card__method\">{{ hit.requestMethod }}</span>\r\n\t\t\t\t\t\t\t\t<span class=\"apisix-card__uri\" [title]=\"hit.requestUri\">{{ hit.requestUri }}</span>\r\n\t\t\t\t\t\t\t\t<aril-badge\r\n\t\t\t\t\t\t\t\t\t[value]=\"formatDuration(hit.responseTime)\"\r\n\t\t\t\t\t\t\t\t\t[severity]=\"durationSeverity(hit.responseTime)\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"apisix-card__meta\">\r\n\t\t\t\t\t\t\t\t@if (hit.routeName) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.route') }}</span><span>{{ hit.routeName }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.timestamp) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.timestamp') }}</span><span>{{ formatTimestamp(hit.timestamp) }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.sourceApp || hit.sourceModule) {\r\n\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.source') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span>{{ hit.sourceApp }}{{ hit.sourceModule ? ' / ' + hit.sourceModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.targetApp || hit.targetModule) {\r\n\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.target') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span>{{ hit.targetApp }}{{ hit.targetModule ? ' / ' + hit.targetModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.upstreamHost) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.upstream') }}</span><span>{{ hit.upstreamHost }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.username) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.user') }}</span><span>{{ hit.username }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.requestSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.requestSize') }}</span><span>{{ formatBytes(hit.requestSize) }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.responseSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.responseSize') }}</span><span>{{ formatBytes(hit.responseSize) }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t@if (hit.requestBody) {\r\n\t\t\t\t\t\t\t\t<details class=\"apisix-card__body\">\r\n\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.requestBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.requestBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.requestBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t@if (hit.responseBody) {\r\n\t\t\t\t\t\t\t\t<details class=\"apisix-card__body\">\r\n\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.responseBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.responseBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.responseBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t</section>\r\n\t\t\t} @else {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t<i class=\"pi pi-inbox\"></i>\r\n\t\t\t\t\t<p>{{ t('traceDrawer.empty') }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t</div>\r\n\t</p-sidebar>\r\n</ng-container>\r\n", styles: [":host ::ng-deep .aril-trace-drawer .p-sidebar-header{padding:1rem 1.25rem;border-bottom:1px solid var(--surface-border, #e5e7eb)}:host ::ng-deep .aril-trace-drawer .p-sidebar-content{padding:0;overflow-y:auto}.aril-trace-drawer__header{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.aril-trace-drawer__header .pi-sitemap{font-size:1.25rem;color:var(--primary-color, #1890ff)}.aril-trace-drawer__title{font-weight:600;font-size:1.1rem}.aril-trace-drawer__chip{font-size:.875rem;padding:.2rem .55rem;border-radius:4px;background:var(--surface-100, #f3f4f6);color:var(--text-color-secondary, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}.aril-trace-drawer__body{padding:1rem 1.25rem;display:flex;flex-direction:column;gap:1.5rem}.aril-trace-drawer__state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:3rem 1rem;color:var(--text-color-secondary, #6b7280);text-align:center;font-size:.95rem}.aril-trace-drawer__state .pi{font-size:2rem}.aril-trace-drawer__state--error .pi{color:var(--red-500, #ef4444)}.aril-trace-drawer__section-title{display:flex;align-items:center;gap:.5rem;margin:0 0 .75rem;font-size:1.05rem;font-weight:600}.aril-trace-drawer__section-title .pi{color:var(--primary-color, #1890ff)}.apisix-card{border:1px solid var(--surface-border, #e5e7eb);border-radius:6px;padding:.75rem;margin-bottom:.75rem;background:var(--surface-card, #ffffff);transition:box-shadow .15s ease}.apisix-card:hover{box-shadow:0 2px 8px #0000000f}.apisix-card__head{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.5rem}.apisix-card__method{font-weight:600;color:var(--primary-color, #1890ff);font-size:.9rem}.apisix-card__uri{font-size:.9rem;color:var(--text-color, #111827);flex:1;min-width:0;word-break:break-all;overflow-wrap:anywhere}.apisix-card__meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:.4rem 1rem;font-size:.9rem}.apisix-card__meta>div{display:grid;grid-template-columns:max-content 1fr;column-gap:.5rem;align-items:baseline;min-width:0}.apisix-card__meta .meta-label{color:var(--text-color-secondary, #6b7280);font-weight:500}.apisix-card__meta .meta-label:after{content:\":\"}.apisix-card__meta span:not(.meta-label){color:var(--text-color, #111827);word-break:break-word}.apisix-card__body{margin-top:.5rem}.apisix-card__body summary{cursor:pointer;font-size:.9rem;color:var(--primary-color, #1890ff);padding:.25rem 0;-webkit-user-select:none;user-select:none}.apisix-card__body summary:hover{text-decoration:underline}.apisix-card__body pre{margin:.35rem 0 0;padding:.6rem .85rem;background:var(--surface-100, #f3f4f6);border-radius:4px;font-size:.85rem;line-height:1.5;max-height:360px;overflow:auto;white-space:pre-wrap;word-break:break-word}\n"], dependencies: [{ kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i1.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: SidebarModule }, { kind: "component", type: i2.Sidebar, selector: "p-sidebar", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i4.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: BadgeComponent, selector: "aril-badge", inputs: ["icon", "value", "severity", "rounded", "background", "styleClass", "textColor", "borderColor", "textClampCharacters"] }, { kind: "component", type: ButtonComponent, selector: "aril-button:not([click])", inputs: ["label", "loading", "disabled", "raised", "rounded", "text", "outlined", "badge", "size", "icon", "iconPos", "color"], outputs: ["clickEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
268
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: TraceDrawerComponent, isStandalone: true, selector: "aril-trace-drawer", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, traceId: { classPropertyName: "traceId", publicName: "traceId", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, startTime: { classPropertyName: "startTime", publicName: "startTime", isSignal: true, isRequired: false, transformFunction: null }, endTime: { classPropertyName: "endTime", publicName: "endTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\r\n\t<p-sidebar\r\n\t\t[visible]=\"visible()\"\r\n\t\t(visibleChange)=\"onVisibleChange($event)\"\r\n\t\t[position]=\"position()\"\r\n\t\t[style]=\"{ width: width() }\"\r\n\t\t[modal]=\"modal()\"\r\n\t\t[dismissible]=\"true\"\r\n\t\t[showCloseIcon]=\"true\"\r\n\t\tstyleClass=\"aril-trace-drawer\">\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<div class=\"aril-trace-drawer__header\">\r\n\t\t\t\t<i class=\"pi pi-sitemap\"></i>\r\n\t\t\t\t<span class=\"aril-trace-drawer__title\">{{ t('traceDrawer.title') }}</span>\r\n\t\t\t\t<code class=\"aril-trace-drawer__chip\">{{ traceId() }}</code>\r\n\t\t\t\t<i\r\n\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\tclass=\"pi pi-share-alt aril-trace-drawer__share\"\r\n\t\t\t\t\t[pTooltip]=\"t('traceDrawer.shareLink')\"\r\n\t\t\t\t\ttooltipPosition=\"bottom\"\r\n\t\t\t\t\t(click)=\"shareLink()\"></i>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\r\n\t\t<div class=\"aril-trace-drawer__body\">\r\n\t\t\t@if (loading()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t<p-progressSpinner strokeWidth=\"3\" styleClass=\"w-3rem h-3rem\"></p-progressSpinner>\r\n\t\t\t\t\t<span>{{ t('traceDrawer.loading') }}</span>\r\n\t\t\t\t</div>\r\n\t\t\t} @else if (errorMessage()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state aril-trace-drawer__state--error\">\r\n\t\t\t\t\t<i class=\"pi pi-exclamation-triangle\"></i>\r\n\t\t\t\t\t<p>{{ errorMessage() }}</p>\r\n\t\t\t\t\t<aril-button [label]=\"t('traceDrawer.retry')\" icon=\"REFRESH\" color=\"primary\" (clickEvent)=\"retry()\" />\r\n\t\t\t\t</div>\r\n\t\t\t} @else {\r\n\t\t\t\t@if (apisixHits().length) {\r\n\t\t\t\t\t<section class=\"aril-trace-drawer__section\">\r\n\t\t\t\t\t\t<h3 class=\"aril-trace-drawer__section-title\">\r\n\t\t\t\t\t\t\t<i class=\"pi pi-globe\"></i>\r\n\t\t\t\t\t\t\t{{ t('traceDrawer.apisixHeader') }}\r\n\t\t\t\t\t\t\t<aril-badge [value]=\"apisixHits().length + ' / ' + totalItem()\" [rounded]=\"true\" />\r\n\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t@for (hit of apisixHits(); track hit.id) {\r\n\t\t\t\t\t\t\t<details class=\"trace-row trace-row--{{ statusSeverity(hit.status) }}\">\r\n\t\t\t\t\t\t\t\t<summary class=\"trace-row__summary\">\r\n\t\t\t\t\t\t\t\t\t<i class=\"pi pi-chevron-right trace-row__chevron\"></i>\r\n\t\t\t\t\t\t\t\t\t<aril-badge [value]=\"hit.status.toString()\" [severity]=\"statusSeverity(hit.status)\" />\r\n\t\t\t\t\t\t\t\t\t<span class=\"trace-row__tag\">{{ hit.requestMethod }}</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"trace-row__main\">{{ hit.requestUri }}</span>\r\n\t\t\t\t\t\t\t\t\t<aril-badge\r\n\t\t\t\t\t\t\t\t\t\t[value]=\"formatDuration(hit.responseTime)\"\r\n\t\t\t\t\t\t\t\t\t\t[severity]=\"durationSeverity(hit.responseTime)\" />\r\n\t\t\t\t\t\t\t\t\t@if (hit.timestamp) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"trace-row__time\">{{ formatTimestamp(hit.timestamp) }}</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t<i\r\n\t\t\t\t\t\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"pi pi-code trace-row__action\"\r\n\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('traceDrawer.copyCurl')\"\r\n\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.preventDefault(); $event.stopPropagation(); copyAsCurl(hit)\"></i>\r\n\t\t\t\t\t\t\t\t</summary>\r\n\t\t\t\t\t\t\t\t<div class=\"trace-row__body\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"trace-row__meta\">\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.routeName) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.route') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ hit.routeName }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.sourceApp || hit.sourceModule) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.source') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ hit.sourceApp }}{{ hit.sourceModule ? ' / ' + hit.sourceModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.targetApp || hit.targetModule) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.target') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ hit.targetApp }}{{ hit.targetModule ? ' / ' + hit.targetModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.upstreamHost) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.upstream') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ hit.upstreamHost }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.username) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.user') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ hit.username }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.requestSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.requestSize') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ formatBytes(hit.requestSize) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.responseSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.responseSize') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ formatBytes(hit.responseSize) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t@if (hit.requestBody) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\">\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.requestBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.requestBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.requestBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (hit.responseBody) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\">\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.responseBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.responseBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.responseBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t@if (hasMore()) {\r\n\t\t\t\t\t\t\t<div class=\"aril-trace-drawer__load-more\">\r\n\t\t\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t\t\t[label]=\"t('traceDrawer.loadMore')\"\r\n\t\t\t\t\t\t\t\t\ticon=\"CHEVRON_DOWN\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\t\t\t[loading]=\"loadingMore()\"\r\n\t\t\t\t\t\t\t\t\t[disabled]=\"loadingMore()\"\r\n\t\t\t\t\t\t\t\t\t(clickEvent)=\"loadMore()\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</section>\r\n\t\t\t\t}\r\n\t\t\t\t@if (appLogs().length) {\r\n\t\t\t\t\t<section class=\"aril-trace-drawer__section\">\r\n\t\t\t\t\t\t<h3 class=\"aril-trace-drawer__section-title\">\r\n\t\t\t\t\t\t\t<i class=\"pi pi-list\"></i>\r\n\t\t\t\t\t\t\t{{ t('traceDrawer.appLogsHeader') }}\r\n\t\t\t\t\t\t\t<aril-badge [value]=\"appLogs().length + ' / ' + appLogsTotal()\" [rounded]=\"true\" />\r\n\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t@for (log of appLogs(); track log.id) {\r\n\t\t\t\t\t\t\t<details class=\"trace-row trace-row--{{ levelSeverity(log.level) }}\">\r\n\t\t\t\t\t\t\t\t<summary class=\"trace-row__summary\">\r\n\t\t\t\t\t\t\t\t\t<i class=\"pi pi-chevron-right trace-row__chevron\"></i>\r\n\t\t\t\t\t\t\t\t\t@if (log.level) {\r\n\t\t\t\t\t\t\t\t\t\t<aril-badge [value]=\"log.level\" [severity]=\"levelSeverity(log.level)\" />\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.module) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"trace-row__tag\">{{ log.module }}</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t<span class=\"trace-row__main\">{{ log.message }}</span>\r\n\t\t\t\t\t\t\t\t\t@if (log.timestamp) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"trace-row__time\">{{ formatTimestamp(log.timestamp) }}</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</summary>\r\n\t\t\t\t\t\t\t\t<div class=\"trace-row__body\">\r\n\t\t\t\t\t\t\t\t\t@if (log.message) {\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"trace-row__message\">{{ log.message }}</div>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.username || log.app) {\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"trace-row__meta\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if (log.app) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.target') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ log.app }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t@if (log.username) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.user') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ log.username }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.errorDetail) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\" open>\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.appLogErrorDetail') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t<pre>{{ log.errorDetail }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.referenceFields?.length) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\">\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.appLogRefFields') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"trace-row__meta\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t@for (rf of log.referenceFields; track rf.field) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ rf.field }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ rf.value }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t@if (appLogsHasMore()) {\r\n\t\t\t\t\t\t\t<div class=\"aril-trace-drawer__load-more\">\r\n\t\t\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t\t\t[label]=\"t('traceDrawer.loadMore')\"\r\n\t\t\t\t\t\t\t\t\ticon=\"CHEVRON_DOWN\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\t\t\t[loading]=\"appLogsLoadingMore()\"\r\n\t\t\t\t\t\t\t\t\t[disabled]=\"appLogsLoadingMore()\"\r\n\t\t\t\t\t\t\t\t\t(clickEvent)=\"loadMoreAppLogs()\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</section>\r\n\t\t\t\t}\r\n\t\t\t\t@if (!apisixHits().length && !appLogs().length) {\r\n\t\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t\t<i class=\"pi pi-inbox\"></i>\r\n\t\t\t\t\t\t<p>{{ t('traceDrawer.empty') }}</p>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t</div>\r\n\t</p-sidebar>\r\n</ng-container>\r\n", styles: [":host ::ng-deep .aril-trace-drawer{display:flex;flex-direction:column;height:100%}:host ::ng-deep .aril-trace-drawer .p-sidebar-header{padding:1rem 1.25rem;border-bottom:1px solid var(--surface-border, #e5e7eb);flex:0 0 auto}:host ::ng-deep .aril-trace-drawer .p-sidebar-content{padding:0;flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden}.aril-trace-drawer__header{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.aril-trace-drawer__header .pi-sitemap{font-size:1.25rem;color:var(--primary-color, #1890ff)}.aril-trace-drawer__title{font-weight:600;font-size:1.1rem}.aril-trace-drawer__chip{font-size:.875rem;padding:.2rem .55rem;border-radius:4px;background:var(--surface-100, #f3f4f6);color:var(--text-color-secondary, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}.aril-trace-drawer__share{cursor:pointer;font-size:1rem;padding:.4rem;border-radius:4px;color:var(--primary-color, #1890ff);transition:background .15s ease}.aril-trace-drawer__share:hover{background:var(--surface-100, #f3f4f6)}.aril-trace-drawer__body{padding:1rem 1.25rem;display:flex;flex-direction:column;gap:1.5rem;min-height:min-content}.aril-trace-drawer__state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:3rem 1rem;color:var(--text-color-secondary, #6b7280);text-align:center;font-size:.95rem}.aril-trace-drawer__state .pi{font-size:2rem}.aril-trace-drawer__state--error .pi{color:var(--red-500, #ef4444)}.aril-trace-drawer__section-title{display:flex;align-items:center;gap:.5rem;margin:0 0 .5rem;font-size:1rem;font-weight:600}.aril-trace-drawer__section-title .pi{color:var(--primary-color, #1890ff)}.trace-row{display:block;border:1px solid var(--surface-border, #e5e7eb);border-left:3px solid var(--surface-border, #e5e7eb);background:var(--surface-card, #ffffff);border-radius:4px;overflow:hidden;transition:background .15s ease,border-color .15s ease,box-shadow .15s ease}.trace-row+.trace-row{margin-top:.4rem}.trace-row:hover{border-top-color:var(--surface-300, #d1d5db);border-right-color:var(--surface-300, #d1d5db);border-bottom-color:var(--surface-300, #d1d5db);box-shadow:0 1px 3px #0000000a}.trace-row[open]{background:var(--surface-50, #fafafa);border-top-color:var(--surface-300, #d1d5db);border-right-color:var(--surface-300, #d1d5db);border-bottom-color:var(--surface-300, #d1d5db);box-shadow:0 1px 4px #0000000d}.trace-row--success{border-left-color:var(--green-500, #22c55e)}.trace-row--info{border-left-color:var(--blue-500, #3b82f6)}.trace-row--warning{border-left-color:var(--orange-500, #f97316)}.trace-row--danger{border-left-color:var(--red-500, #ef4444)}.trace-row--secondary{border-left-color:var(--gray-400, #9ca3af)}.trace-row__summary{cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none;display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem}.trace-row__summary::-webkit-details-marker{display:none}.trace-row__summary:hover{background:var(--surface-50, #fafafa)}.trace-row[open] .trace-row__summary:hover{background:var(--surface-100, #f3f4f6)}.trace-row__chevron{color:var(--text-color-secondary, #6b7280);font-size:.7rem;transition:transform .15s ease;flex-shrink:0}.trace-row[open] .trace-row__chevron{transform:rotate(90deg)}.trace-row__tag{font-weight:600;color:var(--primary-color, #1890ff);font-size:.8rem;white-space:nowrap;flex-shrink:0;letter-spacing:.02em}.trace-row__main{font-size:.85rem;color:var(--text-color, #111827);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.trace-row__time{font-size:.75rem;color:var(--text-color-secondary, #6b7280);font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0}.trace-row__action{cursor:pointer;padding:.25rem;border-radius:4px;color:var(--text-color-secondary, #6b7280);flex-shrink:0;transition:background .15s ease,color .15s ease}.trace-row__action:hover{background:var(--surface-100, #f3f4f6);color:var(--primary-color, #1890ff)}.trace-row__body{padding:.5rem .75rem .75rem;border-top:1px solid var(--surface-border, #e5e7eb);display:flex;flex-direction:column;gap:.5rem;background:var(--surface-0, #ffffff)}.trace-row__message{font-size:.85rem;color:var(--text-color, #111827);line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;background:var(--surface-100, #f3f4f6);border-radius:4px;padding:.5rem .65rem}.trace-row__meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.25rem .75rem;font-size:.8rem}.trace-row__meta>div{display:grid;grid-template-columns:max-content 1fr;column-gap:.4rem;align-items:baseline;min-width:0}.trace-row__meta .meta-label{color:var(--text-color-secondary, #6b7280);font-weight:500}.trace-row__meta .meta-label:after{content:\":\"}.trace-row__meta span:not(.meta-label){color:var(--text-color, #111827);word-break:break-word}.trace-row__sub{margin:0}.trace-row__sub summary{cursor:pointer;font-size:.8rem;color:var(--primary-color, #1890ff);padding:.15rem 0;-webkit-user-select:none;user-select:none}.trace-row__sub summary:hover{text-decoration:underline}.trace-row__sub pre{margin:.25rem 0 0;padding:.5rem .75rem;background:var(--surface-100, #f3f4f6);border-radius:4px;font-size:.78rem;line-height:1.45;max-height:320px;overflow:auto;white-space:pre-wrap;word-break:break-word}.aril-trace-drawer__load-more{display:flex;justify-content:center;margin-top:.5rem}\n"], dependencies: [{ kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i1.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: SidebarModule }, { kind: "component", type: i2.Sidebar, selector: "p-sidebar", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i4.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: BadgeComponent, selector: "aril-badge", inputs: ["icon", "value", "severity", "rounded", "background", "styleClass", "textColor", "borderColor", "textClampCharacters"] }, { kind: "component", type: ButtonComponent, selector: "aril-button:not([click])", inputs: ["label", "loading", "disabled", "raised", "rounded", "text", "outlined", "badge", "size", "icon", "iconPos", "color"], outputs: ["clickEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
141
269
|
}
|
|
142
270
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: TraceDrawerComponent, decorators: [{
|
|
143
271
|
type: Component,
|
|
144
|
-
args: [{ standalone: true, selector: 'aril-trace-drawer', imports: [JsonPipe, TranslocoModule, SidebarModule, ProgressSpinnerModule, BadgeComponent, ButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\r\n\t<p-sidebar\r\n\t\t[visible]=\"visible()\"\r\n\t\t(visibleChange)=\"onVisibleChange($event)\"\r\n\t\t[position]=\"position()\"\r\n\t\t[style]=\"{ width: width() }\"\r\n\t\t[modal]=\"modal()\"\r\n\t\t[dismissible]=\"true\"\r\n\t\t[showCloseIcon]=\"true\"\r\n\t\tstyleClass=\"aril-trace-drawer\">\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<div class=\"aril-trace-drawer__header\">\r\n\t\t\t\t<i class=\"pi pi-sitemap\"></i>\r\n\t\t\t\t<span class=\"aril-trace-drawer__title\">{{ t('traceDrawer.title') }}</span>\r\n\t\t\t\t<code class=\"aril-trace-drawer__chip\" [title]=\"traceId()\">{{ traceId() }}</code>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\r\n\t\t<div class=\"aril-trace-drawer__body\">\r\n\t\t\t@if (loading()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t<p-progressSpinner strokeWidth=\"3\" styleClass=\"w-3rem h-3rem\"></p-progressSpinner>\r\n\t\t\t\t\t<span>{{ t('traceDrawer.loading') }}</span>\r\n\t\t\t\t</div>\r\n\t\t\t} @else if (errorMessage()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state aril-trace-drawer__state--error\">\r\n\t\t\t\t\t<i class=\"pi pi-exclamation-triangle\"></i>\r\n\t\t\t\t\t<p>{{ errorMessage() }}</p>\r\n\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t[label]=\"t('traceDrawer.retry')\"\r\n\t\t\t\t\t\ticon=\"REFRESH\"\r\n\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t(clickEvent)=\"retry()\" />\r\n\t\t\t\t</div>\r\n\t\t\t} @else if (apisixHits().length) {\r\n\t\t\t\t<section class=\"aril-trace-drawer__section\">\r\n\t\t\t\t\t<h3 class=\"aril-trace-drawer__section-title\">\r\n\t\t\t\t\t\t<i class=\"pi pi-globe\"></i>\r\n\t\t\t\t\t\t{{ t('traceDrawer.apisixHeader') }}\r\n\t\t\t\t\t\t<aril-badge [value]=\"apisixHits().length.toString()\" severity=\"info\" [rounded]=\"true\" />\r\n\t\t\t\t\t</h3>\r\n\t\t\t\t\t@for (hit of apisixHits(); track hit.id) {\r\n\t\t\t\t\t\t<div class=\"apisix-card\">\r\n\t\t\t\t\t\t\t<div class=\"apisix-card__head\">\r\n\t\t\t\t\t\t\t\t<aril-badge [value]=\"hit.status.toString()\" [severity]=\"statusSeverity(hit.status)\" />\r\n\t\t\t\t\t\t\t\t<span class=\"apisix-card__method\">{{ hit.requestMethod }}</span>\r\n\t\t\t\t\t\t\t\t<span class=\"apisix-card__uri\" [title]=\"hit.requestUri\">{{ hit.requestUri }}</span>\r\n\t\t\t\t\t\t\t\t<aril-badge\r\n\t\t\t\t\t\t\t\t\t[value]=\"formatDuration(hit.responseTime)\"\r\n\t\t\t\t\t\t\t\t\t[severity]=\"durationSeverity(hit.responseTime)\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"apisix-card__meta\">\r\n\t\t\t\t\t\t\t\t@if (hit.routeName) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.route') }}</span><span>{{ hit.routeName }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.timestamp) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.timestamp') }}</span><span>{{ formatTimestamp(hit.timestamp) }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.sourceApp || hit.sourceModule) {\r\n\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.source') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span>{{ hit.sourceApp }}{{ hit.sourceModule ? ' / ' + hit.sourceModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.targetApp || hit.targetModule) {\r\n\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.target') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t<span>{{ hit.targetApp }}{{ hit.targetModule ? ' / ' + hit.targetModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.upstreamHost) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.upstream') }}</span><span>{{ hit.upstreamHost }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.username) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.user') }}</span><span>{{ hit.username }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.requestSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.requestSize') }}</span><span>{{ formatBytes(hit.requestSize) }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (hit.responseSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t<div><span class=\"meta-label\">{{ t('traceDrawer.responseSize') }}</span><span>{{ formatBytes(hit.responseSize) }}</span></div>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t@if (hit.requestBody) {\r\n\t\t\t\t\t\t\t\t<details class=\"apisix-card__body\">\r\n\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.requestBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.requestBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.requestBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t@if (hit.responseBody) {\r\n\t\t\t\t\t\t\t\t<details class=\"apisix-card__body\">\r\n\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.responseBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.responseBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.responseBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t</section>\r\n\t\t\t} @else {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t<i class=\"pi pi-inbox\"></i>\r\n\t\t\t\t\t<p>{{ t('traceDrawer.empty') }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t</div>\r\n\t</p-sidebar>\r\n</ng-container>\r\n", styles: [":host ::ng-deep .aril-trace-drawer .p-sidebar-header{padding:1rem 1.25rem;border-bottom:1px solid var(--surface-border, #e5e7eb)}:host ::ng-deep .aril-trace-drawer .p-sidebar-content{padding:0;overflow-y:auto}.aril-trace-drawer__header{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.aril-trace-drawer__header .pi-sitemap{font-size:1.25rem;color:var(--primary-color, #1890ff)}.aril-trace-drawer__title{font-weight:600;font-size:1.1rem}.aril-trace-drawer__chip{font-size:.875rem;padding:.2rem .55rem;border-radius:4px;background:var(--surface-100, #f3f4f6);color:var(--text-color-secondary, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}.aril-trace-drawer__body{padding:1rem 1.25rem;display:flex;flex-direction:column;gap:1.5rem}.aril-trace-drawer__state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:3rem 1rem;color:var(--text-color-secondary, #6b7280);text-align:center;font-size:.95rem}.aril-trace-drawer__state .pi{font-size:2rem}.aril-trace-drawer__state--error .pi{color:var(--red-500, #ef4444)}.aril-trace-drawer__section-title{display:flex;align-items:center;gap:.5rem;margin:0 0 .75rem;font-size:1.05rem;font-weight:600}.aril-trace-drawer__section-title .pi{color:var(--primary-color, #1890ff)}.apisix-card{border:1px solid var(--surface-border, #e5e7eb);border-radius:6px;padding:.75rem;margin-bottom:.75rem;background:var(--surface-card, #ffffff);transition:box-shadow .15s ease}.apisix-card:hover{box-shadow:0 2px 8px #0000000f}.apisix-card__head{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.5rem}.apisix-card__method{font-weight:600;color:var(--primary-color, #1890ff);font-size:.9rem}.apisix-card__uri{font-size:.9rem;color:var(--text-color, #111827);flex:1;min-width:0;word-break:break-all;overflow-wrap:anywhere}.apisix-card__meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:.4rem 1rem;font-size:.9rem}.apisix-card__meta>div{display:grid;grid-template-columns:max-content 1fr;column-gap:.5rem;align-items:baseline;min-width:0}.apisix-card__meta .meta-label{color:var(--text-color-secondary, #6b7280);font-weight:500}.apisix-card__meta .meta-label:after{content:\":\"}.apisix-card__meta span:not(.meta-label){color:var(--text-color, #111827);word-break:break-word}.apisix-card__body{margin-top:.5rem}.apisix-card__body summary{cursor:pointer;font-size:.9rem;color:var(--primary-color, #1890ff);padding:.25rem 0;-webkit-user-select:none;user-select:none}.apisix-card__body summary:hover{text-decoration:underline}.apisix-card__body pre{margin:.35rem 0 0;padding:.6rem .85rem;background:var(--surface-100, #f3f4f6);border-radius:4px;font-size:.85rem;line-height:1.5;max-height:360px;overflow:auto;white-space:pre-wrap;word-break:break-word}\n"] }]
|
|
272
|
+
args: [{ standalone: true, selector: 'aril-trace-drawer', imports: [JsonPipe, TranslocoModule, SidebarModule, ProgressSpinnerModule, TooltipModule, BadgeComponent, ButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\r\n\t<p-sidebar\r\n\t\t[visible]=\"visible()\"\r\n\t\t(visibleChange)=\"onVisibleChange($event)\"\r\n\t\t[position]=\"position()\"\r\n\t\t[style]=\"{ width: width() }\"\r\n\t\t[modal]=\"modal()\"\r\n\t\t[dismissible]=\"true\"\r\n\t\t[showCloseIcon]=\"true\"\r\n\t\tstyleClass=\"aril-trace-drawer\">\r\n\t\t<ng-template pTemplate=\"header\">\r\n\t\t\t<div class=\"aril-trace-drawer__header\">\r\n\t\t\t\t<i class=\"pi pi-sitemap\"></i>\r\n\t\t\t\t<span class=\"aril-trace-drawer__title\">{{ t('traceDrawer.title') }}</span>\r\n\t\t\t\t<code class=\"aril-trace-drawer__chip\">{{ traceId() }}</code>\r\n\t\t\t\t<i\r\n\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\tclass=\"pi pi-share-alt aril-trace-drawer__share\"\r\n\t\t\t\t\t[pTooltip]=\"t('traceDrawer.shareLink')\"\r\n\t\t\t\t\ttooltipPosition=\"bottom\"\r\n\t\t\t\t\t(click)=\"shareLink()\"></i>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\r\n\t\t<div class=\"aril-trace-drawer__body\">\r\n\t\t\t@if (loading()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t<p-progressSpinner strokeWidth=\"3\" styleClass=\"w-3rem h-3rem\"></p-progressSpinner>\r\n\t\t\t\t\t<span>{{ t('traceDrawer.loading') }}</span>\r\n\t\t\t\t</div>\r\n\t\t\t} @else if (errorMessage()) {\r\n\t\t\t\t<div class=\"aril-trace-drawer__state aril-trace-drawer__state--error\">\r\n\t\t\t\t\t<i class=\"pi pi-exclamation-triangle\"></i>\r\n\t\t\t\t\t<p>{{ errorMessage() }}</p>\r\n\t\t\t\t\t<aril-button [label]=\"t('traceDrawer.retry')\" icon=\"REFRESH\" color=\"primary\" (clickEvent)=\"retry()\" />\r\n\t\t\t\t</div>\r\n\t\t\t} @else {\r\n\t\t\t\t@if (apisixHits().length) {\r\n\t\t\t\t\t<section class=\"aril-trace-drawer__section\">\r\n\t\t\t\t\t\t<h3 class=\"aril-trace-drawer__section-title\">\r\n\t\t\t\t\t\t\t<i class=\"pi pi-globe\"></i>\r\n\t\t\t\t\t\t\t{{ t('traceDrawer.apisixHeader') }}\r\n\t\t\t\t\t\t\t<aril-badge [value]=\"apisixHits().length + ' / ' + totalItem()\" [rounded]=\"true\" />\r\n\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t@for (hit of apisixHits(); track hit.id) {\r\n\t\t\t\t\t\t\t<details class=\"trace-row trace-row--{{ statusSeverity(hit.status) }}\">\r\n\t\t\t\t\t\t\t\t<summary class=\"trace-row__summary\">\r\n\t\t\t\t\t\t\t\t\t<i class=\"pi pi-chevron-right trace-row__chevron\"></i>\r\n\t\t\t\t\t\t\t\t\t<aril-badge [value]=\"hit.status.toString()\" [severity]=\"statusSeverity(hit.status)\" />\r\n\t\t\t\t\t\t\t\t\t<span class=\"trace-row__tag\">{{ hit.requestMethod }}</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"trace-row__main\">{{ hit.requestUri }}</span>\r\n\t\t\t\t\t\t\t\t\t<aril-badge\r\n\t\t\t\t\t\t\t\t\t\t[value]=\"formatDuration(hit.responseTime)\"\r\n\t\t\t\t\t\t\t\t\t\t[severity]=\"durationSeverity(hit.responseTime)\" />\r\n\t\t\t\t\t\t\t\t\t@if (hit.timestamp) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"trace-row__time\">{{ formatTimestamp(hit.timestamp) }}</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t<i\r\n\t\t\t\t\t\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tclass=\"pi pi-code trace-row__action\"\r\n\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('traceDrawer.copyCurl')\"\r\n\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t(click)=\"$event.preventDefault(); $event.stopPropagation(); copyAsCurl(hit)\"></i>\r\n\t\t\t\t\t\t\t\t</summary>\r\n\t\t\t\t\t\t\t\t<div class=\"trace-row__body\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"trace-row__meta\">\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.routeName) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.route') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ hit.routeName }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.sourceApp || hit.sourceModule) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.source') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ hit.sourceApp }}{{ hit.sourceModule ? ' / ' + hit.sourceModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.targetApp || hit.targetModule) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.target') }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ hit.targetApp }}{{ hit.targetModule ? ' / ' + hit.targetModule : '' }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.upstreamHost) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.upstream') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ hit.upstreamHost }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.username) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.user') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ hit.username }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.requestSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.requestSize') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ formatBytes(hit.requestSize) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t@if (hit.responseSize !== undefined) {\r\n\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.responseSize') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ formatBytes(hit.responseSize) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t@if (hit.requestBody) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\">\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.requestBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.requestBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.requestBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (hit.responseBody) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\">\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.responseBody') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t@if (tryParseJson(hit.responseBody); as parsed) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ parsed | json }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<pre>{{ hit.responseBody }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t@if (hasMore()) {\r\n\t\t\t\t\t\t\t<div class=\"aril-trace-drawer__load-more\">\r\n\t\t\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t\t\t[label]=\"t('traceDrawer.loadMore')\"\r\n\t\t\t\t\t\t\t\t\ticon=\"CHEVRON_DOWN\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\t\t\t[loading]=\"loadingMore()\"\r\n\t\t\t\t\t\t\t\t\t[disabled]=\"loadingMore()\"\r\n\t\t\t\t\t\t\t\t\t(clickEvent)=\"loadMore()\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</section>\r\n\t\t\t\t}\r\n\t\t\t\t@if (appLogs().length) {\r\n\t\t\t\t\t<section class=\"aril-trace-drawer__section\">\r\n\t\t\t\t\t\t<h3 class=\"aril-trace-drawer__section-title\">\r\n\t\t\t\t\t\t\t<i class=\"pi pi-list\"></i>\r\n\t\t\t\t\t\t\t{{ t('traceDrawer.appLogsHeader') }}\r\n\t\t\t\t\t\t\t<aril-badge [value]=\"appLogs().length + ' / ' + appLogsTotal()\" [rounded]=\"true\" />\r\n\t\t\t\t\t\t</h3>\r\n\t\t\t\t\t\t@for (log of appLogs(); track log.id) {\r\n\t\t\t\t\t\t\t<details class=\"trace-row trace-row--{{ levelSeverity(log.level) }}\">\r\n\t\t\t\t\t\t\t\t<summary class=\"trace-row__summary\">\r\n\t\t\t\t\t\t\t\t\t<i class=\"pi pi-chevron-right trace-row__chevron\"></i>\r\n\t\t\t\t\t\t\t\t\t@if (log.level) {\r\n\t\t\t\t\t\t\t\t\t\t<aril-badge [value]=\"log.level\" [severity]=\"levelSeverity(log.level)\" />\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.module) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"trace-row__tag\">{{ log.module }}</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t<span class=\"trace-row__main\">{{ log.message }}</span>\r\n\t\t\t\t\t\t\t\t\t@if (log.timestamp) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"trace-row__time\">{{ formatTimestamp(log.timestamp) }}</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</summary>\r\n\t\t\t\t\t\t\t\t<div class=\"trace-row__body\">\r\n\t\t\t\t\t\t\t\t\t@if (log.message) {\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"trace-row__message\">{{ log.message }}</div>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.username || log.app) {\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"trace-row__meta\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if (log.app) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.target') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ log.app }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t@if (log.username) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ t('traceDrawer.user') }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ log.username }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.errorDetail) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\" open>\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.appLogErrorDetail') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t<pre>{{ log.errorDetail }}</pre>\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t@if (log.referenceFields?.length) {\r\n\t\t\t\t\t\t\t\t\t\t<details class=\"trace-row__sub\">\r\n\t\t\t\t\t\t\t\t\t\t\t<summary>{{ t('traceDrawer.appLogRefFields') }}</summary>\r\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"trace-row__meta\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t@for (rf of log.referenceFields; track rf.field) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"meta-label\">{{ rf.field }}</span\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t><span>{{ rf.value }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</details>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t@if (appLogsHasMore()) {\r\n\t\t\t\t\t\t\t<div class=\"aril-trace-drawer__load-more\">\r\n\t\t\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t\t\t[label]=\"t('traceDrawer.loadMore')\"\r\n\t\t\t\t\t\t\t\t\ticon=\"CHEVRON_DOWN\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\t\t\t[loading]=\"appLogsLoadingMore()\"\r\n\t\t\t\t\t\t\t\t\t[disabled]=\"appLogsLoadingMore()\"\r\n\t\t\t\t\t\t\t\t\t(clickEvent)=\"loadMoreAppLogs()\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</section>\r\n\t\t\t\t}\r\n\t\t\t\t@if (!apisixHits().length && !appLogs().length) {\r\n\t\t\t\t\t<div class=\"aril-trace-drawer__state\">\r\n\t\t\t\t\t\t<i class=\"pi pi-inbox\"></i>\r\n\t\t\t\t\t\t<p>{{ t('traceDrawer.empty') }}</p>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t</div>\r\n\t</p-sidebar>\r\n</ng-container>\r\n", styles: [":host ::ng-deep .aril-trace-drawer{display:flex;flex-direction:column;height:100%}:host ::ng-deep .aril-trace-drawer .p-sidebar-header{padding:1rem 1.25rem;border-bottom:1px solid var(--surface-border, #e5e7eb);flex:0 0 auto}:host ::ng-deep .aril-trace-drawer .p-sidebar-content{padding:0;flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden}.aril-trace-drawer__header{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.aril-trace-drawer__header .pi-sitemap{font-size:1.25rem;color:var(--primary-color, #1890ff)}.aril-trace-drawer__title{font-weight:600;font-size:1.1rem}.aril-trace-drawer__chip{font-size:.875rem;padding:.2rem .55rem;border-radius:4px;background:var(--surface-100, #f3f4f6);color:var(--text-color-secondary, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}.aril-trace-drawer__share{cursor:pointer;font-size:1rem;padding:.4rem;border-radius:4px;color:var(--primary-color, #1890ff);transition:background .15s ease}.aril-trace-drawer__share:hover{background:var(--surface-100, #f3f4f6)}.aril-trace-drawer__body{padding:1rem 1.25rem;display:flex;flex-direction:column;gap:1.5rem;min-height:min-content}.aril-trace-drawer__state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:3rem 1rem;color:var(--text-color-secondary, #6b7280);text-align:center;font-size:.95rem}.aril-trace-drawer__state .pi{font-size:2rem}.aril-trace-drawer__state--error .pi{color:var(--red-500, #ef4444)}.aril-trace-drawer__section-title{display:flex;align-items:center;gap:.5rem;margin:0 0 .5rem;font-size:1rem;font-weight:600}.aril-trace-drawer__section-title .pi{color:var(--primary-color, #1890ff)}.trace-row{display:block;border:1px solid var(--surface-border, #e5e7eb);border-left:3px solid var(--surface-border, #e5e7eb);background:var(--surface-card, #ffffff);border-radius:4px;overflow:hidden;transition:background .15s ease,border-color .15s ease,box-shadow .15s ease}.trace-row+.trace-row{margin-top:.4rem}.trace-row:hover{border-top-color:var(--surface-300, #d1d5db);border-right-color:var(--surface-300, #d1d5db);border-bottom-color:var(--surface-300, #d1d5db);box-shadow:0 1px 3px #0000000a}.trace-row[open]{background:var(--surface-50, #fafafa);border-top-color:var(--surface-300, #d1d5db);border-right-color:var(--surface-300, #d1d5db);border-bottom-color:var(--surface-300, #d1d5db);box-shadow:0 1px 4px #0000000d}.trace-row--success{border-left-color:var(--green-500, #22c55e)}.trace-row--info{border-left-color:var(--blue-500, #3b82f6)}.trace-row--warning{border-left-color:var(--orange-500, #f97316)}.trace-row--danger{border-left-color:var(--red-500, #ef4444)}.trace-row--secondary{border-left-color:var(--gray-400, #9ca3af)}.trace-row__summary{cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none;display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem}.trace-row__summary::-webkit-details-marker{display:none}.trace-row__summary:hover{background:var(--surface-50, #fafafa)}.trace-row[open] .trace-row__summary:hover{background:var(--surface-100, #f3f4f6)}.trace-row__chevron{color:var(--text-color-secondary, #6b7280);font-size:.7rem;transition:transform .15s ease;flex-shrink:0}.trace-row[open] .trace-row__chevron{transform:rotate(90deg)}.trace-row__tag{font-weight:600;color:var(--primary-color, #1890ff);font-size:.8rem;white-space:nowrap;flex-shrink:0;letter-spacing:.02em}.trace-row__main{font-size:.85rem;color:var(--text-color, #111827);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.trace-row__time{font-size:.75rem;color:var(--text-color-secondary, #6b7280);font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0}.trace-row__action{cursor:pointer;padding:.25rem;border-radius:4px;color:var(--text-color-secondary, #6b7280);flex-shrink:0;transition:background .15s ease,color .15s ease}.trace-row__action:hover{background:var(--surface-100, #f3f4f6);color:var(--primary-color, #1890ff)}.trace-row__body{padding:.5rem .75rem .75rem;border-top:1px solid var(--surface-border, #e5e7eb);display:flex;flex-direction:column;gap:.5rem;background:var(--surface-0, #ffffff)}.trace-row__message{font-size:.85rem;color:var(--text-color, #111827);line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;background:var(--surface-100, #f3f4f6);border-radius:4px;padding:.5rem .65rem}.trace-row__meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.25rem .75rem;font-size:.8rem}.trace-row__meta>div{display:grid;grid-template-columns:max-content 1fr;column-gap:.4rem;align-items:baseline;min-width:0}.trace-row__meta .meta-label{color:var(--text-color-secondary, #6b7280);font-weight:500}.trace-row__meta .meta-label:after{content:\":\"}.trace-row__meta span:not(.meta-label){color:var(--text-color, #111827);word-break:break-word}.trace-row__sub{margin:0}.trace-row__sub summary{cursor:pointer;font-size:.8rem;color:var(--primary-color, #1890ff);padding:.15rem 0;-webkit-user-select:none;user-select:none}.trace-row__sub summary:hover{text-decoration:underline}.trace-row__sub pre{margin:.25rem 0 0;padding:.5rem .75rem;background:var(--surface-100, #f3f4f6);border-radius:4px;font-size:.78rem;line-height:1.45;max-height:320px;overflow:auto;white-space:pre-wrap;word-break:break-word}.aril-trace-drawer__load-more{display:flex;justify-content:center;margin-top:.5rem}\n"] }]
|
|
145
273
|
}], ctorParameters: () => [], propDecorators: { visibleChange: [{
|
|
146
274
|
type: Output
|
|
147
275
|
}] } });
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdWktYnVzaW5lc3MvdHJhY2UtZHJhd2VyL3NyYy90cmFjZS1kcmF3ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC91aS1idXNpbmVzcy90cmFjZS1kcmF3ZXIvc3JjL3RyYWNlLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sZ0NBQWdDLENBQUM7QUFHeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFhdEQsTUFBTSxPQUFPLG9CQUFvQjtJQXdDaEM7UUF2Q2lCLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTNELFlBQU8sR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDaEMsWUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUNuQyxhQUFRLEdBQUcsS0FBSyxDQUFXLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLFVBQUssR0FBRyxLQUFLLENBQVMsa0JBQWtCLENBQUMsQ0FBQztRQUMxQyxVQUFLLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzlCLGFBQVEsR0FBRyxLQUFLLENBQVMsR0FBRyxDQUFDLENBQUM7UUFDOUIsY0FBUyxHQUFHLEtBQUssRUFBc0IsQ0FBQztRQUN4QyxZQUFPLEdBQUcsS0FBSyxFQUFzQixDQUFDO1FBRTVCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVuQyxZQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLGlCQUFZLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztRQUNyRCxlQUFVLEdBQUcsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXZDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxRQUFRLENBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNoQixTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNyQixJQUFJLENBQUMsZUFBZTthQUNsQixlQUFlLENBQUM7WUFDaEIsT0FBTztZQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksY0FBYztZQUM3QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDO1lBQzVFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRTtTQUNuRCxDQUFDO2FBQ0QsSUFBSSxDQUNKLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksc0JBQXNCLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNGLENBQ0YsQ0FDRCxDQUNELENBQUM7UUFHRCxNQUFNLENBQ0wsR0FBRyxFQUFFO1lBQ0osSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNGLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDO1FBRUYsTUFBTSxDQUNMLEdBQUcsRUFBRTtZQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVTLGVBQWUsQ0FBQyxLQUFjO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFUyxLQUFLO1FBQ2QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLElBQUksRUFBRTtZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUyxjQUFjLENBQUMsTUFBYztRQUN0QyxJQUFJLE1BQU0sSUFBSSxHQUFHO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDbkMsSUFBSSxNQUFNLElBQUksR0FBRztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3BDLElBQUksTUFBTSxJQUFJLEdBQUc7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUNqQyxJQUFJLE1BQU0sSUFBSSxHQUFHO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDcEMsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQztJQUVTLGdCQUFnQixDQUFDLE9BQWU7UUFDekMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksRUFBRSxJQUFJLElBQUk7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUNoQyxJQUFJLEVBQUUsSUFBSSxHQUFHO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDaEMsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVTLGNBQWMsQ0FBQyxPQUEyQjtRQUNuRCxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6RCxNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3pDLElBQUksRUFBRSxHQUFHLElBQUk7WUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzdDLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRVMsV0FBVyxDQUFDLEtBQXlCO1FBQzlDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3RELElBQUksS0FBSyxHQUFHLElBQUk7WUFBRSxPQUFPLEdBQUcsS0FBSyxJQUFJLENBQUM7UUFDdEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbEUsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbkQsQ0FBQztJQUVTLGVBQWUsQ0FBQyxFQUErQjtRQUN4RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckIsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckgsQ0FBQztRQUNELElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRVMsWUFBWSxDQUFDLE9BQTJCO1FBQ2pELElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakgsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUixPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7SUFDRixDQUFDOzhHQXBJVyxvQkFBb0I7a0dBQXBCLG9CQUFvQixxbkNDN0JqQyw4aExBbUhBLGl6RkR6RlcsUUFBUSw0Q0FBRSxlQUFlLGdPQUFFLGFBQWEsbWRBQUUscUJBQXFCLHlNQUFFLGNBQWMsd0xBQUUsZUFBZTs7MkZBRzlGLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDRyxJQUFJLFlBQ04sbUJBQW1CLFdBR3BCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGVBQWUsQ0FBQyxtQkFDMUYsdUJBQXVCLENBQUMsTUFBTTt3REFjckMsYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpzb25QaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5cclxuaW1wb3J0IHsgRU1QVFksIFN1YmplY3QsIGNhdGNoRXJyb3IsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgUHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wcm9ncmVzc3NwaW5uZXInO1xyXG5pbXBvcnQgeyBTaWRlYmFyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zaWRlYmFyJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbG9jb01vZHVsZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnYXJpbC91aS9iYWRnZSc7XHJcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ2FyaWwvdWkvYnV0dG9uJztcclxuaW1wb3J0ICdhcmlsL3V0aWwvcHJpbWl0aXZlLWV4dGVuc2lvbnMnO1xyXG5cclxuaW1wb3J0IHsgQXBpc2l4SGl0IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgVHJhY2VMb2dTZXJ2aWNlIH0gZnJvbSAnLi90cmFjZS1sb2cuc2VydmljZSc7XHJcblxyXG50eXBlIFBvc2l0aW9uID0gJ3JpZ2h0JyB8ICdsZWZ0JztcclxudHlwZSBTZXZlcml0eSA9ICdzdWNjZXNzJyB8ICdzZWNvbmRhcnknIHwgJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgfCAnY29udHJhc3QnIHwgdW5kZWZpbmVkO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c3RhbmRhbG9uZTogdHJ1ZSxcclxuXHRzZWxlY3RvcjogJ2FyaWwtdHJhY2UtZHJhd2VyJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vdHJhY2UtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi90cmFjZS1kcmF3ZXIuY29tcG9uZW50LnNjc3MnXSxcclxuXHRpbXBvcnRzOiBbSnNvblBpcGUsIFRyYW5zbG9jb01vZHVsZSwgU2lkZWJhck1vZHVsZSwgUHJvZ3Jlc3NTcGlubmVyTW9kdWxlLCBCYWRnZUNvbXBvbmVudCwgQnV0dG9uQ29tcG9uZW50XSxcclxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJhY2VEcmF3ZXJDb21wb25lbnQge1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgdHJhY2VMb2dTZXJ2aWNlID0gaW5qZWN0KFRyYWNlTG9nU2VydmljZSk7XHJcblxyXG5cdHZpc2libGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblx0dHJhY2VJZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcclxuXHRwb3NpdGlvbiA9IGlucHV0PFBvc2l0aW9uPigncmlnaHQnKTtcclxuXHR3aWR0aCA9IGlucHV0PHN0cmluZz4oJ21pbig2ODBweCwgOTB2dyknKTtcclxuXHRtb2RhbCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHRwYWdlU2l6ZSA9IGlucHV0PG51bWJlcj4oMTAwKTtcclxuXHRzdGFydFRpbWUgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XHJcblx0ZW5kVGltZSA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4oKTtcclxuXHJcblx0QE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG5cdHByb3RlY3RlZCByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpc2l4SGl0cyA9IHNpZ25hbDxBcGlzaXhIaXRbXT4oW10pO1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblx0cHJpdmF0ZSByZWFkb25seSByZXNwb25zZSA9IHRvU2lnbmFsKFxyXG5cdFx0dGhpcy5yZXF1ZXN0LnBpcGUoXHJcblx0XHRcdHN3aXRjaE1hcCgodHJhY2VJZCkgPT5cclxuXHRcdFx0XHR0aGlzLnRyYWNlTG9nU2VydmljZVxyXG5cdFx0XHRcdFx0LnNlYXJjaEJ5VHJhY2VJZCh7XHJcblx0XHRcdFx0XHRcdHRyYWNlSWQsXHJcblx0XHRcdFx0XHRcdHN0YXJ0VGltZTogdGhpcy5zdGFydFRpbWUoKSA/PyAyMDAwMDEwMTAwMDAwMCxcclxuXHRcdFx0XHRcdFx0ZW5kVGltZTogdGhpcy5lbmRUaW1lKCkgPz8gKG5ldyBEYXRlKCkuZGF0ZVRvTG9uZygndGltZScpID8/IDk5OTkxMjMxMjM1OTU5KSxcclxuXHRcdFx0XHRcdFx0cGFnZXI6IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUoKSwgcGFnZU51bWJlcjogMSB9XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0XHRcdGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JNZXNzYWdlLnNldChlcnI/LmVycm9yPy5tZXNzYWdlID8/IGVycj8ubWVzc2FnZSA/PyAnxLBzdGVrIGJhxZ9hcsSxc8SxeiBvbGR1Jyk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIEVNUFRZO1xyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHQpXHJcblx0XHQpXHJcblx0KTtcclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHRlZmZlY3QoXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy52aXNpYmxlKCkgJiYgdGhpcy50cmFjZUlkKCkpIHtcclxuXHRcdFx0XHRcdHRoaXMuZmV0Y2godGhpcy50cmFjZUlkKCkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0eyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cclxuXHRcdGVmZmVjdChcclxuXHRcdFx0KCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHJlc3AgPSB0aGlzLnJlc3BvbnNlKCk7XHJcblx0XHRcdFx0aWYgKCFyZXNwKSByZXR1cm47XHJcblx0XHRcdFx0dGhpcy5hcGlzaXhIaXRzLnNldChyZXNwLnJlc3BvbnNlPy5yZXN1bHQgPz8gW10pO1xyXG5cdFx0XHRcdHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG5cdFx0XHRcdHRoaXMuZXJyb3JNZXNzYWdlLnNldCh1bmRlZmluZWQpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcblx0XHR0aGlzLnZpc2libGVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgcmV0cnkoKTogdm9pZCB7XHJcblx0XHRjb25zdCBpZCA9IHRoaXMudHJhY2VJZCgpO1xyXG5cdFx0aWYgKGlkKSB0aGlzLmZldGNoKGlkKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZmV0Y2godHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHR0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xyXG5cdFx0dGhpcy5lcnJvck1lc3NhZ2Uuc2V0KHVuZGVmaW5lZCk7XHJcblx0XHR0aGlzLmFwaXNpeEhpdHMuc2V0KFtdKTtcclxuXHRcdHRoaXMucmVxdWVzdC5uZXh0KHRyYWNlSWQpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHN0YXR1c1NldmVyaXR5KHN0YXR1czogbnVtYmVyKTogU2V2ZXJpdHkge1xyXG5cdFx0aWYgKHN0YXR1cyA+PSA1MDApIHJldHVybiAnZGFuZ2VyJztcclxuXHRcdGlmIChzdGF0dXMgPj0gNDAwKSByZXR1cm4gJ3dhcm5pbmcnO1xyXG5cdFx0aWYgKHN0YXR1cyA+PSAzMDApIHJldHVybiAnaW5mbyc7XHJcblx0XHRpZiAoc3RhdHVzID49IDIwMCkgcmV0dXJuICdzdWNjZXNzJztcclxuXHRcdHJldHVybiAnc2Vjb25kYXJ5JztcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBkdXJhdGlvblNldmVyaXR5KHNlY29uZHM6IG51bWJlcik6IFNldmVyaXR5IHtcclxuXHRcdGNvbnN0IG1zID0gKHNlY29uZHMgPz8gMCkgKiAxMDAwO1xyXG5cdFx0aWYgKG1zID49IDEwMDApIHJldHVybiAnZGFuZ2VyJztcclxuXHRcdGlmIChtcyA+PSAyMDApIHJldHVybiAnd2FybmluZyc7XHJcblx0XHRyZXR1cm4gJ3N1Y2Nlc3MnO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGZvcm1hdER1cmF0aW9uKHNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRpZiAoc2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZHMgPT09IG51bGwpIHJldHVybiAnJztcclxuXHRcdGNvbnN0IG1zID0gc2Vjb25kcyAqIDEwMDA7XHJcblx0XHRpZiAobXMgPCAxKSByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX0gbXNgO1xyXG5cdFx0aWYgKG1zIDwgMTAwMCkgcmV0dXJuIGAke01hdGgucm91bmQobXMpfSBtc2A7XHJcblx0XHRyZXR1cm4gYCR7KG1zIC8gMTAwMCkudG9GaXhlZCgyKX0gc2A7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRpZiAoYnl0ZXMgPT09IHVuZGVmaW5lZCB8fCBieXRlcyA9PT0gbnVsbCkgcmV0dXJuICctJztcclxuXHRcdGlmIChieXRlcyA8IDEwMjQpIHJldHVybiBgJHtieXRlc30gQmA7XHJcblx0XHRpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcclxuXHRcdHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfSBNQmA7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgZm9ybWF0VGltZXN0YW1wKHRzOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG5cdFx0aWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwgfHwgdHMgPT09ICcnKSByZXR1cm4gJyc7XHJcblx0XHRpZiAodHlwZW9mIHRzID09PSAnc3RyaW5nJykgcmV0dXJuIHRzO1xyXG5cdFx0Y29uc3QgcyA9IFN0cmluZyh0cyk7XHJcblx0XHRpZiAocy5sZW5ndGggPT09IDE0KSB7XHJcblx0XHRcdHJldHVybiBgJHtzLnNsaWNlKDgsIDEwKX06JHtzLnNsaWNlKDEwLCAxMil9OiR7cy5zbGljZSgxMiwgMTQpfSAke3Muc2xpY2UoNiwgOCl9LiR7cy5zbGljZSg0LCA2KX0uJHtzLnNsaWNlKDAsIDQpfWA7XHJcblx0XHR9XHJcblx0XHRpZiAodHMgPiAxZTExKSB7XHJcblx0XHRcdHJldHVybiBuZXcgRGF0ZSh0cykudG9Mb2NhbGVTdHJpbmcoKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBzO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHRyeVBhcnNlSnNvbihjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB1bmtub3duIHtcclxuXHRcdGlmICghY29udGVudCkgcmV0dXJuIG51bGw7XHJcblx0XHRjb25zdCB0cmltbWVkID0gY29udGVudC50cmltKCk7XHJcblx0XHRpZiAoISgodHJpbW1lZC5zdGFydHNXaXRoKCd7JykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnfScpKSB8fCAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKTtcclxuXHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqdHJhbnNsb2NvPVwibGV0IHRcIj5cclxuXHQ8cC1zaWRlYmFyXHJcblx0XHRbdmlzaWJsZV09XCJ2aXNpYmxlKClcIlxyXG5cdFx0KHZpc2libGVDaGFuZ2UpPVwib25WaXNpYmxlQ2hhbmdlKCRldmVudClcIlxyXG5cdFx0W3Bvc2l0aW9uXT1cInBvc2l0aW9uKClcIlxyXG5cdFx0W3N0eWxlXT1cInsgd2lkdGg6IHdpZHRoKCkgfVwiXHJcblx0XHRbbW9kYWxdPVwibW9kYWwoKVwiXHJcblx0XHRbZGlzbWlzc2libGVdPVwidHJ1ZVwiXHJcblx0XHRbc2hvd0Nsb3NlSWNvbl09XCJ0cnVlXCJcclxuXHRcdHN0eWxlQ2xhc3M9XCJhcmlsLXRyYWNlLWRyYXdlclwiPlxyXG5cdFx0PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX2hlYWRlclwiPlxyXG5cdFx0XHRcdDxpIGNsYXNzPVwicGkgcGktc2l0ZW1hcFwiPjwvaT5cclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX190aXRsZVwiPnt7IHQoJ3RyYWNlRHJhd2VyLnRpdGxlJykgfX08L3NwYW4+XHJcblx0XHRcdFx0PGNvZGUgY2xhc3M9XCJhcmlsLXRyYWNlLWRyYXdlcl9fY2hpcFwiIFt0aXRsZV09XCJ0cmFjZUlkKClcIj57eyB0cmFjZUlkKCkgfX08L2NvZGU+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHJcblx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX2JvZHlcIj5cclxuXHRcdFx0QGlmIChsb2FkaW5nKCkpIHtcclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX3N0YXRlXCI+XHJcblx0XHRcdFx0XHQ8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIzXCIgc3R5bGVDbGFzcz1cInctM3JlbSBoLTNyZW1cIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxyXG5cdFx0XHRcdFx0PHNwYW4+e3sgdCgndHJhY2VEcmF3ZXIubG9hZGluZycpIH19PC9zcGFuPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHR9IEBlbHNlIGlmIChlcnJvck1lc3NhZ2UoKSkge1xyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJhcmlsLXRyYWNlLWRyYXdlcl9fc3RhdGUgYXJpbC10cmFjZS1kcmF3ZXJfX3N0YXRlLS1lcnJvclwiPlxyXG5cdFx0XHRcdFx0PGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvaT5cclxuXHRcdFx0XHRcdDxwPnt7IGVycm9yTWVzc2FnZSgpIH19PC9wPlxyXG5cdFx0XHRcdFx0PGFyaWwtYnV0dG9uXHJcblx0XHRcdFx0XHRcdFtsYWJlbF09XCJ0KCd0cmFjZURyYXdlci5yZXRyeScpXCJcclxuXHRcdFx0XHRcdFx0aWNvbj1cIlJFRlJFU0hcIlxyXG5cdFx0XHRcdFx0XHRjb2xvcj1cInByaW1hcnlcIlxyXG5cdFx0XHRcdFx0XHQoY2xpY2tFdmVudCk9XCJyZXRyeSgpXCIgLz5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0fSBAZWxzZSBpZiAoYXBpc2l4SGl0cygpLmxlbmd0aCkge1xyXG5cdFx0XHRcdDxzZWN0aW9uIGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX3NlY3Rpb25cIj5cclxuXHRcdFx0XHRcdDxoMyBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX19zZWN0aW9uLXRpdGxlXCI+XHJcblx0XHRcdFx0XHRcdDxpIGNsYXNzPVwicGkgcGktZ2xvYmVcIj48L2k+XHJcblx0XHRcdFx0XHRcdHt7IHQoJ3RyYWNlRHJhd2VyLmFwaXNpeEhlYWRlcicpIH19XHJcblx0XHRcdFx0XHRcdDxhcmlsLWJhZGdlIFt2YWx1ZV09XCJhcGlzaXhIaXRzKCkubGVuZ3RoLnRvU3RyaW5nKClcIiBzZXZlcml0eT1cImluZm9cIiBbcm91bmRlZF09XCJ0cnVlXCIgLz5cclxuXHRcdFx0XHRcdDwvaDM+XHJcblx0XHRcdFx0XHRAZm9yIChoaXQgb2YgYXBpc2l4SGl0cygpOyB0cmFjayBoaXQuaWQpIHtcclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFwaXNpeC1jYXJkXCI+XHJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFwaXNpeC1jYXJkX19oZWFkXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YXJpbC1iYWRnZSBbdmFsdWVdPVwiaGl0LnN0YXR1cy50b1N0cmluZygpXCIgW3NldmVyaXR5XT1cInN0YXR1c1NldmVyaXR5KGhpdC5zdGF0dXMpXCIgLz5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiYXBpc2l4LWNhcmRfX21ldGhvZFwiPnt7IGhpdC5yZXF1ZXN0TWV0aG9kIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJhcGlzaXgtY2FyZF9fdXJpXCIgW3RpdGxlXT1cImhpdC5yZXF1ZXN0VXJpXCI+e3sgaGl0LnJlcXVlc3RVcmkgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YXJpbC1iYWRnZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRbdmFsdWVdPVwiZm9ybWF0RHVyYXRpb24oaGl0LnJlc3BvbnNlVGltZSlcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRbc2V2ZXJpdHldPVwiZHVyYXRpb25TZXZlcml0eShoaXQucmVzcG9uc2VUaW1lKVwiIC8+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFwaXNpeC1jYXJkX19tZXRhXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC5yb3V0ZU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj48c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyB0KCd0cmFjZURyYXdlci5yb3V0ZScpIH19PC9zcGFuPjxzcGFuPnt7IGhpdC5yb3V0ZU5hbWUgfX08L3NwYW4+PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC50aW1lc3RhbXApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj48c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyB0KCd0cmFjZURyYXdlci50aW1lc3RhbXAnKSB9fTwvc3Bhbj48c3Bhbj57eyBmb3JtYXRUaW1lc3RhbXAoaGl0LnRpbWVzdGFtcCkgfX08L3NwYW4+PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC5zb3VyY2VBcHAgfHwgaGl0LnNvdXJjZU1vZHVsZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnNvdXJjZScpIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGhpdC5zb3VyY2VBcHAgfX17eyBoaXQuc291cmNlTW9kdWxlID8gJyAvICcgKyBoaXQuc291cmNlTW9kdWxlIDogJycgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0QGlmIChoaXQudGFyZ2V0QXBwIHx8IGhpdC50YXJnZXRNb2R1bGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyB0KCd0cmFjZURyYXdlci50YXJnZXQnKSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj57eyBoaXQudGFyZ2V0QXBwIH19e3sgaGl0LnRhcmdldE1vZHVsZSA/ICcgLyAnICsgaGl0LnRhcmdldE1vZHVsZSA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnVwc3RyZWFtSG9zdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2PjxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnVwc3RyZWFtJykgfX08L3NwYW4+PHNwYW4+e3sgaGl0LnVwc3RyZWFtSG9zdCB9fTwvc3Bhbj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnVzZXJuYW1lKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+PHNwYW4gY2xhc3M9XCJtZXRhLWxhYmVsXCI+e3sgdCgndHJhY2VEcmF3ZXIudXNlcicpIH19PC9zcGFuPjxzcGFuPnt7IGhpdC51c2VybmFtZSB9fTwvc3Bhbj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnJlcXVlc3RTaXplICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdj48c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyB0KCd0cmFjZURyYXdlci5yZXF1ZXN0U2l6ZScpIH19PC9zcGFuPjxzcGFuPnt7IGZvcm1hdEJ5dGVzKGhpdC5yZXF1ZXN0U2l6ZSkgfX08L3NwYW4+PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC5yZXNwb25zZVNpemUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2PjxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnJlc3BvbnNlU2l6ZScpIH19PC9zcGFuPjxzcGFuPnt7IGZvcm1hdEJ5dGVzKGhpdC5yZXNwb25zZVNpemUpIH19PC9zcGFuPjwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnJlcXVlc3RCb2R5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGV0YWlscyBjbGFzcz1cImFwaXNpeC1jYXJkX19ib2R5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzdW1tYXJ5Pnt7IHQoJ3RyYWNlRHJhd2VyLnJlcXVlc3RCb2R5JykgfX08L3N1bW1hcnk+XHJcblx0XHRcdFx0XHRcdFx0XHRcdEBpZiAodHJ5UGFyc2VKc29uKGhpdC5yZXF1ZXN0Qm9keSk7IGFzIHBhcnNlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxwcmU+e3sgcGFyc2VkIHwganNvbiB9fTwvcHJlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlPnt7IGhpdC5yZXF1ZXN0Qm9keSB9fTwvcHJlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2RldGFpbHM+XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnJlc3BvbnNlQm9keSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0PGRldGFpbHMgY2xhc3M9XCJhcGlzaXgtY2FyZF9fYm9keVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3VtbWFyeT57eyB0KCd0cmFjZURyYXdlci5yZXNwb25zZUJvZHknKSB9fTwvc3VtbWFyeT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0QGlmICh0cnlQYXJzZUpzb24oaGl0LnJlc3BvbnNlQm9keSk7IGFzIHBhcnNlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxwcmU+e3sgcGFyc2VkIHwganNvbiB9fTwvcHJlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlPnt7IGhpdC5yZXNwb25zZUJvZHkgfX08L3ByZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0PC9kZXRhaWxzPlxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0PC9zZWN0aW9uPlxyXG5cdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX3N0YXRlXCI+XHJcblx0XHRcdFx0XHQ8aSBjbGFzcz1cInBpIHBpLWluYm94XCI+PC9pPlxyXG5cdFx0XHRcdFx0PHA+e3sgdCgndHJhY2VEcmF3ZXIuZW1wdHknKSB9fTwvcD5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0fVxyXG5cdFx0PC9kaXY+XHJcblx0PC9wLXNpZGViYXI+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdWktYnVzaW5lc3MvdHJhY2UtZHJhd2VyL3NyYy90cmFjZS1kcmF3ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC91aS1idXNpbmVzcy90cmFjZS1kcmF3ZXIvc3JjL3RyYWNlLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEksT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxN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O0lBQ0YsQ0FBQzs4R0FoUlcsb0JBQW9CO2tHQUFwQixvQkFBb0IscW5DQ2pDakMsd2lXQTBPQSw0MEtENU1XLFFBQVEsNENBQUUsZUFBZSxnT0FBRSxhQUFhLG1kQUFFLHFCQUFxQix3TUFBRSxhQUFhLHNYQUFFLGNBQWMsd0xBQUUsZUFBZTs7MkZBRzdHLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDRyxJQUFJLFlBQ04sbUJBQW1CLFdBR3BCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUMsbUJBQ3pHLHVCQUF1QixDQUFDLE1BQU07d0RBa0JyQyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSnNvblBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5cclxuaW1wb3J0IHsgRU1QVFksIFN1YmplY3QsIGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Byb2dyZXNzc3Bpbm5lcic7XHJcbmltcG9ydCB7IFNpZGViYXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NpZGViYXInO1xyXG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbG9jb01vZHVsZSwgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuaW1wb3J0IHsgS2V5Y2xvYWtTZXJ2aWNlIH0gZnJvbSAna2V5Y2xvYWstYW5ndWxhcic7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5cclxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tICdhcmlsL3VpL2JhZGdlJztcclxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnYXJpbC91aS9idXR0b24nO1xyXG5pbXBvcnQgJ2FyaWwvdXRpbC9wcmltaXRpdmUtZXh0ZW5zaW9ucyc7XHJcblxyXG5pbXBvcnQgeyBBcHBMb2dTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlzaXhIaXQsIEFwcExvZ0l0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBUcmFjZUxvZ1NlcnZpY2UgfSBmcm9tICcuL3RyYWNlLWxvZy5zZXJ2aWNlJztcclxuXHJcbnR5cGUgUG9zaXRpb24gPSAncmlnaHQnIHwgJ2xlZnQnO1xyXG50eXBlIFNldmVyaXR5ID0gJ3N1Y2Nlc3MnIHwgJ3NlY29uZGFyeScgfCAnaW5mbycgfCAnd2FybmluZycgfCAnZGFuZ2VyJyB8ICdjb250cmFzdCcgfCB1bmRlZmluZWQ7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdHNlbGVjdG9yOiAnYXJpbC10cmFjZS1kcmF3ZXInLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi90cmFjZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL3RyYWNlLWRyYXdlci5jb21wb25lbnQuc2NzcyddLFxyXG5cdGltcG9ydHM6IFtKc29uUGlwZSwgVHJhbnNsb2NvTW9kdWxlLCBTaWRlYmFyTW9kdWxlLCBQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIFRvb2x0aXBNb2R1bGUsIEJhZGdlQ29tcG9uZW50LCBCdXR0b25Db21wb25lbnRdLFxyXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmFjZURyYXdlckNvbXBvbmVudCB7XHJcblx0cHJpdmF0ZSByZWFkb25seSB0cmFjZUxvZ1NlcnZpY2UgPSBpbmplY3QoVHJhY2VMb2dTZXJ2aWNlKTtcclxuXHRwcml2YXRlIHJlYWRvbmx5IGFwcExvZ1NlcnZpY2UgPSBpbmplY3QoQXBwTG9nU2VydmljZSk7XHJcblx0cHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZSA9IGluamVjdChNZXNzYWdlU2VydmljZSk7XHJcblx0cHJpdmF0ZSByZWFkb25seSB0cmFuc2xvY29TZXJ2aWNlID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xyXG5cdHByaXZhdGUgcmVhZG9ubHkga2V5Y2xvYWtTZXJ2aWNlID0gaW5qZWN0KEtleWNsb2FrU2VydmljZSk7XHJcblxyXG5cdHZpc2libGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcblx0dHJhY2VJZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcclxuXHRwb3NpdGlvbiA9IGlucHV0PFBvc2l0aW9uPigncmlnaHQnKTtcclxuXHR3aWR0aCA9IGlucHV0PHN0cmluZz4oJ21pbig2ODBweCwgOTB2dyknKTtcclxuXHRtb2RhbCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHRwYWdlU2l6ZSA9IGlucHV0PG51bWJlcj4oMTApO1xyXG5cdHN0YXJ0VGltZSA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4oKTtcclxuXHRlbmRUaW1lID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkPigpO1xyXG5cclxuXHRAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG5cdHByb3RlY3RlZCByZWFkb25seSBsb2FkaW5nTW9yZSA9IHNpZ25hbChmYWxzZSk7XHJcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGFwaXNpeEhpdHMgPSBzaWduYWw8QXBpc2l4SGl0W10+KFtdKTtcclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxJdGVtID0gc2lnbmFsKDApO1xyXG5cdHByb3RlY3RlZCByZWFkb25seSBwYWdlTnVtYmVyID0gc2lnbmFsKDEpO1xyXG5cclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwTG9ncyA9IHNpZ25hbDxBcHBMb2dJdGVtW10+KFtdKTtcclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwTG9nc0xvYWRpbmdNb3JlID0gc2lnbmFsKGZhbHNlKTtcclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwTG9nc1RvdGFsID0gc2lnbmFsKDApO1xyXG5cdHByb3RlY3RlZCByZWFkb25seSBhcHBMb2dzUGFnZSA9IHNpZ25hbCgxKTtcclxuXHJcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGhhc01vcmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmFwaXNpeEhpdHMoKS5sZW5ndGggPCB0aGlzLnRvdGFsSXRlbSgpKTtcclxuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwTG9nc0hhc01vcmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmFwcExvZ3MoKS5sZW5ndGggPCB0aGlzLmFwcExvZ3NUb3RhbCgpKTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSByZXF1ZXN0ID0gbmV3IFN1YmplY3Q8eyB0cmFjZUlkOiBzdHJpbmc7IHBhZ2VOdW1iZXI6IG51bWJlcjsgYXBwZW5kOiBib29sZWFuIH0+KCk7XHJcblx0cHJpdmF0ZSByZWFkb25seSBhcHBMb2dzUmVxdWVzdCA9IG5ldyBTdWJqZWN0PHsgdHJhY2VJZDogc3RyaW5nOyBwYWdlTnVtYmVyOiBudW1iZXI7IGFwcGVuZDogYm9vbGVhbiB9PigpO1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgcmVzcG9uc2UgPSB0b1NpZ25hbChcclxuXHRcdHRoaXMucmVxdWVzdC5waXBlKFxyXG5cdFx0XHRzd2l0Y2hNYXAoKHJlcSkgPT5cclxuXHRcdFx0XHR0aGlzLnRyYWNlTG9nU2VydmljZVxyXG5cdFx0XHRcdFx0LnNlYXJjaEJ5VHJhY2VJZCh7XHJcblx0XHRcdFx0XHRcdHRyYWNlSWQ6IHJlcS50cmFjZUlkLFxyXG5cdFx0XHRcdFx0XHRzdGFydFRpbWU6IHRoaXMuc3RhcnRUaW1lKCkgPz8gMjAwMDAxMDEwMDAwMDAsXHJcblx0XHRcdFx0XHRcdGVuZFRpbWU6IHRoaXMuZW5kVGltZSgpID8/IChuZXcgRGF0ZSgpLmRhdGVUb0xvbmcoJ3RpbWUnKSA/PyA5OTk5MTIzMTIzNTk1OSksXHJcblx0XHRcdFx0XHRcdHBhZ2VyOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplKCksIHBhZ2VOdW1iZXI6IHJlcS5wYWdlTnVtYmVyIH1cclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQucGlwZShcclxuXHRcdFx0XHRcdFx0bWFwKChyZXNwKSA9PiAoeyByZXNwLCBhcHBlbmQ6IHJlcS5hcHBlbmQgfSkpLFxyXG5cdFx0XHRcdFx0XHRjYXRjaEVycm9yKChlcnIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9yTWVzc2FnZS5zZXQoZXJyPy5lcnJvcj8ubWVzc2FnZSA/PyBlcnI/Lm1lc3NhZ2UgPz8gJ8Swc3RlayBiYcWfYXLEsXPEsXogb2xkdScpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9hZGluZ01vcmUuc2V0KGZhbHNlKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gRU1QVFk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdClcclxuXHQpO1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGFwcExvZ3NSZXNwb25zZSA9IHRvU2lnbmFsKFxyXG5cdFx0dGhpcy5hcHBMb2dzUmVxdWVzdC5waXBlKFxyXG5cdFx0XHRzd2l0Y2hNYXAoKHJlcSkgPT5cclxuXHRcdFx0XHR0aGlzLmFwcExvZ1NlcnZpY2VcclxuXHRcdFx0XHRcdC5zZWFyY2hCeVRyYWNlSWQoe1xyXG5cdFx0XHRcdFx0XHR0cmFjZUlkOiByZXEudHJhY2VJZCxcclxuXHRcdFx0XHRcdFx0c3RhcnRUaW1lOiB0aGlzLnN0YXJ0VGltZSgpID8/IDIwMDAwMTAxMDAwMDAwLFxyXG5cdFx0XHRcdFx0XHRlbmRUaW1lOiB0aGlzLmVuZFRpbWUoKSA/PyAobmV3IERhdGUoKS5kYXRlVG9Mb25nKCd0aW1lJykgPz8gOTk5OTEyMzEyMzU5NTkpLFxyXG5cdFx0XHRcdFx0XHRwYWdlcjogeyBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSgpLCBwYWdlTnVtYmVyOiByZXEucGFnZU51bWJlciB9XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0XHRcdG1hcCgocmVzcCkgPT4gKHsgcmVzcCwgYXBwZW5kOiByZXEuYXBwZW5kIH0pKSxcclxuXHRcdFx0XHRcdFx0Y2F0Y2hFcnJvcigoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBMb2dzTG9hZGluZ01vcmUuc2V0KGZhbHNlKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gRU1QVFk7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdClcclxuXHQpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdGVmZmVjdChcclxuXHRcdFx0KCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLnZpc2libGUoKSAmJiB0aGlzLnRyYWNlSWQoKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5mZXRjaCh0aGlzLnRyYWNlSWQoKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cclxuXHRcdCk7XHJcblxyXG5cdFx0ZWZmZWN0KFxyXG5cdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgd3JhcHBlZCA9IHRoaXMucmVzcG9uc2UoKTtcclxuXHRcdFx0XHRpZiAoIXdyYXBwZWQpIHJldHVybjtcclxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB3cmFwcGVkLnJlc3AucmVzcG9uc2U/LnJlc3VsdCA/PyBbXTtcclxuXHRcdFx0XHRjb25zdCB0b3RhbCA9IHdyYXBwZWQucmVzcC5yZXNwb25zZT8ucmVzdWx0SW5mbz8udG90YWxJdGVtID8/IDA7XHJcblx0XHRcdFx0dGhpcy5hcGlzaXhIaXRzLnVwZGF0ZSgocHJldikgPT4gKHdyYXBwZWQuYXBwZW5kID8gWy4uLnByZXYsIC4uLnJlc3VsdF0gOiByZXN1bHQpKTtcclxuXHRcdFx0XHR0aGlzLnRvdGFsSXRlbS5zZXQodG90YWwpO1xyXG5cdFx0XHRcdHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG5cdFx0XHRcdHRoaXMubG9hZGluZ01vcmUuc2V0KGZhbHNlKTtcclxuXHRcdFx0XHR0aGlzLmVycm9yTWVzc2FnZS5zZXQodW5kZWZpbmVkKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0eyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cclxuXHRcdGVmZmVjdChcclxuXHRcdFx0KCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHdyYXBwZWQgPSB0aGlzLmFwcExvZ3NSZXNwb25zZSgpO1xyXG5cdFx0XHRcdGlmICghd3JhcHBlZCkgcmV0dXJuO1xyXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHdyYXBwZWQucmVzcC5yZXNwb25zZT8ucmVzdWx0ID8/IFtdO1xyXG5cdFx0XHRcdGNvbnN0IHRvdGFsID0gd3JhcHBlZC5yZXNwLnJlc3BvbnNlPy5yZXN1bHRJbmZvPy50b3RhbEl0ZW0gPz8gMDtcclxuXHRcdFx0XHR0aGlzLmFwcExvZ3MudXBkYXRlKChwcmV2KSA9PiAod3JhcHBlZC5hcHBlbmQgPyBbLi4ucHJldiwgLi4ucmVzdWx0XSA6IHJlc3VsdCkpO1xyXG5cdFx0XHRcdHRoaXMuYXBwTG9nc1RvdGFsLnNldCh0b3RhbCk7XHJcblx0XHRcdFx0dGhpcy5hcHBMb2dzTG9hZGluZ01vcmUuc2V0KGZhbHNlKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0eyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGxvYWRNb3JlKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaWQgPSB0aGlzLnRyYWNlSWQoKTtcclxuXHRcdGlmICghaWQgfHwgdGhpcy5sb2FkaW5nTW9yZSgpIHx8ICF0aGlzLmhhc01vcmUoKSkgcmV0dXJuO1xyXG5cdFx0Y29uc3QgbmV4dCA9IHRoaXMucGFnZU51bWJlcigpICsgMTtcclxuXHRcdHRoaXMucGFnZU51bWJlci5zZXQobmV4dCk7XHJcblx0XHR0aGlzLmxvYWRpbmdNb3JlLnNldCh0cnVlKTtcclxuXHRcdHRoaXMucmVxdWVzdC5uZXh0KHsgdHJhY2VJZDogaWQsIHBhZ2VOdW1iZXI6IG5leHQsIGFwcGVuZDogdHJ1ZSB9KTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBsb2FkTW9yZUFwcExvZ3MoKTogdm9pZCB7XHJcblx0XHRjb25zdCBpZCA9IHRoaXMudHJhY2VJZCgpO1xyXG5cdFx0aWYgKCFpZCB8fCB0aGlzLmFwcExvZ3NMb2FkaW5nTW9yZSgpIHx8ICF0aGlzLmFwcExvZ3NIYXNNb3JlKCkpIHJldHVybjtcclxuXHRcdGNvbnN0IG5leHQgPSB0aGlzLmFwcExvZ3NQYWdlKCkgKyAxO1xyXG5cdFx0dGhpcy5hcHBMb2dzUGFnZS5zZXQobmV4dCk7XHJcblx0XHR0aGlzLmFwcExvZ3NMb2FkaW5nTW9yZS5zZXQodHJ1ZSk7XHJcblx0XHR0aGlzLmFwcExvZ3NSZXF1ZXN0Lm5leHQoeyB0cmFjZUlkOiBpZCwgcGFnZU51bWJlcjogbmV4dCwgYXBwZW5kOiB0cnVlIH0pO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0dGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHJldHJ5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaWQgPSB0aGlzLnRyYWNlSWQoKTtcclxuXHRcdGlmIChpZCkgdGhpcy5mZXRjaChpZCk7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgc2hhcmVMaW5rKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaWQgPSB0aGlzLnRyYWNlSWQoKTtcclxuXHRcdGlmICghaWQpIHJldHVybjtcclxuXHRcdGNvbnN0IGJhc2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdO1xyXG5cdFx0Y29uc3QgdXJsID0gYCR7YmFzZX0/dHJhY2VJZD0ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YDtcclxuXHRcdG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHVybCkudGhlbigoKSA9PiB7XHJcblx0XHRcdHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuXHRcdFx0XHRzZXZlcml0eTogJ3N1Y2Nlc3MnLFxyXG5cdFx0XHRcdHN1bW1hcnk6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ3RyYWNlRHJhd2VyLmxpbmtDb3BpZWQnKSxcclxuXHRcdFx0XHRrZXk6ICd0b2FzdC1yb290J1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGFzeW5jIGNvcHlBc0N1cmwoaGl0OiBBcGlzaXhIaXQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5rZXljbG9ha1NlcnZpY2UuZ2V0VG9rZW4oKS5jYXRjaCgoKSA9PiAnJyk7XHJcblx0XHRjb25zdCBjbWQgPSB0aGlzLmJ1aWxkQ3VybChoaXQsIHRva2VuKTtcclxuXHRcdGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNtZCk7XHJcblx0XHR0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcblx0XHRcdHNldmVyaXR5OiAnc3VjY2VzcycsXHJcblx0XHRcdHN1bW1hcnk6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ3RyYWNlRHJhd2VyLmN1cmxDb3BpZWQnKSxcclxuXHRcdFx0a2V5OiAndG9hc3Qtcm9vdCdcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBidWlsZEN1cmwoaGl0OiBBcGlzaXhIaXQsIHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0Y29uc3QgbWV0aG9kID0gKGhpdC5yZXF1ZXN0TWV0aG9kID8/ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xyXG5cdFx0Y29uc3QgaG9zdCA9IGhpdC51cHN0cmVhbUhvc3QgPyBoaXQudXBzdHJlYW1Ib3N0LnJlcGxhY2UoL1xcLyskLywgJycpIDogJyc7XHJcblx0XHRjb25zdCB1cmkgPSBoaXQucmVxdWVzdFVyaSA/PyAnJztcclxuXHRcdGNvbnN0IHVybCA9IGhvc3QgPyAoaG9zdC5zdGFydHNXaXRoKCdodHRwJykgPyBgJHtob3N0fSR7dXJpfWAgOiBgaHR0cHM6Ly8ke2hvc3R9JHt1cml9YCkgOiB1cmk7XHJcblx0XHRjb25zdCBlc2NhcGUgPSAoczogc3RyaW5nKSA9PiBzLnJlcGxhY2UoLycvZywgYCdcXFxcJydgKTtcclxuXHRcdGNvbnN0IGxpbmVzID0gW2BjdXJsIC1YICR7bWV0aG9kfSAnJHtlc2NhcGUodXJsKX0nYF07XHJcblx0XHRpZiAodG9rZW4pIGxpbmVzLnB1c2goYC1IICdBdXRob3JpemF0aW9uOiBCZWFyZXIgJHtlc2NhcGUodG9rZW4pfSdgKTtcclxuXHRcdGNvbnN0IGJvZHkgPSBoaXQucmVxdWVzdEJvZHk/LnRyaW0oKTtcclxuXHRcdGlmIChib2R5KSB7XHJcblx0XHRcdGNvbnN0IGlzSnNvbiA9IChib2R5LnN0YXJ0c1dpdGgoJ3snKSAmJiBib2R5LmVuZHNXaXRoKCd9JykpIHx8IChib2R5LnN0YXJ0c1dpdGgoJ1snKSAmJiBib2R5LmVuZHNXaXRoKCddJykpO1xyXG5cdFx0XHRpZiAoaXNKc29uKSBsaW5lcy5wdXNoKGAtSCAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJ2ApO1xyXG5cdFx0XHRsaW5lcy5wdXNoKGAtZCAnJHtlc2NhcGUoYm9keSl9J2ApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpbmVzLmpvaW4oJyBcXFxcXFxuICAnKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZmV0Y2godHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHR0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xyXG5cdFx0dGhpcy5lcnJvck1lc3NhZ2Uuc2V0KHVuZGVmaW5lZCk7XHJcblx0XHR0aGlzLmFwaXNpeEhpdHMuc2V0KFtdKTtcclxuXHRcdHRoaXMudG90YWxJdGVtLnNldCgwKTtcclxuXHRcdHRoaXMucGFnZU51bWJlci5zZXQoMSk7XHJcblx0XHR0aGlzLmFwcExvZ3Muc2V0KFtdKTtcclxuXHRcdHRoaXMuYXBwTG9nc1RvdGFsLnNldCgwKTtcclxuXHRcdHRoaXMuYXBwTG9nc1BhZ2Uuc2V0KDEpO1xyXG5cdFx0dGhpcy5yZXF1ZXN0Lm5leHQoeyB0cmFjZUlkLCBwYWdlTnVtYmVyOiAxLCBhcHBlbmQ6IGZhbHNlIH0pO1xyXG5cdFx0dGhpcy5hcHBMb2dzUmVxdWVzdC5uZXh0KHsgdHJhY2VJZCwgcGFnZU51bWJlcjogMSwgYXBwZW5kOiBmYWxzZSB9KTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBzdGF0dXNTZXZlcml0eShzdGF0dXM6IG51bWJlcik6IFNldmVyaXR5IHtcclxuXHRcdGlmIChzdGF0dXMgPj0gNTAwKSByZXR1cm4gJ2Rhbmdlcic7XHJcblx0XHRpZiAoc3RhdHVzID49IDQwMCkgcmV0dXJuICd3YXJuaW5nJztcclxuXHRcdGlmIChzdGF0dXMgPj0gMzAwKSByZXR1cm4gJ2luZm8nO1xyXG5cdFx0aWYgKHN0YXR1cyA+PSAyMDApIHJldHVybiAnc3VjY2Vzcyc7XHJcblx0XHRyZXR1cm4gJ3NlY29uZGFyeSc7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgbGV2ZWxTZXZlcml0eShsZXZlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogU2V2ZXJpdHkge1xyXG5cdFx0c3dpdGNoICgobGV2ZWwgPz8gJycpLnRvVXBwZXJDYXNlKCkpIHtcclxuXHRcdFx0Y2FzZSAnRVJST1InOlxyXG5cdFx0XHRjYXNlICdGQVRBTCc6XHJcblx0XHRcdFx0cmV0dXJuICdkYW5nZXInO1xyXG5cdFx0XHRjYXNlICdXQVJOJzpcclxuXHRcdFx0Y2FzZSAnV0FSTklORyc6XHJcblx0XHRcdFx0cmV0dXJuICd3YXJuaW5nJztcclxuXHRcdFx0Y2FzZSAnSU5GTyc6XHJcblx0XHRcdFx0cmV0dXJuICdpbmZvJztcclxuXHRcdFx0Y2FzZSAnREVCVUcnOlxyXG5cdFx0XHRjYXNlICdUUkFDRSc6XHJcblx0XHRcdFx0cmV0dXJuICdzZWNvbmRhcnknO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiAnc2Vjb25kYXJ5JztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBkdXJhdGlvblNldmVyaXR5KHNlY29uZHM6IG51bWJlcik6IFNldmVyaXR5IHtcclxuXHRcdGNvbnN0IG1zID0gKHNlY29uZHMgPz8gMCkgKiAxMDAwO1xyXG5cdFx0aWYgKG1zID49IDEwMDApIHJldHVybiAnZGFuZ2VyJztcclxuXHRcdGlmIChtcyA+PSAyMDApIHJldHVybiAnd2FybmluZyc7XHJcblx0XHRyZXR1cm4gJ3N1Y2Nlc3MnO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIGZvcm1hdER1cmF0aW9uKHNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRpZiAoc2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZHMgPT09IG51bGwpIHJldHVybiAnJztcclxuXHRcdGNvbnN0IG1zID0gc2Vjb25kcyAqIDEwMDA7XHJcblx0XHRpZiAobXMgPCAxKSByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX0gbXNgO1xyXG5cdFx0aWYgKG1zIDwgMTAwMCkgcmV0dXJuIGAke01hdGgucm91bmQobXMpfSBtc2A7XHJcblx0XHRyZXR1cm4gYCR7KG1zIC8gMTAwMCkudG9GaXhlZCgyKX0gc2A7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRpZiAoYnl0ZXMgPT09IHVuZGVmaW5lZCB8fCBieXRlcyA9PT0gbnVsbCkgcmV0dXJuICctJztcclxuXHRcdGlmIChieXRlcyA8IDEwMjQpIHJldHVybiBgJHtieXRlc30gQmA7XHJcblx0XHRpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcclxuXHRcdHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfSBNQmA7XHJcblx0fVxyXG5cclxuXHRwcm90ZWN0ZWQgZm9ybWF0VGltZXN0YW1wKHRzOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG5cdFx0aWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwgfHwgdHMgPT09ICcnKSByZXR1cm4gJyc7XHJcblx0XHRpZiAodHlwZW9mIHRzID09PSAnc3RyaW5nJykgcmV0dXJuIHRzO1xyXG5cdFx0Y29uc3QgcyA9IFN0cmluZyh0cyk7XHJcblx0XHRpZiAocy5sZW5ndGggPT09IDE0KSB7XHJcblx0XHRcdHJldHVybiBgJHtzLnNsaWNlKDgsIDEwKX06JHtzLnNsaWNlKDEwLCAxMil9OiR7cy5zbGljZSgxMiwgMTQpfSAke3Muc2xpY2UoNiwgOCl9LiR7cy5zbGljZSg0LCA2KX0uJHtzLnNsaWNlKDAsIDQpfWA7XHJcblx0XHR9XHJcblx0XHRpZiAodHMgPiAxZTExKSB7XHJcblx0XHRcdHJldHVybiBuZXcgRGF0ZSh0cykudG9Mb2NhbGVTdHJpbmcoKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBzO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIHRyeVBhcnNlSnNvbihjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB1bmtub3duIHtcclxuXHRcdGlmICghY29udGVudCkgcmV0dXJuIG51bGw7XHJcblx0XHRjb25zdCB0cmltbWVkID0gY29udGVudC50cmltKCk7XHJcblx0XHRpZiAoISgodHJpbW1lZC5zdGFydHNXaXRoKCd7JykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnfScpKSB8fCAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKTtcclxuXHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqdHJhbnNsb2NvPVwibGV0IHRcIj5cclxuXHQ8cC1zaWRlYmFyXHJcblx0XHRbdmlzaWJsZV09XCJ2aXNpYmxlKClcIlxyXG5cdFx0KHZpc2libGVDaGFuZ2UpPVwib25WaXNpYmxlQ2hhbmdlKCRldmVudClcIlxyXG5cdFx0W3Bvc2l0aW9uXT1cInBvc2l0aW9uKClcIlxyXG5cdFx0W3N0eWxlXT1cInsgd2lkdGg6IHdpZHRoKCkgfVwiXHJcblx0XHRbbW9kYWxdPVwibW9kYWwoKVwiXHJcblx0XHRbZGlzbWlzc2libGVdPVwidHJ1ZVwiXHJcblx0XHRbc2hvd0Nsb3NlSWNvbl09XCJ0cnVlXCJcclxuXHRcdHN0eWxlQ2xhc3M9XCJhcmlsLXRyYWNlLWRyYXdlclwiPlxyXG5cdFx0PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX2hlYWRlclwiPlxyXG5cdFx0XHRcdDxpIGNsYXNzPVwicGkgcGktc2l0ZW1hcFwiPjwvaT5cclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX190aXRsZVwiPnt7IHQoJ3RyYWNlRHJhd2VyLnRpdGxlJykgfX08L3NwYW4+XHJcblx0XHRcdFx0PGNvZGUgY2xhc3M9XCJhcmlsLXRyYWNlLWRyYXdlcl9fY2hpcFwiPnt7IHRyYWNlSWQoKSB9fTwvY29kZT5cclxuXHRcdFx0XHQ8aVxyXG5cdFx0XHRcdFx0cm9sZT1cImJ1dHRvblwiXHJcblx0XHRcdFx0XHRjbGFzcz1cInBpIHBpLXNoYXJlLWFsdCBhcmlsLXRyYWNlLWRyYXdlcl9fc2hhcmVcIlxyXG5cdFx0XHRcdFx0W3BUb29sdGlwXT1cInQoJ3RyYWNlRHJhd2VyLnNoYXJlTGluaycpXCJcclxuXHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcblx0XHRcdFx0XHQoY2xpY2spPVwic2hhcmVMaW5rKClcIj48L2k+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHJcblx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX2JvZHlcIj5cclxuXHRcdFx0QGlmIChsb2FkaW5nKCkpIHtcclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX3N0YXRlXCI+XHJcblx0XHRcdFx0XHQ8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIzXCIgc3R5bGVDbGFzcz1cInctM3JlbSBoLTNyZW1cIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxyXG5cdFx0XHRcdFx0PHNwYW4+e3sgdCgndHJhY2VEcmF3ZXIubG9hZGluZycpIH19PC9zcGFuPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHR9IEBlbHNlIGlmIChlcnJvck1lc3NhZ2UoKSkge1xyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJhcmlsLXRyYWNlLWRyYXdlcl9fc3RhdGUgYXJpbC10cmFjZS1kcmF3ZXJfX3N0YXRlLS1lcnJvclwiPlxyXG5cdFx0XHRcdFx0PGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvaT5cclxuXHRcdFx0XHRcdDxwPnt7IGVycm9yTWVzc2FnZSgpIH19PC9wPlxyXG5cdFx0XHRcdFx0PGFyaWwtYnV0dG9uIFtsYWJlbF09XCJ0KCd0cmFjZURyYXdlci5yZXRyeScpXCIgaWNvbj1cIlJFRlJFU0hcIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2tFdmVudCk9XCJyZXRyeSgpXCIgLz5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0fSBAZWxzZSB7XHJcblx0XHRcdFx0QGlmIChhcGlzaXhIaXRzKCkubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHQ8c2VjdGlvbiBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX19zZWN0aW9uXCI+XHJcblx0XHRcdFx0XHRcdDxoMyBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX19zZWN0aW9uLXRpdGxlXCI+XHJcblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJwaSBwaS1nbG9iZVwiPjwvaT5cclxuXHRcdFx0XHRcdFx0XHR7eyB0KCd0cmFjZURyYXdlci5hcGlzaXhIZWFkZXInKSB9fVxyXG5cdFx0XHRcdFx0XHRcdDxhcmlsLWJhZGdlIFt2YWx1ZV09XCJhcGlzaXhIaXRzKCkubGVuZ3RoICsgJyAvICcgKyB0b3RhbEl0ZW0oKVwiIFtyb3VuZGVkXT1cInRydWVcIiAvPlxyXG5cdFx0XHRcdFx0XHQ8L2gzPlxyXG5cdFx0XHRcdFx0XHRAZm9yIChoaXQgb2YgYXBpc2l4SGl0cygpOyB0cmFjayBoaXQuaWQpIHtcclxuXHRcdFx0XHRcdFx0XHQ8ZGV0YWlscyBjbGFzcz1cInRyYWNlLXJvdyB0cmFjZS1yb3ctLXt7IHN0YXR1c1NldmVyaXR5KGhpdC5zdGF0dXMpIH19XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8c3VtbWFyeSBjbGFzcz1cInRyYWNlLXJvd19fc3VtbWFyeVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgdHJhY2Utcm93X19jaGV2cm9uXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8YXJpbC1iYWRnZSBbdmFsdWVdPVwiaGl0LnN0YXR1cy50b1N0cmluZygpXCIgW3NldmVyaXR5XT1cInN0YXR1c1NldmVyaXR5KGhpdC5zdGF0dXMpXCIgLz5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0cmFjZS1yb3dfX3RhZ1wiPnt7IGhpdC5yZXF1ZXN0TWV0aG9kIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRyYWNlLXJvd19fbWFpblwiPnt7IGhpdC5yZXF1ZXN0VXJpIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8YXJpbC1iYWRnZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFt2YWx1ZV09XCJmb3JtYXREdXJhdGlvbihoaXQucmVzcG9uc2VUaW1lKVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W3NldmVyaXR5XT1cImR1cmF0aW9uU2V2ZXJpdHkoaGl0LnJlc3BvbnNlVGltZSlcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC50aW1lc3RhbXApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRyYWNlLXJvd19fdGltZVwiPnt7IGZvcm1hdFRpbWVzdGFtcChoaXQudGltZXN0YW1wKSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvbGU9XCJidXR0b25cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwicGkgcGktY29kZSB0cmFjZS1yb3dfX2FjdGlvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W3BUb29sdGlwXT1cInQoJ3RyYWNlRHJhd2VyLmNvcHlDdXJsJylcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBjb3B5QXNDdXJsKGhpdClcIj48L2k+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L3N1bW1hcnk+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidHJhY2Utcm93X19ib2R5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0cmFjZS1yb3dfX21ldGFcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC5yb3V0ZU5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnJvdXRlJykgfX08L3NwYW5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PjxzcGFuPnt7IGhpdC5yb3V0ZU5hbWUgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0QGlmIChoaXQuc291cmNlQXBwIHx8IGhpdC5zb3VyY2VNb2R1bGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnNvdXJjZScpIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj57eyBoaXQuc291cmNlQXBwIH19e3sgaGl0LnNvdXJjZU1vZHVsZSA/ICcgLyAnICsgaGl0LnNvdXJjZU1vZHVsZSA6ICcnIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnRhcmdldEFwcCB8fCBoaXQudGFyZ2V0TW9kdWxlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyB0KCd0cmFjZURyYXdlci50YXJnZXQnKSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+e3sgaGl0LnRhcmdldEFwcCB9fXt7IGhpdC50YXJnZXRNb2R1bGUgPyAnIC8gJyArIGhpdC50YXJnZXRNb2R1bGUgOiAnJyB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC51cHN0cmVhbUhvc3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnVwc3RyZWFtJykgfX08L3NwYW5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PjxzcGFuPnt7IGhpdC51cHN0cmVhbUhvc3QgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0QGlmIChoaXQudXNlcm5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnVzZXInKSB9fTwvc3BhblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+PHNwYW4+e3sgaGl0LnVzZXJuYW1lIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnJlcXVlc3RTaXplICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnJlcXVlc3RTaXplJykgfX08L3NwYW5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PjxzcGFuPnt7IGZvcm1hdEJ5dGVzKGhpdC5yZXF1ZXN0U2l6ZSkgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0QGlmIChoaXQucmVzcG9uc2VTaXplICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWV0YS1sYWJlbFwiPnt7IHQoJ3RyYWNlRHJhd2VyLnJlc3BvbnNlU2l6ZScpIH19PC9zcGFuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD48c3Bhbj57eyBmb3JtYXRCeXRlcyhoaXQucmVzcG9uc2VTaXplKSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdEBpZiAoaGl0LnJlcXVlc3RCb2R5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRldGFpbHMgY2xhc3M9XCJ0cmFjZS1yb3dfX3N1YlwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHN1bW1hcnk+e3sgdCgndHJhY2VEcmF3ZXIucmVxdWVzdEJvZHknKSB9fTwvc3VtbWFyeT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBpZiAodHJ5UGFyc2VKc29uKGhpdC5yZXF1ZXN0Qm9keSk7IGFzIHBhcnNlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlPnt7IHBhcnNlZCB8IGpzb24gfX08L3ByZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gQGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlPnt7IGhpdC5yZXF1ZXN0Qm9keSB9fTwvcHJlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGV0YWlscz5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRAaWYgKGhpdC5yZXNwb25zZUJvZHkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGV0YWlscyBjbGFzcz1cInRyYWNlLXJvd19fc3ViXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3VtbWFyeT57eyB0KCd0cmFjZURyYXdlci5yZXNwb25zZUJvZHknKSB9fTwvc3VtbWFyeT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBpZiAodHJ5UGFyc2VKc29uKGhpdC5yZXNwb25zZUJvZHkpOyBhcyBwYXJzZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHByZT57eyBwYXJzZWQgfCBqc29uIH19PC9wcmU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IEBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHByZT57eyBoaXQucmVzcG9uc2VCb2R5IH19PC9wcmU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kZXRhaWxzPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8L2RldGFpbHM+XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0QGlmIChoYXNNb3JlKCkpIHtcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX2xvYWQtbW9yZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGFyaWwtYnV0dG9uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtsYWJlbF09XCJ0KCd0cmFjZURyYXdlci5sb2FkTW9yZScpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWNvbj1cIkNIRVZST05fRE9XTlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbG9yPVwicHJpbWFyeVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtvdXRsaW5lZF09XCJ0cnVlXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0W2xvYWRpbmddPVwibG9hZGluZ01vcmUoKVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJsb2FkaW5nTW9yZSgpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0KGNsaWNrRXZlbnQpPVwibG9hZE1vcmUoKVwiIC8+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdDwvc2VjdGlvbj5cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0QGlmIChhcHBMb2dzKCkubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHQ8c2VjdGlvbiBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX19zZWN0aW9uXCI+XHJcblx0XHRcdFx0XHRcdDxoMyBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX19zZWN0aW9uLXRpdGxlXCI+XHJcblx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJwaSBwaS1saXN0XCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdHt7IHQoJ3RyYWNlRHJhd2VyLmFwcExvZ3NIZWFkZXInKSB9fVxyXG5cdFx0XHRcdFx0XHRcdDxhcmlsLWJhZGdlIFt2YWx1ZV09XCJhcHBMb2dzKCkubGVuZ3RoICsgJyAvICcgKyBhcHBMb2dzVG90YWwoKVwiIFtyb3VuZGVkXT1cInRydWVcIiAvPlxyXG5cdFx0XHRcdFx0XHQ8L2gzPlxyXG5cdFx0XHRcdFx0XHRAZm9yIChsb2cgb2YgYXBwTG9ncygpOyB0cmFjayBsb2cuaWQpIHtcclxuXHRcdFx0XHRcdFx0XHQ8ZGV0YWlscyBjbGFzcz1cInRyYWNlLXJvdyB0cmFjZS1yb3ctLXt7IGxldmVsU2V2ZXJpdHkobG9nLmxldmVsKSB9fVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHN1bW1hcnkgY2xhc3M9XCJ0cmFjZS1yb3dfX3N1bW1hcnlcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJwaSBwaS1jaGV2cm9uLXJpZ2h0IHRyYWNlLXJvd19fY2hldnJvblwiPjwvaT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0QGlmIChsb2cubGV2ZWwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8YXJpbC1iYWRnZSBbdmFsdWVdPVwibG9nLmxldmVsXCIgW3NldmVyaXR5XT1cImxldmVsU2V2ZXJpdHkobG9nLmxldmVsKVwiIC8+XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0QGlmIChsb2cubW9kdWxlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0cmFjZS1yb3dfX3RhZ1wiPnt7IGxvZy5tb2R1bGUgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0cmFjZS1yb3dfX21haW5cIj57eyBsb2cubWVzc2FnZSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0QGlmIChsb2cudGltZXN0YW1wKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0cmFjZS1yb3dfX3RpbWVcIj57eyBmb3JtYXRUaW1lc3RhbXAobG9nLnRpbWVzdGFtcCkgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdDwvc3VtbWFyeT5cclxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0cmFjZS1yb3dfX2JvZHlcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0QGlmIChsb2cubWVzc2FnZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0cmFjZS1yb3dfX21lc3NhZ2VcIj57eyBsb2cubWVzc2FnZSB9fTwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdEBpZiAobG9nLnVzZXJuYW1lIHx8IGxvZy5hcHApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidHJhY2Utcm93X19tZXRhXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAaWYgKGxvZy5hcHApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyB0KCd0cmFjZURyYXdlci50YXJnZXQnKSB9fTwvc3BhblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD48c3Bhbj57eyBsb2cuYXBwIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBpZiAobG9nLnVzZXJuYW1lKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtZXRhLWxhYmVsXCI+e3sgdCgndHJhY2VEcmF3ZXIudXNlcicpIH19PC9zcGFuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PjxzcGFuPnt7IGxvZy51c2VybmFtZSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0QGlmIChsb2cuZXJyb3JEZXRhaWwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGV0YWlscyBjbGFzcz1cInRyYWNlLXJvd19fc3ViXCIgb3Blbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzdW1tYXJ5Pnt7IHQoJ3RyYWNlRHJhd2VyLmFwcExvZ0Vycm9yRGV0YWlsJykgfX08L3N1bW1hcnk+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlPnt7IGxvZy5lcnJvckRldGFpbCB9fTwvcHJlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGV0YWlscz5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRAaWYgKGxvZy5yZWZlcmVuY2VGaWVsZHM/Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkZXRhaWxzIGNsYXNzPVwidHJhY2Utcm93X19zdWJcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzdW1tYXJ5Pnt7IHQoJ3RyYWNlRHJhd2VyLmFwcExvZ1JlZkZpZWxkcycpIH19PC9zdW1tYXJ5PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRyYWNlLXJvd19fbWV0YVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAZm9yIChyZiBvZiBsb2cucmVmZXJlbmNlRmllbGRzOyB0cmFjayByZi5maWVsZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1ldGEtbGFiZWxcIj57eyByZi5maWVsZCB9fTwvc3BhblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PjxzcGFuPnt7IHJmLnZhbHVlIH19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2RldGFpbHM+XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdDwvZGV0YWlscz5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRAaWYgKGFwcExvZ3NIYXNNb3JlKCkpIHtcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXJpbC10cmFjZS1kcmF3ZXJfX2xvYWQtbW9yZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGFyaWwtYnV0dG9uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtsYWJlbF09XCJ0KCd0cmFjZURyYXdlci5sb2FkTW9yZScpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWNvbj1cIkNIRVZST05fRE9XTlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbG9yPVwicHJpbWFyeVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtvdXRsaW5lZF09XCJ0cnVlXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0W2xvYWRpbmddPVwiYXBwTG9nc0xvYWRpbmdNb3JlKClcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRbZGlzYWJsZWRdPVwiYXBwTG9nc0xvYWRpbmdNb3JlKClcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQoY2xpY2tFdmVudCk9XCJsb2FkTW9yZUFwcExvZ3MoKVwiIC8+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdDwvc2VjdGlvbj5cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0QGlmICghYXBpc2l4SGl0cygpLmxlbmd0aCAmJiAhYXBwTG9ncygpLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFyaWwtdHJhY2UtZHJhd2VyX19zdGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cInBpIHBpLWluYm94XCI+PC9pPlxyXG5cdFx0XHRcdFx0XHQ8cD57eyB0KCd0cmFjZURyYXdlci5lbXB0eScpIH19PC9wPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L3Atc2lkZWJhcj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
|